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 "Explicitní typová konverze 3. příklad". Cvičení Řídící struktura if...else, zkrácené vyhodnocování booleanovských výrazů a prefix versus postfix inkrement. Operátor AND && ve formě vnořených struktur if...else a jediné struktury if...else. Ve formě jediné struktury if...else je ukázáno zkrácené vyhodnocování booleanovských výrazů, tedy, že znak se testuje jen, když má výsledek testu čísla hodnotu true. #include #include #include #define POCET_CYKLU 100 #define MAX 5 #define ROZSAH_KODU_ZNAKU (1 + 'Z' - 'A') #define MIN_CISLO_VE_VYPISU 2 #define MIN_ZNAK_VE_VYPISU 'T' int main() { int i, cislo, znak, pocet_nevytisknutych_cyklu, pocet_testu_cisla, pocet_testu_znaku; unsigned int cas; cas = (unsigned int) time(NULL); srand(cas); pocet_nevytisknutych_cyklu = 0; for (i = 0; i < POCET_CYKLU; i++) { cislo = rand() % MAX; znak = 'A' + rand() % ROZSAH_KODU_ZNAKU; if (cislo > MIN_CISLO_VE_VYPISU) { if (znak > MIN_ZNAK_VE_VYPISU) { printf("%d ", cislo); printf("%c\n", znak); } else { pocet_nevytisknutych_cyklu++; } } else { pocet_nevytisknutych_cyklu++; } } printf("Pocet nevytisknutych cyklu: %d\n", pocet_nevytisknutych_cyklu); srand(cas); pocet_nevytisknutych_cyklu = pocet_testu_cisla = pocet_testu_znaku = 0; for (i = 0; i < POCET_CYKLU; i++) { cislo = rand() % MAX; znak = 'A' + rand() % ROZSAH_KODU_ZNAKU; if (printf("%d. Testuji cislo.\n", ++pocet_testu_cisla) && cislo > MIN_CISLO_VE_VYPISU && printf("%d. Testuji znak.\n", ++pocet_testu_znaku) && znak > MIN_ZNAK_VE_VYPISU) { /* Porovnejte s postfix verzi inkrementu: if (printf("%d. Testuji cislo.\n", pocet_testu_cisla++) && cislo > MIN_CISLO_VE_VYPISU && printf("%d. Testuji znak.\n", pocet_testu_znaku++) && znak > MIN_ZNAK_VE_VYPISU) { */ printf("%d ", cislo); printf("%c\n", znak); } else { pocet_nevytisknutych_cyklu++; } } printf("Pocet nevytisknutych cyklu: %d\n", pocet_nevytisknutych_cyklu); return 0; } Operátor OR || ve formě vnořených struktur if...else a jediné struktury if...else. Ve formě jediné struktury if...else je ukázáno zkrácené vyhodnocování booleanovských výrazů, tedy, že znak se testuje jen, když má výsledek testu čísla hodnotu false. #include #include #include #define POCET_CYKLU 10 #define MAX 5 #define ROZSAH_KODU_ZNAKU (1 + 'Z' - 'A') #define MIN_CISLO_VE_VYPISU 2 #define MIN_ZNAK_VE_VYPISU 'T' int main() { int i, cislo, znak, pocet_nevytisknutych_cyklu, pocet_testu_cisla, pocet_testu_znaku; unsigned int cas; cas = (unsigned int) time(NULL); /* Explicitni pretypovani */ srand(cas); pocet_nevytisknutych_cyklu = 0; for (i = 0; i < POCET_CYKLU; i++) { cislo = rand() % MAX; znak = 'A' + rand() % ROZSAH_KODU_ZNAKU; if (cislo > MIN_CISLO_VE_VYPISU) { printf("%d ", cislo); printf("%c\n", znak); } else if (znak > MIN_ZNAK_VE_VYPISU) { printf("%d ", cislo); printf("%c\n", znak); } else { pocet_nevytisknutych_cyklu++; } } printf("pocet nevytisknutych cyklu %d\n", pocet_nevytisknutych_cyklu); srand(cas); pocet_nevytisknutych_cyklu = pocet_testu_cisla = pocet_testu_znaku = 0; for (i = 0; i < POCET_CYKLU; i++) { cislo = rand() % MAX; znak = 'A' + rand() % ROZSAH_KODU_ZNAKU; if ((printf("%d. Testuji cislo.\n", ++pocet_testu_cisla) && cislo > MIN_CISLO_VE_VYPISU) || (printf("%d. Testuji znak.\n", ++pocet_testu_znaku) && znak > MIN_ZNAK_VE_VYPISU)) { /* Porovnejte s postfix verzi inkrementu: if ((printf("%d. Testuji cislo.\n", pocet_testu_cisla++) && cislo > MIN_CISLO_VE_VYPISU) || (printf("%d. Testuji znak.\n", ++pocet_testu_znaku) && znak > MIN_ZNAK_VE_VYPISU)) { */ printf("%d ", cislo); printf("%c\n", znak); } else { pocet_nevytisknutych_cyklu++; } } printf("pocet nevytisknutych cyklu %d\n", pocet_nevytisknutych_cyklu); return 0; } V obou programech funkce printf() vrací počet vytisknutých znaků, který je v závorce za klíčovým slovem if interpretován jako hodnota true, když se vytiskne alespoň jeden znak, viz "Return Value" na stránce http://www.cplusplus.com/reference/cstdio/printf/