cool web a perfektni rs- Doporucuji

Sunday, October 07, 2007

Program precte znak, priradi ho promenne c a testuje, zda tento znak byl priznakem konce souboru. Jestlize nebyl, tak telo cyklu while je vykonano. Testovani se znovu opakuje. Kdyz se narazi na konec souboru, prikaz while, stejne jako funkce main, ukonci cinnost. Tato verze programu soustreduje vstup na jedno misto - nyni je uz jen jedno volani funkce getchar - a zkracuje text programu. Vlozeni prirazovaciho prikazu do testovaciho vyra- zu je jednou z moznosti, kdy jazyk C umoznuje vyznamne zkrace- ni textu programu. /Je mozne se o tuto moznost nestarat a a vytvaret "nevnorujici se" text programu, ale tomu se budeme snazit vyhybat./
Je dulezite si uvedomit, ze vlozeni prirazovaciho prikazu do zavorek je opravdu nezbytne. Priorita operatoru != je vyssi nez prirazeni = , z cehoz vyplyva, ze pri nepritomnosti zavo- rek bude prikaz != vykonan drive nez prirazeni =. Proto prikaz
c = getchar() != EOF
je shodny s prikazem
c = (getchar() != EOF)
To ma za nasledek to, ze promenne c bude prirazena hodnota 0 nebo 1 podle toho, zda funkce getchar narazila na konec sou- boru nebo ne /vice o teto problematice bude uvedeno v kapito- le 2/.
Pocitani znaku
Nasledujici program pocita znaky. Je to uprava programu pro kopirovani.
main() /*pocitani znaku na vstupu*/
{
long nc;
nc = 0;
while (getchar(), = EOF)
++nc;
printf("%1d\n",nc);
}
Ő.po 12

Labels:

Sunday, September 30, 2007

Příkaz for

