RecapitulareCe mai stiti din lectia anterioara ? Exista functia main() din care sunt apelate
toate functiile, nu ? In functia main() punem cam tot ce ne intereseaza. In
functia main() citim datele, din functia main() scriem datele. In programarea
structurata (care e folosita in C) functia main() este cea mai importanta.
De fapt... ii spune chiar si numele (main=principal).
Bun, v-ati prins care-i structura unui program in C, acum se pune intrebarea
"Cum face altceva?", sau "Cum putem folosi functia main() ca programul sa faca
ce vrem noi sa faca?". Pentru asta avem nevoie de functiile de intrare/iesire
standard puse la dispozitie de C. Pentru a putea folosi functiile standard de
intrare/iesire va trebui sa introducem un header. Un header este un fisier
separat cu terminatia .h in care sunt definite functii, structuri, constante
in functie de scopul headerului. In cazul nostru avem nevoie de headerul
stdio.h (STanDard Input Output) care contine prototipul unor functii
definite in libraria standard C. Headerul se introduce in program in felul
urmator:
#include
In UNIX din moment ce functiile sunt definite in libc (libraria standard) nu e
neaparat necesar sa includem acest header dar e bine sa ne obisnuit sa-l
includem pentru a fi mai usoara portarea programului pe un alt sistem de
operare.
Bun, sa trecem la fapte. Ce stie stdio asta si ce putem face cu el ?
getchar()functia getchar() citeste codul ASCII al unui caracter care il introduceti de
la tastatura. Codul nu este citit direct de la tastatura ci dintr-un buffer din
memorie in care se pastreaza toate caracterele introduse, buffer care se
poate corecta folosind tasta backspace.
Functia se apeleaza sub forma:
char a;
a = getchar();
unde a este o variabila de tip caracter. Dupa executarea
functiei a va lua valoarea returnata de getchar(), adica codul ASCII a tastei
care am apasat-o.
putchar()Afiseaza codul ASCII al unui caracter. Se apeleaza de forma:
putchar(a);
unde a este o variabila care contine un cod ASCII
al unui caracter.
Acum ca stim deja doua functii de intrare/iesire sa facem si un mic programel:
#include
int main(){
char a;
a = getchar();
putchar(a);
putchar('\n');
return 0;
}
Pe linia 1 a programului am inclus headerul stdio.h pentru a putea folosi
functiile getchar() si putchar();
Pe linia 3 incepe functia main;
Pe linia 4 am declarat variabila a de tip char. Adica, variabila a va putea tine
un cod ASCII;
Pe linia 6 folosim functia getchar() pentru a citi un cod de la tastatura
cod care il pune in variabila a.
Pe linia 7 avem deja variabila a care are un anumit continut (dat de noi de la
tastatura). Folosim functia putchar() pentru a afisa continutul variabilei.
Pe linia 8 afisam caracterul newline ('\n') strict din motive estetice

Pe linia 10 returnam 0 ca valoare de iesire pentru functia main() iar pe linia
11 se inchide acolada care marcheaza sfarsitul blocului main().
Simplu, nu ? Copiati codul, compilati-l si jucati-va putin cu el.
Vedeti ce se intampla daca in loc de
char a;
a = getchar();
putchar(a);
puneti ceva de genul asta:
putchar(getchar());
Functioneaza ? Daca
da, incercati sa va dati seama de ce. Daca nu, la fel... incercati sa va dati
seama de ce.
gets()Sa luam un text de 30 de caractere cu functia getchar() e destul de nasol. In
libraria standard exista functia gets() care ne ajuta cu siruri de caractere.
Apelul se face in felul urmator:
char sir[30];
gets(sir);
unde sir poate contine maxim 30 de caractere (dupa cum e
specificat). La apelul functiei gets() utilizatorul va introduce un sir de
caractere iar programul va returna sirul cand utilizatorul va apasa tasta enter.
puts()Daca exista functie pentru citirea unui sir de caractere trebuie sa existe o
functie si pentru afisarea acestuia. Functia puts primeste ca parametru un
sir de caractere care il afiseaza pe ecran. Se foloseste de forma:
char sir[] = "Test";
puts(test);
OK, haideti sa combinam cele doua functii si sa facem un programel mic.
Sa folosim functia gets() pentru a va citi numele iar apoi functia puts() pentru
a-l afisa. Codul va arata de forma:
#include
int main(){
char nume[30];
puts("Care e numele tau?");
gets(nume);
puts(nume);
return 0;
}
Ce face codul de mai sus ? Creaza o variabila nume care poate tine maxim
30 de caractere. Afiseaza "Care este numele tau?", asteapta sa introduceti
un text care va fi salvat in variabila nume iar apoi afiseaza continutul
variabilei nume.
Faceti cateva teste si vedeti ce se intampla daca tastati mai mult de 30
de caractere. Modificati programul si jucati-va putin cu el.
printf()Probabil v-ati dat seama ca nu aveti flexibilitate cu functiile getchar(),
putchar(), gets() si puts(). Poate ca doriti ca intr-o singura linie sa
afisati mai multe date: caractere, numere intregi, numere reale etc. Pentru asta
se foloseste functia printf() (printf formated). Functia ne permite sa afisam
un text si sa controlam modul de afisare. printf() returneaza numarul de
caractere afisate sau -1 in caz de eroare.
Se foloseste in felul urmator:
printf(sir_de_control,parametrul1,parametrul1,...,parametrulN);
unde sir_de_control este un camp text care contine caractere speciale de control
despre care am vorbit si in lectia trecuta. La rulare se inlocuiesc in text
caracterele speciale (specificatorii de format) cu valorile parametrilor
dati functiei, parametrii ce corespund sirurilor de control.
Probabil stiti deja cum se lucreaza cu functia din lectia anterioara asa ca
ma rezum la un exemplu scurt:
printf("Acesta este un numar - %d\n",53);
Observati ca in sirul
de control se pot pune si caractere speciale (newline - \n, tab - \t etc).
Hai a refacem programul de mai sus folosind functia printf. Ar arata cam asa:
#include
int main(){
char nume[30];
printf("Care e numele tau?");
gets(nume);
printf("Salut, %s\n",nume);
return 0;
}
Compilati-l si rulati-l. Alta viata, nu ?

