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 "Statická a dynamická správnost přiřazení". Cvičení Čtení čísla z klávesnice s ověřením. Formátování kódu, viz soubor "format.xlsx" na adrese http://efis.tul.cz/~dana.nejedlova/C/DistancniStudium/2019LS/ Následující program má tyto nedostatky: 1. Nevysvětluje význam voleb 1-4. 2. Zacyklí se, když nezadáme číslo. 3. Chybí výzvy k zadání operandů. 4. Po vypsání výsledku nezařádkuje. 5. Po zadání volby pro ukončení se spustí default větev. 6. Operandy kalkulačky jsou celá čísla. #include #define KONEC 0 int main(void) { int cislo, cislo1, cislo2; do { printf("Zadejte cislo mezi 1 a 4 nebo %d pro ukonceni: ", KONEC); scanf("%d", &cislo); switch (cislo) { case 1: printf("Scitani\n"); scanf("%d", &cislo1); scanf("%d", &cislo2); printf("%d + %d = %d", cislo1, cislo2, cislo1 + cislo2); break; case 2: printf("Odcitani\n"); scanf("%d", &cislo1); scanf("%d", &cislo2); printf("%d - %d = %d", cislo1, cislo2, cislo1 - cislo2); break; case 3: printf("Nasobeni\n"); scanf("%d", &cislo1); scanf("%d", &cislo2); printf("%d * %d = %d", cislo1, cislo2, cislo1 * cislo2); break; case 4: printf("Deleni\n"); scanf("%d", &cislo1); scanf("%d", &cislo2); printf("%d / %d = %d", cislo1, cislo2, cislo1 / cislo2); break; default: printf("Neznama volba.\n"); break; } } while (cislo != KONEC); return 0; } Následující program má odstraněny předchozí nedostatky. #include #define KONEC 0 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; } int main(void) { int volba; double cislo1, cislo2; 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: printf("Kalkulacka je ukoncena.\n"); break; case 1: 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); break; case 2: 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); break; case 3: 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); break; case 4: 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); break; default: printf("Neznama volba!\n"); break; } } while (volba != KONEC); return 0; }