Jak je mozno ocekavat, je mnoho zpusobu, jak napsat program; uvedeme jinou variantu naseho programu pro konverzi teplot
main () /* tabulka prevodu Fahrenheit-Celsius/
{
int fahr
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
printf("%4d %6.1f\n", fahr, (5.0/9.0) * (fahr - 32));
}

Vysledek bude stejny, ale program vypada jinak. Jednou z hlav- nich zmen je zmenseni poctu promennych. Jedina promenna, ktera zustala, je celociselna promenna f a h r /celociselna proto, abychom mohli ukazat, jak pracuje konverze %d v printf/. Dolni a horni mez a hodnota kroku step se objevuji jenom jako kons- tanty prikazu for, ktery je pro nas novinkou. Vyraz pro vypocet prevodu se nyni vyskytuje na miste tretiho argumentu funkce Posledni zmena je prikladem obecneho pravidla jazyka C; v kteremkoliv miste, kde se muze vyskytnout promenna, je mozne pouzit vyraz stejneho typu. Protoze treti argument funkce printf ma byt typu float, aby jej bylo mozno zobrazit konverzi %6.1f, tak na jeho pozici se muze pouzit vyraz v pohyblive radove carce. Prikaz f o r je podmineny prikaz, ktery je zobecnenim prika- zu w h i l e. Jestlize jej porovname s prikazem while, tak jeho cinnost by nam mela byt jasna. Sestava ze tri casti, ktere jsou od sebe oddeleny stredniky.
Prvni cast, iniciace
fahr = 0;
je provedena jednou na zacatku. Druha cast je podminka, ktera ridi cyklus
fahr <= 300;
Podminka je vyhodnocena; jestlize je pravdiva, tak prikazy tela cyklu for jsou vykonany /v nasem pripade je to pouze jedno vy- volani funkce printf/. Potom je vykonana treti cast prikazu for, reinicializace,
fahr = fahr + 20
a znovu je vyhodnocena podminka v druhe casti prikazu for. Cy- klus je ukoncen, jestlize je podminka nepravdiva. Stejne jako u prikazu while muze telo cyklu tvorit jeden nebo skupina pri- kazu, ktere jsou uvnitr slozenych zavorek. Inicializace a reinicializacce mohou byt jednoduche vyrazy. Je lhostejne, pouzijeme-li v programu prikaz for nebo while, ale vzdy se snazime volit tu variantu, ktera vypada jasneji. Prikaz for je vhodny obycejne v takovych prikladech, kdy inicializace a reinicializace jsou jednoduche, logicky svazane prikazy. Prikaz for je tomto pripade kompaktnejsi, protoze prikazy pro rizeni cyklu jsou zde pohromade. Ő.po 3
C v i c e n i 1-5. Modifikujte program pro konverzi teplot
tak aby, tiskl tabulku v opacnem poradi tj. od 300 stup.F
do 0 stup. F.

Labels:

Saturday, September 29, 2007

Rozsah techto typu zavisi na pouzitem typu pocitace. Podrob- nosti jsou uvedeny v kapitole 2. Zakladni typy jsou rovnez pole, struktury, uniony, ukazatele na ne, a funkce, ktere s ni- mi pracuji. Se vsemi temito typy se postupne v textu shledame. Skutecny vypocet v programu pro vypocet prevodni ta- bulky mezi stupni Fahrenheita a stupni Celsia zaciname prirazenim
lower = 0;
upper = 300 ;
step = 20 ;Ő.po 12 fahr = lower ;

ktere nastavi pocatecni hodnoty promennych. Jednotlive pri- kazy jsou oddeleny strednikem. Protoze kazdy radek tabulky je pocitan ze stejneho vy- razu, muzeme pouzit cyklus, ktery je definovan prikazem w h i l e :
while (fahr <= upper)
{
...
}

Podminka v kulatych zavorkach je vyhodnocena. Jestlize je pravdiva /tj. promenna fahr je mensi nebo rovna pro- menne upper/, telo cyklu /tj. prikazy ohranicene slo- zenymi zavorkami { a }/ je vykonano. Potom je podminka znovu vyhodnocena a jestlize je opet pravdiva, telo cy- klu je opet vykonano. Jestlize je podminka nepravdiva /fahr je vetsi nez upper/ cyklus je ukoncen. Protoze jiz nejsou v nasem programu zadne prikazy, tak je pro- gram ukoncen. Telo prikazu w h i l e muze byt tvoreno jednim ne- bo vice prikazy vlozenymi do slozenych zavorek, jako je tomu v nasem programu, nebo jednim prikazem bez sloze- nych zavorek, napr.
while (i < j)
i = 2 * i;
V obou prikladech prikazy, ktere jsou podmineny prikazem
while, zacinaji jednim tabelatorem, takze je mozne na prv- ni pohled urcit, ktere prikazy jsou uvnitr tela cyklu. "Zubova" struktura textu programu zduraznuje logickou strukturu programu. Prestoze v jazyku C nezalezi prilis na pozici prikazu v textu, je vhodne zduraznovat logic- kou strukturu a uzivat mezery, abychom zduraznili clene- ni programu. Doporucujeme psat pouze jeden prikaz na radku a nechavat mezery okolo operatoru. Poloha zavorek neni jiz tak dulezita; my jsme si vybrali jeden z mnoha popularnich zpusobu. Vyberte si i vy svuj zpusob, ktery vam vyhovuje, a ten pak stale pouzivejte. Vetsina cinnosti naseho programu je vykonana v tele smycky while. Teplota ve stupnich Celsia je vypocitana a prirazena promenne celsius prikazem
celsius = (5.0/9.0) * (fahr - 32.0);
Duvod pro pouziti 5.0/9.0 misto jednodussiho 5/9 je ten, ze v jazyku C, stejne v jako mnoha dalsich jazycich, je vysledek celociselneho deleni o r e z a n , takze dese- tinna cast je ztracena. Proto vysledek operace 5/9 je nula a vsechny teploty by byly take nula. Desetinna tec- ka v konstante indikuje, ze se jedna o cislo s pohyb- livou radovou carkou, a proto 5.0/9.0 = 0.555..., coz je to, co jsme potrebovali.Ő.po 12 Rovnez piseme 32.0 misto 32, prestoze fahr je typu float a 32 by bylo automaticky zkonvertovano na float /na 32.0/ pred odecitanim. Je to vlastne jen otazka stylu, presto je vsak lepsi psat konstanty typu float s dese- tinnou teckou i kdyz maji celou hodnotu. Je tim zduraz- nen jejich typ i pro ctenare programu a zajistuje se i stejne chapani veci prekladacem. Podrobna pravidla pro to, zda budou celociselne kon- stanty konvertovany na typ float jsou uvedeny v kapitole 2. Nyni si vsimneme, ze prirazeni
fahr = lower;
a podminka
while (fahr <= upper)
funguje tak, jak ocekavame, tj. ze promenne typu i n t jsou konvertovany na typ f l o a t pred uskutecenim operaci. Tento priklad take podrobneji ukazuje, jak pracuje funkce printf. printf je vlastne obecne pouzitelna funkce pro formatovany vystup. Podrobne bude popsana v kapitole 7. Jejim prvnim argumentem je retezec znaku, ktery ma byt zobrazen a znak % urcuje, kam maji byt dalsi argumenty /druhy, treti.../ umisteny a jakym zpusobem maji byt tis- teny. Napr. v prikazu:
printf ("%4.0f %6.1f\n" , fahr, celsius);
specifikace %4.0f znamena, ze cislo typu float ma byt zobrazeno s delkou ctyr znaku a nema mit desetinnou cast. %6.1f urcuje, ze dalsi cislo bude v delce 6 znaku s jednou cislici za desetinnou teckou: tato specifikace je obdobou formatove specifikace f6.1 ve FORTRANU nebo specifikace f(6,1) v jazyku PL/1. Nektere casti specifikace nemusi byt uvedeny, napr. %6f urcuje, ze cislo ma byt alespon 6 znaku dlouhe; %.2f pozaduje dve mista za desetinnou teckou a cel- kovy pocet znaku neni omezen: %f specifikuje pouze tisk cisla typu float. Printf rovnez rozpoznava %d pro desetinne cele cis- lo, %o pro oktalovou reprezentaci, %x pro hexadecimalni repre- zentaci, %c pro znak, %s pro retezec znaku a %% pro % samo. Kazdy znak % v prvnim argumentu funkce printf je spojen jen s odpovidajici druhym, tretim,... argumentem. Specifikace musi byt presne popsana cisly a typem, jinak dava program nes- myslne vysledky. Mimochodem funkce p r i n t f neni casti jazyka C. Sam ja- zyk C nema definovane operace vstupu nebo vystupu. Funkce printf neni obestrena nejakymi kouzly, je to jen uzitecna funk- ce, ktera je casti standartni knihovny funkci jazyka C. Abychom se mohli soustredit pouze na jazyk C nebudeme az do kapitoly 7 mnoho uvadet o vstupne-vystupnich operacich. Odlozime take do te doby pojednani o formatovanem vstupu. Kdyz budete chtit za- davat cisla jako vstup, prectete si o funkci s c a n f v kap. 7 odstavec 7.4. Scanf je funkce obdobna jako printf, az nato, ze cte vstup misto psani vystupu.

Labels:

Wednesday, September 26, 2007

Vystup bude stejny jako v predeslem prikladu. Je treba si uvedomit, ze dvojice znaku \n reprezentuje pouze jeden znak; znak zmeny, (escape) oznaceny znakem \, umoznuje obecny a rozsiritelny mechanizmus pro reprezenta- ci tezko zobrazitelnych nebo neviditelnych znaku. Napr. \t je symbol pro tabelator, \b pro zpetny posun, \" pro uvozovky a \\ pro obracene lomitko samo.
C v i c e n i 1-2. Pokuste se zjistit co se stane, kdyz retezec znaku, ktery je argumentem funkce printf, obsahuje \x, kde x je nejaky znak, ktery jsme vyse neuvedli.
1.2. Proměnné a aritmetika

Nasledujici program tiskne prevodni tabulku mezi stupni Fahrenheita a stupni Celsia za pouziti vztahu C = (5/9) . (F - 32) 0 -17,8
20 -6.7
40 4.4
60 15.6
... ....
260 126.7
280 137.8
300 148.9

Program vypada takto:
/*tisk prevodni tabulky Fahrenheit - Celsius
pro f=0, 20, ..., 300*/
int lower, upper, step;
main ();
{
float fahr, celsius;
lower = 0; /* dolni mez tabulky teplot */Ő.po 3
upper = 300; /* horni mez */
step = 20; /* hodnota kroku */
fahr = lower;
while(fahr <= upper)
{
celsius = (5.0/9.0) * (fahr - 32.0);
printf ("%4.0f %6.1f\n",fahr,celsius);
fahr = fahr + step;
}
}