Acum putem formula o propozitie cu variabila nume
scanf()Prin analogia cu printf() va puteti da seama si ce face scanf(). Adica,
citeste (scaneaza) ceva de la tastatura si returneaza in variabilele specificate.
Functia are formatul:
scanf(sir_de_control,$parametrul1,parametrul2,...,parametrulN);
Ce putem face cu scanf() ?
Daca vrem sa citim un numar, putem folosi variabila scanf() in felul urmator:
scanf("%d",&i);
astfel i-am "spus" functiei scanf() ca ii trimitem
un numar intreg ( %d ) care trebuie sa-l stocheze la adresa variabilei i ( &i ).
Observati ca s-a pus un & in fata lui i. Asta pentru ca scanf() asteapta o
adresa la care sa puna variabila, nu o variabila. Momentan obisnuiti-va cu ideea.
Cand ajungem la pointeri intelegeti mai bine ce e & sau * si la ce si cum se
folosesc.
De asemenea, putem "scana" 2 sau mai multe variabile cu scanf() chiar si de
tipuri diferite. Cum facem asta ? In felul urmator:
int a;
char nume[20];
scanf("%s %d",&nume, &a);
Chestia de mai sus spune functiei scanf() ca utilizatorul va introduce o linie
care va avea forma : un sir de caractere (spatiu) un numar ( de ex. 'test 5' ).
Haideti sa facem acum un program care cere numele si varsta pe o singura linie
si apoi le afiseaza:
#include
int main(){
char nume[30];
int varsta;
puts("Introdu numele si varsta pe o singura linie separate de spatiu!");
scanf("%s %d",&nume,&varsta);
printf("Salut, %s!. Stiu ca ai %d ani :D\n",nume,varsta);
return 0;
}
NOTA - Specificatori de formatSpecificatorii de format sunt caracterele alea care le puneti in sirul
de control al functiilor printf() sau scanf(). In functie de specificator
functia stie ce tip de variabila trebuie sa puna la adresa specificata
sau ce tip de variabila trebuie sa citeasca. Mai jos pun o lista a
specificatorilor de format:
COD SEMNIFICATIE
%c - Caracter
%d - Intreg cu semn
%i - Intreg cu semn
%e - Afisare numere reale in format cu exponent
%E - Afisare numere reale in format cu exponent
%f - Afisare cu numere reale, simpla precizie, in format cu virgula
%g - Foloseste cel mai scurt format dintre %e si %f
%G - Foloseste cel mai scurt format dintre %E si %f
%o - Afisarea unui numar in octal
%s - Afisarea unui sir de caractere
%u - Afisare intreg fara semn
%x - Hexazecimal fara semn folosind litere mici
%X - Hexazecimal fara semn folosind litere mari
%p - Afisarea unui pointer
%n - Pointer intreg spre numarul de caractere afisate anterior
%% - Afisarea caracterului %
TemaOK, haideti sa va dau si o tema daca tot suntem la scoala:
Faceti si voi 2-3 programele simplute folosind functiile prezentate mai sus.
Folositi-va imaginatia. Faceti ceva dragut. Astept sa vad ce ati lucrat.