Documente Academic
Documente Profesional
Documente Cultură
-1-
INFORMATIC*I*
Tabelul urmtor conine o descriere detaliat a funciilor pentru operaiile I/O la nivel de caracter:
Funcie
Exemple
Descriere
Rezultat
int getchar();
char c;
c=getchar();
Citete un caracter
int getche();
char c;
c=getche();
int getch();
char c;
c=getch();
int
c);
putch(int char c;
putch(c);
Funciile getch, putch, getche nu sunt standard, de aceea este bine s se evite utilizarea lor!
Tabelul urmtor conine o descriere detaliat a funciilor pentru operaiile I/O cu iruri de caractere:
Funcie
Exemple
Descriere
Rezultat
utilizare
char * gets(char * s);
char sir[10];
gets(sir);
Citete caractere pn la
ntlnirea lui Enter; acesta
nu se adaug la irul s.
Plaseaz /0 la sfritul lui s.
Obs: codul lui Enter e scos
din buffer-ul de intrare.
Tiprete irul primit ca
parametru, apoi NewLine,
cursorul
trecnd
la
nceputul rndului urmtor
Returneaz
adresa
primului caracter din ir.
Dac se tasteaz CTRL+Z
returneaz NULL.
Returneaz codul ultimului
caracter din ir sau EOF la
insucces
INFORMATIC*I*
caracterele din format care nu fac parte din descriptori se tipresc pe ecran.
%o
%u
%x, %X
%c
caracter
%s
%f, %F
%e, %E
%g, %G
%p
%ld, %li
%%
caracterul procent
-3-
INFORMATIC*I*
int a=3;
printf ("%d\n",a);
// afieaz 3 ca ntreg i trece la linia urmtoare
int a=5, b=7;
printf ("a=%d b=%d\n", a, b);
// afieaz a=5 b=7 i trece la linia urmtoare
int g=30, m=5, s=2;
printf ("%2d grade %2d min %2d sec\n", g,m,s);
// afieaz 30 grade 5 min
2 sec i trece la linia urmtoare
int anInt = 12345;
float aFloat = 55.6677;
double aDouble = 11.2233;
char aChar = 'a';
char aStr[] = "Hello";
printf("The int is %d.\n", anInt);
// afieaz:The int is 12345.
printf("The float is %f.\n", aFloat);
// afieaz:The float is 55.667702.
printf("The double is %f.\n", aDouble);
// afieaz:The double is 11.223300.
printf("The char is %c.\n", aChar);
printf("The string is %s.\n", aStr);
// afieaz:The char is a.
// afieaz:The string is Hello.
Programatorul trebuie s asigure concordana dintre descriptorii de format i tipul variabilelor sau
expresiilor argument, deoarece funciile scanf i printf nu fac nici o verificare i nu semnaleaz
neconcordane. Exemplele urmtoare trec de compilare (fr mesaj de eroare) dar afieaz incorect
valorile variabilelor:
int i=3;
float f=3.14;
printf ("%f \n", i);
printf ("%i \n", f);
Funciile scanf i printf folosesc noiunea de cmp (field): un cmp conine o valoare i este separat
de alte cmpuri prin spaii. Fiecare descriptor de format poate conine mrimea cmpului, ca numr
ntreg. Aceast mrime se folosete mai ales la afiare, pentru afiare numere pe coloane, aliniate la
dreapta. n lipsa acestei informaii mrimea cmpului rezult din valoarea afiat.
-4-
INFORMATIC*I*
Exemple:
printf("%d %d",a,b);
printf("%8d8%d",a,b);
Dac nu se precizeaz mrimea cmpului i numrul de cifre de la partea fracionar pentru numere,
atunci funcia printf alege automat aceste valori:
dimensiunea cmpului rezult din numrul de caractere necesar pentru afiarea cifrelor,
semnului i altor caractere cerute de format;
numrul de cifre de la partea fracionar este 6 indiferent dac numerele sunt de tip float sau
double sau long double, dac nu este precizat explicit.
Se poate preciza numai mrimea cmpului sau numai numrul de cifre la partea fracionar.
Exemple:
float a=1.; double b=0.0002; long double c=7.5; float d=-12.34;
printf ("%.0f %20lf %20.10Lf %f \n", a, b, c, d);
Specificnd dimensiunea cmpului n care se afieaz o valoare, putem realiza scrierea mai multor
valori n coloane. Dac valoarea de afiat necesit mai puine caractere dect este mrimea
cmpului, atunci aceast valoare este aliniat la dreapta n cmpul respectiv.
Secvena urmtoare va scrie trei linii, iar numerele afiate vor apare ntr-o coloan cu cifrele de
aceeai pondere aliniate unele sub altele:
int a=203, b=5, c=16;
printf (%10d \n %10d \n %10d \n,a,b,c);
Formatul cu exponent (%e) este util pentru numere foarte mari, foarte mici sau despre ale cror
valori nu se tie nimic. Numrul este scris cu o mantis fracionar (ntre 0 i 10) i un exponent al
lui 10, dup litera E (e).
La formatul %g printf alege ntre formatul %f sau %e n funcie de ordinul de mrime al
numrului afiat: pentru numere foarte mari sau foarte mici formatul cu exponent, iar pentru
celelalte formatul cu parte ntreag i parte fracionar.
-5-
INFORMATIC*I*
ntre caracterul % i literele care desemneaz tipul valorilor scrise mai pot apare, n ordine:
a) un caracter ce exprim anumite opiuni de scriere:
- (minus): aliniere la stnga n cmpul de lungime specificat
+ (plus): se afieaz i semnul + pentru numere pozitive
0 : numerele se completeaz la stnga cu zerouri pe lungimea w
# : form alternativ de scriere pentru numere
b)
un numr ntreg w ce arat lungimea cmpului pe care se scrie o valoare, sau
caracterul * dac lungimea cmpului se d ntr-o variabil de tip int care precede
variabila a crei valoare se scrie.
c) punct urmat de un ntreg, care arat precizia (numrul de cifre de dup punctul zecimal)
cu care se scriu numerele nentregi.
d) una din literele h, l sau L care modific lungimea tipului numeric.
//xx
Helloxx
//xxHello
xx
n general trebuie s existe o concordan ntre numrul i tipul variabilelor i formatul de citire sau
scriere din funciile scanf i printf, dar aceast concordan nu poate fi verificat de compilator i
nici nu este semnalat ca eroare la execuie, dar se manifest prin falsificarea valorilor citite sau
scrise. O excepie notabil de la aceast regul general este posibilitatea de a citi sau scrie corect
numere de tip double cu formatul %f (pentru tipul float), dar nu i numere de tip long double (din
cauza diferenelor de reprezentare intern a exponentului).
IB.03.3.2 Funcia scanf
Descriptorii de format admii n funcia scanf sunt:
Specificatori format
Descriere
%d
ntreg zecimal cu semn
%i
%o
%u
%x, %X
INFORMATIC*I*
%c
%s
%ld, %li
%lf
%Lf
%[]
%[^]
%%
caracterul procent
Dup cum spuneam mai sus, argumentele funciei scanf sunt de tip pointer i conin adresele unde
se memoreaz valorile citite. Pentru variabile numerice aceste adrese se obin cu operatorul de
adresare (&) aplicat variabilei care primete valoarea citit.
Numerele citite cu scanf pot fi introduse pe linii separate sau n aceeai linie dar separate prin spaii
sau caractere Tab. ntre numere succesive pot fi oricte caractere separator (\n,\t, ). Un numr
se termin la primul caracter care nu poate apare ntr-un numr.
Exemple:
int n, a,b;
scanf("%d", &n);
scanf("%d%d", &a,&b);
float rad;
scanf("%f", &rad);
char c;
scanf("%c", &c);
-7-
INFORMATIC*I*
La citirea de iruri trebuie folosit un vector de caractere, iar n funcia scanf se folosete numele
vectorului (echivalent cu un pointer). Exemplu:
char s[100];
scanf(%s, s);
scanf(%s, &s);
Chiar i spaiile trebuie folosite cu atenie n irul format din scanf. Exemplu de citire care poate
crea probleme la execuie din cauza blancului din format:
scanf("%d
",&a);
// corect este
scanf (%d,&a);
Funcia scanf nu poate afia nimic, de aceea pentru a precede introducerea de date de un mesaj (prin
care este anunat utilizatorul c se ateapt introducerea unei date) trebuie folosit secvena printf,
scanf. Exemplu:
printf ("n= ");
scanf ("%d", &n);
//
//
//
//
//
Observaii
Toate funciile de citire menionate (excepie getch, getche) folosesc o zon tampon (buffer) n care
se adun caracterele tastate pn la apsarea tastei Enter, moment n care coninutul zonei buffer
este transmis programului. n acest fel este posibil corectarea unor caractere introduse greit
nainte de apsarea tastei Enter.
Caracterul \n este prezent n zona buffer numai la funciile getchar i scanf, dar funcia gets
nlocuiete acest caracter cu un octet zero, ca terminator de ir n memorie (rezultatul funciei gets
este un ir terminat cu zero).
-8-
INFORMATIC*I*
Funcia scanf recunoate n zona buffer unul sau mai multe cmpuri (fields), separate i terminate
prin caractere spaiu (blanc, \n, \r,\f); drept consecin, preluarea de caractere din buffer se
oprete la primul spaiu alb, care poate fi i caracterul terminator de linie. La urmtorul apel al
funciei getchar sau scanf se verifica dac n zona buffer mai sunt caractere, nainte de a atepta
introducerea de la tastatura i va gsi caracterul terminator de linie rmas de la citirea anterioar.
Pentru ca un program s citeasc corect un singur caracter de la tastatur avem mai multe soluii:
apelarea funciei fflush(stdin) nainte de oricare citire; aceast funcie golete zona buffer
asociat tastaturii i este singura posibilitate de acces la aceast zon tampon.
introducerea unei citiri false care s preia terminatorul de linie din buffer (cu getchar(), de
exemplu).
utilizarea funciei nestandard getch (declarat n conio.h), funcie care nu folosete o zon buffer
la citire
citirea unui singur caracter ca un ir de lungime 1:
char c[2];
scanf (%1s,c);
Unele medii integrate nchid automat fereastra n care se afieaz rezultatele unui program. Pentru
meninerea rezultatelor pe ecran vom folosi fie o citire fals (pune programul n ateptare) fie
instruciunea: system(pause); din stdlib.h.
IB.03.3 Fluxuri de intrare/ieire in C++
n C++ s-a introdus o alt posibilitate de exprimare a operaiilor de citire-scriere, pe lng funciile
standard de intrare-ieire din limbajul C. n acest scop se folosesc cteva clase predefinite pentru
fluxuri de I/O (declarate n fiierele antet iostream.h i fstream.h).
Un flux de date (stream) este un obiect care conine datele i metodele necesare operaiilor cu acel
flux. Pentru operaii de I/O la consol sunt definite variabile de tip flux, numite cin (console input)
respectiv cout (console output).
Operaiile de citire sau scriere cu un flux pot fi exprimate prin metode ale claselor flux sau prin doi
operatori cu rol de extractor din flux (>>) sau insertor n flux (<<). Atunci cnd primul operand este
de un tip flux, interpretarea acestor operatori nu mai este cea de deplasare binar ci este extragerea
de date din flux (>>) sau introducerea de date n flux (<<).
Operatorii << i >> implic o conversie automat a datelor ntre forma intern (binar) i forma
extern (ir de caractere). Formatul de conversie poate fi controlat prin cuvinte cheie cu rol de
"modificator".
Exemplu de scriere i citire cu format implicit:
#include <iostream.h>
void main ( ) {
int n; char s[20];
cout << " n= "; cin >> n;
cout << " un ir: "; cin >> s;
}
ntr-o expresie ce conine operatorul << primul operand trebuie s fie cout (sau o alt variabil de
un tip ostream), iar al doilea operand poate s fie de orice tip aritmetic sau de tip char* pentru
afiarea irurilor de caractere. Rezultatul expresiei fiind de tipul primului operand, este posibil o
expresie cu mai muli operanzi (ca la atribuirea multipl).
Exemplu:
cout << "x= " << x << "\n";
n mod similar, ntr-o expresie ce conine operatori >> primul operand trebuie s fie cin sau de un
-9-
INFORMATIC*I*
alt tip istream, iar ceilali operanzi pot fi de orice tip aritmetic sau pointer la caractere. Exemplu:
cin >> x >> y;
Este posibil i un control al formatului de scriere prin utilizarea unor modificatori, ns nu vom
detalia aici acest aspect, deoarece nu vom folosi aceste faciliti care in de C++, ele fiind date doar
ca titlu informativ.
- 10 -