Sunteți pe pagina 1din 6

PROGRAMAREA CALCULATOARELOR

ȘI LIMBAJE DE PROGRAMARE

CURS 4

1.10 Prototipuri de funcţii. Biblioteci de prototipuri


Atunci când compilatorul întâlneşte un apel la o funcţie, el trebuie să poată verifica concordanţa
între parametrii actuali şi cei formali (tipul şi numărul parametrilor), şi are nevoie de tipul
rezultatului funcţiei pentru a face conversiile necesare evaluării expresiei. Pentru aceasta este
nevoie de o definiţie a funcţiei în care apar tipurile parametrilor şi tipul rezultatului. Această
definiţie se numeşte şablon sau prototip şi are forma
tip numefuncţie(tip, tip, …, );
De exemplu, funcţia sin are un singur parametru de tip double,iar rezultatul este de tip double;
prototipul funcţiei sin este
double sin(double);
Limbajele C şi C++ au biblioteci standard cu prototipurile funcţiilor limbajului. De asemenea,
utilizatorul poate defini biblioteci cu prototipuri. Toate aceste biblioteci sunt semnalate
compilatorului cu directiva include cu forma
# include nume_bibliotecă
Aceste biblioteci sunt fişiere numite fişiere header sau antet. Directiva include este diferită în
cazul limbajului C de cea din limbajul C++.
In cazul limbajului C fişierele header au extensia h. De exemplu, biblioteca cu prototipurile
funcţiilor intrare/ieşire tip C este stdio.h (Standard Input and Output Library), biblioteca cu
prototipurile funcţiilor matematice este math.h, biblioteca cu prototipurile funcţiilor de
prelucrat şiruri tip C este string.h, etc. In consecinţă, în cazul unui program în limbajul C vom
semnala compilatorului aceste biblioteci cu directivele
# include <stdio.h>
# include <math.h>
In limbajul C++ fişierele header nu au extensie. De exemplu, biblioteca cu prototipurile
funcţiilor intrare/ieşire tip C++ este iostream. La utilizarea în limbajul C++, bibliotecile
specifice limbajului C sunt redefinite ca <cstdio>, <cmath>, <cstring>, etc. In plus, în limbajul
C++ toate funcţiile standard ale limbajelor C şi C++ sunt grupate într-un spaţiu de nume
denumit std. In consecinţă, putem semnala compilatorului bibliotecile standard iostream şi
math astfel
# include <iostream>
# include <cmath>
using namespace std;
Putem defini propriile biblioteci cu prototipuri pe care să le semnalăm compilatorului cu
directiva include. Numele propriilor biblioteci cu prototipuri sunt scrise între ghilimele.

1.11 Operaţii de intrare / ieşire


Orice aplicaţie ce rulează pe un calculator are un director curent asociat şi fişiere standard de
intrare şi ieşire. Fişierul standard de intrare este tastatura iar cel de ieşire este ecranul. In
program, orice fişier este asociat unui obiect numit stream. Există două tipuri de fişiere: text şi
binare. Ele vor fi prezentate detaliat într-un capitol ulterior. Fişierele standard asociate unei
aplicaţii sunt de tipul text. Fişierul text este este compus dintr-un şir de caractere grupate în
linii. Liniile constau din zero sau mai multe caractere urmate de un caracter ‘\n’. Streamul de
intrare asociat tastaturii are denumirea cin, streamul de ieşire asociat ecranului se numeşte cout.
Mai există alte două streamuri cerr şi clog pentru scrierea mesajelor de eroare.

1
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

Operatorul de scriere a datelor

Operatorul de scriere a datelor este <<. El inserează date în streamul de ieşire. De exemplu,
secvenţa de instrucţiuni
int i = 123;
cout << “i = ” << i;
afişază pe ecran
i = 123
Operatorul << inserează în stream valoarea expresiei din dreapta sa. De exemplu, expresia
<< “i= “
inserează în stream şirul de caractere i= , expresia
<< i
inserează în stream valoarea variabilei i, 123, etc.
Pentru a afişa valori pe mai multe linii, trebuie ca după fiecare linie să scriem caracterul ‘\n’,
care este predefinit ca endl. De exemplu, fie instrucţiunile
int j = -7;
double x = 1 + sin(0.2);
Pentru a afişa valorile variabilelor j si x pe două linii, vom scrie
cout << “j = “ << j << endl << “x = “ << x << endl;
sau
cout << “j = “ << j << ‘\n’ << “x = “ << x << ‘\n’;
sau
cout << “j =” << j << “\n” << “x = “ << x << “\n”;
sau, echivalent, cu doua instrucţiuni cout
cout << “j =” << j << endl;
cout << “x = “ << x << endl;
Operatorul << poate scrie orice tip predefinit de date: int, float, şiruri de caractere, etc.

