Zpět na seznam článků     Číst komentáře (22)     Verze pro tisk

SooM-D 02) Programovani v jazyce C

Autor: Tecquilka   
12.5.2006

Dalsi dil, tentokrat popisuji zakladni operace, konzolovy vstup a vystup a zakladni vetveni pomoci podminky if(). Poznamky piste do komentaru. V tomto dile je uveden ukol, nejlepsi resitele uvedu na konci clanku. :D


Po nejake te dobe jsem se rozhodl sepsat dalsi clanek pojednavajici o programovani v jazyce C. Po precteni tohoto clanku budete schopni (tedy pokud jste precetli minuly clanek) sepsat jednoduche programy. No, nebudu Vas dale napinat a rovnou se do toho pustime :D


[Hlavni funkce]:
V prvnim dile, jsem se zminil o funkci, ktera nese oznaceni "main()". Ti z Vas, kteri maji anglictinu (a umi :D) vi, ze "main()" znamena "hlavni."
Funkce "main()" je hlavni funkci programu. V teto funkci probihaji vsechny deje, ktere naprogramujete (at matematicke vypocty,prace se sockety ci volani jinych funkci). Main je DULEZITOU soucasti Vaseho programu, bez teto funkce nezkompilujete zadny zdrojovy kod do vysledne spustitelne podoby (hlavickove soubory main neobsahuji, nekompiluji se totiz hlav. soubory, ale programy, ke kterym jsou hlavickove soubory prilinkovane). Hlavni funkci tedy piste vzdy, pred praci s promennymi (promenne NEMUSI byt deklarovany uvnitr hlavni funkce, ale na viditelnost promennych se podivame nedy priste). Prozatim budete sepisovat hlavni funkci bez parametru: "main()", ale pozdeji si uvedeme ze i tato funkce muze mit parametry, vcetne jejich zapisu. Hlavni funkce (jako kazda funkce) ma sve telo, vymezene od "{" do "}". Takze na to nezapominejte. Slozene zavorky jsou parovy znak, to je take dulezite vedet.


[Matematicke operace]:
Matematicke oparece patri mezi jedny z nejzakladnejsich operaci, ktere budete provadet. Osobne kdyz jsem zkousel programovat, tak mim prvnim programem byla kalkulacka, budiz to inspiraci i Vam :D V minulem dile jsem psal o operatorech (+,-,*,/ atd.), pomoci kterych lze tyto matematicke operace provadet. Nenapada me co dodat, jelikoz zakladni matematicke operace se ucili vsichni na zakladni skole (tedy doufam ze jste nebyli nemocni na treba scitani ;-P).
Ted co je dulezite znat: nelze beztrestne scitat promenne ruzneho datoveho typu (float + int = int [dojde ke konverzi a odtrzeni desetinne carky]), nemelo by se pracovat pomoci matematickych funkci s textovymi promennymi (de-facto pracujete s jejich ASCII hodnotou). Jazyk C ma v automaticke konverzi vyhodu proti jinym jazykum, uvedu napriklad Pascal. Zde musite cisla z ruznych datovych typu slozite konvertovat, coz nam u jazyku C odpada. Zapis matematicke operace neni nikterak slozity, uvedu priklad:
/*neni zde includovan hlavickovy soubor stdio.h, jelikoz nepouzivam funkci pro vystup (printf();) */
int main()
{
/* s datovym typem integer */
int a,b,c;
a = 5;
b = 10;
c = a + b;
/* s datovym typem float */
float d,e,f;
d = 5.5;
e = 4.5;
f = d + e;
}


Pocitam ze vysledky si domyslite :D, kdybych ale scital promennou "a" s "d", vyjde Vam vysledek 10. Doslo k odtrzeni desetinne carky, ale zaokrouhleni se neprovede. Je dulezite si na tyto drabnosti davat pozor.
Toto co jsem zde uvedl jsou jen zakladni matematicke operace, existuji slozitejsi matematicke operace (napr. mocneni), ktere se vsak resi pomoci specialnich funkci, dale zde mame tzv. modulo, ktere provede celociselne deleni a zjisti zbytek. Modulo se zapisuje znakem procento "%". Zde uvedu priklad: 5%3=2. Cislo dve je zbytek po deleni.
Zjisteni funkci na mocneni, odmocneni apod. necham na Vas, ale stejne je nejspis uvedu nekdy priste jako ukol na doma :D


