2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.



Podobné dokumenty
Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Datové typy pro reálná čísla

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

D DE = = + [ + D[ [ D = - - XY = = + -

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

- jak udělat konstantu long int: L long velka = 78L;

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Operační systémy. Cvičení 3: Programování v C pod Unixem

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Jazyk C++, některá rozšíření oproti C

přetížení operátorů (o)

IUJCE 07/08 Přednáška č. 1

Standardní vstup a výstup

Racionální čísla, operátory, výrazy, knihovní funkce

Základy programování (IZP)


Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

vstup a výstupv jazyce C

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Programovací jazyk C++ Hodina 1

červená LED 1 10k LED 2

Racionální čísla, operátory, výrazy, knihovní funkce

Práce se soubory. Základy programování 2 Tomáš Kühr

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Úvod do programování. Lekce 1

Datové typy pro reálná čísla

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Práce se soubory. Úvod do programování 2 Tomáš Kühr

PROGRAMOVÁNÍ V C++ CVIČENÍ


1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Vstupní a vstupní proudy v C++

vstup a výstupy jazyce C

Teoretické minimum z PJV

Odvozené a strukturované typy dat

Vstup a výstup datové proudy v C


Formátové specifikace formátovací řetězce

Algoritmizace a programování

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

VISUAL BASIC. Práce se soubory

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Zápis programu v jazyce C#

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b


IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

M R 8 P % 8 P5 8 P& & %


Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

11b Další příklady operací vstupu a výstupu (úvod viz 10)


Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Jazyk C++ II. Výjimky

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Programování v Javě I. Leden 2008

Semestrální projekt. Předmět: Programování v jazyce C. Zadání: Operace s maticemi. Uživatelský manuál. ver. 1.0

Základy programování (IZP)

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

5 Přehled operátorů, příkazy, přetypování

2 Datové typy v jazyce C

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

Operační systémy. Cvičení 4: Programování v C pod Unixem

Základy programování (IZP)

- tzv. standardní vstupní a výstupní proud (input / output stream)


10 Práce s řetězci - pokračování

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

Programovanie v jazyku C - ti to zratam...

Algoritmizace a programování

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Programování v Javě I. Únor 2009

Více o konstruktorech a destruktorech

DUM 01 téma: Obecné vlastnosti tabulkového editoru, rozsah, zápis do buňky, klávesové zkratky

4.2 Paměti PROM NiCr. NiCr. Obr.140 Proudy v naprogramovaném stavu buňky. Obr.141 Princip PROM. ADRESOVÝ DEKODÉR n / 1 z 2 n

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Funkce, intuitivní chápání složitosti

Tabulkové processory MS Excel (OpenOffice Calc)


Determinant. Definice determinantu. Permutace. Permutace, vlastnosti. Definice: Necht A = (a i,j ) R n,n je čtvercová matice.

Řešení sady 1. Úvod do programování 1 Tomáš Kühr

Parametrizace, harmonogram

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Proměnná a její uložení v paměti

Úvod do programovacích jazyků (Java)

Základy programování (IZP)

Algoritmizace a programování


Algoritmizace a programování

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Transkript:

Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv copyright To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne) Z toho vyplývá, že není dovoleno tuto ukázku jakýmkoliv zpùsobem dále šíøit, veøejnì èi neveøejnì napø umis ováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod redakce nakladatelství BEN technická literatura redakce@bencz

2 ZÁKLADNÍ FUNKCE A OPERÁTORY 2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce 21 Funkce printf Funkce printf (print formatted) slouží pro formátovaný výpis proměnných nebo výrazů základních datových typů, tato funkce je uvedena v hlavičkovém souboru stdioh Hlavička je uvedena na obr 21 popis formátování int printf(const char* format[,arg1,arg2,,argn]); počet vypsaných znaků formátované hodnoty Obr 21 Hlavička funkce printf Při práci s funkcí printf je třeba dodržet tato pravidla: printf je funkce s proměnným počtem parametrů Povinným parametrem je pouze řetězec format, počet následujících parametrů je volitelný (včetně případu, že je jejich počet nulový), arg1 až argn určují hodnoty, které mají vystoupit ve tvaru popsaném v řetězci format, popis tvaru, v jakém má hodnota arg1 až argn vystoupit, se nazývá konverzí Každá konverze začíná znakem %, za kterým bezprostředně následuje popis konverze Počet konverzí a formátovaných hodnot musí být stejný, jinak obdržíme podivné výpisy, znaky nepatřící do žádné konverze vystoupí tak, jak jsou zapsány Pro lepší vysvětlení uvádíme formát zápisu jedné konverze na obr 22, části zapsané v hranatých závorkách jsou nepovinné (lze je vynechat) Konverze začíná znakem %, následují nepovinné příznaky dle tab 21, nepovinná šířka určuje minimální počet znaků na výstupu (na volná místa se vkládají mezery nebo nuly, pokud uvedená šířka začíná znakem 0), nepovinná přesnost se zapisuje za tečku (význam dle tab 22), nepovinný modifikátor dle tab 23 upravuje výpisy pro modifikované typy a poslední částí je povinná konverze dle tab 24 viz tab 21 viz tab 22 viz tab 24 %[příznaky][šířka][přesnost][modifikátor]konverze začátek konverze minimální počet znaků výstupu viz tab 23 Obr 22 Formát zápisu konverze Jednotlivé části zápisu konverze jsou přehledně uvedeny v tab 21 až 24 2-1

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH Tab 21 Příznaky Příznak Význam zarovnání výpisu doleva (implicitně doprava), výsledek bude opatřen znaménkem + pro kladná čísla (implicitně se + používá pouze pro záporná čísla a kladná čísla nejsou opatřena znaménkem), pro kladná čísla bude výsledek předcházet mezera (záporná čísla budou mezera opatřena znaménkem a mezera se vypustí), převedení výpisu do alternativního tvaru, závisí na použité konverzi (viz tab 24): c, d, i, u nemá efekt, o pokud je číslo nenulové, tiskne se úvodní 0, # x, X tiskne se úvodní 0x (0X), e, E, f tiskne se desetinná tečka i v případě, že za celou částí nejsou číslice (normálně se v tomto případě tečka netiskne), g, G stejné jako e, E s tím, že je jsou vyjmuty vodící nuly Tab 22 Přesnost Konverze Význam d, i, o, u, x, X minimální počet cifer na výstupu, e, E, f počet cifer za desetinnou tečkou Tab 23 Modifikátor Modifikátor Význam h pro konverze d, i, o, u, x, X bude int konvertován na short, pro konverze d, i, o, u, x, X bude int konvertován na long, l pro konverzi f bude float konvertován na double, L pro konverze e, E, f vystoupí číslo v přesnosti long double Tab 24 Základní konverze Konverze Význam c vystoupí znak (c jako char), vystoupí celé číslo se znaménkem v desítkové soustavě (d jako decimal, d, i i jako int), vystoupí celé číslo bez znaménka v desítkové soustavě (u jako u unsigned), o vystoupí celé číslo v osmičkové soustavě (o jako octal), vystoupí reálné číslo v exponenciálním tvaru v přesnosti double (e jako e, E exponent), e pro malý exponent, E pro velký exponent, vystoupí reálné číslo v desetinném tvaru v přesnosti double (f jako f floating point), vystoupí celé číslo v šestnáctkové soustavě (x jako hexadecimal), x, X x pro malé znaky, X pro velké znaky 2-2

2 ZÁKLADNÍ FUNKCE A OPERÁTORY Pro lepší vysvětlení uvedeme několik příkladů použití funkce printf a odpovídající výstupy (symbol značí mezeru) Mějme následující deklarace: int a=-300, b=-5, c=0xabc; float f=123456; printf("%d",a); vypíše celkem 4 znaky: 300 printf("%-5d",b); vypíše celkem 5 znaků: 5, protože bylo požadováno zarovnání doleva a celkový počet znaků byl 5 printf("%05d",b); vypíše celkem 5 znaků: 0005, protože šířka začínala znakem 0 a celkový počet znaků byl 5 printf("%5x",c); vypíše celkem 5 znaků: abc, protože malé x způsobí výpis malými písmeny printf("%#5x",c); vypíše celkem 5 znaků: 0XABC, protože velké X způsobí výpis velkými písmeny a příznak # tiskne úvodní 0X printf("%82f",f); vypíše celkem 8 znaků: 12346, protože je požadována přesnost na dvě místa (zaokrouhlení) a celkový počet 8 znaků printf("%103e",f); vypíše celkem 10 znaků: 1235e+2, protože je požadována přesnost na tři místa (zaokrouhlení) a celkový počet 10 znaků printf("%0f",f); vypíše celkem: 123, desetinná část nebude nyní zobrazena (zaokrouhlí se) 22 Základní operátory Operátory jsou symboly označující matematické nebo logické operace V této chvíli se seznámíme pouze se základními operátory Rozdělení operátorů podle počtu operandů Unární operátory mají jeden operand, zápis je obvykle v prefixové podobě (existují dvě výjimky, které používají postfixový zápis), Binární operátory mají dva operandy, zápis je vždy v infixové podobě, Ternární operátor má tři operandy (viz kapitolu 1313) UNÁRNÍ OPERÁTOR (prefix): x operátor operand UNÁRNÍ OPERÁTOR (postfix): x++ operátor operand BINÁRNÍ OPERÁTOR (infix): a b levý operand operátor pravý operand Obr 23 Rozdělení operátorů 2-3

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH Prefixový a postfixový zápis se používá pouze pro unární operátory Prefix znamená, že se symbol operátoru píše před operand U postfixové formy se symbol operátoru píše za operand Infixový zápis se používá pro binární operátory a symbol operátoru se uvádí mezi levý a pravý operand Aritmetické operátory Všechny aritmetické operátory jsou použitelné jak pro celá čísla (včetně typu char), tak i pro reálná čísla Výjimkou je operátor %, který lze používat pouze pro celá čísla Níže jsou uvedeny jednotlivé aritmetické operátory: Unární + unární + slouží pro označení kladného znaménka čísla, zapisuje se v prefixové podobě, tedy +x, Unární unární slouží pro označení záporného znaménka čísla (tedy násobení 1), zapisuje se v prefixové podobě, tedy x Pro níže uvedené binární operátory +,, *, / platí: jsou-li oba operandy celá čísla, je výsledkem celé číslo, je-li alespoň jeden z operandů reálný, je výsledek také reálný Binární + binární + odpovídá operaci součtu dvou čísel, zapisuje se v infixové podobě, tedy x+y, Binární binární odpovídá operaci rozdílu dvou čísel, zapisuje se v infixové podobě, tedy x y, Násobení * binární operátor * odpovídá operaci součinu dvou čísel, zapisuje se v infixové podobě, tedy x*y, Dělení / binární operátor / odpovídá operaci podílu dvou čísel, zapisuje se v infixové podobě, tedy x/y, jsou-li oba operandy celá čísla, jedná se o celočíselné dělení, je-li alespoň jeden z operandů reálné číslo, jedná se o reálné dělení, Zbytek po dělení % (modulo) binární operátor % získá zbytek po dělení dvou čísel, zapisuje se v infixové podobě, tedy x%y, je použitelný pouze pro celá čísla Operátory +,, *, / lze použít v libovolné kombinaci celočíselných i reálných datových typů Je-li alespoň jedním z operandů reálné číslo, je výsledek opět reálné číslo Zvláštní postavení má operátor /, který podle souvislosti představuje celočíselné dělení (pokud jsou oba operandy celá čísla) nebo reálné dělení (pokud je alespoň jeden operand reálné číslo) Níže je uveden příklad použití operátoru /, jsou kombinovány operandy různých typů a vypsána výsledná hodnota podílu 2-4

6 FUNKCE ZÁKLADNÍ RYSY 6 Funkce základní rysy Pro návrh složitějšího programu je vhodné použít hierarchickou strukturu, která souvisí s postupným návrhem programu metodou shora dolů Tato metoda spočívá v opakovaném rozkladu složitějších problémů na dílčí podproblémy Přecházíme tak od původně abstraktních příkazů (řešící složitější problémy) na příkazy méně abstraktní (řešící dílčí podproblémy) 61 Základy používání funkcí Nejdříve uvedeme základní vlastnosti funkcí Výhody používání funkcí: umožňují rozdělit program do kratších celků, opakující části není třeba několikrát opisovat (případnou chybu opravíme na jediném místě), správnou činnost funkce lze ověřit nezávisle na zbytku programu, vyšší srozumitelnost, návrh programu metodou shora dolů (rozdělení celku na dílčí problémy, které se pak řeší odděleně) Obecný zápis funkce Zápis funkce začíná tzv hlavičkou, která definuje tři významné vlastnosti funkce (viz obr 61): typ návratové hodnoty (typ výsledku funkce), identifikátor funkce (jméno funkce), parametry (vstupně/výstupní operandy), každý parametr se musí definovat samostatně! <typ> <identifikátor>(<parametry>) return <návratová hodnota>; Obr 61 Obecný formát zápisu funkce hlavička funkce tělo funkce (příkazy) Jednotlivé operace, které má funkce vykonat, se zapisují do těla funkce Příkaz return ukončí okamžitě prováděnou funkci a předá její výsledek Jako praktický příklad si můžeme uvést funkci, která ze dvou vstupních celých čísel určí minimum a vrátí ho jako svůj výsledek, viz obr 62 Příkaz else je možné dokonce vynechat, protože příkaz return okamžitě ukončí funkci Takže pokud je podmínka splněna, vrátí se hodnota x a funkce min se ukončí V opačném případě se vrátí hodnota y a funkce min se ukončí int min(int x, int y) if(x<y) return x; else return y; příkaz else je vlastně nadbytečný vrátí jako minimum x a ukončí funkci vrátí jako minimum y a ukončí funkci Obr 62 Zápis funkce min 6-1

PROGRAMOVANÍ V JAZYCE C V PŘÍKLADECH Typ návratové hodnoty Funkce mohou vracet hodnoty prakticky libovolného typu Omezením je pouze skutečnost, že typem návratové hodnoty nesmí být pole Situaci lze však řešit tak, že funkce vrátí ukazatel na pole Typ void Existují případy funkcí, které nemají žádnou návratovou hodnotu Pak je typ návratové hodnoty void Typ void (prázdný) nemůžeme použít pro definici proměnné, nebude mu totiž přidělena žádná paměť Používá se vlastně pouze v případě funkcí Příkaz return nyní nepředává výsledek, ale pouze ukončuje funkci Pokud není třeba provádění funkce předčasně ukončit, nemusíme tento příkaz vůbec používat! Jako příklad funkce bez návratové hodnoty uvedeme funkci, která má na obrazovce opakovaně zobrazit zvolený znak dle jednoho parametru tolikrát za sebou, kolik udává druhý parametr Funkci můžeme nazvat například tiskznaku První parametr bude tedy znak a druhý celé číslo, viz obr 63 znak pro tisk void tiskznaku(char z, int n) lokální proměnná i, existuje pouze uvnitř funkce (těla cyklu) int i; for(i=0;i<n;i++) printf("%c",z); Obr 63 Zápis funkce tiskznaku počet opakování 62 Volání hodnotou Až dosud jsme používali takzvané volání hodnotou Platí pro něj tato pravidla: hodnota skutečného parametru se do formálního parametru zkopíruje, formální parametr je vlastně lokální proměnná, změna formálního parametru tedy nemá vliv na skutečný parametr, jako skutečný parametr muže být použita proměnná nebo literál Na obr 64 je připomenuta funkce tiskznaku Tato funkce má dva formální parametry (znak označený z a celé číslo označené n) formální parametry void tiskznaku(char z, int n) int i; for(i=0;i<n;i++) printf("%c",z); skutečné parametry int i=8; tiskznaku('x',i); Obr 64 Vysvětlení pojmů formální a lokální parametr 6-2

6 FUNKCE ZÁKLADNÍ RYSY Na obr 64 je uvedena možnost volání této funkce Skutečnými parametry mohou být buď proměnné nebo literály Jako první parametr je dosazen literál 'x', jako druhý parametr je dosazena proměnná i Jsou-li parametry volané hodnotou, nevzniká mezi skutečným a formálním parametrem vazba Hodnota skutečného parametru se prostě překopíruje do formálního parametru Takže tělo funkce pracuje s kopií původní hodnoty Jakékoli změny této kopie se tedy nemohou projevit jako změny skutečného parametru Volání odkazem se tedy hodí pouze pro tzv vstupní parametry 63 Volání přes ukazatel Programovací jazyk C nedisponuje voláním parametrů odkazem jako jiné programovací jazyky Realizace výstupních parametrů je založena na volání přes ukazatel Volání parametrů přes ukazatel znamená, že místo hodnot jednotlivých parametrů předáme jejich adresy Přes ukazatel bude mít funkce přístup k proměnné jak pro čtení tak i pro zápis Vazba na skutečný parametr je zprostředkována pomocí adresy skutečného parametru Jako praktický příklad volání parametrů přes ukazatel je uvedena funkce vymena dle obr 65 Účelem této funkce je vzájemně vyměnit hodnoty dvou celočíselných proměnných Taková operace je nezbytná například pro některé algoritmy řazení Parametry pa a pb jsou ukazatele na celá čísla Takže při volání funkce musíme dosadit adresy dvou celočíselných proměnných (není tedy možné jako parametr dosadit literál) Ve funkci je deklarována lokální proměnná c Do této proměnné nejdříve zkopírujeme hodnotu první proměnné, na kterou ukazuje ukazatel pa Operace *pa poskytne přístup k proměnné přes ukazatel pa Následně bude hodnota proměnné odkázaná ukazatelem pa přepsána hodnotou proměnné z adresy pb zápisem: *pa=*pb Na závěr se původní hodnota první proměnné (dočasně uložená v proměnné c) zapíše do druhé proměnné přes ukazatel pb void vymena(int *pa, int *pb) int c=*pa; *pa=*pb; *pb=c; int a=4,b=2; vymena(&a,&b); skutečné parametry 6-3 formální parametry Obr 65 Vysvětlení volání parametrů přes ukazatel Na obr 65 je rovněž uvedena ukázka volání funkce vymena Jsou deklarovány proměnné a, b s hodnotami 4 a 2 Do parametrů funkce vymena musíme dosadit adresy těchto proměnných získanými operacemi &a, &b Funkce vymění hodnoty obou proměnných, takže po jejím volání bude platit: a=2, b=4

PROGRAMOVANÍ V JAZYCE C V PŘÍKLADECH Parametr typu pole Jak již víme z kapitoly 53, představuje název pole vlastně i jeho adresu (resp adresu prvního prvku pole) Parametr typu pole se tedy předává pomocí adresy Volání pole přes ukazatel přináší další výhodu Předává se pouze adresa, nedochází ke kopírování prvků Tento způsob volání parametru je tedy velmi efektivní Jako praktický příklad můžeme uvážit funkci vypis, která vypíše jednotlivé prvky pole (připomeňme, že funkce printf může prvky vypsat pouze tak, že v cyklu vypisuje pole po jednom prvku) Když předáme adresu pole do funkce, nedá se již zjistit, jaká je velikost pole (pole se předává přes ukazatel, který má stále stejnou šířku), proto je nutný druhý parametr, který určuje počet prvků Na obr 66 vlevo je ukázán klasický zápis První parametr je ukazatel na int (představuje ukazatel na pole celých čísel) a druhý parametr slouží k předání počtu prvků pole Na obr 66 vpravo je alternativní zápis, který může být poněkud přehlednější void vypis(int *pole, int n) void vypis(int pole[], int n) parametr typu ukazatel parametr typu ukazatel Obr 66 Parametr typu pole předávaný přes ukazatel Diskutujme ještě chvíli zmíněnou funkci vypis Jelikož tato funkce bude prvky pole pouze číst a nebude provádět jejich změnu, je účelné tuto skutečnost zdůraznit modifikátorem const Vznikne tak ukazatel na konstantní objekt, v případě pokusu změny prvků přes konstantní ukazatel podá překladač varovné hlášení void vypis(const int *pole, int n) parametr typu ukazatel void vypis(const int pole[], int n) parametr typu ukazatel Obr 67 Parametr typu pole předávaný přes konstantní ukazatel (viz PROG_06_03) 64 Příklady Po předcházejícím úvodu přistoupíme k praktickým příkladům Příklad PROG_06-01 Zadání: Napište funkci sgn, která má jako parametr celé číslo a jako výsledek vrací 1; x < 0 celé číslo Chování funkce je popsáno tímto výrazem: sgn( x ) = 0; x = 0 + 1; x > 0 Takto jednoduchý příklad jistě není třeba dokládat vývojovým diagramem Vlastní funkce sgn je velmi jednoduchá a zápis bude podobný jako v případě funkce min dle obr 62 Nyní je příkaz else již zcela vynechán Hlavní program obsahuje cyklus dowhile, který přečte celé číslo z klávesnice a následně vypíše jeho znaménko 6-4

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH long ftell(file *f) vrátí aktuální pozici ukazovátka souboru (při chybě vrací -1L) int fflush(file *f) vyprázdní vyrovnávací paměť (buffer) souboru (tím zajistí zápis dat na disk) 94 Příklady práce se soubory Níže jsou uvedeny příklady práce s textovými a binárními soubory Příklad PROG_09-01 Napište program, který nageneruje řadu deseti náhodných čísel v rozsahu 1 až 1000 a uloží ji do textového souboru s názvem CISLATXT Na začátku programu jsou deklarovány proměnné: dvě celá čísla (jedno pro řízení cyklu a druhé pro generované číslo) a hlavně proměnná typu ukazatel na FILE Následně je vyvolána funkce fopen První parametr je řetězec názvu souboru a druhý odpovídá otevření souboru pro zápis v textové formě Následuje test úspěšného otevření a zápis nagenerovaných čísel pomocí funkce fprintf Nakonec je soubor zavřen pomocí funkce fclose #include <stdioh> #include <stdlibh> int main(int argc, char *argv[]) int i,c; FILE *f; f=fopen("cislatxt","w"); otevření souboru if(f!=null) test úspěšného otevření for(i=0;i<10;i++) c=rand()%1000+1; fprintf(f,"%d\n",c); zápis čísel fclose(f); zavření souboru printf("cisla uspesne zapsana\n"); else printf("soubor se nepodarilo otevrit\n"); Obsah souboru CISLATXT (\r\n odpovídají znaků s pořadovými čísly 13 a 10): 42\r\n 468\r\n 335\r\n 501\r\n 170\r\n 725\r\n 479\r\n 359\r\n 963\r\n 465\r\n system("pause"); return 0; Příklad PROG_09-02 Napište program, který čte čísla z textového CISLATXT, stanoví jejich součet a průměr Proměnné n, s slouží pro počítání čísel a jejich součtu Proto jsou nejdříve 9-6

9 VSTUP A VÝSTUP PROGRAMU vynulovány Proměnná c slouží pro načtení čísla a proměnná f zajišťuje přístup k souboru Soubor je nejdříve otevřen voláním funkce fopen do vstupního textového režimu Čísla ze souboru budeme číst tak dlouho, dokud nebude dosaženo konce souboru Připomeňme, že funkce fscanf vrátí 1 pro úspěšné načtení (jedné konverze) Při nalezení konce souboru vrací hodnotu EOF Je tedy třeba zapsat volání funkce fscanf přímo jako podmínku příkazu while V těle cyklu pak za každé úspěšně načtené číslo zvýšíme obsah proměnné n o 1 a načtené číslo přičteme k obsahu proměnné s Po ukončení cyklu je zobrazen počet načtených čísel a pokud je počet nenulový, vypočítá a zobrazí se i aritmetický průměr #include <stdioh> #include <stdlibh> int main(int argc, char *argv[]) int n=0,s=0,c; FILE *f; f=fopen("cislatxt","r"); otevření souboru if(f!=null) test úspěšného otevření while(fscanf(f,"%d",&c)==1) n++; s=s+c; fclose(f); zavření souboru čtení čísla spojené s testem konce printf("pocet cisel: %d\n",n); printf("soucet cisel: %d\n",s); if(n>0) printf("aritmeticky prumer: %1f\n",(float)s/n); else printf("soubor se nepodarilo otevrit\n"); system("pause"); return 0; Příklad PROG_09-03 Napište program, který uloží údaje osob uložené v poli prvků typu TOsoba (viz kapitolu 84) do binárního souboru OSOBYBIN Nejdříve deklarujeme pole prvků typu TOsoba s pěti položkami nazvané Udaje Pro jednoduchost je provedena inicializace přímo při deklaraci Následně se voláním funkce fopen otevře soubor OSOBYBIN pro zápis v binárním režimu 9-7