Witam Serdecznie :-)
Głowie sie nad programem dlugo i prawie skonczylem.
Wyrzuca mnie z programu na ostatniej funkcji.
Mam błąd w funkcji ODEJMIJ. Nie pojawiają sie jednakze komunikaty o błędzie.
W funkcji ODEJMIJ chodzi o to aby ona wzięła pierwszą macierz (powstałą w wyniku mnożenia - patrz funkcja mnożenie) i odjęła ją od drugiej macierzy (powstałej w wyniku dodawania - patrz funkcja dodawanie).
#include <stdlib.h>
#include <stdio.h>
#define N 100
#define M 100
struct dane
{
int ilosc_wierszy;
int ilosc_kolumn; //dane do macierzy pierwszej (powstalej po mnozeniu)
int wart_pocz_wiersza;
int wart_pocz_kolumny;
float skok_wiersza;
float skok_kolumny;
int ilosc_wierszy2;
int ilosc_kolumn2; //dane do macierzy drugiej (powstalej z dodawania)
int wart_pocz_wiersza2;
int wart_pocz_kolumny2;
float skok_wiersza2;
float skok_kolumny2;
float *tab; //tablica kolumn za jej pomoca tworze macierz druga
float *tab2; //tablica wierszy
float **tab1w2; //pierwsza tablica 2w wpisuje tutaj macierz mnozenie
float **tab2w2; //tablica dwuwymiarowa wpisuje do niej macierz dodawanie
float **tab3w2; //tutaj wpisuje macierz odejmowanie
};
void pobieranie_danych(struct dane *s)
{
printf("Macierz #1\n"); //mnozenie
printf("----------\n\n\n");
printf("Podaj ilosc wierszy: ");
scanf("%d",&s->ilosc_wierszy);
printf("Podaj ilosc kolumn: ");
scanf("%d",&s->ilosc_kolumn);
printf("Podaj wartosc poczatkowa wiersza: ");
scanf("%d",&s->wart_pocz_wiersza);
printf("Podaj wartosc poczatkowa kolumny: ");
scanf("%d",&s->wart_pocz_kolumny);
printf("Podaj skok wiersza: ");
scanf("%f",&s->skok_wiersza);
printf("Podaj skok kolumny: ");
scanf("%f",&s->skok_kolumny);
printf("\n\n\n");
}
void mnozenie(struct dane *s)
{
printf(" * ");
float temp12=0;
for (int i=0; i<s->ilosc_kolumn; i++)
{
printf("%10.2f ",(s->wart_pocz_kolumny)+temp12);
temp12=temp12+(s->skok_kolumny);
}
printf("\n");
float temp11=0;
for (int i=0; i<s->ilosc_wierszy; i++)
{
float temp1=0;
for (int i=0; i<s->ilosc_kolumn; i++)
{
if (i==0) printf("%.2f ",(s->wart_pocz_wiersza)+temp11);
printf("%10.2f ",((s->wart_pocz_wiersza)+temp11)*((s->wart_pocz_kolumny)+temp1));
temp1=temp1+(s->skok_kolumny);
}
printf("\n");
temp11=temp11+(s->skok_wiersza);
}
printf("\n\n\n\n");
s->tab1w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */
for(int i=0; i<M; i++)
{
s->tab1w2[i]=(float*)malloc(M*sizeof(float));
}
printf("Zapisuje macierz do tablicy: \n");
printf("---------------------------\n");
//float tab1w2[100][100];
float temp11w=0;
for (int i=0; i<s->ilosc_wierszy; i++)
{
float temp1w=0;
for (int j=0; j<s->ilosc_kolumn; j++)
{
s->tab1w2[i][j]=(s->wart_pocz_wiersza+temp11w)*(s->wart_pocz_kolumny+temp1w);
temp1w=temp1w+(s->skok_kolumny);
printf("%.2f ",s->tab1w2[i][j]);
}
printf("\n");
temp11w=temp11w+(s->skok_wiersza);
}
printf("\n\n\n\n");
}
void pobieranie_danych2(struct dane *s)
{
printf("Macierz #2\n"); //dodawanie
printf("----------\n\n\n");
printf("Podaj ilosc wierszy: ");
scanf("%d",&s->ilosc_wierszy2);
printf("Podaj ilosc kolumn: ");
scanf("%d",&s->ilosc_kolumn2);
printf("Podaj wartosc poczatkowa wiersza: ");
scanf("%d",&s->wart_pocz_wiersza2);
printf("Podaj wartosc poczatkowa kolumny: ");
scanf("%d",&s->wart_pocz_kolumny2);
printf("Podaj skok wiersza: ");
scanf("%f",&s->skok_wiersza2);
printf("Podaj skok kolumny: ");
scanf("%f",&s->skok_kolumny2);
printf("\n\n\n");
}
void dodawanie(struct dane *s)
{
printf("\n\n\n");
//(float*)malloc(sizeof(float));
printf(" + ");
s->tab=(float*)malloc(s->ilosc_kolumn2 * sizeof(float));
float temp2=0;
for (int i=0; i<s->ilosc_kolumn2; i++)
{
s->tab[i]=s->wart_pocz_kolumny2+temp2;
temp2=temp2+(s->skok_kolumny2);
printf("%.2f ",s->tab[i]);
}
printf("\n");
s->tab2=(float*)malloc(s->ilosc_wierszy2 * sizeof(float)); /* alokacja dynamiczna */
float temp22=0;
for (int i=0; i<s->ilosc_wierszy2; i++)
{
s->tab2[i]=s->wart_pocz_wiersza2+temp22;
temp22=temp22+(s->skok_wiersza2);
}
for (int j=0; j<s->ilosc_wierszy2; j++)
{
float temp222=0;
for (int i=0; i<s->ilosc_kolumn2; i++)
{
if (i==0)printf("%.2f ",s->tab2[j]+temp222);
printf("%.2f ",s->tab2[j]+(s->tab[i]));
temp222=temp222+(s->skok_wiersza2);
}
printf("\n");
}
printf("\n\n\n\n");
s->tab2w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */
for(int i=0; i<M; i++)
{
s->tab2w2[i]=(float*)malloc(M*sizeof(float));
}
printf("Zapisuje macierz do tablicy: \n");
printf("---------------------------\n");
//zapisuje Macierz #2 do tablicy dwuwymiarowej
float temp22w=0;
for (int j=0; j<s->ilosc_wierszy2; j++)
{
float temp222w=0;
for (int i=0; i<s->ilosc_kolumn2; i++)
{
s->tab2w2[i][j]=s->tab2[j]+(s->tab[i]);
temp222w=temp222w+(s->skok_wiersza2);
printf("%.2f ",s->tab2w2[i][j]);
}
printf("\n");
}
}
void odejmowanie(struct dane *s)
{
printf("\n\n\n\n");
printf("Macierz #3\n"); //odejmowanie
printf("----------\n\n\n");
printf("Odejmowanie dwoch macierzy:\n\n\n"); <------------ TEN NAPIS WYSWIETLA I WYRZUCA [!!!] PROGRAM nie ma komunikatów o bledzie
s->tab1w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */
for(int i=0; i<M; i++)
{
s->tab1w2[i]=(float*)malloc(M*sizeof(float));
}
float temp11w=0; <--------------- TUTAJ jeszcze raz wyswietlam macierz MNOZENIE
for (int i=0; i<s->ilosc_wierszy; i++)
{
float temp1w=0;
for (int j=0; j<s->ilosc_kolumn; j++)
{
s->tab1w2[i][j]=(s->wart_pocz_wiersza+temp11w)*(s->wart_pocz_kolumny+temp1w);
temp1w=temp1w+(s->skok_kolumny);
printf("%.2f ",s->tab1w2[i][j]);
}
printf("\n");
temp11w=temp11w+(s->skok_wiersza);
}
printf("\n-\n\n");
s->tab2w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */
for(int i=0; i<M; i++)
{
s->tab2w2[i]=(float*)malloc(M*sizeof(float));
}
float temp22w=0; // <--------------- TUTAJ wyswietlam macierz dodawanie
for (int i=0; i<s->ilosc_wierszy2; i++)
{
float temp222w=0;
for (int j=0; j<s->ilosc_kolumn2; j++)
{
s->tab2w2[j][i]=s->tab2[i]+(s->tab[j]);
temp222w=temp222w+(s->skok_wiersza2);
printf("%.2f ",s->tab2w2[j][i]);
}
printf("\n");
}
printf("\n\n\n\nMacierz #3:\n\n");
//tab1w2[100][100];
//tab2w2[100][100];
s->tab3w2=(float**)malloc(N*sizeof(float *)); /* alokacja dynamiczna */
for(int i=0; i<M; i++)
{
s->tab3w2[i]=(float*)malloc(M*sizeof(float));
}
// <---------------tutaj jest algorytm do porownania ktora macierz jest wieksza, aby mozna bylo odjac wieksza od mniejszej:(
s->ilosc_kolumn = s->ilosc_kolumn > s->ilosc_kolumn2 ? s->ilosc_kolumn2 : s->ilosc_kolumn;
s->ilosc_wierszy = s->ilosc_wierszy > s->ilosc_wierszy2 ? s->ilosc_wierszy2 : s->ilosc_wierszy;
// <------------------------- tutaj jest odejmowanie obydwu macierzy (od macierzy powstalej z mnozenia odejmuje macierz powstala z dodawania)
for(int i=0; i<s->ilosc_wierszy; i++)
{
for(int j=0; j <s->ilosc_kolumn; j++)
{
s->tab3w2[i][j]=((s->tab1w2[i][j])-(s->tab2w2[j][i]));
printf("%.2f ",s->tab3w2[i][j]);
}
printf("\n");
}
}
int main()
{
struct dane mnoz;
struct dane dodaj;
struct dane odejmij;
pobieranie_danych(&mnoz);
mnozenie(&mnoz);
pobieranie_danych2(&dodaj);
dodawanie(&dodaj);
odejmowanie(&odejmij); //<------ PO WYWOLANIU TEJ FUNKCJI WYRZUCA PROGRAM
system("PAUSE");
}