Jdi na obsah Jdi na menu
 


Vstup/Výstup a Operátory , výrazy

8. 10. 2008

Vstup/Výstup

Kde je uveden popis funkcí pro vstup a výstup a jak se připojí do programu?

V hlavičkovém souboru stdio.h a připojí se pomocí direktivy

#include < stdio.h>

Jaká funkce realizuje formátovaný vstup hodnot– uveďte příklad!

scanf(“formatove specifikace“,seznam adres promennych);

Př.:

scanf("%f %c %f",&a,&c,&b);

Před název každé proměnné píšeme znak & ve významu adresní operátor.

Do první proměnné uložíme hodnotu podle prvního formátu, do druhé podle druhého formátu, atd.

 

  Jaká funkce realizuje formátovaný výstup hodnot– uveďte příklad!

printf("formatove specifikace",seznam promennych);

Př.:

printf("a=%f c=%c b=%f", a, c, b);

Jaké znáte formátové specifikace?

Formátová specifikace určuje v jakém tvaru bude hodnota proměnné vypisována.

Typ                                        Klíčové slovo                                     Formátová specifikace

Znak                                                   char                                                    %c

Celé číslo se znaménkem                   int                                                       %d      %x       %o

Desetinné číslo                                   float                                                   %f

Desetinné číslo s dvojnásobnou přesností     double                                    %lf

Bez hodnoty                                                                                                 void

 

 

Celá čísla můžeme číst a vypisovat jako desítková (formátem %d), jako šestnáctková (formátem %x) nebo jako osmičková (formátem %o).

Příklady čtení a výpisu celých čísel v různých formátech jsou uvedeny za otázkou 21.

 

 Kolik formátových specifikací musí funkce scanf (printf) obsahovat?

Počet formátových specifikací se musí rovnat počtu načítaných nebo vypisovaných proměnných.

Výpis hodnoty proměnné

Napište program, který deklaruje jednu celočíselnou proměnnou pojmenovanou num.

Přiřaďte této proměnné hodnotu 1000 a pak pomocí jednoho příkazu printf vypište num na obrazovku takto:

A)    Hodnota num je 1000

B)    1000 je hodnota num

 

#include <stdio.h>

#include <conio.h>

main(){

     int num;

     num=1000;

     printf("Hodnota num je %d\n",num);

     printf("%d je hodnota num je\n",num);

}

 

 

Př.: Zadání a výpis různých typů proměnných

#include <stdio.h>

int main(void)

{

     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;

}

Dobré je po každém čtení použít funkci fflush, která vyprázdní vstupní zásobník.

 

Př.: Jednoduchá kalkulačka: zadání dvou čísel a výpis všech arit. operací

#include <stdio.h>

int main(void)

{

     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);

return 0;

}

Formátová specifikace %.2f  znamená, že racionální číslo se vypíše na dvě desetinná místa.

Př.: Výpis čísla, zadaného desítkově šestnáctkově a osmičkově

#include <stdio.h>

int main(void)

{

     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.

Př.: Výpis čísla, zadaného šestnáctkově desítkově a osmičkově

#include <stdio.h>

int main(void)

{

     int a;

     printf("Zadej cele cislo: ");

     scanf("%x",&a);

     printf("desitkove: %d\n",a);

     printf("osmickove: %o\n",a);

return 0;

}

Př.: Výpis čísla, zadaného šestnáctkově desítkově a osmičkově - zacykleno

#include <stdio.h>

int main(void)

{

     int a;

     while(1){

     printf("Zadej cele cislo: ");

     scanf("%x",&a);

     if(a==0)break;

     printf("desitkove: %d\n",a);

     printf("osmickove: %o\n",a);

     }

return 0;

}

Modifikátory

Pomocí modifikátorů lze upravit základní datové typy.

long použitelné na int i double

short použitelné na int

signed použitelné na celé číslo se znaménkem

unsigned použitelné na celé číslo se znaménkem

Všechny datové typy definované normou ANSI C

Různé datové typy zabírají různé místo v paměti.

ANSI – American National Standard Institute

                              Typická velikost       Minimální rozsah

                              v bitech               

  char                                                       -127 až 127

  unsigned char      8                               0 až 255

  signed char          8                               -127 až 127

  int                        16 nebo 32               -32 767 až 32 767

  unsigned int         16 nebo 32                           0 až 65535

  signed int             16 nebo 32 ,             stejné jako int

  short int               16                             stejné jako int

  unsigned short     int 16                        0 až 65 535

  signed short int    16                             stejné jako int

  long int                32                             -2 147 483 647 až

                                                                       2 147 483 647

  signed long int                                      stejné jako long int

                                                           32       

  unsigned long int 32                             0 až 4 294 967 295

  float                     32                             přesnost na 6 číslic

  double                  64                             přesnost na 10 číslic

  long double          80                             přesnost na 10 číslic

 

Specifikátory formátu funkce 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

 

Stanovení počtu bytů a maximálních a minimálních hodnot pro jednotlivé datové typy:

     #include <stdio.h>

     #include <conio.h>

     #include <limits.h>

     #include <float.h>

    

     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;

     }

