Vstupy a výstupy v C C-like jazyky se liší řešením vstupů a výstupů, proto jsou zvlášť probrány vstupy a výstupy v C a v C#. Kapitola popisuje formátovaný vstup a výstup v C, formátové specifikace a speciální funkce pro vstup a výstup znaků a řetězců. Na závěr je uvedených několik řešených úloh. Klíčové poj my: Formátovaný vstup a výstup, formátové specifikace, vstup a výstup znaků a řetězců.
Popis funkcí pro vstup a výstup a jeho připojení do programu Popis funkcí pro vstup a výstup je v hlavičkovém souboru stdio.h a připojí se pomocí direktivy: #include <stdio.h>
Formátovaný vstup hodnot Univerzální vstupní funkce pro vstup hodnot do proměnných různého typu je scanf. Formát vstupu dat je určen tzv. formátovou specifikací, která souvisí s typem proměnných, do kterých se zadaná data uloží. Tvar funkce: scanf("formatove specifikace",seznam adres promennych); Před název každé proměnné píšeme ve funkci scanf znak & ve významu adresní operátor.
Formátovaný výstup hodnot Univerzální výstupní funkce pro výstup hodnot proměnných různého typu je printf. Formát výstupu dat je určen tzv. formátovou specifikací, která souvisí s typem proměnných, jejichž hodnota se vypisuje na obrazovku. Tvar funkce: printf("formatove specifikace",seznam promennych); Ve funkci printf před názvy proměnných znak & nepíšeme.
Formátové specifikace 2.11.11
Vstupy a výstupy v C
1/15
Formátová specifikace určuje v jakém tvaru bude hodnota proměnné vypisována. Typ Klíčové slovo Znak char Celé číslo se znaménkem int Desetinné číslo float Desetinné číslo s dvojnásobnou přesností double
Formátová specifikace %c %d %x %o %f %lf
Celá čísla můžeme číst a vypisovat jako: desítková (formátem %d) šestnáctková (formátem %x) osmičková (formátem %o)
Počet formátových specifikací funkcí scanf a printf Počet formátových specifikací se musí rovnat počtu načítaných nebo vypisovaných proměnných. Program 1 Program načte dvě čísla a vypíše jejich součet. #include <stdio.h> #include
int main(){ float a,b; printf("Zadej dve cisla: "); scanf("%f %f",&a,&b); printf("%f",a+b); return 0; }
Do první proměnné uložíme hodnotu podle prvního formátu, do druhé podle druhého formátu, atd. Program 2 Výpis hodnoty proměnné Napište program, který deklaruje jednu celočíselnou proměnnou pojmenovanou cislo. Přiřaďte této proměnné hodnotu 100 a pak pomocí jednoho příkazu printf vypište cislo na obrazovku takto: (a) Hodnota cisla je 100 (b) 64 je hodnota cisla sestnactkove
2.11.11
Vstupy a výstupy v C
2/15
#include <stdio.h> #include int main(){ int cislo; cislo=100; printf("Desitkova hodnota cislo je %d\n",cislo); printf("%x je hodnota cislo sestnactkove\n",cislo); getch(); return 0; }
Program 3 Zadání a výpis různých typů proměnných Program si nejprve vyžádá zadání hodnot příslušného typu, a potom je současně vypíše. Po zadání jednotlivých hodnot je třeba vyprázdnit vstupní zásobník pomocí funkce: fflush(stdin). #include <stdio.h> int main(){ int a; char c; float f; printf("Zadej cele cislo: "); scanf("%d",&a);fflush(stdin); printf("Zadej racionalni cislo: "); scanf("%f",&f);fflush(stdin); printf("Zadej znak: "); scanf("%c",&c);fflush(stdin); printf("Zadal jsi: %d %f %c\n",a,f,c); return 0; }
Program 4 Jednoduchá kalkulačka: zadání dvou čísel a výpis všech aritmetických operací #include <stdio.h> int main(){ float a,b; printf("Zadej dve cisla: "); scanf("%f %f",&a,&b); printf("soucet: %.2f\n",a+b); printf("rozdil: %.2f\n",a-b); printf("soucin: %.2f\n",a*b); printf("podil: %.2f\n",a/b);
2.11.11
Vstupy a výstupy v C
3/15
return 0; }
Formátová specifikace %.2f znamená, že racionální číslo se vypíše na dvě desetinná místa. Chceme - li vypsat hodnotu proměnné float na určitý počet desetinných míst, tak mezi znaky % a f uvedeme tečku a požadovaný počet desetinných míst. Program 5 Výpis čísla, zadaného desítkově šestnáctkově a osmičkově #include <stdio.h> int main() { int a; printf("Zadej cele cislo: "); scanf("%d",&a); printf("setnactkove: %X\n",a); printf("osmickove: %o\n",a); return 0; }
Pro šestnáctkový výpis je použita formátová specifikace %X a pro osmičkový výpis %o. Jestliže uvedeme malé x, budou se šestnáctkové cifry a,b,c,d,e,f vypisovat malými písmeny a jestliže uvedeme velké X, budou se šestnáctkové cifry A,B,C,D,E,F vypisovat velkými písmeny. Program 6 Výpis čísla, zadaného šestnáctkově desítkově a osmičkově #include <stdio.h> int main() { int a; printf("Zadej cele cislo: "); scanf("%x",&a); printf("desitkove: %d\n",a); printf("osmickove: %o\n",a); return 0; }
2.11.11
Vstupy a výstupy v C
4/15
Specifikátory formátu funkcí scanf a printf Kód Formát %c znak %d desítkové celé číslo se znaménkem %i desítkové celé číslo se znaménkem %e semilogaritmický tvar s malým 'e' (vědecká notace) %E semilogaritmický tvar s velkým 'E' (vědecká notace) %f desítkové číslo s pohyblivou řádovou čárkou %g použije se kratší z formátů %e nebo %f %G použije se kratší z formátů %E nebo %f %o osmičkové číslo bez znaménka %s řetězec znaků %u desítkové celé číslo bez znaménka %x šestnáctkové celé číslo bez znaménka (malá písmena) %X šestnáctkové celé číslo bez znaménka (velká písmena) %p zobrazí ukazatel %n přidružený argument je ukazatel na proměnnou typu int, do které se uloží počet dosud vypsaných znaků %% vypíše znak % %hd short %ld long int %lu unsigned long int %lf double %Lf long double
Výpis počtu bytů určitého datového typu Počet bytů určíme pomocí operátoru sizeof: sizeof(datový typ) sizeof(proměnná, nebo výraz příslušného datového typu) Tuto hodnotu můžeme vypsat funkcí printf, a protože je to celé číslo, použijeme formátovou specifikaci %d. Například: long int a; printf("%d\n",sizeof(unsigned long int)); printf("%d\n",sizeof(a));
2.11.11
Vstupy a výstupy v C
5/15
Stanovení počtu bytů a maximálních a minimálních hodnot pro jednotlivé datové typy: Hlavičkový soubor limits.h obsahuje definici konstant, které obsahují minimální a maximální hodnotu jednotlivých celočíselných datových typů. Hlavičkový soubor float.h osahuje totéž pro reálné datové typy. Následující program vypisuje hodnoty těchto konstant s příslušným komentářem. #include <stdio.h> #include #include #include int main(){ printf("char: %d\n",sizeof(char)); printf("int : %d\n",sizeof(int)); printf("short int: %d\n",sizeof(short int)); printf("long int: %d\n",sizeof(long int)); printf("float: %d\n",sizeof(float)); printf("double: %d\n",sizeof(double)); printf("CHAR_BIT: %d\n",CHAR_BIT); printf("CHAR_MAX: %d\n",CHAR_MAX); printf("CHAR_MIN: %d\n",CHAR_MIN); printf("SHRT_MAX: %d\n",SHRT_MAX); printf("SHRT_MIN: %d\n",SHRT_MIN); printf("USHRT_MAX: %d\n",USHRT_MAX); printf("INT_MAX: %d\n",INT_MAX); printf("INT_MIN: %d\n",INT_MIN); printf("UINT_MAX: %.0f\n",(float)UINT_MAX); printf("LONG_MAX: %d\n",LONG_MAX); printf("LONG_MIN: %d\n",LONG_MIN); printf("ULONG_MAX: %.0f\n",(float)ULONG_MAX); printf("FLT_MIN: %e\n",FLT_MIN); printf("FLT_MAX: %e\n",FLT_MAX); printf("FLT_MANT_DIG: %d\n",FLT_MANT_DIG); printf("DBL_MAX: %e\n",DBL_MAX); printf("DBL_MIN: %e\n",DBL_MIN); printf("DBL_MANT_DIG: %d\n",DBL_MANT_DIG); printf("LDBL_MAX: %e\n",LDBL_MAX); printf("LDBL_MIN: %e\n",LDBL_MIN); printf("LDBL_MANT_DIG: %d\n",LDBL_MANT_DIG); return 0; }
2.11.11
Vstupy a výstupy v C
6/15
Výpis programu: char: 1 int : 4 short int: 2 long int: 4 float: 4 double: 8 CHAR_BIT: 8 CHAR_MAX: 127 CHAR_MIN: -128 SHRT_MAX: 32767 SHRT_MIN: -32768 USHRT_MAX: 65535 INT_MAX: 2147483647 INT_MIN: -2147483648 UINT_MAX: 4294967296 LONG_MAX: 2147483647 LONG_MIN: -2147483648 ULONG_MAX: 4294967296 FLT_MIN: 1.175494e-038 FLT_MAX: 3.402823e+038 FLT_MANT_DIG: 24 DBL_MAX: 1.797693e+308 DBL_MIN: 2.225074e-308 DBL_MANT_DIG: 53 LDBL_MAX: 1.797693e+308 LDBL_MIN: 2.225074e-308 LDBL_MANT_DIG: 53
Zadání počtu vypisovaných znaků Počet vypisovaných znaků lze určit tak, že ve formátové specifikaci mezi znak "%" a písmeno, určující typ dat uvedeme konstantu, určující požadovaný počet vypisovaných znaků. Jedná-li se o počet desetinných míst, uvedeme před ním ".". Znak "." uvedeme i před konstantu, určující počet znaků vypisovaného řetězce. #include <stdio.h> #include int main (){ printf("%5d\n", 10); printf("%.5d\n", 10);
2.11.11
Vstupy a výstupy v C
7/15
printf("%.2f\n", 12.3456789); printf("%.10s", "Vypise se 10 znaku tohoto retezce\n"); getch(); return 0; }
Výpis programu: 10 00010 12.35
Speciální funkce pro V/V znaku Kromě univerzálních funkcí scanf a printf můžeme pro čtení a výpis znaků použít speciální funkce: char ch; ch=getchar(); putchar(ch); ch=getch(); putchar(ch); ch=getche();fflush(stdin); putchar(ch); ch=getc(stdin); putc(ch,stdout); putchar(ch);
Speciální funkce pro V/V řetězce Pro načtení řetězce musíme nadelkarovat pole znaků: char s[počet]; Pro načtení použijeme funkci: gets(s); Pro výpis použijeme funkci: puts(s); Načítáme-li řetězec funkcí gets(s), může řetězec obsahovat mezery. Při načítání řetězce pomocí scanf("%s",s) to není možné. Speciální funkce pro znaky a pro řetězce jsou rovněž rychlejší, než obecné funkce V/V, využívající formátovaný V/V (scanf a printf).
2.11.11
Vstupy a výstupy v C
8/15
Řešené úlohy 1.
Jak byste vypsali tento řádek pomocí funkce printf( )?
Sleva: 20% původní ceny printf("Sleva: 20%% puvodni ceny");
2.
Ukažte, jak zobrazit číslo 1023.03456 tak, aby se vypisovala jen dvě desetinná místa.
printf ( "%.2f\n",1023.03456) ;
3. Napište program, který připočítává k zadané ceně 15% daň a vypíše ji dvakrát: s desetinnými místy a zaokrouhlenou na celé číslo float cena; scanf("%f",&cena); cena=1.15*cena; printf( "%f %.0f\n",cena,cena);
4.
Napište program, který načte cenu a daň a vypíše cenu s daní
float cena,dan; scanf("%f",&cena); scanf("%f",&dan); cena=dan/100*cena+cena; printf( "%f %.0f\n",cena,cena);
5. Napište příkazy, pomocí kterých přečteme šířku a výšku obdélníka a vypíšeme jeho obsah float sirka,vyska; scanf("%f",&sirka); scanf("%f",&vyska); printf( "%f\n",sirka*vyska);
6. Výpis hodnot výrazů Jsou dány definice: int a = 2 , b = 2 , c = 1, d = 0 , e = 4; Napište program, který vypíše hodnoty následujících výrazů: a) ++a / c-- * e++ b) ++b * --c - ++a c)-b – c++ d) --a - ++e e) --e / ++a * ++b/ c-f) a%= b - d - 1 + e / 2 Správnost zkontrolujte vlastním výpočtem. int a = 2 , b = 2 , c = 1, d = 0 , e = 4; printf( "%d\n",++a / c-- * e++);
2.11.11
Vstupy a výstupy v C
9/15
a = 2 ; b = 2 ; c = 1; d = 0 ; e = 4; printf( "%d\n",++b * --c - ++a); a = 2 ; b = 2 ; c = 1; d = 0 ; e = 4; printf( "%d\n",b - c++ ); a = 2 ; b = 2 ; c = 1; d = 0 ; e = 4; printf( "%d\n",--a - ++e ); a = 2 ; b = 2 ; c = 1; d = 0 ; e = 4; printf( "%d\n",--e / ++a * ++b/ c-- ); a = 2 ; b = 2 ; c = 1; d = 0 ; e = 4; printf( "%d\n",a%= b - d - 1 + e / 2 );
Vypíše se: 12 -3 1 -4 3 2
7.
Napište program, který přečte reálné číslo a vypíše jeho celou a desetinnou část.
float a; int cela; float desetinna; scanf("%f",&a); cela=(int)a; desetinna=a-cela; printf( "%d %f\n",cela,desetinna);
8. Napište program, který přečte dvě velká písmena a vypíše dvě odpovídající malá písmena. Lze využít skutečnost, že ASCII kód malého písmena je o 32 větší, než ASCII kód velkého písmena. char a,b; scanf("%c %c",&a,&b); printf( "%c %c\n",a+32,b+32);
9. Napište program, který přečte tři malá písmena a vypíše je jako tři velká písmena v obráceném pořadí. char a,b,c; scanf("%c %c %c",&a,&b,&c); printf( "%c %c %c\n",c+32,b+32,a+32);
2.11.11
Vstupy a výstupy v C
10/15
10. Výpis rozsahu datových typů unsigned int a signed int Napište program, který vypíše maximální číslo, které je možno uložit do unsigned int a do signed int Pomůcka: -1 jako signed int je maximální unsigned int a maximální signed int je 1/2 maximálního unsigned int. signed int si=-1; unsigned int usi=(unsigned int)si; printf( "%u\n",usi); si=usi/2; printf( "%d\n",si);
11. Výpis rozsahu datových typů short a long Napište program, který zjistí totéž pro typy short a long. Pro typ short: signed short si=-1; unsigned short usi=(unsigned short)si; printf( "%u\n",usi); si=usi/2; printf( "%hd\n",si);
Pro typ long: signed long si=-1; unsigned long usi=(unsigned long)si; printf( "%lu\n",usi); si=usi/2; printf( "%ld\n",si);
12. Podíl a zbytek po celočíselném dělení Napište program, který objasní všechny způsoby použití operátoru / (dělení celočíselné i reálné) a operátoru % (dělení modulo). int a,b; scanf("%d %d",&a,&b); printf( "Celociselny podil: %d\n",a/b); printf( "Zbytek po celociselnem deleni: %d\n",a%b); printf( "Realny podil: %f\n",(float)a/(float)b);
Po zadání: 100 3
Vypíše se: Celociselny podil: 33 Zbytek po celociselnem deleni: 1 Realny podil: 33.333333
2.11.11
Vstupy a výstupy v C
11/15
13. Napište program, který přečte najednou 5 reálných čísel a vypíše jejich aritmetický průměr na dvě desetinná místa. #include <stdio.h> /* Vypocet prumeru peti cisel */ void main ( ){ int a, b, c, d, e; float prumer; printf("Zadej pet cisel oddelenych mezerami "); scanf (" %d %d %d %d %d", &a, &b, &c, &d, &e) ; prumer= ( a+b+c+d+e ) / 5. ; printf ("Prumer je %.2f\n",prumer) ; }
14. věk.
Napište program, který přečte rok vašeho narozeni a aktuální letopočet a vypíše váš
#include <stdio.h> void main ( ){ /* Výpočet věku */ int vek,rok; printf("Zadejte prosím rok, ve kterem jste se narodil(a):"); scanf (" %d", &vek) ; printf ("jaky ze je letopocet : "); scanf (" %d", &rok) ; printf ("\nJe vam %dlet . \n", rok-vek) ; }
15. Podíl a zbytek po celočíselném dělení Vytvořte program, který načte dvě celá čísla a vypíše jejich podíl a zbytek po celočíselném dělení. int a,b; printf("Zadej dve cisla: "); scanf("%d %d",&a,&b); printf("Celociselny podil prvniho cisla druhym je: %d\n",a/b); printf("Zbytek po celociselnem deleni je: %d\n",a%b);
16.
Vytvořte program, který načte trojciferné číslo, oddělí jednotlivé cifry a vypíše je.
Separace cifer trojciferného čísla int c,c0,c1,c2; printf("Zadejte trojciferne cislo:"); scanf ("%d", &c) ; c0=c%10; c/=10; c1=c%10;
2.11.11
Vstupy a výstupy v C
12/15
c2=c/10; printf ("\n%d %d %d\n", c2,c1,c0) ;
17.
Vytvořte program, který načte 3 hrany kvádru a vypočítá jeho objem a povrch.
float a,b,c,V,S; scanf("%f %f %f",&a,&b,&c); V=a*b*c; S=2*(a*b+a*c+b*c); printf("%f %f",V,S);
18. Převod z desítkové do dvojkové soustavy Pomocí operátoru % můžeme dělat převod do dvojkové soustavy tak, že zadané číslo dělíme dvěma a vypisujeme zbytky. Číslo se v dvojkové soustavě vypíše pozpátku. int a; printf("Zadej
cislo do 255: ");
scanf("%d",&a); printf("%d",a%2); a=a/2; printf("%d",a%2); a=a/2; printf("%d",a%2); a=a/2; printf("%d",a%2); a=a/2; printf("%d",a%2); a=a/2; printf("%d",a%2); a=a/2; printf("%d",a%2); a=a/2; printf("%d\n",a%2);
Jestliže se budou zbytky po celočíselném dělení dvěma ukládat do proměnných b, c, d, e, f, g, h, i, je možné proměnné vypsat v opačném pořadí, a tak získat dvojkovou reprezentaci zadaného čísla. int a,b,c,d,e,f,g,h,i; printf("Zadej
cislo do 255: ");
scanf("%d",&a); b=a%2; a=a/2; c=a%2;
2.11.11
Vstupy a výstupy v C
13/15
a=a/2; d=a%2; a=a/2; e=a%2; a=a/2; f=a%2; a=a/2; g=a%2; a=a/2; h=a%2; a=a/2; i=a%2; printf("%d%d%d%d%d%d%d%d\n",i,h,g,f,e,d,c,b);
Poznámka Kdybychom chtěli převádět do jiné soustavy (např. osmičkové) použili bychom dělení a dělení modulo základem této číselné soustavy. 19. Převod časového údaje Napište program, ve kterém uživatel zadá čas v sekundách a program vypíše hlášení ve formátu: ... s = ... h ... min ... s char vstup; int zadanoSekund,hodin,minut,sekund; printf("Zadejte pocet sekund: "); scanf("%d",&zadanoSekund); // Zjistíme počet hodin - použijeme celočíselné dělení: hodin = zadanoSekund / 3600; // Zjistíme počet minut ve zbytku: minut = (zadanoSekund % 3600) / 60; // Zjistíme počet zbývajících sekund // (zbytek po dělení 60): sekund = zadanoSekund % 60; printf("%d s = %d h %d min %d s\n", zadanoSekund, hodin, minut, sekund);
Rozšíření Jak bychom uvedený program rozšířili, aby nám vypisoval i počet dnů? int zadanoSekund,hodin,minut,sekund,dny; printf("Zadejte pocet sekund: "); scanf("%d",&zadanoSekund);
2.11.11
Vstupy a výstupy v C
14/15
dny=zadanoSekund /( 3600 * 24); sekund=zadanoSekund %( 3600 * 24); // Zjistíme počet hodin - použijeme celočíselné dělení: hodin = sekund / 3600; // Zjistíme počet minut ve zbytku: minut = (sekund % 3600) / 60; // Zjistíme počet zbývajících sekund // (zbytek po dělení 60): sekund = sekund % 60; printf("%d s =%d d %d h %d min %d s\n", zadanoSekund,dny, hodin, minut, sekund);
20. Rozdíl dvou časových údajů Následující program si vyžádá dva časové údaje a vypíše jejich rozdíl v hodinách, minutách a sekundách. int h1,m1,s1,h2,m2,s2,h,m,s,sec; puts("Zadej 1. casovy udaj:"); scanf("%d:%d:%d",&h1,&m1,&s1); printf("%d:%d:%d\n",h1,m1,s1); puts("Zadej 2. casovy udaj:"); scanf("%d:%d:%d",&h2,&m2,&s2); printf("%d:%d:%d\n",h2,m2,s2); h=h2-h1; m=m2-m1; s=s2-s1; sec=h*60*60+m*60+s; printf("Celkem %d s\n",sec); h=sec/3600; sec=sec%3600; m=sec/60; s=sec%60; printf("%d:%d:%d\n",h,m,s); s=h*60*60+m*60+s; printf("Celkem %d s\n",s);
Shrnutí: Uvedená kapitola ukázala možnosti vstupu a výstupu hodnot do různých typů proměnných jazyku C a ilustrovala tyto možnosti řadou příkladů.
2.11.11
Vstupy a výstupy v C
15/15