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 intunsigned 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

  1. 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
  2. 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á.
  3. 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  
    
  4. 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
    Použite príkaz switch a funkciu getchar(). Znaky 'q' alebo 'Q' už nerátajte.

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;
}