Sunteți pe pagina 1din 48

Limbaje de programare II

Suport de curs
prof.univ.dr.Mariana Marinescu

Cuvinte importante:
- elemente de baza ale limbajului C/C++: identificatori, separatori,
comentarii;
- structura unui program C/C++: functia main (), definirea si aplul
unei functii;
- preprocesare: directiva #include si fisierul antet (header),
directiva #define;
- utilizarea functiilor din bibliotecile standard: prototipul unei
functii; apelul functiei dintr-o biblioteca standard;
- etapele dezvoltarii unui program C/C++: compilare, link-editare,
executie;
- variabile: tipuri de variabile predefinite, declararea variabilelor,
variabile locale si globale;
- citirea datelor de la tastatura si afisarea datelor pe ecran in
limbajul C/C++: functia scanf () si functia printf (); fluxul I/O cin si fluxul
I/O cout;

Notiuni introductive
Istoric C/C++:
- 1972 - Brian Kernighan si Dennis Ritchie au conceput un limbaj cu
destinatie universala, denumit C;
- 1980 - Bjarne Stroustrup publica specificatiile limbajului C++, o
extensie a limbajului C destinata programarii orientate pe obiecte.
Setul de caractere folosit:
Setul de caractere utilizat pentru scrierea programelor C/C++ este setul de
caractere al codului ASCII.

Elemente de baza ale limbajului C/C++


Identificatori
Identificatorii, intalniti si sub denumirea de nume simbolice, au rolul de a denumi
elemente ale programului C/C++: constante, variabile, functii etc.
Din punct de vedere sintactic, un identificator este constituit dintr-o succesiune de
litere, cifre sau caracterul _ (liniuta de subliniere), primul caracter fiind obligatoriu
litera sau liniuta de subliniere. Lungimea maxima a unui identificator este de 31 de
caractere.
3

Limbajul C/C++ este case-sensitive, adica face diferenta intre literele mici si
literele mari. De aceea, identificatorii sunt diferiti in functie daca sunt scrisi cu litere
mici si mari.
Cuvintele-cheie (keywords) sunt identificatori speciali, cu inteles predefinit, care pot
fi utilizati numai in constructii sintactice in care sunt specificati. De exemplu: if,
while etc. In limbajul C/C++, toate cuvintele-cheie se scriu numai cu litere mici.
Separatori
Separatorii au rolul de a separa unitatile sintactice:
- Ca separatori generali se utilizeaza caracterele albe: spatiu ( ), TAB
(\t), sfarsit de linie (\n) si comentariile.
- Separatorii specifici sun folositi, de exemplu, pentru a separa unele
constructii sintactice: variabilele sunt separate prin caracterul virgula (,).
- Delimitatorii sunt folositi, de exemplu, pentru:
- a delimita sfarsitul unei instructiuni sau al unei declaratii caracterul punct si virgula (;);
- a delimita o constanta de tip caracter - caracterul apostrof ();
- a delimita constantele sir de caractere(ghilimelele ).
4

Comentarii
Comentariile sunt texte care vor fi ignorate de compilator, dar au rolul de a explicita
si de a face mai lizibil pentru programator anumite secvente de program.
Din punct de vedere sintactic, un comentariu este:
- o succesiune de caractere incadrata intre /* si */ ; aceste comentarii pot fi
formate din mai multe linii;
- o succesiune de caractere care incepe cu // si se termina la sfarsitul unei
singure linii.

Structura unui program C/C++


Un program C/C++ este format dintr-o succesiune de module, denumite functii. Una
dintre aceste functii este functia principala denumita main (). Aceasta functie
delimiteaza instructiunile din programul principal pe care le executa mai intai
calculatorul. Astfel, functia main () este o functie speciala, care trebuie sa apara
obligatoriu o singura data in orice program C/C++.
Cel mai simplu program C/C++ (care nu face nimic) arata astfel:
void main (void)
{}
5

Programul de mai sus nu executa nimic, el fiind constituit numai din functia main ().
In general, o functie este o colectie de instructiuni care executa o anumita sarcina.
O functie se defineste prin:
- antetul functiei;
- corpul functiei.
Antetul functiei contine numele functiei, tipul rezultatului pe care il calculeaza si il
returneaza functia si o lista de parametri, fiecare avand un tip precizat, prin care
functia comunica cu exteriorul ei, incadrata intre paranteze rotunde:
Corpul functiei este constituit din declaratii si instructiuni cara executa diferite
sarcini. Toate declaratiile si instructiunile din corpul functiei sunt incadrate intre
paranteze acolade.
Sintaxa definirii unei functii este:
<tip_rezultat> nume_functie (<lista_parametri>)
{ <corpul_functiei> }