Labels:

Monday, September 24, 2007

Programova radka

printf("hello, world\n");
je volanim funkce, ktera se jmenuje printf a jedinym argumentem je retezec znaku "hello, world\n". Printf je knihovni funkce, ktera zobrazuje vystup na terminal /jestlize neni specifikovano jine medium/. V tomto pripade zob- razi retezec znaku, ktery je jejim argumentem. Souvisla rada libovolneho mnozstvi znaku vlozena do uvo- zovek "...." je nazyvana znakovy retezec nebo retezcova konstanta. V teto chvili budou znakove retezce pouzivany jako argumenty funkci jako je napr. funkce p r i n t f. Dvojice znaku \n v retezci je v jazyku C symbolem pro znak nove radky, ktery kdyz je nalezen, posune kurzor na levy okraj nove radky. Kdybychom znaky \n neuvedli /coz mu- zeme udelat jako pokus/, uvidime, ze vystup neni ukoncen pre- sunem na novou radku. Uvedeni dvojice znaku \n je jediny zpusob prechodu na novou radku. Kdyz budete zkouset neco po-Ő.po 12 dobneho jako
printf("hello, world
");

tak prekladac jazyka C bude hlasit chybu /chybejici prave uvo- zovky/. Funkce printf nikdy nevykonava presun na novou radku automa- ticky, proto pro vytvoreni pozadovaneho vystupu muze byt pouzi- to vicenasobne vyvolani funkce printf. Nas prvni program muze tedy vypadat takto
main()
{
printf ("hello,");
printf (" world");
printf ("\n");
}

Labels:

Friday, September 21, 2007

Zacneme strucnym uvodem

do jazyka C. Nasim cilem je ukazat zakladni prvky jazyka na skutecnych programech s tim, ze nebu- dou vynechavany detaily, formalni pravidla ani vyjimky. V tom- to okamziku se nesnazime o kompletnost. Snazime se umoznit cte- narum psat uzitecne programy tak rychle, jak jen je mozne. Soustredime se na tyto zakladni pojmy: promenne a konstanty, aritmetika, vetveni programu, funkce a zaklady vstupu a vystu- pu. Umyslne v teto kapitole vynechavame vlastnosti jazyka C, ktere jsou dulezite pro psani vetsich programu. Jedna se o pointry, struktury, vetsinu z bohateho rejstriku operatoru ja- zyka C, vetsinu prikazu pro podminene vetveni programu a dalsi podrobnosti. Tento pristup ma ovsem sve nevyhody. Zvlastnosti je to, ze kompletni popis urcite vlastnosti jazyka neni na jednom miste. Vzhledem k tomu, ze neni mozne pouzivat od zacatku vsechny moz- nosti jazyka C, priklady nejsou tak strucne a elegantni jak by mohly byt. Snazili jsme se tuto nevyhodu minimalizovat, ale presto na to ctenare upozornujeme. Dalsi nevyhodou je to, ze se budeme v nekolika clancich opa- kovat. Myslime si vsak, ze opakovani vam spise pomuze v uceni, nez ze vas bude obtezovat. Zkuseni programatori by meli byt v kazdem pripade schopni si z teto kapitoly vybrat to, co potrebuji. Zacatecnikum dopo- rucujeme, aby si studium teto kapitoly dopnili napsanim ma- lych programu, ktere jsou modifikaci programu uvedenych.

Labels: