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

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

Standardní vstup a výstup

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

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

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.

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

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

Vstup a výstup datové proudy v C

vstup a výstupv jazyce C

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

vstup a výstupy jazyce C

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

Algoritmizace a programování

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

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

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

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

Úvod do programování. Lekce 1

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

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

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

vstup a výstupy jazyce C

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

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

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

Datové typy pro reálná čísla

Základy programování (IZP)

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

Šifrování/Dešifrování s použitím hesla

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

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

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

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

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

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

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

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

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

NPRG030 Programování I, 2010/11

Algoritmy v jazyku C a C++

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

Základy programování (IZP)

NPRG030 Programování I, 2016/17 1 / :58:13

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

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

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

Teoretické minimum z PJV

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

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

Programovací jazyk C++ Hodina 1

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

Základy jazyka C. Základy programování 1 Tomáš Kühr

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

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

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

Opakování programování

Knihovny funkcí. Chyby v CRT. IUJCE Přednáška č. 9

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

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

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í

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

VISUAL BASIC. Práce se soubory

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

Základy programování v C

Část I. Část 1 Základy programování v C. Přehled témat. Základy programování v C. Jazyk C

Algoritmy v jazyku C a C++

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

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

Struktury a dynamická paměť

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

more Program se zastaví vždy po vypsání jedné stránky textu. Ukončení Ctrl+C less Umožňuje pohybovat se v souboru dopředu i dozadu.

Základy programování (IZP)

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Jazyk C# (seminář 5)

Algoritmy a datové struktury

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Algoritmizace a programování

FORMÁTY SOUBORŮ PRO IMPORT A EXPORT DAT PRO HOMEBANKING PPF banky a.s.

Datové typy pro reálná čísla

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

Programování v Javě I. Leden 2008

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

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

ADT/ADS = abstraktní datové typy / struktury

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Desetinná čísla. pro celá čísla jsme používali typ int. pro desetinná čísla používáme typ double

Základy programování v C

Úvod do programovacích jazyků (Java)

Úvod do programování. Lekce 5

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

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

C2110 Operační systém UNIX a základy programování

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Základy jazyka C. Úvod do programování 1 Tomáš Kühr


Transkript:

Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 CZ.1.07/1.5.00/34.1076 Pro vzdělanější Šluknovsko 32 - Inovace a zkvalitnění výuky prostřednictvím ICT 0202 Ing. Vladimír Ďurči LINUX VY_32_INOVACE_0202_0309 Jazyk C/C++, Standardní vstup - výstup a ukazatele [3/9] JAZYK C - OS LINUX Vytvořeno 6. 6. 2013 Určeno pro Operační systémy 4. ročník, maturitní obor Přílohy Přiložené textové soubory, a zpracované programy IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C Lekce 9

J a z y k C / C + +, S t a n d a r d n í v s t u p - v ý s t u p a u k a z a t e l e Obsah lekce: Úvod... 1 Shrnutí Funkce printf() a ukazatele.... 2 Otázky k opakování..3 Lab..4

Úvod Úvod V této lekci se podíváme na printf() a scanf(), nejznámější funkce ze standardní knihovny, a také na funkce jim podobné. S t a n d a r d n í v s t u p v ý s t u p Programovací jazyk C nemá žádné příkazy pro vstupní a výstupní operace, jako např. FORTRAN, kde příkazy READ a WRITE jsou součástí jazyka. V této kapitole budou popsány některé standardní knihovní funkce provádějící operace vstupu a výstupu. Funkční prototypy standardních knihovních funkcí provádějících vstup a výstup jsou obsaženy v hlavičkovém souboru <stdio.h>. Soubor je v jazyce C chápán jako posloupnost slabik (bytů), která je ukončena určitou speciální kombinací slabik a má své jméno. Ukončovací kombinace - konec souboru, která uľ do obsahu souboru nepatří, má hodnotu symbolické konstanty EOF typu int, (protože pro ukončení posloupnosti znaků je třeba použít jinou hodnotu než znak). Je definována v hlavičkovém souboru stdin, obvykle je reprezentována hodnotou -1. V terminologii jazyka C (i operačního systému UNIX ) se zmíněná posloupnost slabik nazývá proud dat (stream). V tomto odstavci se budeme zabývat funkcemi, které umožňují komunikaci programu se standardním vstupem a výstupem. Vstup a výstup znaků Funkce getchar() je určena pro vstup znaků ze standardního vstupu, funkce putchar() pro výstup znaků na standardní výstup. Funkce mají následující funkční prototypy: int getchar(void); int putchar(int c); Funkce getchar() nemá žádný parametr, návratovou hodnotou této funkce je kód znaku, přečtený ze standardního vstupu stdin. (Jestliže byla přečtena hodnota symbolické konstanty EOF vrací funkce tuto hodnotu.) Funkce putchar má jako argument hodnotu typu int, zadávající kód znaku, který má být zapsán na standardní výstup stdout. Návratová hodnota funkce je kód zapsaného znaku, nebo EOF pokud při výstupu došlo k chybě. Příklad 3. by 1 13: / Program kopiruje znaky ze standardniho vstupu na standardni vystup Ukoncovaci "znak" souboru EOF lze zadat kombinaci 2 klaves: Ctrl+Z / main() { int c; / Testovani konce souboru / while((c=getchar())!=eof) / c=getchar() musi byt v zavorce / 3

} putchar(c); Formátovaný výstup - funkce printf() Vyložíme nyní systematicky základní možnosti použití těchto funkcí. Funkce printf() se používá pro formátovaný výstup dat na standardní výstup stdout. Funkční prototyp má následující tvar: int printf(const char retezec, arg1, arg2,..., argn); Parametry arg1, arg2,... argn jsou obecně výrazy, jejichž hodnoty mají vystoupit v určitém tvaru na stdout. Funkce má proměnný počet argumentů, volání funkce ale musí obsahovat alespoň první argument retezec, tj. formátový řetězec, který obsahuje jednak libovolné znaky, jež se beze změny kopírují na výstup, jednak formátové specifikace (konverze) určující, v jakém tvaru se parametry arg1, arg2,..., argn zobrazí. Vzájemné přiřazení parametrů a konverzí je provedeno podle pořadí zleva doprava. V případě, že ve formátovém řetězci specifikujeme více konverzí, než kolik jsme zadali skutečných parametrů, vznikne chyba a nelze předpovědět co vystoupí. Návratová hodnota funkce printf() udává počet slabik, které byly funkcí zapsány do stdout. Příklad 3. by 1 13: printf("\n2. mocnina %d. prvku pole A je rovna cislu %f",i,a[i]a[i]); Znak '\n' je zde interpretován jako přechod na novou řádku, viz tabulku escape sekvencí v části. Kombinace %d, %f jsou konverze určené pro výstup hodnot po řadě typu int a double, přitom hodnota i se tiskne podle konverze %d a hodnota A[i]A[i]) podle konverze %f. Kdyby byl uvedený příkaz printf() umístěn v cyklu for(i=0;i<3;i++){...} vypadal by výstup pro A i = i, i = 0,1,2 takto: 2. mocnina 0. prvku pole A je rovna cislu 0.000000 2. mocnina 1. prvku pole A je rovna cislu 1.000000 2. mocnina 2. prvku pole A je rovna cislu 4.000000 První argument funkce printf() je, jak vyplývá z jejího funkčního prototypu, ukazatel na konstantní řetězec. V následujícím příkladu je tento ukazatel zadán pomocí identifikátoru pole typu char. Příklad 3. by 1 13: main() { int i; char a[][8]={{"\nahoj,"},{" rad"},{" te"},{" zase"},{" vidim!"}}; char b[15]={"\nja tebe taky!"}; } for(i=0;i<5;i++) printf(a[i]); printf(b); return; 4

výstup tohoto programu by vypadal takto: Ahoj, rad te zase vidim! Ja tebe taky! Formátová specifikace má obecně následující tvar: %[příznaky][šířka][.přesnost][modifikátor]konverze Závorky [] zde označují nepovinné parametry. Jednotlivé položky specifikace vysvětlíme v pořadí jejich důležitosti. Konverze: Konverze je povinný parametr, je označena jedním znakem, mezi znakem % a označením konverze mohou být umístěné další (nepovinné) parametry. Následující tabulka ukazuje, jaké konverze se používají pro výstup hodnot jednotlivých datových typů, eventuálně v jakém tvaru se zobrazí. konverze: typ položky seznamu odpovídající konverzi: %c znak; (je-li hodnota typu int, je převedena na typ unsigned char) %d %i číslo typu signed int, desítkový (dekadický) zápis %u číslo typu unsigned int, desítkový zápis %o číslo typu unsigned int, osmičkový (oktalový) zápis %x %X číslo typu unsigned int, šestnáctkový (hexadecimální) zápis, číslice označené a,b,c,d,e,f nebo A,B,C,D,E,F %f číslo typu float, double, desetinný tvar %e %E číslo typu float, double, semilogaritmický tvar, exponent označen podle konverze e nebo E %g %G číslo typu float, double, tvar zvolen podle výhodnosti zápisu jako desetinný nebo semilogaritmický, exponent je podle konverze (v semilogaritmickém tvaru) e nebo E %s řetězec (bez ukončovacího znaku '\0') %p ukazatel; tiskne se jeho obsah nejčastěji v šestnáctkovém zápisu %n ukazatel na typ int. Na adresu na kterou ukazuje se zapíše počet znaků který byl až dosud tímto voláním zapsán na výstup, netiskne se nic, Modifikátor: h modifikuje konverze d,i na typ signed short int konverze u,o,x,x na typ unsigned short int l modifikuje konverze d,i na typ signed long int konverze u,o,x,x na typ unsigned long int konverze f,e,e,g,g na typ double L modifikuje konverze f,e,e,g,g na typ long double Šířka: n tiskne se alespoň n znaků, mezery se doplňují zprava nebo zleva, viz příznaky 0n tiskne se alespoň n znaků, namísto mezer se doplňují nuly šířka je zadána nepřímo: argument, který "je na řadě" obsahuje šířku, (musí být typu int), následuje argument, který bude vystupovat Přesnost: Přesnost je dekadické číslo, které pro konverze d, i, o, u, x, X znamená minimální počet cifer na výstupu, pro konverze f, e, E, znamená počet cifer za desetinnou tečkou, pro konverze g, G 5

znamená počet významových cifer a pro konverzi s maximální počet znaků. Kromě toho má. a. následující význam:. přesnost je zadána nepřímo: argument, který "je na řadě", obsahuje přesnost,(musí být typu int), následuje argument, který bude vystupovat. znamená totéž co.0 Příznak: - výsledek se zarovná doleva, zprava se doplní mezery není-li uveden, výsledek se zarovná doprava a zleva se doplní mezery nebo nuly + číslo typu signed se vytiskne vždy se znaménkem není-li uveden vynechá se znaménko '+' u kladných hodnot mezera kladné číslo se vytiskne bez znaménka, "+" bude nahrazeno mezerou Příklady: Hodnota: Konverze: Výstup: Poznámka: 3.141592 %7.3 3.141 mezery se doplní zleva 3.141592 %-7.3 3.141 mezery se doplní zprava 369.24 %+11.3E +3.692E+02 Ahoj! %2s Ahoj! Ahoj! %.2s Ah Formátovaný vstup - funkce scanf() Funkce scanf() se používá pro formátovaný vstup dat ze standardního vstupu stdin. Funkční prototyp má následující tvar: int scanf(const char retezec, arg1, arg2,..., argn); Parametry arg1, arg2,... argn jsou adresy proměnných, jejichž hodnoty se mají přečíst ze standardního vstupu. (Jak víme, jsou parametry funkcí volány hodnotou. Chceme-li měnit ve funkci hodnoty některých proměnných, musíme použít jejich adresy jako parametry funkce.) Funkce má proměnný počet argumentů, volání funkce ale musí obsahovat alespoň první argument retezec, tj. formátový řetězec. Tento řetězec obsahuje formátové specifikace (konverze) určující, jak se budou jednotlivé čtené posloupnosti slabik interpretovat. Dále může formátový řetězec obsahovat bílé znaky a ostatní znaky (ASCII znaky různé od % a bílých znaků). Pokud funkce scanf() najde ve formátovém řetězci bílý znak, přečte všechny následující bílé znaky ze vstupu aľ po první jiný znak. Tyto bílé znaky nejsou přitom transformovány v žádnou vstupní hodnotu. Pokud najde funkce scanf() ostatní znak ve formátovém řetězci očekává, že následující znak z stdin bude s tímto znakem totožný. Tento znak bude přečten a ignorován. Formátové specifikace mají následující tvar: %[šířka][modifikátor]konverze Význam parametrů modifikátor, konverze je stejný jako ve formátových specifikacích funkce printf(). Parametr šířka určuje počet znaků tzv. vstupního pole. Bude přečteno maximálně tolik znaků, kolik zadává parametr šířka. Pokud narazí funkce scanf() na bílý znak nebo na znak, který nepatří do zápisu čtené hodnoty, ukončí se čtení dříve. Na rozdíl od funkce printf(), kde lze konverze f, e, E, g, G použít pro výstup hodnot typu float i typu double, lze tyto konverze ve funkci 6

