IB001 Úvod do programování skrze C, Seminární skupiny 09, 10, 11
Týden 5 datové typy, výčtové typy, príkaz switch
Celočíselné datové typy
- operátory, ktoré s celočíselnými operandami poskytujú celočíselné výsledky: +, -, *, /, %
- celočíselné typy so znamienkom: short int, int, long int, long long int
- celočíselné typy bez znamienka: unsigned short int, unsigned int, unsigned long int, unsigned long long int
- zistenie veľkosti datového typu v bytoch: operator sizeof
- pomenované konštanty udávajúce minimálnu a maximálnu hodnotu jednotlivých celočíselných typov so znamienkom: hlavičkový súbor limits.h
- modifikátory dĺžky používané pri funkciach printf a scanf: h, l, ll
- Pretypovanie premennej int integer = 1;
- double real = (double) integer;
- double real = integer + 0.0;
/* Program na vypis velkosti celociselnych datovych typov */ #include <stdio.h> #include <limits.h> int main(void) { printf("Velkost jednotlivych celocicelnych datovych typov:\n\n"); printf("short %d B %20hd az %hd\n", sizeof(short), SHRT_MIN, SHRT_MAX); printf("int %d B %20d az %d\n", sizeof(int), INT_MIN, INT_MAX); printf("long %d B %20ld az %ld\n", sizeof(long), LONG_MIN, LONG_MAX); printf("long long %d B %20lld az %lld\n\n", sizeof(long long), LLONG_MIN, LLONG_MAX); printf("unsigned short %d B %20hu az %hu\n", sizeof(unsigned short), 0u, USHRT_MAX); printf("unsigned int %d B %20u az %u\n", sizeof(unsigned int), 0u, UINT_MAX); printf("unsigned long %d B %20lu az %lu\n", sizeof(unsigned long), 0Lu, ULONG_MAX); printf("unsigned long long %d B %20llu az %llu\n", sizeof(unsigned long long), 0LLu, ULLONG_MAX); return 0; }
Datový typ znak (char)
- Znaky sa zapisujú v apostrofoch: 'a', 'X', '{'
- Práca so znakmi ako celočíselnými
- funkce getchar (navrátový typ int) a putchar
- int znak = getchar(); if (znak == 'X'){}
Výčtový typ
- zápis výčtového typu
enum rocneObdobie { jar, leto, jesen, zima } obdobie;
Oddelenie deklarácie typu od deklarácie premenných:
enum rocneObdobie { jar, leto, jesen, zima }; enum rocneObdobie obdobie;
Výčet definovaný ako nový datový typ:
typedef enum { jar, leto, jesen, zima } rocneObdobie;
rocneObdobie obdobie;
- možnosť práce s hodnotami výčtového typu jako s hodnotami celočíselnými
- priradenie celočíselnych hodnot jednotlivým hodnotám výčtového typu
- možnosti deklarácie:
- kombinácia výčtových a celočíselných veličín:
- je možné int i = leto;
- nie je môžné obdobie = 1;
Príkaz switch
- zápis príkazu switch
- význam príkazu break v príkaze switch
Použitie výčtového typu
/* Program, ktory nacita cislo – poradie dna v tyzdni a vypise jeho meno. */ #include <stdio.h> int main(void) { typedef enum { // pondelok = 1 zmeni defaultnu indexaciu, ktora zacina od 0 pondelok = 1, utorok, streda, stvrtok, piatok, sobota, nedela } denTyzdna; int poradieDna; printf("Zadajte poradie dna v tyzdni (1-7): "); scanf("%d",& poradieDna); printf("Cislo %d odpoveda ", poradieDna); switch (poradieDna) { case pondelok: printf("pondelku.\n"); break; case utorok: printf("utorku.\n"); break; case streda: printf("strede.\n"); break; case stvrtok: printf("stvrtku.\n"); break; case piatok: printf("piatku.\n"); break; case sobota: printf("sobote.\n"); break; case nedela: printf("nedeli.\n"); break; default: printf("nicomu.\n"); break; } return 0; }
Príklady k precvičeniu
- Naprogramujte jednoduchú kalkulačku s operáciami +,-,*,/
Vstup: 3 + 4
Výstup: 3 + 4 = 7
Program skončí ak užívatel namiesto znaku operacie zadá znak 'q' alebo 'Q'. Zkúste využiť príkaz switch - Zistite, čí zdané číslo je prvočíslo. Pri hľadaní použité vlastný výčtový typ stav. (Stavy budu tri hledam, uzDelitel, jePrvocislo). Príkazom switch vypíšte o aké číslo sa jedná.
- Vypište ASCII tabulku od znaku medzera ' ' po znak '~'. Od užívateľa si vyžiadajte počet riadkov. Vypisujte znaky po stĺpcoch. Príklad pre 10 riadkov
32 42 * 52 4 62 > 72 H 82 R 92 \ 102 f 112 p 122 z 33 ! 43 + 53 5 63 ? 73 I 83 S 93 ] 103 g 113 q 123 { 34 " 44 , 54 6 64 @ 74 J 84 T 94 ^ 104 h 114 r 124 | 35 # 45 - 55 7 65 A 75 K 85 U 95 _ 105 i 115 s 125 } 36 $ 46 . 56 8 66 B 76 L 86 V 96 ` 106 j 116 t 126 ~ 37 % 47 / 57 9 67 C 77 M 87 W 97 a 107 k 117 u 38 & 48 0 58 : 68 D 78 N 88 X 98 b 108 l 118 v 39 ' 49 1 59 ; 69 E 79 O 89 Y 99 c 109 m 119 w 40 ( 50 2 60 < 70 F 80 P 90 Z 100 d 110 n 120 x 41 ) 51 3 61 = 71 G 81 Q 91 [ 101 e 111 o 121 y
- Postupne načítavajte znaky od užívateľa až kým nezadá znak 'q' alebo 'Q'. Na výstup vypíšte:
- Počet zátvoriek: (,),{,},[,],<,>
- Počet 'a' alebo 'A'
- Počet všetkých ostatných znakov
Riešenie príkladov
#include <stdio.h> #include <stdlib.h> int main(){ char znamienko; do { double a, b; scanf("%lf %c %lf", &a, &znamienko, &b); switch(znamienko){ case '+': printf("%g + %g = %g\n",a,b, a + b); break; case '-': printf("%g - %g = %g\n",a,b, a - b); break; case '*': printf("%g * %g = %g\n",a,b, a * b); break; case '/': if ((int) b == 0){ puts("Neda sa delit nulou!!!"); break; } printf("%g / %g = %g\n",a,b, a / b); break; } } while (znamienko != 'q' && znamienko != 'Q'); puts("Konec"); return 0; }
#include <stdio.h> #include <stdlib.h> /* * Vypis ASCII tabulky na zadany pocet riadkov */ int main(){ puts("Zadajte pocet riadkov"); int radky; scanf("%d", &radky); for (int i = 0; i < radky;i++){ //Vypiseme znaky od medzery po znak vlnka //na danom riadku znak zvysujeme o pocet riadkov //znaky medzi tym napiseme v dalsich riadkoch pri iteracii //vonkajsieho cyklu s indexom i for (int znak = ' '; znak+i<='~';znak=znak+radky){ printf("%3d %c ",znak+i,znak+i); } printf("\n"); } return 0; }