Operatorul de citire a datelor

Operatorul de citire dintr-un stream este >>. El extrage date din streamul de intrare şi le atribuie
unor variabile. Operatorul >> este urmat de numele variabilei ce va memora valoarea citită. De
exemplu, secvenţa de instrucţiuni
int a;
cin >> a;
va citi o valoare introdusă de la tastatură şi o va atribui variabilei a (expresia >>a citeşte o
valoare de la tastatură şi o atribuie variabilei a). O instrucţiune cin poate citi oricâte date din
stream. Fie instrucţiunea
int a, b ;
Instrucţiunea
cin >> a >> b;
citeşte două valori de la tastatură şi le atribuie variabilelor a şi b. Ea poate fi scrisă ca
cin >> a;
cin >> b;
Valorile introduse de la tastatură sunt analizate şi atribuite variabilelor de către instrucţiunea
cin. Pentru fiecare variabilă se procedează astfel :
• se citesc şi se ignoră toate caracterele spaţiu, ‘\t’ sau ‘\n’ (acesta din urmă este generat
la apăsarea tastei Return),
• se citesc următoarele caractere corespunzând tipului variabilei sau până la întâlnirea
unui caracter spaţiu, ‘\t’ sau ‘\n’ şi valoarea citită se atribuie variabilei.

2
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

Fie variabilele de tip întreg a şi b definite cu instrucţiunea.


int a, b;
Fie de citit valorile 25 şi 17 pentru aceste variabile. Ele pot fi introduse de la tastatură separate
de un spaţiu ca

Şirul introdus este analizat astfel :


• se citesc toate caracterele spaţiu, ‘\t’ sau ‘\n’ până la prima cifra întâlnită şi se ignoră (în
acest caz primul caracter este diferit de spaţiu, ‘\t’ sau ‘\n’),
• se citesc apoi toate caracterele până la primul caracter diferit de cifră, deoarece trebuie
citit un număr întreg, şi rezultă numărul 25.
Se procedează la fel pentru al doilea număr :
• se citeşte şi se ignoră spaţiul,
• se citesc cifrele până la primul caracter diferit de cifră şi rezultă numărul 17.
Aceleaşi valori pot fi introduce ca

Fie de iniţializat prin citire o variabilă x tip caracter la valoarea ‘A’. Variabila este definită cu
instrucţiunea
char x;
Instrucţiunea de citire este
cin >> x;
Putem introduce caracterul A astfel:

sau

Citirea caracterului se face după regula de mai sus : se citesc şi se ignoră toate caracterele spaţiu,
‘\t’ sau ‘\n’ şi se citeşte un caracter care este atribuit variabilei x.
Valorile introduse de la tastatură sunt analizate şi atribuite variabilelor de către
instrucţiunea cin doar după introducerea unui caracter ‘\n’.
Reamintim că biblioteca de prototipuri pentru streamurile cin, cout, etc are numele iostream.
Pentru a modifica formatul de scriere sau citire a datelor putem utiliza manipulatori definiţi în
biblioteca <iomanip>. Pentru scrierea sau citirea unui număr întreg în în diferite baze, se
utilizează în instrucţiunile cout sau cin manipulatorii:
• hex pentru baza 16,
• dec pentru baza 10,
• oct pentru baza 8.
Aceşti manipulatori rămân la valoarea prescrisă până sunt modificaţi. La începerea
execuţiei unui program baza 10 este implicită.
Fie următorul exemplu
int a ;
cin >> hex >> a ;
cout << a << endl;
Presupunem introdus de la tastatură şirul de caractere de mai jos

Valoarea atribuită prin citire variabilei a este 27. De ce ? Pentru a afişa valoarea variabilei a în
baza 16 trebuie să scriem

3
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

cout << hex << a << endl ;


In următorul exemplu vom citi numărul negativ -44 în baza 16.
int i ;
cin >> hex >> i ;
Numărul poate fi introdus ca în tabelul de mai jos.

Pentru afişarea bazei se utilizează manipulatorii:


• showbase pentru scrierea bazei,
• noshowbase pentru a nu scrie baza.
Exemplu. Fie instrucţiunea
int k = 20;
Tabloul următor prezintă exemple de utilizare a manipulatorilor pentru a afişa pe ecran valoarea
variabilei k.

cout << k; 20
cout << hex << k; 14
cout << showbase << hex << k; 0x14
cout << oct << k; 24
cout << showbase << oct << k; 024

In cazul numerelor reale avem manipulatorii:


• fixed numărul este scris fără exponent,
• scientific numărul este scris cu exponent.
Exemplu. Fie instrucţiunea
float x = 122.63;
Tabloul următor prezintă exemple de utilizare a manipulatorilor pentru a afişa pe ecran valoarea
variabilei x.

cout << x; 122.63