scanf() obvykle použít pouze pro vstup hodnot typu float, zatímco pro hodnoty typu double je nutné použít tyto konverze s modifikátorem l, tedy lf, le, le, lg, lg. Kromě toho mají konverze f, e, E, g, G na vstupu stejný význam, všechny lze je použít k přečtení čísla zapsaného v desetinném i semilogaritmickém tvaru. Návratová hodnota funkce scanf() je počet přečtených vstupních polí. Příklad 3. by 1 13: char c; int i; float r_1; double r_2; char text[9];... scanf("%c%d%f%lf%8s",&c,&i,&r_1,&r_2,text); V uvedeném příkladu je čtení řetězce omezeno na jeho prvních 8 znaků, (devátý znak je vyhrazen pro ukončovací znak '\0'). Návratová hodnota funkce by v našem příkladu byla rovna 5. Vstup a výstup řádek Jak jsme uvedli v předchozí části, pokud narazí funkce scanf() na bílý znak nebo na znak, který nepatří do zápisu čtené hodnoty, ukončí se čtení dříve. To poněkud komplikuje čtení řetězců obsahujících v textu mezery. Naproti tomu funkce gets(), puts() pracují s textovými řádkami jako s celky: char gets(char str); int puts(char str); Funkce gets() přečte řetězec znaků až do znaku '\n' tj. textovou řádku ze standardního vstupního zařízení a uloží ji do řetězce str. Znak '\n' se neukládá a řetězec je automaticky ukončen znakem '\0'. Návratová hodnota funkce je ukazatel na řetězec str. Pokud je řetězec prázdný, vrací funkce hodnotu symbolické konstantu NULL. Funkce puts() vytiskne řetězec str a odřádkuje, tj. vypíše znak '\n'. Funkce vrací nezáporné číslo, v případě že operace nemůže z nějakého důvodu proběhnout je návratová hodnota rovna EOF. Příklady na probrané funkce a některé další uvedeme v části. 7

O t á z k y k o p a k o v á n í 1. V které knihovně jsou definovány funkce printf() a scanf()? 2. Co znamenají zápisy %d, %f, %c ve funkcích printf() a scanf()? 3. Co znamenají zápisy \n, \t, \r ve funkci printf()? 8

L a b 1. Napište program, který krátce pípne! / řešení Zvukovy vystup ============== / int main(void) { printf("tento program kratce pipne \007\n"); return 0; } 2. Napište program, který přečte reálné číslo a vypíše celou jeho část. Zkuste vytvořit více způsobů získání celé části. / řešení Oriznuti desetinne casti ======================== / int main(void) { double f; int i; printf("zadejte realne cislo s desetinnou casti: "); scanf("%lf", &f); printf("1) bez desetinne casti: %.0f - pomoci formatu tisku (!zaokrouhluje)\n", f); printf("2) bez desetinne casti: %d - pomoci explicitni typove konverze\n", (int) f); i = f; printf("3) bez desetinne casti: %d - pomoci implicitni typove konverze\n", i); return 0; } 3. Další příklady / 9

Formatovane cteni a nasobeni realnych cisel =========================================== / int main(void) { double x, y, z; printf("zadej 3 realna cisla: "); scanf("%lf %lf %lf", &x, &y, &z); printf("aritmeticky prumer je: %.2f\n", (x + y + z) / 3); return 0; } / Ruzne vyznamy operatoru / ========================= / int main(void) { int i, j; double f, g; printf("celociselne a realne deleni\n"); printf("delenec Delitel Cele Realne\n"); i = 7; j = 2; f = 7.0; g = 2.0; printf("%5d / %5d = %5d %5.2f\n", i, j, (int)(i/j), (double)(i/j)); printf("%5.2f / %5d = %5d %5.2f\n", f, j, (int)(f/j), (double)(f/j)); printf("%5d / %5.2f = %5d %5.2f\n", i, g, (int)(i/g), (double)(i/g)); printf("%5.2f / %5.2f = %5d %5.2f\n", f, g, (int)(f/g), (double)(f/g)); printf("\ndeleni modulo:\n"); printf("delenec Delitel Zbytek\n"); printf("%4d %% %3d = %5d\n", i, j, i % j); printf("%4d %% %3d = %5d\n", j, i, j % i); return 0; } 10