Přednáška http://efis.tul.cz/~dana.nejedlova/ Základy programování, Programování I a II Přednáška z jazyka C Probralo se to do snímku "Stavové slovo". Cvičení Vysvěleny programy na mé stránce pod odkazy Čtení matice Načtení matice do pole - program bez podprogramů Matice dynamicky alokovaná metodou 4, viz snímek mých přednášek z jazyka C "Dynamické vícerozměrné pole 4. varianta – Method 4" Soubor "Matice.txt" jsme vytvořili pomocí tabulkového procesoru MS Excel, ze kterého jsme zkopírovali obdélníkovu oblast s funkcí NÁHČÍSLO() do textového souboru a v něm nahradili desetinné čárky za tečky. #include #include #include #define SOUBOR "Matice.txt" #define DELKA_BUFFERU 1024 #define SEPARATORY " ;\t\n" int zjisti_pocet_radku(char *nazev_souboru) { FILE *fr; char buffer_radku[DELKA_BUFFERU]; int i = 0; if ((fr = fopen(nazev_souboru, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", nazev_souboru); exit(1); } while (fgets(buffer_radku, DELKA_BUFFERU, fr) != NULL) { i++; } if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", nazev_souboru); exit(1); } printf("Soubor %s ma %d radku.\n", nazev_souboru, i); return i; } int zjisti_pocet_sloupku(char *nazev_souboru) { FILE *fr; char buffer_radku[DELKA_BUFFERU]; char *cislo_string; int i = 0; if ((fr = fopen(nazev_souboru, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", nazev_souboru); exit(1); } if (fgets(buffer_radku, DELKA_BUFFERU, fr) != NULL) { cislo_string = strtok(buffer_radku, SEPARATORY); if (cislo_string != NULL) { i++; } while ((cislo_string = strtok(NULL, SEPARATORY)) != NULL) { i++; } } if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", nazev_souboru); exit(1); } printf("Soubor %s ma %d sloupku.\n", nazev_souboru, i); return i; } void vytvor_matici_double(double ***x, double **p_x, int r, int s) { int i; if ((*p_x = (double *) malloc(r * s * sizeof(double))) == NULL) { printf("Malo pameti!\n"); exit(1); } if ((*x = (double **) malloc(r * sizeof(double *))) == NULL) { printf("Malo pameti!\n"); exit(1); } for (i = 0; i < r; i++) { (*x)[i] = *p_x + i * s; } } void zrus_matici_double(double ***x, double **p_x) { free((void *) *p_x); *p_x = NULL; free((void *) *x); *x = NULL; } void zrus_matici(void **x, void **p_x) { free(*p_x); *p_x = NULL; free(*x); *x = NULL; } int napln_matici_double(char *nazev_souboru, int r, int s, double **x) { FILE *fr; int i, j; if ((fr = fopen(nazev_souboru, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", nazev_souboru); exit(1); } for (i = 0; i < r; i++) { for (j = 0; j < s; j++) { if (fscanf(fr, "%lf", &x[i][j]) != 1) { printf("Chyba na radku %d ve sloupci %d.", i + 1, j + 1); return 1; } } } if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", nazev_souboru); exit(1); } return 0; } void secti_prvky_matice(int r, int s, double **x) { int i, j; double soucet = 0.0; for (i = 0; i < r; i++) { for (j = 0; j < s; j++) { soucet += x[i][j]; } } printf("Matice ma soucet prvku = %f.\n", soucet); } int main() { int radky, sloupky; double **x, *p_x; if ((radky = zjisti_pocet_radku(SOUBOR)) < 1) { return 1; } if ((sloupky = zjisti_pocet_sloupku(SOUBOR)) < 1) { return 1; } vytvor_matici_double(&x, &p_x, radky, sloupky); if (napln_matici_double(SOUBOR, radky, sloupky, x) == 1) { return 1; } secti_prvky_matice(radky, sloupky, x); //zrus_matici_double(&x, &p_x); zrus_matici((void **) &x, (void **) &p_x); /* Lepsi reseni umoznujici rusit matice ruznych datovych typu */ printf("%p %p\n", x, p_x); /* Overeni, ze byly spravne vynulovany pointery */ printf("Hello world!\n"); return 0; }