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 "Funkce jako parametry funkcí". Zadán domácí úkol. Do 9:00 hodin dopoledne 21. 12. 2020 pošlete e-mailem obrázek s grafem vyhodnocení výrazu, který Vám byl poslán. Podklady jsou na stránce https://elearning.tul.cz/course/view.php?id=7803 v části "Téma 6". https://elearning.tul.cz/ - předmět "KIN/ZP - Základy programování (2020)" Hodnocení domácího úkolu: 2 body za poslání správného řešení na první pokus do 9:00 hodin dopoledne 21. 12. 2020. 1 bod za poslání správného řešení na druhý pokus do termínu stanoveném individuálně. 0 bodů za poslání jakéhokoli řešení (na první nebo druhý pokus včetně správných řešení) po stanoveném termínu. Řešení poslané po termínu nebude vyhodnoceno. Získané body se připočtou k bodům získaným v zápočtovém testu, který se bude psát ve zkouškovém období. Cvičení Zápis do textového souboru. Kalkulačka se strukturou switch #include #define KONEC 0 #define SOUBOR "vystup.txt" void nacti_cislo(double *cislo) { while (scanf("%lf", cislo) != 1) { printf("Zadali jste cislo spatne.\n"); printf("Zadejte cislo znovu: "); while (getchar() != '\n') ; } while (getchar() != '\n') ; } double zadej_cislo(void) { double cislo; while (scanf("%lf", &cislo) != 1) { printf("Zadali jste cislo spatne.\n"); printf("Zadejte cislo znovu: "); while (getchar() != '\n') ; } while (getchar() != '\n') ; return cislo; } void nacti_nenulove_cislo(double *cislo) { while (nacti_cislo(cislo), *cislo == 0) { /* operator carky */ printf("Zadali jste nulu.\n"); printf("Zadejte nenulove cislo: "); } } double zadej_nenulove_cislo(void) { double cislo; while ((cislo = zadej_cislo()) == 0) { printf("Zadali jste nulu.\n"); printf("Zadejte nenulove cislo: "); } return cislo; } int zadej_cele_cislo(void) { int cislo; while (scanf("%d", &cislo) != 1) { printf("Zadali jste cislo spatne.\n"); printf("Zadejte cislo znovu: "); while (getchar() != '\n') ; } while (getchar() != '\n') ; return cislo; } void konec(FILE *fw) { printf("Kalkulacka je ukoncena.\n"); fprintf(fw, "Kalkulacka je ukoncena.\n"); } void scitani(FILE *fw) { double cislo1, cislo2; printf("Scitani\n"); printf("Zadej 1. cislo: "); nacti_cislo(&cislo1); printf("Zadej 2. cislo: "); nacti_cislo(&cislo2); printf("%f + %f = %f\n", cislo1, cislo2, cislo1 + cislo2); fprintf(fw, "%f + %f = %f\n", cislo1, cislo2, cislo1 + cislo2); } void odcitani(FILE *fw) { double cislo1, cislo2; printf("Odcitani\n"); printf("Zadej 1. cislo: "); cislo1 = zadej_cislo(); printf("Zadej 2. cislo: "); cislo2 = zadej_cislo(); printf("%f - %f = %f\n", cislo1, cislo2, cislo1 - cislo2); fprintf(fw, "%f - %f = %f\n", cislo1, cislo2, cislo1 - cislo2); } void nasobeni(FILE *fw) { double cislo1, cislo2; printf("Nasobeni\n"); printf("Zadej 1. cislo: "); cislo1 = zadej_cislo(); printf("Zadej 2. cislo: "); cislo2 = zadej_cislo(); printf("%f * %f = %f\n", cislo1, cislo2, cislo1 * cislo2); fprintf(fw, "%f * %f = %f\n", cislo1, cislo2, cislo1 * cislo2); } void deleni(FILE *fw) { double cislo1, cislo2; printf("Deleni\n"); printf("Zadej 1. cislo: "); cislo1 = zadej_cislo(); printf("Zadej 2. cislo: "); /* cislo2 = zadej_nenulove_cislo(); */ nacti_nenulove_cislo(&cislo2); printf("%f / %f = %f\n", cislo1, cislo2, cislo1 / cislo2); fprintf(fw, "%f / %f = %f\n", cislo1, cislo2, cislo1 / cislo2); } int main(void) { FILE *fw; int volba; if ((fw = fopen(SOUBOR, /* "w" */ "a")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR); return 1; } do { printf("%d Ukonceni\n", KONEC); printf("1 Scitani\n"); printf("2 Odcitani\n"); printf("3 Nasobeni\n"); printf("4 Deleni\n"); printf("Zadejte cislo mezi %d a 4: ", KONEC); volba = zadej_cele_cislo(); switch (volba) { case KONEC: konec(fw); break; case 1: scitani(fw); break; case 2: odcitani(fw); break; case 3: nasobeni(fw); break; case 4: deleni(fw); break; default: printf("Neznama volba!\n"); break; } } while (volba != KONEC); if (fclose(fw) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR); return 1; } return 0; } Kalkulačka s polem pointerů na funkce #include #define KONEC 0 #define SOUBOR "vystup.txt" void nacti_cislo(double *cislo) { while (scanf("%lf", cislo) != 1) { printf("Zadali jste cislo spatne.\n"); printf("Zadejte cislo znovu: "); while (getchar() != '\n') ; } while (getchar() != '\n') ; } double zadej_cislo(void) { double cislo; while (scanf("%lf", &cislo) != 1) { printf("Zadali jste cislo spatne.\n"); printf("Zadejte cislo znovu: "); while (getchar() != '\n') ; } while (getchar() != '\n') ; return cislo; } void nacti_nenulove_cislo(double *cislo) { while (nacti_cislo(cislo), *cislo == 0) { /* operator carky */ printf("Zadali jste nulu.\n"); printf("Zadejte nenulove cislo: "); } } double zadej_nenulove_cislo(void) { double cislo; while ((cislo = zadej_cislo()) == 0) { printf("Zadali jste nulu.\n"); printf("Zadejte nenulove cislo: "); } return cislo; } int zadej_cele_cislo(void) { int cislo; while (scanf("%d", &cislo) != 1) { printf("Zadali jste cislo spatne.\n"); printf("Zadejte cislo znovu: "); while (getchar() != '\n') ; } while (getchar() != '\n') ; return cislo; } void konec(FILE *fw, int vypocet) { printf("Ukonceni\n"); if (vypocet) { printf("Kalkulacka je ukoncena.\n"); fprintf(fw, "Kalkulacka je ukoncena.\n"); } } void scitani(FILE *fw, int vypocet) { double cislo1, cislo2; printf("Scitani\n"); if (vypocet) { printf("Zadej 1. cislo: "); nacti_cislo(&cislo1); printf("Zadej 2. cislo: "); nacti_cislo(&cislo2); printf("%f + %f = %f\n", cislo1, cislo2, cislo1 + cislo2); fprintf(fw, "%f + %f = %f\n", cislo1, cislo2, cislo1 + cislo2); } } void odcitani(FILE *fw, int vypocet) { double cislo1, cislo2; printf("Odcitani\n"); if (vypocet) { printf("Zadej 1. cislo: "); cislo1 = zadej_cislo(); printf("Zadej 2. cislo: "); cislo2 = zadej_cislo(); printf("%f - %f = %f\n", cislo1, cislo2, cislo1 - cislo2); fprintf(fw, "%f - %f = %f\n", cislo1, cislo2, cislo1 - cislo2); } } void nasobeni(FILE *fw, int vypocet) { double cislo1, cislo2; printf("Nasobeni\n"); if (vypocet) { printf("Zadej 1. cislo: "); cislo1 = zadej_cislo(); printf("Zadej 2. cislo: "); cislo2 = zadej_cislo(); printf("%f * %f = %f\n", cislo1, cislo2, cislo1 * cislo2); fprintf(fw, "%f * %f = %f\n", cislo1, cislo2, cislo1 * cislo2); } } void deleni(FILE *fw, int vypocet) { double cislo1, cislo2; printf("Deleni\n"); if (vypocet) { printf("Zadej 1. cislo: "); cislo1 = zadej_cislo(); printf("Zadej 2. cislo: "); /* cislo2 = zadej_nenulove_cislo(); */ nacti_nenulove_cislo(&cislo2); printf("%f / %f = %f\n", cislo1, cislo2, cislo1 / cislo2); fprintf(fw, "%f / %f = %f\n", cislo1, cislo2, cislo1 / cislo2); } } void na_druhou(FILE *fw, int vypocet) { double cislo; printf("Druha mocnina\n"); if (vypocet) { printf("Zadej cislo: "); cislo = zadej_cislo(); printf("%f na druhou = %f\n", cislo, cislo * cislo); fprintf(fw, "%f na druhou = %f\n", cislo, cislo * cislo); } } int main(void) { FILE *fw; int volba, i; if ((fw = fopen(SOUBOR, /* "w" */ "a")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR); return 1; } typedef void (* P_FCE)(); P_FCE funkce[] = { konec, scitani, odcitani, nasobeni, deleni, na_druhou }; int pocet_funkci = sizeof(funkce) / sizeof(*funkce); do { for (i = 0; i < pocet_funkci; i++) { /* Vypis menu */ printf("%d ", i); funkce[i](fw, 0); } printf("Zadejte cislo mezi %d a %d: ", KONEC, pocet_funkci - 1); volba = zadej_cele_cislo(); if (volba >= KONEC && volba < pocet_funkci) { funkce[volba](fw, 1); } else { printf("Neznama volba!\n"); } } while (volba != KONEC); if (fclose(fw) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR); return 1; } return 0; }