cout << fixed << x; 122.63
cout << scientific << x; 1.226300e+002

Funcţiile următoare sunt apelate de operatorul de scriere << :


• setbase(int),
• setw(int),
• setfill(char),
• setprecision(int).
Funcţia setbase(int) indică baza în care va fi afişat un număr întreg, 8, 10 sau 16. Funcţia
setw(int) dă dimensiunea câmpului în caractere pe care este scris un număr. Valoarea implicită
a acestui manipulator este 0. Dacă dimensiunea câmpului nu este specificată, sau este prea mică,
numărul este scris pe câte caractere este necesar. Funcţia setfill(char) indică un caracter cu care
se umplu spaţiile libere ale unui câmp. Valoarea implicită a acestui caracter este spaţiul.
Funcţia setprecision(int) dă numărul de cifre cu care este scrisă partea subunitară a unui număr
real.
Exemplu. Fie instrucţiunile
int x = 23;
double pi(3.141592);

4
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

Tabloul următor prezintă exemple de utilizare a funcţiilor operatorului <<.

cout << setw(5) << x; 23


cout << x; 23
cout << setbase(16) << x; 17
cout << setbase(16) << showbase << x; 0x17
cout << dec << setw(4) << setfill(‘*’) << x; **23
cout << pi << endl; 3.14159
cout << setprecision(3) << pi << endl; 3.141
cout << setprecision(4) << pi << endl; 3.1416
cout << setprecision(6) << pi << endl; 3.141592

Exemplu. Fie instrucţiunea


float z = 12.64;
Tabelul următor prezintă exemple de utilizare a funcţiilor anterioare la afişarea variabilei z cu
instrucţiunea cout.

cout << setprecision(3) << z; 12.6


cout << setw(8) << z; 12.64
cout << setw(8) << setfill(‘*’) << z; ***12.64
cout << setw(15) << scientific << z; 1.264000e+001

Manipulatorii următori specifică modul de cadrare al valorilor scrise :


• left - cadrare la stânga,
• right – cadrare la dreapta.
Menţionăm că dimensiunea câmpului prescrisă de funcţia setw(int) se aplică doar
următorului număr de scris. Ceilalţi manipulatori rămân la valoarea prescrisă până sunt
modificaţi.
Exemplu. Fie instrucţiunile
int x ;
cin >> x ;
cout << hex << x << endl ;
cout << x << endl ;
Valoarea variabilei x este afişată în baza 16 cu ambele instrucţiuni, deoarece manipulatorul de
scriere a bazei are valoarea hex. Pentru a afişa din nou variabilele întregi în baza 10 trebuie să
scriem o instrucţiune
cout << dec << x << endl ;

1.12 Funcţia main


Orice program scris în limbajele C sau C++ se compune din funcţii care se apelează unele pe
altele. Definiţia unei funcţii este
tip numefunctie (lista de parametri)
{
instrucţiuni
}
Una dintre funcţii are numele main, iar execuţia programului începe cu această funcţie.
Prototipul acestei funcţii este
int main();

5
PROGRAMAREA CALCULATOARELOR
ȘI LIMBAJE DE PROGRAMARE

Semnificaţia acestui prototip este următoarea. Funcţia main are ca rezultat o valoare întreagă şi
nu are parametri. Corpul funcţiei este o instrucţiune compusă, adică o secvenţă de instrucţiuni
scrise între acolade, { şi }. Corpul funcţiei conţine şi o instrucţiune return ce termină execuţia
funcţiei şi transmite în programul apelant valoarea calculată de funcţie.
Programul poate conţine comentarii. Comentariile plasate între delimitatorii /* şi */ se pot
întinde pe mai multe linii. Comentariile ce încep cu caracterele // se întind pe o singură linie.
Putem scrie acum primul program care citeşte o valoare întreagă de la tastatură şi afişează
pătratul ei. Reamintim că orice instrucţiune în limbajele C şi C++ este terminată cu
caracterul ;.
// program care citeste o valoare intreaga si calculeaza patratul ei
# include <iostream>
using namespace std;
int main()
{
int i, j;
/* se citeste o valoare intreaga */
cout << “introduceti o valoare intreaga” << endl;
cin >> i;
cout << “valoarea introdusa este “ << i << endl;
/* se calculeaza patratul valorii citite */
j = i * i;
/* se afisaza valoarea calculata */
cout << “patratul valorii este “ << j << endl;
return 0;
}

Menţionăm că funcţia main() returnează valoarea 0 cu instrucţiunea


return 0;
Limbajul C++ defineşte constanta EXIT_SUCCESS ce are valoarea zero. In consecinţă, putem
scrie
return EXIT_SUCCESS;
Rezultatul rulării programului este cel de mai jos.

Pentru claritatea programelor, limbajul defineşte şi constanta EXIT_FAILURE ce are valoarea


unu.

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