5. Operaţii de I/E cu tastatura/monitorul
• Funcţiile de intrare/ieşire cu tastatura/monitorul sunt incluse în fişierul STDIO.H #include < stdio.h > • Operaţiile de I/E se realizează cu conversie
Scrierea Monitor
M.P.
1
2
Format intern (binar: virgulă fixă, virgulă mobilă)
Format afişabil (ASCII) Format de scriere
Citirea M.P. Tastatura
1
Format extern (ASCII)
2
Format intern Format de citire
Coduri de conversie în formate Ce sunt formatele de intrare/ieşire? Sunt: a) •
•
Şabloane ale modului de reprezentare externă (ASCII) a datelor. Pascal: - la citire format implicit; - la scriere format implicit şi format controlat (:n:m). C: - format explicit mult mai dezvoltat şi convenabil programatorilor.
b) Parametri de indicare a tipului de conversie intern
extern
Exemplu int d; d = 65; printf (“%i”, d); /*scrie 65; conversie ca intreg*/ printf (“%c”, d); /*scrie A; conversie ca un caracter*/ %i, %c sunt coduri de format (coduri de conversie)
Observaţii • Fiecărei variabile (obiect) scrisă/citită trebuie să-i corespundă un cod de conversie în format. • Codurile de conversie din format se redau ca şiruri, care preced obiectele scrise/citite. De fapt, formatele se exprimă în “minilimbaj” (există reguli de construire a şirurilor care redau formatul).
De exemplu: % [aspect] [lăţime] [.precizie] cod_conversie [secvenţă_comandă] • Codurile de conversie se pun în corespondenţă cu “obiectele” de la stânga la dreapta: int a, b; printf(“Nr. 1 = %i, Nr. 2 = %i”, a, b);
Funcţiile de I/E au următoarea sintaxă a parametrilor: ( < sir_format >, obiect1, obiect2, … ) • Şirul de format este încadrat între ghilimele (este şir)! • Fiecărui cod de format trebuie să-i corespundă exact un obiect.
Dacă tipul obiectului nu concordă cu specificatorul (codul) de format, se obţin rezultate imprevizibile (compilatorul nu controlează corespondenţa. DE CE?)
Codurile de format Cod format
Ieşirea formatizată
Observaţii
d
zecimal cu semn (int)
întregi
i
zecimal cu semn (int)
întregi
o
octal fără semn
întregi
u
zecimal fără semn (int)
întregi
x
printf: hexazecimal fără semn (int) litere mici scanf: hexazecimal (int)
întregi
X
printf: hexazecimal fără semn (int) litere mari scanf: hexazecimal (int)
întregi
f
virgulă mobilă [-]dddd.ddd
virgulă mobilă
e
virgulă mobilă [-]d.ddd.e[+/-]dd
virgulă mobilă
g
ca şi f sau e, depinde de precizie
virgulă mobilă
E
ca şi e, utilizează litera E pentru exponent
virgulă mobilă
G
ca şi g, utilizează litera E pentru exponent
virgulă mobilă
c
imprimă un singur caracter
întregi
s
imprimă caractere pînă la ‘\0’ sau pînă la .prec
şiruri
%
caracterul %
%% => %
RETINEŢI, PENTRU PRACTICĂ: • Verifică pe teste intrările/ieşirile, modificând până la obţinerea formatelor externe dorite; • Analizează cu grijă corespondenţa tipul de obiect cu codul de conversie; • Aşteaptă-te la “bug-uri”.
Funcţii de citire/scriere cu format Grupa A: Funcţii generale
Scriere: printf( <sir_format>,
, ,… );
scrie standard pe stdout.
Citire: scanf(<sir_format>, , , …);
citeşte standard de la stdin.
ATENŢIE: ESTE ŞMECHERIA MODULUI ÎN CARE AU FOST CONCEPUTE FUNCŢIILE: • apelul printf transferă valori; • apelul scanf transferă adrese (&). SCRIERE: obiectele pot fi variabile, constante, expresii sau [apeluri de] funcţii; CITIRE: numai adrese de variabile.
Câteva precizări cu privire la citire: • Datele externe pot fi: - separate prin spaţiu (spaţiu, TAB, CR/LF) sau virgulă; - şiruri cu lungimi prestabilite (se dă lungime de şir extern).
Exemple int x, y; scanf(“%i %i”, &x, &y); //separare prin spaţiu scanf(“%i,%i”, &x, &y); //separare prin virgulă scanf(“%5i%2i”, &x, &y); /*bună la fişierele magnetice x este şir de 5 caractere y este şir de 2 caractere */
• Deoarece masivele de date sunt pointeri, când este posibilă specificarea numelui masivului, nu mai trebuie &. Exemple: prelucrarea unui nume: char den[20]; printf(“Nume:”); scanf(“%s”, den); //Atenţie: den este pointer char den[20]; printf(“Caracter:”); scanf(“%c”, den[0]); /* Atenţie: den[0] nu este pointer; deci trebuie &den[0] */
ATENŢIE: La citire, şirul se încheie cu CR/LF sau spaţiu!!! (chiar dacă se dă lungime de câmp) Trebuie găsite alte soluţii!!
Grupa B: Funcţii de I/E specializate pentru şiruri puts(sir); Scrie pe ecran un şir urmat de CR/LF. puts(“ok”); ↔ printf(“ok\n”); gets(masiv_sir); Citeşte un şir până la CR/LF (nu până la spaţiu);
Grupa C: Funcţii de I/E specializate pentru caractere putchar(obiect_caracter); Scrie un caracter, fără CR/LF!! getchar(o); Citeşte un caracter cu ecou. getch(o); Citeşte un caracter fără ecou.