Nota: In cazul functiei main () prezentata mai sus, cuvantul-cheie void, care apare
intre paranteze, spune compilatorului de C ca functia nu utilizeaza nici un parametru.
Cuvantul-cheie void, care apare inaintea functiei main () specifica faptul ca functia
nu intoarce nici un rezultat (este de tip void).
In mod obisnuit functiile folosesc instructiunea return pentru incheierea executiei
lor si pentru a returna rezultatul calculelor catre functia care le-a apelat.
Sintaxa instructiunii return este:
return <expresie>;
unde:
- <expresie> - specifica valoarea returnata de functie si este, de fapt valoarea
functiei.
In cazul functiei main (), daca este specificat cuvantul-cheie void inaintea functiei,
atunci nu se foloseste instructiunea return pentru returnarea rezultatului functiei.
Daca functia main () este precedata de un alt tip de data (de exemplu int) atunci este
necesara folosirea instructiunii return. In acest caz, rezultatul returnat de functia
main () este preluat de sistemul de operare si ofera indicatii despre modul de
functionare a programului. Cand executia unui program se termina cu succes, in mod
uzual programul returneaza valoarea 0.
7

De exemplu:
int main (void)
{ return 0; }
Acest program nu face nimic, dar se termina cu succes.
In caz ca apar erori pe parcursul executiei programului, functia main () returneaza o
valoare diferita de 0, care, de obicei, codul specific erorii care a aparut pe parcursul
executiei programului.

Preprocesare
Preprocesorul este un program lansat in executie automat inainte de compilare. El
executa toate directivele preprocesor incluse in program, efectuand substitutii de
texte. Toate directivele incluse in program incep cu caracterul # si sunt puse
inaintea oricaror declaratii de variabile sau functii (deci, sunt plasate la inceputul
programului).
De exemplu, #include, #define, #if, #undef etc.
Pentru elaborarea programelor trebuie sa intelegem doua dintre aceste directive, si
anume, #include si #define.
8

Directiva #include este utilizata pentru a include intr-un program un fisier antet
(header) standard sau creat de programator.
Un fisier antet (header) contine declaratiile functiilor, constantelor, variabilelor si
tipurilor definite intr-o biblioteca standard sau creata de programator. Fisierul antet
este specific bibliotecii folosite si are intotdeauna extensia .h .
Pentru a include intr-un program un fisier antet (existent in biblioteca standard a
limbajului) se foloseste sintaxa:
#include <<nume_fisier_antet>.h>.
De exemplu:
#include <math.h> - include fisierul antet al bibliotecii de functii matematice;
#include <iostream.h> - include un fisier antet al bibliotecii limbajului C++ cu
functii de intrare/iesire;
#include <stdio.h> - include un fisier antet al bibliotecii limbajului C cu functii de
intrare/iesire.

Directiva #define permite definirea unei constante simbolice. Sintaxa folosita este:
#define <identificator_constanta> valoare
Ca efect, preprocesorul va substitui in program orice aparitie a identificatorului de
constanta cu valoarea acesteia.
De exemplu:
#define PI 3.1415
#define NrMaxPersoane 35
Nota: Se recomanda utilizarea constantelor simbolice atunci cand se doreste sa se
asocieze o denumire mai sugestiva la o valoare. De asemenea, prin utilizarea
constantelor simbolice programul devine mai usor de modificat.
Observatie: Fisierele antet contin si definitii de constante simbolice. De exemplu:
- in fisierul antet values.h sunt definite constante simbolice cum ar fi:
MAXINT (cu valoarea 32767) si MAXLONG (cu valoarea 2147483647) etc;
- in fisierul antet conio.h sunt definite constantele simbolice pentru culori
(de exemplu: BLACK cu valoarea 0, BLUE cu valoarea 1, GREEN cu valoarea 2,
RED cu valoarea 4 etc).
10

Utilizarea functiilor din bibliotecile standard