char: 1

int : 4

short int: 2

long int: 4

float: 4

double: 8

long double: 8

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

 

 

1. Nechcete-li specifikovat minimální šířku pole, můžete přesto specifikovat přesnost. Stačí dát před hodnotu přesnosti tečku, jak ukazuje následující program:

#include <stdio.h>

int main (void){

printf("%.5d\n", 10);

printf("$%.2f\n", 99.95);

printf("%.10s", "Ne všechno z tohoto řetězce se vytiskne\n");

return 0;

}

Výpis z tohoto programu vypadá takto:

00010

$99.95

Ne všechno

 

 

#include <stdio.h>

int main(void){

int i;

printf ( "%d %f\n%n", 100, 123.23, &i) ;

printf("Dosud bylo vypsáno %d znaků", i);

return 0;

}

Jeho výstup vypadá takto:

100 123.230000

Dosud bylo vypsáno 15 znaků

Patnáctý znak je "nový řádek" .

 

Zadání:

1. Napište program, který vypisuje tabulku čísel. Každý řádek obsahuje číslo a jeho druhou a třetí mocninu. Tabulka začíná číslem 2 a končí 100. Zarovnejte sloupce zleva.

2. Jak byste vypsali tento řádek pomocí funkce printf( )?

Sleva: 40 % původní ceny

3. Ukažte, jak zobrazit číslo 1023.03 tak, aby se vypisovala jen dvě desetinná místa.

 

Příklady:

1)      Co se vypíše?

int i=6,j=5;

            printf( "Soucet je %d" , i + j ) ;

vypíše: Soucet je 11

2) printf ( "Pracovali na 100%%" ) ;

vypíše: Pracovali na 100%

neboť pro výpis znaku "%." je nutné tento znak zdvojit

3) printf ( "Součet je %d\tSoučin je %d\n" , i + j , i * j ) ;

vypíše: Soucet je 11 Soucin je 28 a odřádkuje

4) printf ( "\007Chyba, pokus o deleni nulou. \n" ) ;

pískne a vypíše: Chyba, pokus o deleni nulou. a odřádkuje

5) printf ( "Toto je \ "backslash\ " : ' \\' \n" ) ;

vypíše: Toto je "backslash" : ' \' a odřádkuje

Proto se při tisku používají často pouze apostrofy místo uvozovek, neboť s apostrofy nejsou žádné problémy.

6) printf ( "Toto je ' backslash' . ' \\' \n" ) ;

vypíše: Toto j e 'backslash' . ' \' a odřádkuje

 

Příklady:

printf( "Znak ' %c' ma ASCII kod %d (%XH)\n" , c, c, c) ;

vypíše: Znak ' A' ma ASCII kod 65 (41H)

2.  printf ( "Znak ''%c ma ASCII kod %d (%XH) \n" ,´*´,´*´,´*´);

vypíše: Znak '*' ma ASCII kod 42 (2AH)

3) printf( "Je presne %2d:%2d\n" , hodiny, minuty) ; vypíše např.: Je presne 1:12

nebo např.: Je presne 13: 3

protože počet cifer, který se bude tisknout se dá přímo určit

4) printf ( "Za pivo jsme utratili : %6.2f Kcs . \n" , pocet * cena_piva);