[Konzolovy vstup/vystup]:
-nikdy nezapominejte vkladat pri praci s vstupem a vystupem patricny hlavickovy soubor
-zlata rada z knihy: pokud programujete aplikaci a vite ze uzivatel nikdy nezada cislo vetsi jak 1000, tak pouzivejte takove promenne, ktere zvladnou praci s hodnotou 10 000, uzivatele radi zkousi veci, ktere nezamyslite


Vstup jednoho znaku:
int getchar();
-nacita jeden znak
-nacita se prirazenim ("promenna = getchar();")
-nemusim zde urcovat
-"prom_int = getchar();"

Vystup jednoho znaku:
void putchar(int znak);
-"vypusti" na konzoli jeden znak
-promennou, kterou chceme vypsat napisi do zavorek
-i pri pouziti retezce znaku dojde k vypisu pouze prvniho znaku
-"putchar( prom_int );"


Format vstupu:
Predtim, nez uvedu funkce printf() a scanf(), uvedu jednu dulezitou vec, kterou je nutne znat a zapamatovat/zapsat si. U neformatovaneho vstupu po jednom znaku urcoval datovy typ nacitaneho cisla/znaku jen datovy typ promenne, zde je jeste nutne urcit format vstupu uvnitr funkci. Toto urcuji dvojznakem ProcentoPismeno, ktere urcuji s jakym datovym typem pracuji. Pri praci s datovym typem integer pouziji format vstupu %d, ale tento format jiz nemohu pouzit pri praci s znakem. Nasledky omylu poznate urcite behem Vasich pokusu. Zde je slibeny vypis:
%c - datovy typ char, jedno pismeno
%s - retezec
%d - signed int (integer se znamenkem)
%ld - Signed Long
%u - unsigned int (integer bezznamenkovy, nemuzu byt v rozsahu zapornych hodnot)
%f - float (s desetinnym mistem)
%Lf - long double (s velkym L)
%lf - double
%x - hexadecimalni cislo malymi pismeny (2ca8)
%X - hex. cislo velkymi pismeny (2CA8)
%o - osmickove cislo (v zivote jsem nepouzil)


Formatovany vstup:
scanf("format", &promenna);
-nacte cislo do promenne podle urciteho formatu
-format odpovida (musi pro korektni zpracovani) datovemu typu
-nutne pouzit ampresand pred promennou, pri zapomenuti se nic neprovede (zadne nacteni)
-"scanf( "%lf" , &double_promenna );
-nevpisujte zadne dalsi znaky, jinak se neprovede cteni korektne
-mohu nacitat vice promennych: "scanf("%d %d", &promA, &promB);"
-pri nacitani muzete promenne rozdelit bud mezerou nebo enterem

Formatovany vystup:
printf("format", promenna);
-vypise hodnotu promenne
-nepouzivam ampresand
-mohu vypisovat hodnotu vice promennych (i ruznych dat, typu): "printf("integer:%d float:%f", int_prom, flo_prom);"
-jak jste si vsimli, pouzivejte s klidnym svedomim texty
-je dulezite udrzovat stejny pocet "dvojznaku" urcujici format a samotnych promennych
-nemusim nutne pracovat s promennymi: "printf("%d", 156);"
-mohu pouzivat matematicke operace: "printf("%d + %d = %d", int_A, int_B, int_A+int_B);"
-mohu pouzivat tzv. bile znaky


Bile znaky:
Bile znaky jsou netisknutelne znaky, ktere presto pouzivate. Jednim z nich je mezera, ci tabulator. Dalsim, a myslim ze i oblibenym znakem je pipnuti :D Bile znaky zapisuji na misto, kam pisi format a ostatni texty. Zde je jejich vypis:
\n -nova radka
\r -navrat na zacatek radky
\f -nova stranka
\t -tabulator
\b -posun doleva
\a -PIPNUTI :D
\\ -zpetne lomitko "\"
\' -apostrof
\" -uvozovky
\0 -NULL, nulovy znak

