Vstup z terminálu alebo "Načo je tam to & ?"

Programy, ktoré sme doteraz v jazyku C vytvárali, boli pomerne nezdvorilé -- ak sa nám ich podarilo skompilovať a spustiť, tak na nás väčšinou niečo vychrlili a tým to pre ne haslo. Po spustení sme ich beh už nemohli nijak ovplyvniť. Dobre vychovaný program by sa ale takto správať nemal. Mal by sa nás aspoň občas na niečo spýtať.

Jednou z možností, ako ovplyvniť beh programu, je vstup z terminálu. Na určitom mieste program zastaví a čaká, kým niečo napíšete. Potom si to uloží do premennej (ktorú musí mať predtým deklarovanú) a ďalej s tým pracuje.

Na vstup z terminálu slúži funkcia scanf. Funguje podobne ako funkcia printf. Ako prvý argument musí dostať riadiaci reťazec, ktorý jej povie, aké typy premenných bude čítať. Potom nasleduje zoznam premenných, do ktorých sa majú načítané hodnoty uložiť. Ale pozor! Pred každé meno premennej sa musí napísať znak &. V praxi to bude vyzerať takto:

#include <stdio.h>

main()
{
    int i,j;

    printf("Ja som mimoriadne nadany program, ktory vie scitat.\n");
    printf("Zadaj cislo: ");
    scanf("%d",&i);
    printf("Este jedno: ");
    scanf("%d",&j);
    printf("%d + %d = %d. To som dobry. Co?\n",i,j,i+j);
}
V programe najprv deklarujeme dve premenné i a j. Potom sa vypíšu nejaké úvodné bláboly a zavolá sa funkcia scanf. Jej úvodný reťazec jej povie, že má očakávať celé číslo (ak tam niekto napíše niečo iné, program za seba neručí a asi bude robiť hlúposti). To, čo uživateľ zadá z klávesnice, sa uloží do premennej i. Potom sa zas niečo vypíše a očakáva sa vstup ďalšieho celého čísla, ktoré sa uloží do premennej j. Nakoniec sa vypíše obsah oboch premenných a ich súčet.

Pozor!!! Vo funkcii scanf sa do úvodného reťazca okrem riadiacich znakov (ako napr. %f, %c, %d) nič nepíše. Ak by ste tam aj niečo napísali, na termináli sa to neobjaví a môže to spôsobiť zmätok, takže ani do premenných sa vám nič nenačíta.

Úloha č.1 Napíšte a skompilujte uvedený program. Pochopte, ako funguje. Spustite ho viackrát. Vyskúšajte zadať aj iný vstup, než program očakáva (napr. nejaké písmená)

Patrilo by sa vysvetliť, prečo sa do printf píšu premenné normálne a do scanf pred ne treba písať &. Postupnosť znakov &i znamená "miesto, kde sa v pamäti nachádza premenná i". Ak by ste napísali príkaz printf("%d",&i); program vám nevypíše, čo sa nachádza v krabičke nazývanej "i", ale adresu v pamati, kde sa tá krabička na čísla nachádza. Môže to fungovať napríklad takto:

#include <stdio.h>
main()
{
    int i;
    i = 5;
    printf("Premenna i je na adrese %x a obsahuje cislo %d\n",&i,i);
}
(Riadiaci znak %x vypíše celé číslo v šestnástkovej sústave, ktorá sa zvyčajne používa na určenie adresy v pamäti.)

Keď používame funkciu printf, ide nám väčšinou o to, aby sme zistili, čo sa v premenných nachádza. Vtedy tam & nedávame. Keď ale používame funkciu scanf, musíme počítaču povedať, kam do pamäte má načítanú hodnotu uložiť. Keď ju chceme uložiť do premennej cis, ako parameter dáme funkcii scanf výraz &cis, ktorý jej povie, kam do pamäte má načítanú hodnotu uločiť -- na to miesto, kde sa nachádza premenná cis.

Keď tomu rozumiete, tešte sa. Keď nie, zapamätajte si, že do scanf treba dať pred meno premennej & a tiež to nejak pôjde.



Nasledovné programy píšte tak, aby sa správali slušne, aby povedali, čo od vás chcú a aby povedali, čo vypisujú.

Úloha č.2 Napíšte program, ktorý načíta dve strany obdĺžnika a vypíše jeho obsah.

Úloha č.3 Napíšte program, ktorý načíta znak a vypíše jeho ASCII kód.

Úloha č.4 Napíšte program, ktorý načíta číslo, vypíše číslo o jedna väčšie a komentár Haha, vyhral som !!!

Úloha č.5 Napíšte program, v ktorom deklarujete tri premenné typu int a vypíšete adresy v pamäti, na ktorých sa nachádzajú. Koľko bajtov zaberá jedna premenná typu int?

Anino Belan 2003-10-26