vypíše: Za pivo jsme utratili : 13 . 60 Kcs .

protože 6. 2 znamená, že reálné číslo bude vytištěno na 6 znaků a z nich budou dva za desetinou tečkou a jeden je desetinná tečka

printf( "Kolik stalo %s pivo?\n" , " jedno" ) ;

vypíše: Kolik stalo jedno pivo?

 

Cvičení:

1) Napište program, který vypíše přesně následující text:

James Bond \ "Agent 007" \ # 150% zaruka # /

Spol. s rucenim neomezenym

 

Řešení:

printf("James Bond \\ \"Agent 007\" \\ \# 150%% zaruka \# \n\

Spol. s rucenim neomezenym\n");

 

2) Napište program, který přečte znak a vypíše znak s ASCII hodnotou o jednu vyšší, např.:

vstup : A

výstup : B (ASCII 66)

3) Napište program, který přečte celé dekadické číslo (v rozsahu 0 až 255 a vypíše jeho hexadecimální hodnotu dvouznakově, např.:

vstup : 127

výstup : 7Fh

4) Napište program, který připočítává 25% daň, např.:

vstup : Zadejte cenu bez dane: 100

výstup : Prodejní cena s dani (25%) : 125

5) Napište program, který vypočte obsah obdélníka, např.:

vstup : Zadejte délku a šířku : 5 4

výstup : Obdélník o délce 5 a šířce 4 má obsah 20

6) jsou-li dány definice: int a = 2 , b = 2 , c = 1, d = 0 , e = 4; pak napište programy, které vypíší hodnoty následujících výrazů a správnost zkontrolujte vlastním výpočtem.

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

7) Napište program, který přečte reálné číslo a vypíše jeho celou část. Zkuste využít více způsobů získání celé části.

 

8) Napište program, který přečte tři velká písmena a vypíše je jako tři malá písmena.

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í.

10) 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.

11) Napište program, který zjistí totéž pro typy short a long.

12) 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).

13) Napište program, který přečte najednou tři reálná čísla a vypíše jejich aritmetický průměr na dvě desetinná místa.

14) Napište program, který krátce pípne.

 

Výpočet průměru pěti čísel

#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) ;

}

Výpočet věku

#include <stdio.h>

 void main ( ){

 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) ;

 }

 

Existuje 5 aritmetických operátorů:

+, -, *, / lze je použít s jakýmkoliv základním datovým typem

% zbytek po celočíselném dělení, je použitelný pouze s celočíselným typem

Zápis výrazu lze zpřehlednit závorkami:

(count*num) + (88/val) – (19 % count)

Příklad na %

printf ("%d",5/2);

printf ("%d",5%2);

printf ("%d",4/2);

printf ("%d",4%2);

 

 Obrazek

Obrazek

 

 

scanf("%d",&d);

c0=d%10;

d/=10;

c1=d%10;

c2=d/10;

printf("%d %d %d",c2,c1,c0);

 Obrazek

scanf("%f %f %f",&a,&b,&c);

V=a*b*c;

S=2*(a*b+a*c+b*c);

printf("%f %f",V,S);

scanf("%f %f",&a,&b);

POM=a;

a=b;

b=POM;

 

 


 

 Jaké znáte speciální funkce pro V/V znaku?

int ch;

ch=getchar();

ch=getch();

ch=getche();

ch=getc(stdin);

putc(ch,stdout);

putchar(ch);

Jaké znáte speciální funkce pro V/V řetězce?

char s[počet];

gets(s);

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).

 

K čemu slouží operátory?

K vytváření výrazů.

 Jak dělíme operátory?

Operátory rozdělujeme podle počtu operandů (arity) na:

·operátory unární – mají 1 operand

·binární – mají 2 operandy

·ternární – má 3 operandy

Binární operátory jsou:

·         aritmetické,

·         relační,

·         logické,

·         bitové

·         operátory přiřazení

·         posuvu

 Jak vytváříme výrazy?

Výraz je předpis pro výpočet hodnoty.

Obsahuje operátory a operandy.

Použití některých operátorů má přednost před jinými operátory (má vyšší prioritu).

Priorita operátorů může být změněna pomocí kulatých závorek.

