====== Výpočty s maticemi ====== #include #include #include typedef struct tmatice { int radky, sloupce; int** matice; } TMatice; TMatice alokujMatici (int r, int s) { int i; TMatice m; m.radky=r; m.sloupce=s; int **mrizka=calloc(r, sizeof(int*)); if (mrizka==NULL) { fprintf (stderr, "!\n"); } for (i=0; iradky; i++) free (m->matice[i]); free (m->matice); } TMatice nactiMatici(char *soubor) { FILE *fp; TMatice m; if ((fp=fopen(soubor,"r"))==NULL) { m.radky=0; m.sloupce=0; return m; } int i, j, r, s; if (fscanf (fp, "%d %d", &r, &s) != 2) { fprintf (stderr, "Spatne rozmery!\n"); fclose(fp); m.radky=0; m.sloupce=0; return m; } m = alokujMatici (r, s); for (i = 0; i < r; i++) for (j = 0; j < s; j++) if (fscanf (fp, "%d", &m.matice[i][j]) != 1) { uvolniMatici(&m); fclose(fp); m.radky=0; m.sloupce=0; fprintf (stderr, "Nekompatibilni matice!\n"); return m; } fclose(fp); return m; } void pisMatici(TMatice m) { int i,j; printf("%d %d\n",m.radky,m.sloupce); for (i=0;i vstup.matice[i][j-1]) status=1; if (vstup.matice[i][j] < vstup.matice[i][j-1]) status=-1; if (last!=status && last!=0) return EXIT_FAILURE; } } //sloupce status=0; for (j=0; j vstup.matice[i-1][j]) status=1; if (vstup.matice[i][j] < vstup.matice[i-1][j]) status=-1; if (last!=status && last!=0) return EXIT_FAILURE; } } return EXIT_SUCCESS; } int subMatice (TMatice m1, TMatice m2) { if (m1.radky < m2.radky || m1.sloupce < m2.sloupce) return EXIT_FAILURE; //Vleze se? int i1, j1, i2, j2; for (j1=0; j1<=(m1.sloupce-m2.sloupce); j1++) for (i1=0; i1<=(m1.radky-m2.radky); i1++) if (m1.matice[i1][j1] == m2.matice[0][0]) for (j2=0; j2= 3 && (strcmp("-mono", argv[1]) == 0 || strcmp("-add", argv[1]) == 0 || strcmp("-submatrix", argv[1]) == 0 || strcmp("-mult", argv[1]) == 0)) { //Nacitani 1. matice TMatice m1 = nactiMatici(argv[2]); if (m1.radky<=0 || m1.sloupce<=0) { fprintf (stderr, "Chyba pri otevirani souboru 1!\n"); return EXIT_FAILURE; } // pisMatici (m1); printf("\n"); //Monotonnost if (strcmp("-mono", argv[1]) == 0) { int x = monoMatice (m1); uvolniMatici(&m1); if (x==0) printf ("1\n"); else printf ("#\n"); return EXIT_SUCCESS; } //Nacitani 2. matice TMatice m2 = nactiMatici(argv[3]); if (m2.radky<=0 || m2.sloupce<=0) { uvolniMatici(&m1); fprintf (stderr, "Chyba pri otevirani souboru 2!\n"); return EXIT_FAILURE; } // pisMatici (m2); printf("\n"); //Scitani matic if (strcmp("-add", argv[1]) == 0) { TMatice m = sectiMatice (m1, m2); if (m.radky <= 0 || m.sloupce <= 0) fprintf (stderr,"#\n"); else { pisMatici (m); uvolniMatici(&m); } uvolniMatici(&m1); uvolniMatici(&m2); return EXIT_SUCCESS; } //Nasobeni matic if (strcmp("-mult", argv[1]) == 0) { TMatice m = nasobMatice (m1, m2); if (m.radky <= 0 || m.sloupce <= 0) fprintf (stderr,"#\n"); else { pisMatici (m); uvolniMatici(&m); } uvolniMatici(&m1); uvolniMatici(&m2); return EXIT_SUCCESS; } //Submatice if (strcmp("-submatrix", argv[1]) == 0) { int x = subMatice (m1, m2); uvolniMatici(&m1); uvolniMatici(&m2); if (x==0) printf ("1\n"); else printf ("#\n"); return EXIT_SUCCESS; } uvolniMatici(&m1); uvolniMatici(&m2); } else { fprintf (stderr,"Spatne parametry!\n"); return EXIT_FAILURE; } fprintf (stderr,"Toto by se nikdy nemelo napsat!\n"); return EXIT_FAILURE; } //gcc -std=c99 -Wall -W -pedantic proj3.c -o proj3 -O2