Pot exista unele operatii care sunt frecvent utilizate in cadrul unui program C/C++
(cum ar fi: citirea datelor, scrierea datelor, stergerea ecranului, extragerea radicalului
etc) pentru care nu exista instructiuni specifice ale limbajului C/C++.
Din acest motiv, s-au constituit biblioteci de functii (elaborate de firma proiectanta a
mediul de programare folosit) care contin colectii de functii de utilitate generala
grupate pe categorii. Pentru a putea fi utilizate, se include la inceputul programului
(cu ajutorul directivei #include) fisierul antet al bibliotecii si se apeleaza functia care
ne este necesara.
Pentru a apela o functie trebuie sa se cunoasca numele si formatul (prototipul)
acesteia. In biblioteci exista sute si sute de prototipuri de functii care nu pot fi toate
invatate ci vor fi retinute cele mai des folosite. Insa, in Help vom gasi prototipul
tuturor functiilor din bibliotecile standard si explicatii despre modul de functionare a
acestora.
Prototipul unei functii este compus din: numele functiei, tipul valorii calculate de
functie, parametrii functiei. Cu alte cuvinte, prototipul unei functii are structura unui
antet de functie.
11

Apelul unei functii dintr-o biblioteca standard se face folosind sintaxa:


nume_functie (<lista_valori_parametrii>);
Valorile parametrilor de la apelul functiei trebuie sa corespunda ca numar, ordine si
tip cu parametrii specificati in prototipul functiei.
De exemplu:
1. In fisierul antet math.h care contine functii matematice este declarata functia de
extragere a radicalului sqrt (). Prototipul functiei sqrt () este:
double sqrt (double x);
Functia calculeaza radicalul valorii x transmise ca parametru.
2. In fisierul antet conio.h este declarata functia clrscr () care are ca efect stergerea
ferestrei curente (adica fereastra care coincide, implicit, cu intreg ecranul care are
implicit culoarea negru). Prototipul acestei functii este:
void clrscr (void);

12

3. Daca dorim sa schimbam culoarea de fundal a ecranului vom folosi functia


textbackground (), declarata tot in fisierul antet conio.h. Prototiul functiei este:
void textbackground (int culoare);
Pentru a schimba culoarea ecranului in verde, se va folosi functia textbackground ()
pentru a stabili culoarea de fundal, si apoi functia clrscr () pentru a colora ecranul
in culoarea de fundal stabilita:
textbackground (GREEN);
clrscr ();

13

Etapele dezvoltarii unui program C/C++:


1. Editarea instructiunilor programului. Pentru acesta operatie este necesar un
editor de texte (tip ASCII). Rezultatul este un fisier sursa, care are extensia .cpp
(pentru C++) sau .c (pentru C).
2. Compilarea programului. Pentru aceasta operatie se lanseaza in executie un
program special, denumit compilator. Compilatorul analizeaza textul sursa al
programului din punct de vedere sintactic, semnaland eventualele erori. Daca
programul nu contine erori sintactice, compilatorul traduce acest program in
limbajul-masina. Rezultatul compilarii este un fisier denumit fisier obiect, care are
extensia .obj (sub Windows/DOS) sau extensia .o (sub Linux).
3. Editarea de legaturi. Aceasta operatie este realizata de un program special
denumit editor de legaturi (sau link-editor). Editorul de legaturi asambleaza toate
modulele obiect din care este alcatuita aplicatia (inclusiv, combina instructiunile
programului din fisierul obiect cu functiile apelate din bibliotecile standard).
Rezultatul link-editarii este programul executabil, care are extensia .exe.

14

Scrierea
instructiunilor
programului-sursa
(.c sau .cpp)

Compilarea
programuluisursa

Cu succes?

Editarea
legaturilor
pentru
programul
obiect (.obj)

Cu succes?

Executia
programului
(.exe)

Modificarea
instructiunilor
programului

Procesul de compilare a unui program si de editare a legaturilor

15

Variabile
Variabila este o zona temporara de stocare, rezidenta in memoria RAM, care are un
nume simbolic (identificator) si stocheaza un anumit tip de date. Ea poate fi
modificata pe parcursul executiei programului.
Pentru utilizarea unei variabile intr-un program C/C++ trebuie ca aceasta sa fie
declarata. La declararea variabilei trebuie specificat numele simbolic al variabilei,
tipul acesteia si, eventual, o valoare initiala care se atribuie variabilei.
Tipurile de date predefinite
Un tip de date defineste multimea de valori pe care variabila poate sa le stocheze,
modul de reprezentare a acestora in memorie, ca si setul de operatii pe care
programul poate sa le realizeze cu aceste date.
Limbajul C/C++ accepta urmatoarele tipuri de baza: int, char, float, double, void.
Observatie:
In functie de compilatorul utilizat si de sistemul hardware folosit domeniul
valorilor si reprezentarea interna in memorie pentru tipurile de date, enumerate mai
sus, pot fi diferite.
16

Tipul de date int


Valorile datelor de tip int sunt numere intregi, cuprinse, de obicei, in intervalul [32768, 32767], si reprezentate in memorie pe 2 bytes, un bit fiind alocat pentru semn.
Tipul de date int suporta modificatori de tip unsigned si long.
Nota: Un modificator de tip schimba domeniul valorilor pe care o variabila le poate
pastra sau modul in care compilatorul stocheaza o variabila. Pentru a modifica un tip,
se plaseaza modificatorul in fata numelui tipului de baza.
Folosind si modificatorii de tip, se obtin urmatoarele tipuri de date intregi:
Tip

Valori

Reprezentare in
memorie

int

[-32768, 32767]

2 bytes, cu semn

unsigned int

[0, 65535]

2 bytes, fara semn

long int

[-2147483648, 2147483647] 4 bytes, cu semn

unsigned long int

[0, 4294967295]

4 bytes, fara semn


17

Nota: Atunci cand un tip de date nu este precizat, implicit este considerat int.
Astfel, se poate specifica numai modificatorul long sau unsigned sau unsigned
long, tipul fiind implicit int.
Constantele intregi sunt numere intregi din intervalul corespunzator tipului.
Ele pot fi specificate in:
- baza 10 - folosind notatia uzuala;
- baza 8 - constanta este precedata de un 0 (zero) nesemnificativ;
- baza 16 - constanta este precedata de 0x sau 0X.
De exemplu:
25 - constatnta zecimala de tip int;
28231567 - constanta de tip long int;
01230 - constanta octala;
0x1a3 - constanta hexazecimala.
Tipul constanei este determinat implicit de valoarea ei.
18

Tipul de date char


Tipul char este folosit pentru a pastra valori de tip caracter. In memorie, tipul char
este reprezentat pe un byte, cu semn. O variabila de tip char poate pastra numere
intregi cu valori cuprinse intre -128 si 127. Acest tip suporta un singur modificator,
unsigned.Se obtin astfel urmatoarele tipuri de de date char:

Tip

Valori

Reprezentare in
memorie

char

[-127,128]

1 octet, cu semn

unsigned char

[0, 255]

1 octet, fara semn

19

Se poate atribui o valoare unei variabile de tip char intr-una din modalitatile
urmatoare:
- atribuirea codului ASCII corespunzator caracterului; de exemplu litera
A are codul ASCII 65:
char litera = 65;
- folosirea unei constante de tip caracter care apare intre doua apostrofuri:
char litera = A;
Nota: Variabilele de tip char nu pot pastra decat un caracter la un moment dat.
Pentru a pastra un sir de caractere trebuie declarata o variabila indexata de tip char.
Constantele de tip char (unsigned char) pot fi numere intregi din intervalul
specificat sau caracterele care au codurile ASCII in intervalul specificat. Rezulta ca
datele de tip char par a avea o natura duala - caractere ASCII si numere intregi.
Dar compilatorul interpreteaza valorile de tip char ca fiind caractere ASCII in
functie de valorile numerice asociate (adica codurile ASCII asociate).De exemplu,
caracterul A si constanta 65 au pentru calculator aceeasi semnificatie.

20

Caracterele grafice (tiparibile) (cu coduri ASCII de la 32 la 127) se pot specifica


incadrand caracterul respectiv intre apostrofuri. De exemplu: a, 9, , *.
Caracterele speciale (netiparibile) se pot specifica incadrand intre apostrofuri o
secventa escape. Secventa escape este formata din caracterul \ (backslash) si o litera
sugestiva sau o valoare ASCII in octal sau in hexazecimal. Exemple de reprezentare
a caracterelor speciale prin secvente escape:
Secventa escape

Caracter special

\a

Caracterul alarm (genereaza un sunet)

\b

Caracterul backspace (deplaseaza cursorul pe ecran cu o pozitie la stanga

\r

Caracterul retur de car

\n

Caracterul newline (trecerea cursorului la linie noua)

\t

Caracterul tab orizontal

\\

Caracterul backslash

Caracterul apostrof

Caracterul ghilimele

\?

Caracterul semnul intrebarii

\nnn

Cod ASCII exprimat in octal

\xnnn

Cod ASCII exprimat in hexazecimal


21

Constantele sir de caractere sunt formate dintr-o succesiune de caractere incadrate


intre ghilimele.
Observatie: Limbajul C++ nu utilizeaza secventa escape \ pentru caracterul
apostrof din cadrul sirului de caractere la iesire.
De exemplu:
Totul despre C/C++
Prima linie afisata pe ecran \n A doua linie afisata pe ecran

22

Tipul de date float si double


Tipul de date float este folosit pentru a pastra valori reale in virgula mobila (numere
negative si pozitive care contin parti fractionare). In memorie, tipul float este
reprezentat pe 4 bytes. O variabila de tip float poate pastra numere reale in intervalul
[3.4*10-38, 3.4*10+38] [-3.4*10+38, -3.4*10-38].
Tipul de date double este folosit pentru a pastra valori reale in virgula mobila
(numere negative si pozitive care contin parti fractionare). In memorie, tipul double
este reprezentat pe 8 bytes. Tipul de date double accepta si modificatorul de tip long.
Folosind si modificatorul de tip long, se obtin urmatoarele tipuri de date reale de tip
double:
Tip

Valori

Reprezentare in memorie

double

[1.7*10-308, 1.7*10+308]
[-1.7*10+308, -1.7*10-308]

8 octeti, in virgula mobila

long double

[3.4*10-4932, 1.1*10+4932]
[-3.4*10+4932, +1.1*10-4932]

10 octeti, in virgula mobila

23

Constantele reale care se pot reprezenta in memoria calculatorului sunt numere


rationale din intervalele specificate. Constantele reale pot fi specificate in notatia
obisnuita sau in format stiintific.
Formatul stiintific (sau exponential) prezinta numarul real utilizand o singura cifra in
stanga virgulei, un numar oarecare de cifre in dreapta virgulei si un exponent
(precedat de litera e sau E) reprezentand o putere a lui 10. Valoarea numarului se
obtine inmultind numarul cu 10 la puterea specificata.
De exemplu:
-17.6 - in format obisnuit;
12.56 - in format obisnuit;
3.1415967E+7 (in format stiintific) = 3.1415967*107 = 31415967 (in format
obisnuit).
Tipul void
Tipul void este un tip special, pentru care multimea valorilor este vida. Acest tip se
utilizeaza cand este necesar sa se specifice absenta oricarei valori. De exemplu
pentru tipul functiilor care nu intorc nici un rezultat, cum a fost cazul functiei
main ().
24

Observatie: In limbajul C/C++ nu exista un tip de date special pentru valori logice
(true si false). Valoarea 0 este asociata valorii false, orice valoare diferita de 0 este
asociata valorii true.
Sintaxa folosita pentru declararea de variabile este:
<tip> <nume_v1> [= <expresie>] [, <nume_v2> [= <expresie2>] ];
unde:
- <tip> - specifica tipul de data al variabilelor;
- <nume_v1>, <nume_v2>, - specifica numele simbolic al variabilelor care se
declara (adica, identificatorii);
- <expresie1>, <expresie2>, - specifica o expresie de initializare; expresia trebuie
sa fie evaluabila in momentul declararii; sunt optionale si sunt folosite pentru a
atribui unor variabile anumite valori initiale.
Nota: Se pot declara simultan mai multe variabile de acelasi tip, separand numele
lor prin virgula.

25

Instructiunea de declarare a unei variabile poate fi plasata in interiorul unei functii


(in cazul nostru, al functiei main ()) sau in exteriorul oricarei functii (in cazul nostru
in exteriorul functiei main ()). Dar declaratia unei variabile trebuie sa preceada orice
referire la variabila respectiva.
Observatie: In limbajul C, declaratiile de variabile trebuie sa fie plasate la inceputul
corpului functiei (in cazul nostru, al functiei main ()), inaintea oricarei instructiuni.
In limbajul C++, declaratiile de variabile pot fi plasate oriunde in corpul functiei,
dar trebuie sa preceada orice referire la ele.
Variabile locale si globale
O variabila locala este recunoscuta numai la nivelul unei functii. Declararea unei
variabile locale se face prin plasarea instructiunii de declarare in interiorul corpului
functiei.O variabila locala nu este automat initializata cu valoarea 0.
O variabila globala este recunoscuta la nivelul tuturor functiilor care compun
programul. Declararea unei variabile globale se face prin plasarea instructiunii de
declarare in exteriorul oricarei functii. O variabila globala este automat initializata
cu valoarea 0.

26

De exemplu:
#include <stdio.h>
void main ()
{
int varsta;
int greutate;
int inaltime;
printf ("Totul despre C/C++");

#include <stdio.h>
void main ()
{
int varsta, greutate, inaltime;
printf ("Totul despre C/C++");
.
}

#include <stdio.h>
int main ()
{
int varsta = 41, greutate = 75, inaltime = 180;
printf (" varsta=%d\n greutate=%d\n inaltime=%d\n", varsta, greutate, inaltime);
return 0;}
Alte exemple de declaratii de variabile ce pot fi folosite intr-un program:
int a, b=3, c=8;
char h;
float x=b*5.6, y;
27

Citirea datelor de la tastatura si afisarea datelor pe ecran


In limbajul C/C++ nu exista instructiuni specializate pentru citirea/scrierea datelor. Aceste
operatii se realizeaza prin intermediul unor functii existente in bibliotecile standard ale
limbajului. Operatiile de intrare/iesire difera in limbajul C++ fata de limbajul C.

Citirea datelor de la tastatura si afisarea datelor pe ecran in limbajul C


Citirea si scrierea datelor se realizeaza prin intermediul unor functii specifice.
Citirea datelor cu format specificat
Functia scanf () permite citirea datelor cu un format specificat.Aceasta functie este
declarata in fisierul antet stdio.h si are prototipul:
int scanf (<format>, <adresa_v1>, <adresa_v2>, , <adresa_vn>);

unde:

- <format> - este un sir de caractere care poate contine specificatori de format, caractere
albe (spatiu, tab sau newline) si alte caractere; caracterele albe prezente la intrare vor fi
ignorate; celelalte caractere (care nu fac parte dintr-un specificator de format) trebuie sa
fie prezente la intrare in pozitiile corespunzatoare;
- <adresa_v1>, <adresa_v2>, , <adresa_vn>) - adresele de memorie (pointeri) care
specifica variabilele in care se vor memora valorile citite de la tastatura; adresa unei
variabile se obtine cu ajutorul operatorului de referentiere & (de exemplu: &v1 este adresa
de memorie a variabilei v1).
28

Efectul apelului functiei scanf () este urmatorul: se parcurge succesiunea de


caractere introdusa de la tastatura si se extrag valorile care trebuie citite conform
formatului dat; valorile citite sunt memorate in ordine in variabilele specificate prin
adresele lor in lista de parametri ai functiei.
Functia scanf () returneaza numarul de valori citite corect. In cazul unei erori,
citirea se intrerupe in pozitia in care a fost intalnita eroarea.
Specificatorii de format au urmatoarea sintaxa:
% [*] [lg] [l|L] <litera_tip>
unde:
% - indica inceputul unui specificator de format;
- <litera_tip> - specifica tipul valorii care se citeste.

29

Litera ce indica tipul valorii citite poate fi:


<litera_tip>

Semnificatie

Se citeste un numar intreg scris in baza 10, care va fi memorat intr-o


variabila de tip int

Se citeste un numar intreg scris in baza 8, care va fi memorat intr-o


variabila de tip int

Se citeste un numar intreg scris in baza 10, care va fi memorat intr-o


variabila de tip unsigned int

Se citeste un numar intreg scris in baza 16, care va fi memorat intr-o


variabila de tip int

f, e sau g

Se citeste un numar real scris in baza 10, care va fi memorat intr-o


variabila de tip float

Se citeste un caracter (in acest caz, caracterele albe prezente la


intrare nu se ignora).

Se citeste un sir de caractere (sirul incepe cu urmatorul caracter care


nu este alb si continua pana la primul caracter alb intalnit sau pana
la epuizarea dimensiunii maxime lg din specificatorul de format).
30

Optional, unele litere_tip pot fi precedate de litera l sau de litera L.


Literele d, o si x pot fi precedate de litera l, caz in care valoarea citita va fi
convertita la tipul long int. Litera u poate fi precedata de litera L, caz in care
valoarea citita va fi convertita la tipul unsigned long int.
Literele f, e, g pot fi precedate de litera l, caz in care valoarea citita este convertita la
tipul double. Literele f, e, g pot fi precedate de litera L, caz in care valoarea citita
este convertita la tipul long double.
Parametrul optional lg din specificatorul de format reprezinta numarul maxim de
caractere ce vor fi citite pana la intalnirea unui caracter alb sau a unui caracter
neconvertibil in tipul specificat de <litera_tip>.
Caracterul optional * specifica faptul ca la intrare este prezenta o data de tipul
specificat de specificatorul de format, dar ea nu va fi atribuita nici uneia dintre
variabilele specificate in lista de parametri ai functiei scanf ().

31

De exemplu:
1. Fie declaratiile de variabile:
int a; unsigned long b; double c;
iar de la tastatura se introduc valorile: 650 -4.8 123000. Apeland functia:
scanf (%d %lf %lu, &a, &c, &b);
variabilei a i se atribuie valoarea 650, variabilei c i se atribuie valoarea -4,8 si
variabilei b i se atribuie valoarea 123000.
2. Fie declaratia de variabile:
char a1, a2, a3;
iar de la tastatura se introduc caracterele: 245. Apeland functia:
scanf (%c %c %c, &a1, &a2, &a3);
variabilei a1 i se atribuie caracterul 2, variabilei a2 i se atribuie caracterul 4 si
variabilei a3 i se atribuie caracterul 5.

32

3. Fie declaratia de variabile:


int a, b, c;
iar de la tastatura se introduce: 5=2+3 . Apeland functia:
scanf (%d=%d+%d, &a, &b, &c);
variabilei a i se atribuie valoarea 5, variabilei b i se atribuie valoarea 2 si variabilei c
i se atribuie valoarea 3.
Apeland functia:
scanf (%d=%*d+%d, &a, &b);
variabilei a i se atribuie valoarea 5, variabilei b i se atribuie valoarea 3. Valoarea 2 a
fost citita, dar nu a fost atribuita nici unei variabile.
4. Fie declaratia de variabile:
int zi, luna, an;
iar de la tastatura se introduce o data in formatul zz-ll-aa. La apelul functiei:
scanf (%d-%d-%d, &zi, &luna, &an);
se citeste ziua, luna si anul.
33

Pentru citirea caracterelor au fost elaborate unele functii speciale cum ar fia
functiile: getch () si getche ().
Functia getch () este declarata in fisierul antet conio.h. Prototipul functiei este:
int getch (void);
La apelul functiei se citeste de la tastatura un caracter. Functia returneaza codul
ASCII al caracterului citit. Caracterul tastat nu este afisat pe ecran.
Functia getche () este declarata in fisierul antet conio.h. Prototipul functiei este:
int getche (void);
La apelul functiei se citeste de la tastatura un caracter. Functia returneaza codul
ASCII al caracterului citit. Caracterul tastat este afisat pe ecran.

34

Afisarea datelor cu format specificat


Afisarea datelor cu format specificat se face cu functia printf (), care este declarata
in fisierul antet stdio.h. Prototipul functiei este:
int printf (<format>, <expresie1>, <expresie2>, <expresien>
unde:
- <format> - este un sir de caractere care poate contine specificatori de format si,
eventual, alte caractere; in parametrul <format> trebuie sa existe cate un specificator
de format pentru fiecare expresie din lista de parametrii (specificatorul 1 corespunde
la <expresie1>, specificatorul 2 corespunde la <expresie2> etc); celelalte caractere
din parametrul <format> vor fi afisate pe ecran in pozitiile corespunzatoare.
- <expresie 1>, <expresie 2>, <expresie n> - reprezinta expresii sau variabile care
sunt afisate pe ecran in formatul corespunzator specificatorilor de format alesi.
Efectul apelului functiei printf () este urmatorul: se evalueaza expresiile (sau
variabilele) si se scriu in ordine valorile acestora, in forma specificata de parametrul
<format>.
Functia printf () returneaza numarul de caractere afisate.
35

Specificatorii de format au urmatoarea sintaxa:


% [ind] [lg] [.prec] [l|L] <litera_tip>
unde:
% - indica inceputul unui specificator de format;
- <litera_tip> - specifica tipul expresiei (variabilei) corespunzatoare care se
afiseaza.
Litera ce indica tipul valorii afisate poate fi:
<litera_tip>

Semnificatie

Expresia se converteste in tipul int si se afiseaza in baza 10

Expresia se converteste in tipul int si se afiseaza in baza 8

Expresia se converteste in tipul unsigned int si se afiseaza in baza 10

x, X

Expresia se converteste in tipul int si se afiseaza in baza 16 (literele


care reprezinta 10, 11,12, 13, 14, 15 sunt majuscule in cazul lui X
sau minuscule in cazul lui x

Expresia se converteste in tipul float si se afiseaza in formatul


<parte_intreaga.parte_zecimala>
36

(continuare)

<litera_tip>

Semnificatie

e, E

Expresia se converteste in tipul float si se afiseaza in format


stiintific (cu exponent) (in cazul lui E litera care precede exponentul
este E)

Se aplica una dintre conversiile corespunzatoare literei f sau literei e


(cea care se reprezinta cu numar minim de caractere)

Expresia are ca valoare codul ASCII al unui caracter si se


converteste in caracterul corespunzator care este afisat.

Expresia este un sir de caractere care va fi afisat pe ecran

Optional, unele litere_tip pot fi precedate de litera l sau de litera L.


Literele d, o, x, X sau u pot fi precedate de litera l, caz in care valoarea afisata va fi
convertita la tipul long int ( respectiv unsigned long int).
Daca litera l apare inainte de f, e, E sau g, conversia se realizeaza in tipul double.
Literele f, e, E sau g pot fi precedate de litera L, caz in care valoarea afisata va fi
convertita la tipul long double.
37

Parametrul optional lg din specificatorul de format reprezinta numarul minim de


caractere ce vor fi afisate.
Daca numarul de caractere necesare pentru a afisa valoarea expresiei depaseste lg,
se va realiza trunchierea valorii din expresie.
Daca numarul de caractere necesare pentru a afisa valoarea expresiei este mai mic
decat lg, se vor afisa cele lg caractere (restul zonei completandu-se cu spatii).
Modul de aliniere implicit este la dreapta (completarea cu spatii se realizeaza la
stanga). Daca se specifica indicatorul (parametrul ind) minus (-) atunci alinierea se
va face la stanga (si completarea cu spatii se va realiza la dreapta).
Parametru .prec stabileste precizia pentru expresiile de tip real. Acesta indica
numarul de cifre de la partea zecimala care vor fi afisate (implicit 6 zecimale).
Daca precizia este mai mica decat numarul de zecimale al numarului real afisat,
atunci valoarea afisata va fi rotunjita.
Pentru siruri de caractere, precizia indica numarul de caractere din sir care se
afiseaza (primele prec).

38

De exemplu:
1. Citirea si afisarea datei calendaristice in formatul zz-ll-aa se poate face cu
urmatoarea secventa de program (numit citeste_data_ca.c):
#include <stdio.h>
void main ()
{
int zi, luna, an;
printf ("Introduceti o data calendaristica in formatul zz-ll-aa\n");
scanf ("%d-%d-%d", &zi, &luna, &an);
printf ("Data introdusa de dvs.\n%d-%d-%d", zi, luna, an);
}

2. Citirea unui caracter de la tastatura care nu este afisat atunci cand este tastat si
afisarea la ecran a caracterului introdus se poate face cu urmatoarea secventa de
program (numit citeste_codASCII.c):
#include <stdio.h>
#include <conio.h>
void main ()
{
int caracter;
printf ("Introduceti un caracter:");
caracter=getch ();
printf ("\nCaracterul introdus de dvs. este: %c", caracter);
}
39

3. Citirea unui caracter de la tastatura care este afisat atunci cand este tastat si afisarea la
ecran a caracterului introdus se poate face cu urmatoarea secventa de program (numit
citeste_codASCII.c):
#include <stdio.h>
#include <conio.h>
void main ()
{
int caracter;
printf ("Introduceti un caracter:");
caracter=getche ();
printf ("\n\nAti tastat caracterul: %c care are codul ASCII %d", caracter, caracter);
}
4. Fie declaratia de variabila:
float x=-243.192;
la apelul functiei:
printf (x=%f sau\n x=%e sau\n x=%g\n, x, x, x);
se afiseaza urmatoarele:
x=-243.192 sau
x=-2.43192e+02 sau
x=-243.192
40

5. Fie declaratia de variabila:


int d=0xf01a;
la apelul functiei:
printf (d=%d sau d=%x\n, d, d);
se afiseaza urmatoarele:
d=-4070 sau d=f01a

6. Fie declaratia de variabila:


float x=-238.147
la apelul functiei:
printf (x=%.2f \n, x);
se afiseaza urmatoarele:
X=-238.15
41

Citirea datelor de la tastatura si afisarea datelor pe ecran in limbajul


C++
Conceptul fundamental in operatiile de intrare/iesire in limbajul C++ este fluxul de
intrare/iesire (stream). Daca stream-ul este de intrare, succesiunea de caractere
curge dinspre exterior (in acest caz, de la tastatura) catre memoria calculatorului.
Daca stream-ul este de iesire, secventa de caractere curge dinspre memoria
calculatorului catre exterior (in acest caz, catre ecran). In limbajul C++, fisierul antet
(header) iostream.h defineste biblioteca de clase pentru fluxurile de intrare/iesire
pentru ecran si tastatura.
In fisierul antet iostream.h sunt declarate doua fluxuri standard:
- un flux de intrare de la tastatura, denumit cin (console input);
- un flux de iesire catre ecran, denumit cout (console output).
Observatie: De fapt, cin si cout sunt instante ale unei clase I/O din bibliotaca de clase
C++.
Fluxurile de intrare/iesire cin si cout sunt utilizate in programe pentru a executa
operatii de I/O catre fisierele standard (indicatoare-fisier) stdin (tastatura) si stdout
(ecranul sau consola). Cand se efectueaza operatii cu fluxurile I/O cin si cout,
complilatorul furnizeaza informatii despre fiecare tip de data, astfel ca specificatorii
de format nu mai sunt necesari ca in cazul functiilor limpajului C, scanf si printf.
42

Citirea datelor de la tastatura folosind fluxul cin


Fluxul I/O cin este folosit pentru a primi date de la stdin (tastatura).
Datele citite de la tastatura, vor fi extrase din fluxul de intrare, folosind operatorul
(de clasa) de intrare (citire) >> si sintaxa:
cin >> <nume_variabila>;
Efect: se va citi de la tastatura o succesiune de caractere, care va fi convertita intr-o
valoare de tipul variabilei <nume_variabila> si apoi atribuita variabilei
<nume_variabila>.
Pentru citirea datelor ce vor fi stocate succesiv in mai multe variabile se
foloseste sintaxa:
cin >> <nume_v1> >> <nume_v2> >> >> <nume_vn>;
Cum selecteaza cin campurile de date?
1. cin utilizeaza caractere albe (spatiu, tab sau linie noua) pentru a delimita
campurile de date.
2. Caracterele albe sunt ignorate de cin.
43

De exemplu (programele citire_cin.cpp si citire_cin1.cpp) pentru citirea a trei numere


intregi:
Varianata 1:
# include <iostream.h>
# include <stdio.h>
void main()
{int x, y, z;
printf ("introduceti numerele:\n");
cin >> x;
cin >> y;
cin >> z;
printf ("Numerele introduse de dvs. sunt: %d %d %d\n", x, y, z);
}
Varianta2:
# include <iostream.h>
# include <stdio.h>
void main()
{int x, y, z;
printf ("introduceti numerele:\n");
cin >> x >> y >> z;
printf ("Numerele introduse de dvs. sunt: %d %d %d\n", x, y, z);
}
44

Afisarea datelor pe ecran folosind fluxul cout


Fluxul I/O cout este folosit pentru a trimite date catre stdout (ecranul sau consola
calculatorului).
Pentru scrierea datelor pe ecran se foloseste operatorul (de clasa) de iesire (scriere)
<<. Acest operator specifica fluxul la care programul transmite datele.
Sintaxa folosita este:
cout << <expresie>;

unde:

- <expresie> - specifica un nume de variabila sau o expresie.


Efect: Se evalueaza <expresie> si apoi valoarea ei este convertita intr-o succesiune
de caractere care va fi afisata pe ecran.
Cand se doreste scrierea la ecran a mai multor date de acelasi tip sau de tipuri
diferite intr-o singura instructiune se foloseste sintaxa:
cout << <expresie1> << <expresie2> << << <expresien>;
Nota: Secventa escape \n (newline) este folosita pentru trecerea pe o linie noua.
Trecerea la linie noua se poate face si folosind simbolul endl (endline).
Fluxul de I/O cout permite programelor, in mod implicit, afisarea valorilor numerice
in baza 10.
45

De exemplu, programele prezentate la fluxul de intrare cin (in care s-a folosit
functia printf () pentru afisarea datelor) pot fi modificate pentru a folosi fluxul de
iesire cout (programele scriere_cout.cpp si scriere_cout1.cpp) astfel:
Varianta 1:
# include <iostream.h>
void main()
{int x, y, z;
cout<< "introduceti numerele:" << '\n';
cin >> x;
cin >> y;
cin >> z;
cout << "Numerele introduse de dvs. sunt: ";
cout << x;
cout << ;
cout << y;
cout << ;
cout << z;
}
46

Variana 2:
# include <iostream.h
void main()
{int x, y, z;
cout << "introduceti numerele: " << endl;
cin >> x >> y >> z;
cout << "Numerele introduse de dvs. sunt: " << x << << y << << z << '\n';
}

47

Nota: Se pot utiliza modificatorii dec, oct, hex pentru a afisa valorile in zecimal,
octal si hexazecimal. Iata un exemplu de program (cu numele scriere_cout2.cpp)
care face conversii ale unor numere in octal si hexazecimal:
# include <iostream.h>
void main()
{int x, y, z;
cout << "introduceti numerele: " << endl;
cin >> x >> y >> z;
cout << "Numerele introduse de dvs. in baza 10 sunt: " << x << ' ' << y
<< ' ' << z << '\n';
cout << "Numerele introduse de dvs. in baza 8 sunt: " << oct << x << ' '
<< oct << y << ' ' << oct << z << '\n';
cout << "Numerele introduse de dvs. in baza 16 sunt: " << hex << x << ' '
<< hex << y << ' ' << hex << z << '\n';
}

48

S-ar putea să vă placă și