Př.:

(a+b)/(c+d)

Jaký operátor určí velikost typu v Bytech?

sizeof(typ)

Př.:

printf("%d",sizeof(int));

Vypíše velikost celočíselného datového typu v bytech.

Jak vypadá příkaz přiřazení?

Proměnná = výraz;

Př.:

E=(a+b)/(c+d);

Jaké znáte unární operátory? (mají 1 operand)

+, -    plus a mínus před číselnou proměnnou

příklad:

a=-a;  // hodnotu proměnné změníme na opačnou

        

&        reference (získání adresy objektu)         

*        dereference (získání objektu dle adresy)

!        logická negace        

~       bitová negace         

++, -- inkrementace resp. dekrementace hodnoty, prefixový i postfixový zápis      

(typ)            přetypování na typ uvedený v závorkách

sizeof           operátor pro získání délky objektu nebo typu     

Jaké znáte binární operátory?

=         přiřazení

+         sčítání           

-          odčítání        

*          násobení      

/          dělení 

%        zbytek po celočíselném dělení (modulo)         

<<, >>          bitový posun vlevo resp. vpravo            

&         bitový součin (and)           

|          bitový součet (or)

^         bitový vylučovací soucet (xor)   

&&      logický součin (and)         

||        logický součet (or)           

.           tečka, přímý přístup ke členu struktury         

->        nepřímý přístup ke členu struktury      

,           čárka, oddělení výrazů    

<         menší než    

>         větší než      

<=      menší nebo rovno  

>=      větší nebo rovno    

==      rovnost         

!=        nerovnost    

Jaké znáte rozšířené přiřazovací operátory?

Operátor přiřazení lze kombinovat s jinými operátory, např. +=, -=, *=, /=, <<=, ^=        

Př.:

A+=10;

B*=2;

Jaké znáte logické operátory?

&&      logický součin (and)         

||        logický součet (or)           

!           negace (not)

 Jaké znáte relační operátory?

<         menší než    

>         větší než      

<=      menší nebo rovno  

>=      větší nebo rovno    

==      rovnost         

!=        nerovnost    

Jaké znáte bitové operátory?

&         bitový součin (and)           

|          bitový součet (or)

^         bitový vylučovací soucet (xor)   

~         bitová negace         

Jaký znáte adresový operátor a k čemu slouží?

& - slouží k určení adresy proměnné

Jaký znáte podmíněný operátor a k čemu slouží – uveďte příklad!

Ternární operátor:

? :        podmíněný operátor         

Př.:

C=(a>b)?a:b;

Vyhodnotí se výraz v kulatých závorkách (podmínka) a jestliže platí, do C se dá hodnota proměnné a.

Jestliže neplatí, do C se dá hodnota proměnné b.

Do C se teda uloží větší z obou hodnot.

Používá se místo příkazu if, např. za příkazem return ve funkci.

float maximum(float a,float b){

return (a>b)?a:b;

}

Funkce vrátí větší hodnotu z obou parametrů.

K čemu slouží operátor čárka– uveďte příklad!

,           postupné vyhodnocení           zleva doprava 

Př.:

for(I=0,j=0;I<10;I++,j++){…}

Co je to priorita operátorů, uveďte příklad!

Priorita operátorů je přednost při vyhodnocování výrazů. Nejvyšší prioritu mají operátory v prvním řádku následující tabulky a nejnižší v posledním řádku tabulky.

operátor         typ operátoru

[ ], ( ), ., ->     

postfixové ++, postfixové --

prefixové ++, prefixové --, sizeof, & ,*, +, -, ~, !   

přetypování, unární +, unární -       

*, /, %             násobení , dělení, dělení modulo

+ ,-      sčítání, odčítání

<<, >>             bitový posun

<, >, <=, >=    relační

==, != rovnost , nerovnost

^          bitové vylučovací OR (XOR)

|           bitové OR

&&     logické AND

||          logické OR

? :        podmíněné vyhodnocení

=, *=, /=, %=, +=, -=, <<=, >>=, &=, |=, ^=            přiřazení

 

Komentáře

Přidat komentář

Přehled komentářů

Zatím nebyl vložen žádný komentář