-pokud chcete vypsat napr. cestu k souboru, tak musite vypisovat timto zpusobem: "printf("c:\\Windows\\system\\soubor \n");"
-jak jste si vsimli, neni nutne, aby funkce printf obsahovala cast s promennymi (avsak taky nemuzete pouzit onoho dvojznaku pro vypis hodnoty z promenne, jelikoz ji nemate :D)
-pokud si myslite ze radku rozdelite obycejnym zapisem mezery, mylite se ... radka je rozdelena az pomoci \n


[Zakladni vetveni]
Tak, ukazali jsme si funkce pro nacteni a nasledneho vypisu z a do promennych. Dalsi veci, kterou ted uvedu je podmineny prikaz, ktery slouzi k vetveni behu programu. Prikaz se jmenuje if(). Pomoci tohoto prikazu mohu urcit podminku a nasledne akce v pripade jeji splneni. Mohu napriklad urcit, ze pokud zada uzivatel cislo 1, pozdravim jej, pokud zada cislo 2, vypisu jinou zpravu apod. Prikaz if() je jeden z nejdulezitejsich prikazu celeho jazyka C. Nepamatuji si zadny program (krom "hello world" :D) kde bych nepouzival podminky.
Prikazu na vetveni je mnohem vice, ale o tech se zminim v dalsich dilech tohoto serialu. Nebudu zde popisovat zbytecne vyhody ci nevyhody proti jinym jazykum, protoze zadne nejsou.
Samotny zakladni zapis podminky if() je takovy:
if( podminka )
{
telo_podminky;
}

Toto byla podminka, u ktere se pri splneni podminky provede cast uvedena v tele podminky ( od "{" do "}" ). Pokud ona podminka neplati, program pokracuje dale, bez ohledu na to, co je v podmince..
Existuje i zapis podminky, kdy pri nesplneni podminky pokracujem v mnou danem sledu instrukci, ktery urcime. Je to rozsirujici vlastnost zakladni podminky, naziva se "else". Zapis je takovyto:
if( podminka )
{
telo;
podminky;
nemusi;
mit_jen_jeden:
prikaz;
}
else
{
jinak_proved;
}

Posledni zapis, ktery uvedu je nekolikanasobna podminka. U teto podminky se kontroluje postupne vicero veci. Pro pochopeni ukazi zapis:
if( podminka )
{
telo1;
}
else if( podminka2 )
{
telo2;
}
else
{
jinak_pokud_neplati;
ani_jedna_podminka;
}

Dalsi veci ktere lze u podminek vyuzivat jsou ruzne operatory. Naucim vas pouziti operatoru "||" (slouzi jako logicke or, nebo) a "&&" (slouzi jako logicke and, a zaroven). Opet ukazi na priklade:
if( promenna > 0 && promenna < 5 )
{
printf("Zadal jsi hodnotu mezi 1-4\n");
}
else
{
printf("Zadal jsi hodnotu ve spatnem rozsahu");
}

Slovni zapis teto ukazky je tento: "Pokud je promenna vetsi jak 0 (cislo 0 uz podminku nesplnuje, protoze neni vetsi, ale rovno) a mensi jak 5 (tzn. maximalne 4), vypis text "Zadal jsi hodnotu mezi 1-4", jinak pokud podmina neplati, vypis toto: "Zadal jsi hodnotu ve spatnem rozsahu."

Ted uvedu jeden priklad ze zivota:
#include
int main()
{
int prom;
printf("Zadej pocet vypitych piv:");
scanf("%d",&prom);
if( prom == 0 || prom > 0 && prom < 5 )
{
printf("Zatim by jsi mel byt OK\n");
}
else if( prom > 4 && prom < 8 )
{
printf("Nejspis jsi v naladicce\n");
}
else
{
printf("Uz jsi toho vypil dost\n");
}
return 0;
}



ZADANI UKOLU:
Naprogramujte mi jednoduchou kalkulacku :D Sve kody vkladejte do prispevku, napisu komentare. Kalkulacka musi umet zakladni matematicke operace, nemusi (ale muze) umet pracovat s desetinou carkou. Uzivatel zada cisla a vybere operaci, probehne vypocet a vypise se vysledek. Nejlepsi resitele budou zmineni v clanku :D (jako motivace).


Nejlepsi resitele:

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 0/0

1  2  3  4  5    
(známkování jako ve škole)