Prostudujte si přednášku z jazyka C na stránce http://efis.tul.cz/~dana.nejedlova/ v odstavci "Programování I a II" od smínku "Statická pole" do snímku "Pole pointerů na funkce a operátor typedef". Vyzkoušejte si všechny programy na snímcích, které si máte prostudovat, a program na mé stránce pod odkazem "Menu", kde je příklad statického pole pointerů na funkce a různé další způsoby, jak programovat kalkulačku. Můžete poslat vypracování domácího úkolu ve kterém vytvoříte svou variantu následujícího programu. Smyslem tohtoto úkolu je procvičit si tvorbu funkcí nebo práci s polem. Následující program načte čísla z textového souboru do dynamického jednorozměrného pole a vypíše čísla do výstupního textového souboru v obráceném pořadí. Vstupní i výstupní soubor pro následující program máte také v adresáři spolu s tímto souborem. Do projektu s následujícm programem budete potřebovat jen soubor "cisla.txt", soubor "cisla_obracene.txt" bude programem vytvořen. #include #include #define SOUBOR_VSTUP "cisla.txt" #define SOUBOR_VYSTUP "cisla_obracene.txt" int zjisti_pocet_cisel(void) { FILE *fr; int cislo, counter = 0; if ((fr = fopen(SOUBOR_VSTUP, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR_VSTUP); exit(1); } while (fscanf(fr, "%d", &cislo) == 1) counter++; if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR_VSTUP); exit(1); } return counter; } int nacti_cisla_do_pole(int *cislo) { FILE *fr; int counter = 0; if ((fr = fopen(SOUBOR_VSTUP, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR_VSTUP); exit(1); } while (fscanf(fr, "%d", &cislo[counter]) == 1) counter++; if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR_VSTUP); exit(1); } printf("Nacteno %d cisel.\n", counter); return counter; } void zapis_cisla_v_obracenem_poradi(int *cislo, int pocet_cisel) { FILE *fw; if ((fw = fopen(SOUBOR_VYSTUP, "w")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR_VYSTUP); exit(1); } for (pocet_cisel--; pocet_cisel + 1; ) { fprintf(fw, "%d ", cislo[pocet_cisel--]); } if (fclose(fw) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR_VYSTUP); exit(1); } } void uvolni_pole(void **pole) { free((void *) *pole); *pole = NULL; } int main(void) { int *cislo, pocet_cisel; pocet_cisel = zjisti_pocet_cisel(); if ((cislo = (int *) malloc(pocet_cisel * sizeof(int))) == NULL) { printf("Malo pameti!\n"); return 1; } if (pocet_cisel != nacti_cisla_do_pole(cislo)) { printf("Pocet cisel ma byt %d!\n", pocet_cisel); return 1; } zapis_cisla_v_obracenem_poradi(cislo, pocet_cisel); uvolni_pole((void **) &cislo); return 0; } Ve svém řešení tento program modifikujte v alespoň jednom z následujících prvků: 1. Alokace paměti pro dynamické pole bude v podprogramu, viz například programy v souboru "12.txt". 2. Uvolnění paměti pro dynamické pole bude v přímo ve funkci main(). 3. Nějaký jiný podprogram z výše uvedeného programu bude zrušen a jeho kód bude bude ve funkci main(). 4. Nějaký podprogram z výše uvedeného programu bude mít jiné parametry nebo jiný návratový typ. 5. Jiným způsobem procházejte pole. Například jinak aktualizujte indexy, zaveďte pro ně proměnnou tak, že program začne být pochopitelnější, přesuňte aktualizaci indexu na jiné místo for cyklu nebo místo indexů v hranatých závorkách použijte pointerovou aritmetiku a podobně. Opatřete svůj program komentářem popisujícím, co jste v programu modifikovali. Svůj program naformátujte ve stylu K&R, viz soubor "format.xlsx". Výsledný program musí mít stejné vstupy a výstupy jako výchozí program, tedy bude dělat to samé, ale nějak jinak a také správným způsobem.