8. výukový týden byly v pondělí Velikonoce, proto pokračujeme 9. týdnem. 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 "Soubory – 1. část" do snímku "Vrácení přečteného znaku zpět do vstupního bufferu – 3. příklad". Témata přednášky jsou ilustrována následujícími dvěma programy, které vychází z programu v souboru "7.txt". První program demonstruje použití - funkce scanf() pro zjištění správnosti vstupu, viz řádek "if (scanf("%lf", &r) == 1) {". - funkce ungetc(). - konstanty pro ukončující znak. Porovnejte tento program s programem v souboru "7.txt". #include #include #define KONEC 'k' void vycisti_buffer(void) { while (putchar(getchar()) != '\n') ; } int main() { char c; double r; do { printf("Zadejte nejake cislo nebo '%c' pro ukonceni programu: ", KONEC); scanf("%c", &c); c = tolower(c); /* Na znak 'k' se chceme odkazovat konstantou KONEC a proto eliminujeme v programu znak 'K'. Kvuli tomu je pripojena knihovna ctype.h. */ switch (c) { case KONEC: printf("Konec programu."); break; default: ungetc(c, stdin); /* Kdyz nebyl zadan znak 'k', tak se vrati nacteny znak do vstupniho bufferu, protoze muze byt soucasti cisla. */ if (scanf("%lf", &r) == 1) { /* Funkce scanf() vraci pocet uspecne nactenych paremetru, viz snimek mych prednasek "Test zda jsou v souboru data". */ printf("Zaporne cislo je: %f\n", -r); printf("Prevracena hodnota cisla je: %f\n", 1 / r); } vycisti_buffer(); break; } } while (c != KONEC); return 0; } Druhý program je předchozím programem s přidaným zápisem výsledků do výstupního souboru. Budete-li ve svém programu k zápočtu pracovat se souborem, testujte vždy otevření a uzavření souboru na úspěch dle tohoto příkladu. #include #include #define KONEC 'k' #define SOUBOR "vystup.txt" void vycisti_buffer(void) { while (putchar(getchar()) != '\n') ; } int main() { FILE *fw; char c; double r; if ((fw = fopen(SOUBOR, "w")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR); return 1; } do { printf("Zadejte nejake cislo nebo '%c' pro ukonceni programu: ", KONEC); scanf("%c", &c); c = tolower(c); /* Na znak 'k' se chceme odkazovat konstantou KONEC a proto eliminujeme v programu znak 'K'. Kvuli tomu je pripojena knihovna ctype.h. */ switch (c) { case KONEC: printf("Konec programu."); break; default: ungetc(c, stdin); /* Kdyz nebyl zadan znak 'k', tak se vrati nacteny znak do vstupniho bufferu, protoze muze byt soucasti cisla. */ if (scanf("%lf", &r) == 1) { /* Funkce scanf() vraci pocet uspecne nactenych paremetru, viz snimek mych prednasek "Test zda jsou v souboru data". */ fprintf(fw, "Bylo zadano cislo %f. ", r); fprintf(fw, "K nemu zaporne cislo je %f. ", -r); fprintf(fw, "Prevracena hodnota cisla je %f.\n", 1 / r); printf("Zaporne cislo je: %f\n", -r); printf("Prevracena hodnota cisla je: %f\n", 1 / r); } vycisti_buffer(); break; } } while (c != KONEC); if (fclose(fw) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR); return 1; } return 0; }