P. 1
Introduce Re in Ansi c++ (v2)

Introduce Re in Ansi c++ (v2)

|Views: 1,837|Likes:
Published by flavyan_paul

More info:

Published by: flavyan_paul on Oct 12, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

03/24/2013

pdf

text

original

Sections

  • Introducere
  • Capitolul 1 – Primul program
  • Capitolul 2 – Notiuni de baza
  • Capitolul 3 – Expresii C++
  • Capitolul 4 – Instructiuni conditionale
  • Capitolul 5 – Instructiuni repetitive
  • Capitolul 6 – Vectori (matrici)
  • Capitolul 7 – Siruri de caractere
  • Capitolul 8 – Structuri si alte tipuri utilizator
  • Capitolul 9 – Functii
  • Capitolul 10 – Recursivitate
  • Capitolul 11 – Fisiere
  • Capitolul 12 – Pointeri
  • Anexe
  • Bibliografie

Introducere in ANSI C

++

Introducere
Initial, aceasta lucrare a fost conceputa avand ca instrument de lucru mediul de programare Borland C++ 3.1, varianta de DOS. Aparitia standardelor ANSI pentru C si C++ si in primul rand introducerea suportului pentru acest standard in majoritatea compilatoarelor (gcc, g++, bcc32 etc.), a dus la faptul ca unele dintre sursele existente sa nu mai fie viabile. Capitolele au fost modificate in asa fel incat un utilizator familiarizat cu mediul BC++ 3.1 sa poate face intr-un mod accesibil trecerea de la acest mediu spre variantele free oferite pe piata cu suport ANSI C++. Lucrarea a fost editata in intregime sub programul OpenOffice Writer, oferit in (probabil) toate distributiile gratuite de Linux. In acest caz, sistemul pe care s-a lucrat este SUSE 9.3. Am folosit pentru editarea programelor sursa utilitarul Kate, avand optiunile de editare specifice C++ activate, pentru compilare compilatorul g++, iar pentru depanare Kdbg, o interfata pentru gdb, depanatorul GNU. Urmatoarele volume vor contine:
– – –

Prezentarea bilbiotecii standard ANSI C++ Programare orientate obiect in ANSI C++ STD (Standard Template Library)

-1-

Introducere in ANSI C++

Capitolul 1 – Primul program
1.1 Structura generala a unui program C++
In general, structura surselor C++ ce apar in lucrare este urmatoarea:
// Comentariu (enuntul problemei) # directive_preprocesor prototipuri_functii; declaratii_variabile globale; int main(){ declaratii_variabile_locale; instructiuni; } definire_functii

Sursele C++ reprezinta fisiere text care contin codul pe care dorim sa il rulam pe calculator. Scrierea acestora se poate face in orice editor de text care permite salvarea intr-un format text „curat”, fara detalii de formatare cum ar fi cele introduse de catre un procesor de text (MS Word, OpenOffice Write etc.). Textul sursa va fi salvat sub un nume sugestiv si cu extensia cpp. Pentru a putea fi rulat, textul sursa trebuie sa fie „tradus” intr-o forma executabila de catre calculator. Fara a intra in amanunte, sursa trebuie compilata, apoi link-editata, obtinand un program executabil. In Figura 1.1 dam o schema simplificata a acestui proces.

-2-

Introducere in ANSI C++

Compilare Linkeditare

nume.cpp

nume.exe

Figura 1.1 – Trecerea de la textul sursa la fisierul executabil

1.2 Hi man!
Ca prim program vom implementa urmatoarea problema: P1. Realizati un program C++ care afiseaza mesajul „Hi man!” pe ecran. Vom rezolva problama in trei variante, una specifica C, a doua folosind mediul Borland C++ 3.1 si a treia varianta respectand standardul ANSI C++.
// P1_1. Realizati un program C++ care afiseaza mesajul „Hi man!” pe ecran.

#include <stdio.h> int main(){ printf("Hi man!");
}

// linia 1 // linia 2 // linia 3 // linia 4

Limbajele C si C++ nu dispun de catre instructiuni de intrare/iesire. Pentru a putea citi valori de la tastatura sau pentru afisa pe ecran vom folosi biblioteci care „imbogatesc” limbajul cu diferite functii utile. In acest caz, linia 1 include biblioteca standard stdio.h (standard input/output). Orice program C++ contine o functie numita main, functie cu care incepe executia programului. Linia 2 contine antetul acestei functii. Sfarsitul liniei 2 contine '{', care reprezinta inceputul unui bloc, terminat in linia 4. Intre acolade sunt scrise instructiunile programului, in acest caz linia 3, linie pe care apelam functia printf, functie care realizeaza afisarea mesajului dorit pe ecran.

-3-

Introducere in ANSI C++ In varianta urmatoare vom folosi biblioteca iostream, introdusa in C++ si care implementeaza asa numitele fluxuri de intrare/iesire.
#include <iostream.h> int main(){ cout << "Hi man!"; }
// linia 1 // linia 2 // linia 3 // linia 4

Diferentele fata de primul exemplu le constatam in linia 1, unde am inclus o alta biblioteca ce ne ofera acees la operatiile de intrare iesire, respectiv in linia 3, unde, pentru afisare folosim o altfel de constructie. Cei obisnuiti cu compilatoarele mai vechi, cum ar fi bcc.exe, compilatoriul care vine cu mediul Borland C++ 3.1, vor ramane surprinsi ca sursa de mai sus nu functioneaza (iar daca main ar fi returnat void, am fi avut doua erori!). Varianta care respecta standardul ANSI C++ este urmatoarea:
#include <iostream> int main(){ std::cout << "Hi man!"; }
// linia 1 // linia 2 // linia 3 // linia 4

Observam lipsa extensiei „.h” din linia 1, respectiv specificarea spatiului de nume std in linia 3.

1.3 Compilarea si rularea programului
1.3.1 In mediul Borland C++ 3.1
In cazul in care avem pornit mediul, putem rula programul prin apasarea combinatiei Ctrl+F9. Mediul va a apela automat compilatorul, apoi linkeditorul, va genera fisierul executabil, apoi il va rula. Pentru vizualizarea efectiva a rezultatului, apasam Alt+F5 pentru vizualizarea iesirii.

-4-

out .obj > p01. Daca dorim specificarea unui alt nume de fisier executibail. -5- .cpp va genera executabilul Hi_Man.. > bcc p01.obj) pas 3.exe) (este rulat programul) 1. pas 4.3.cpp. din directorul in care avem textul sursa.2 Folosind compilatorul g++ Rulam comanda g++ p01. De exemplu g++ -o Hi_Man p01./Hi_Man . obtinem la acest pas fisierul p01.out.. Copiem sursa in directorul c:/borlandc/bin (pas facultativ. ./a. si obtinem fisierul executabil a. dar in acest mod simplificam explicatiile) pas 2. de exemplu notepad.exe (obtinem p01. .Introducere in ANSI C++ In cazul in care am editat sursa intr-un alt editor. iar rularea se va face prin . care poate fi lansat in executie prin comanda . . in felul urmator: pas 1. pentru a rula aplicatia dorita vom realiza manual trecerea spre fisierul executabil.. > tlink p01.cpp (in cazul in care sursa a fost corecta. comanda de compilare va contine optiunea -o.

P1. Vorbim de clase de probleme in urmatorul sens: daca 2x+3=0.Introducere in ANSI C++ Capitolul 2 – Notiuni de baza 2. rezolvarea efectiva a problemei si date de iesire. Date de intrare Rezolvarea problemei Date de iesire Figura 2. in sensul ca executia pasilor algoritmului are loc fara nici un efort creator. conform Figurii 2. In general.1 – Forma generala a unui algoritm Pentru a evidentia pasii de urmat vom lua ca exemplu urmatoarea problema. iar data de iesire va fi S. Un algoritm este caracterizat prin sintagma „noi muncim. Inainte de a incepe rezolvarea problemei trebuie sa ne fie clar care sunt datele initiale de la care se pleca. -6- . In acest caz. respectiv x-4=0 reprezinta probleme. ax+b=0 va reprezenta clasa de probleme ce formeaza ecuatia de gradul I. in cadrul unui algoritm avem trei sectiuni distincte: date e intrare.1 Notiunea de algoritm Numim algoritm o succesiune de pasi care rezolva o clasa de probleme. care respecta datele problemei (adica S=a+b). datele de intrare sunt reprezentate de catre a si b.1. respectiv ce anume se cere. Realizati un algoritm care calculeaza suma a doua valori. nu gandim!”.

prin care.. deoarece compilatorul trebuie sa ”inteleaga” ceea ce dorim sa facem. sau vom rezolva o alta problema decat cea ceruta. -7- . [3].2 Citirea si afisarea datelor In subcapitolul anterior am citit datele de intrare ale algoritmului. sau vezi [1]. functii1 din cadrul bibliotecii iostream. << ultima_chestie.Introducere in ANSI C++ Algortimul este: Date de intrare (a. Limbajul C++ nu ofera instructiuni de intrare/iesire. In cazul in care dorim implementarea algoritmului intr-un limbaj de programare. respectiv am afisat rezultatul. pentru simplitatea in utilizare.)). 2. putem realiza aceste operatii.. In schimb avem la dispozitie biblioteca de functii standard. Am ales. sau: cout << ceva << altceva << .b) citeste a si b Rezolvarea problemei S=a+b Date de iesire (S) afiseaza S Intelegerea clara a enuntului unei probleme este vitala in rezolvarea acesteia. dar in acest moment ce sa zic. cel mai probabil rezolvarea nu va fi corecta. in cazul nostru C++. In cazul descrierii algoritmului in cuvinte. Pentru afisare vom folosi constructii de forma: cout << ce_vrem_sa_afisam. trebuiesc respectate o serie de reguli clare. 1 De fapt sunt obiecte... Compilatoarele C++ actuale vin cu bilbioteca standard. asteptati volumele viitorre ale lucrarii pentru explicatii suplimentare (merge si asa . Daca nu sunt clare care sunt datele de intrare. respectiv cele de iesire ale unui algoritm. acest lucru a fost realizat prin simpla enuntare a operatiei de executat (scrie S).

} Linia a doua din sursa va face ca folosirea specificarii spatiului de nume std  (std::cout) sa nu fie obligatorie. int main(){ cout << "text".1 inlocuiti #include <iostream> using namespace std.. dupa introducerea notiunii de variabila. In cazul in care folositi mediul Borland C++ 3. //afisarea unui text cout << " de".Introducere in ANSI C++ P2. cout << " te" << "st!". Afisati textul "text de test!" pe ecran. #include <iostream> using namespace std. sau: cin >> v1 >> v1 >> . Exemple de citire vom da mai tarziu. cu #include <iostream.h> in rest programul ramand nechimbat. >> vn .. Afisarea textului 'text de test!' pe ecran. Pentru citire vom folosi constructii de forma: cin >> in_ce_citim. // P2_1. -8- .

456 . stocarea unui caracter se face folosind codul lui ASCII .456 . datele de lucru au fost a. Algorimii lucreaza cu date.poate fi folosit si pentru a memora numere intregi mici .indica absenta informatiei .0 123. Fiecare constanta sau variabila din C++ are asociata un tip.1 – Tipurile de baza in C++ char int float double bool -9- .b si S. Datele cu care lucreaza algoritmii au ca si corespondent in C++ constantele si variabilele.intervalul acoperit de acest tip poate diferi de la un calculator la altul .001 10 true false Observatii .il folosim pentru numere foarte mari sau pentru o precizie mai mare dupa virgula . Variabile si constante.numar intreg cu semn .este memorat in format cu virgula mobila (float) in simpla precizie .Introducere in ANSI C++ 2.defineste un caracter .001 3.tip care apare in ANSI C++ . Tipurile fundamentale ale C++ sunt prezentate in Tabelul 2.in memoria calculatorului. In exemplul cu suma.1: Tip void Constante 'A' 'B' 'a' '+' '3' 3 123 -1020 3.3 Tipuri de date.folosit pentru memorarea numerelor reale .100.numere reale .0 123.100.1 Tabelul 2.nu este recunoscut in Borland C++ 3.

inainte de a folosi o variabila. vn.reduce intervalul de reprezentare .daca dorim doar memorarea a valori pozitive intr-o variabila .1.forteaza existenta semnului . v2. . In C++. este dublat numarul de valori pozitive de memorat . sau: tip v1.mareste intervalul de reprezentare Tabelul 2. aceasta trebuie declarata. reprezentand succesiuni de caractere cuprinse intre ghilimele. vom folosi si constante de tip sir de caractere. Exemplu de siruri de caractere pot fi: ”ABC”. folositi pentru a scimba domeniul valorilor pe are le poate pastra o variabila.2 – Modificatorii de tip short long Tipurile de date sunt folosite pentru a defini variabilele cu care dorim sa lucram in program. Prin variabila intelegem o entitate capabila sa-si modifice valoarea.10 - .2: Modificator signed unsigned Efect . C++ permite initializarea variabilei. Folosirea cuvantului cheie const inainte de declaratia unei variabile va spune compilatorului ca valoarea acesteia nu poate fi modificata in cadrul programului..Introducere in ANSI C++ Pe langa aceste tipuri de baza. prezentati in Tabelul 2. Pe langa constantele prezentate in Tabelul 2... Forma generala a unei declaratii este: tip nume. C++ ofera asa numitii modificatori de tip. . declaratia devenind: tip nume=valoare.prin disparitia semnului. In momentul declaratiei. ”Sunt un sir de caractere!”. ”1+2=3”.

Definiti cel putin 5 variabile de tipuri diferite.344.11 - . "Sunt intregul fara semn: " << u << endl. initializati-le si apoi afisati valoarile pe ecran. "Numar real (da' mai mare. "Sunt intregul mare: " << l << endl.14. Pentru a determina cantitatea de spatiu ocupata de catre fiecare tip de data. In urma executiei sa va afisa pe ecran: Sunt caracterul: A Sunt intregul: ­123 Sunt intregul mare: 12356789 Sunt intregul fara semn: 98 Sunt intregul mare fara semn: 12345678 Sunt numarul real: 3. unsigned long int U=12345678. "Sunt intregul mare fara semn: " << U << endl. cout cout cout cout cout cout cout } << << << << << << << // // // // // // // tip caracter intreg "obisnuit" intreg "mare" intreg pozitiv intreg mare fara semn numar real alt numar real "Sunt caracterul: " << c << endl. #include <iostream> using namespace std. long int l=12356789. int i=-123.14 Numar real (da' mai mare. unsigned int u=98. respectiv unsigned  int reprezinta aceeasi declaratie. daca vreau): "<<d<< endl. daca vreau): ­21. "Sunt intregul: " << i << endl. "Sunt numarul real: " << f << endl. In cazul in care lipseste tipul in cadrul declaratiei si punem doar modificatorul. introducem operatorul sizeof. Pentru exemplificare fie urmatoarea problema: P3.344 Pentru „cosmetizarea” afisarii am folosit cout << endl pentru a trece la rand nou. int main(){ char c='A'. float f=3.Introducere in ANSI C++ const tip  nume=valoare. acesta va fi aplicat pe tipul int. operator care returneaza numarul de octeti ocupati . deci unsigned. double d=-21.

cin >>b. In acest moment avem toate datele pentru a implementa algoritmul cerut in problema 1 (cea de la inceputul capitolului). cout cout cout cout } << "Un caracter ocupa "<<sizeof(char)<<" octet" << endl.12 - . S=a+b. P4. #include <iostream> using namespace std. Verificati cat ocupa in memoria calculatorului dumneavoastra diverse tipuri de date. int main(){ int a. Programul va afisa: Un caracter ocupa 1 octet Un intreg ocupa 4 octeti Tipul float ocupa 4 octeti Tipul double ocupa 8 octeti Rezultatele pot sa difere de la calculator la calculator. cin >>a. } // declararea variabilelor // citirea datelor de intrare // calcularea sumei //afisarea rezultatului .Introducere in ANSI C++ in memoria calculatorului. <<"Tipul double ocupa "<<sizeof(double)<<" octeti". #include <iostream> using namespace std. Se citesc doua anumere intregi. cout << S. Afisati pe ecran suma lor. <<"Tipul float ocupa "<<sizeof(float)<<" octeti"<< endl.S.b. << "Un intreg ocupa " << sizeof(i) << " octeti" << endl. O posibila implementare este: // P2_4. int main(){ int i=123.

o „cosmetizare” fiind bine venita: P5.b. avand in fata doar un cursor care clipeste. #include <iostream> using namespace std. realizand o interfata prietenoasa cu utilizatorul. apoi se trece la urmatoarea instructiune. Calculati valoare expresiei 2*(a-b)+c. obtinem in final afisarea sumei valorilor introduse. cin >>c. cout << endl. // declararea variabilelor // trecem la rand nou // scriem un mesaj ajutator // citim prima variabila // analog pentru celelalte // date de intrare // calcularea expresiei cout << "E=2*(" << a << "-". int main(){ int a. dupa declaratii. In acest moment variabila a preia valoarea introdusa. cout << "a=".c. O posibila rulare a aplicatiei va arata de forma: 3 5 8 Observam ca varianta prezentata nu arata deloc bine. cout << "c=". Motivul este cel ca.Introducere in ANSI C++ La rularea aplicatiei avem impresia ca ea s-a blocat.13 - . cout << "b=". cin >>b.E. executia va afisa ceva de forma: a=3 b=5 c=2 E=2*(3­5)+2=­2 . //afisarea rezultatului cout << b << ")+" << c << "=" << E. se executa instructiunea cin>>a. } In acest moment.  iar programul se opreste din executie in asteptarea unei valori introduse de la tastatura. Tratand analog si cea de a doua citire. Acest lucru se realizeaza prin scrierea unei valori urmata de apasarea tastei Enter. E=2*(a-b)+c. cin >>a.

sau in cadrul unor siruri de caractere. Tabelul 2. Urmatoarele doua surse rezolva aceeasi problema: .un caracter ' (apostrof) .un caracter \ (backslash) . fiecare secventa fiind interpretata ca un singur caracter special.4 Secvente escape Secventele escape sunt succesiuni de caractere care incep cu caracterul '\'. cum ar fi trecerea la rand nou sau tab-ul. de forma sau '\\'.14 - . Secventele escape sunt folosite pentru a introduce entitati imposibil de afisat in alt mod.un caracter ” (ghilimea) . Secventa escape \n Efect .tab orizontal .Introducere in ANSI C++ 2. cum ar fi ” abc\n\”abc\” ”.backspace .echivalent cu endl .nnn reprezinta un cod ASCII in baza 8 Tabelul 2.trecere la rand nou .3 – Secvente escape \t \' \\ \” \b \a \nnn '\n' Secventele escape pot aparea sub forma de caractere de sine statatoare.sunet de alerta .3 da o serie de secvente escape uzuale.

$ $$$ \n \n $$$ \n $$$$$ \n" << endl. Afisati un romb din caracterul '$' pe ecran. " $ " << endl. " $$$ " << endl. int main(){ cout cout cout cout cout }    $   $$$  $$$$$   $$$    $ #include <iostream> using namespace std. int main(){ cout << " cout << " }    $   $$$  $$$$$   $$$    $ << << << << << " $ " << endl. $ " << endl. " $$$$$ " << endl. " $$$ " << endl.Introducere in ANSI C++ P6.15 - . #include <iostream> using namespace std. .

int &copie_a=a. cout << "Sunt tot variabila a:" << copie_a << endl.Introducere in ANSI C++ 2. cout << "Sunt a.5 Referinte (alias-uri) C/C++ permite definirea unor alias-uri ale variabilelor. si mi se spune:123 . Exemplu de lucru cu referinte. Folosirea referintelor reluata in Capitolul 8. int &porecla=a.16 - . // variabila intreaga a // un alt nume pentru a // tot a cout << "Sunt variabila a:" << a << endl. } Sunt variabila a:123 Sunt tot variabila a:123 Sunt a. variabila initiala va putea fi accesata atat cu numele ei cat si cu alias-ul. P7. int main(){ int a=123. Din momentul definirii unei referinte. tip &porecla=a. si mi se spune:" << porecla << endl. referitor la functii. Forma generala este: tip a. #include <iostream> using namespace std.

b) = (a+3)/2 +b E(a. Afisati pe ecran un bradulet folosind caracterul '*'. Pp3. .b.  Acum voi face beep de 3 ori. in acelasi program si intr-o varianta prietenoasa cu utilizatorul.Introducere in ANSI C++ 2. sunt un backslash.c) = (a+b+c)/3 F(a. cate unul pe un rand. dupa ce am 'sarit' un tab. Folositi secvente escape pentru a afisa pe ecran: Ma numesc ”ghilimea” si nu arat asa '. Pp4. apoi afisati-le in ordine inversa. Eu.17 - .c. Calculati media aritmetica a doua valori intregi citite de la tastatura.d) = (a+b)/2 + (d­c)/3 Pp5. Pp2. Calculati si afisati. Cititi de la tastatura trei numere intregi.6 Probleme propuse Pp1.b. Citirea si afisarea sa fie prietenoasa cu utilizatorul. urmatoarele expresii: M(a. adica \.

1 Atribuirea Forma generala a operatiei de atribuire este: variabila = expresie. deci pe locul in care folosim atribuirea apare o valoare. i=3. 3.14.14 cout << "\ni=" << i. // caracterul c ia valoarea 'C' (65) f=2+1. Valoarea . va fi folosita valoarea curenta) Pas 2. } La rulare vom avea: i=3 c=C f=3. float f. cout << "\nc=" << c.18 - . Exemple de atribuiri simple #include <iostream> using namespace std. operatori si apeluri de functii evaluabila la o valoare unica. Modul in care limbajul realizeaza atribuirea este urmatorul: Pas 1. // realul f ia valoarea 3. char c. spre deosebire de alte limbaje. cout << "\nf=" << f. Este evaluata valoarea expresiei din dreapta (daca variabila din stanga apare in cadrul expresiei. int main(){ int i. atribuirea este o expresie.14 Interesant este faptul ca in C/C++.Introducere in ANSI C++ Capitolul 3 – Expresii C++ Numim expresie valida in C++ orice succesiune corecta de variabile. Valoarea calculata este atribuita variabilei din stanga P1. constante. // intregul i ia valoarea 3 c='A'+2.

cout << "\na=" << a. Alte exemple de atribuiri #include <iostream> using namespace std. de forma urmatoare: variabila1 = variabila2 = . // in partea dreapta i are valoare 3. int a. Se evalueaza expresie: . P2. pe locul atribuirii apare valoarea 3. cout << "Rezultatul atribuirii i=3 este:" << (i=3). int main(){ int i. daca avem atribuirea a=3. = variabilan = expresie. Initial avem a = expresie.variabila b ia valoarea i+2 (10 in exemplul nostru) .19 - . variabila a ia valoarea 10 . Deci.Introducere in ANSI C++ returnata de catre oparatia de atribuire este valoarea expresiei din dreapta. i=i+5. apoi devine 8 a=b=i+2.// a si b vor lua valoarea 10 (i nu se modifica) cout << "\ni=" << i. Putem folosi acest fapt pentru a realiza atribuiri multiple. Pas 2..b. } Se va afisa: Rezultatul atribuirii i=3 este:3 i=8 a=10 b=10 Pentru expresia a=b=i+2 avem urmatoarea ordine a operatiilor: Pas 1. cout << "\nb=" << b.. unde expresie este b=i+2.expresie returneaza valoarea 10 Pas 3.

In general. char. vom avea un avertisment la compilare. Conversie implicita de tip. conversia de tip este realizata fara probleme daca variabila si expresia sunt ambele de tip intreg (int. iar variabila este reprezentata pe un numar egal sau mai mare de octeti decat rezultatul expresiei.2 Conversii de tip Este posibil ca tipul expresiei sa nu fie identic cu tipul variabilei unde memoram rezultatul. i=c.) sau de tip real (float. f=i. float f=97. cout << "\nf=" << f. In urmatoare doua exemple vom evidentia cele doua cazuri de conversie implicita.14. caz in care este realizata o conversie implicita de tip si. cout << "\nc=" << c. fara pierdere de informatie #include <iostream> using namespace std. } i=65 c=A f=12345 . P3. in unele cazuri. cout << "\ni=" << i.).Introducere in ANSI C++ 3.20 - . long etc. double etc. char c='A'. int main(){ int i=12345.

Conversie implicita de tip. cout << "\nc=" << c.cpp: In function `int main()': p04.14 Observatie: c contine caracterul '9'.14.cpp:11: warning: converting to `int' from `float' La rulare: i=97 c=9 f=97.21 - . nu valoarea intreaga 9. char c='A'. i=f. int main(){ int i=12345. cu pierdere de informatie #include <iostream> using namespace std. c=i. cout << "\nf=" << f.Introducere in ANSI C++ P4. avem: p04. cout << "\ni=" << i. de forma: (tip) expresie tip(expresie) sau: . C si C++ permit conversii explicite de tip. float f=97. } La compilare.

int main(){ int i=12345. float f=97. Conversia explicita de tip #include <iostream> using namespace std.22 - . << "Dati caracterul:". Doua posibile rulari ale aplicatiei: Dati caracterul:a Caracterul 'a' are codul ASCII 97 Dati caracterul:9 Caracterul '9' are codul ASCII 57 . cout << "\nf=" << int(f). cout << "\ni=" << float(i+3). Afisati codul ASCII corespunzator caracterului citit #include <iostream> using namespace std. cin >>c. Se citeste un caracter.Introducere in ANSI C++ P5.14. << "Caracterul \'" << c. cout << "\nc=" << (char) 97. } i=12348 c=a f=97 O aplicatie directa a conversiei explicite de tip este: P6. << "\' are codul ASCII " << int(c). int main(){ char cout cout cout } c.

Daca ambii operanzi sunt intregi. // impartire intrega cout << i << "/" << f << "=" << i/f. In acest ultim caz are sens sa vorbim despre restul impartirii. // operatorul unar a=2*i. Operatorul '/' (impartirea) reactioneaza in mod diferit in functie de tipul operanzilor. 7/2 are valoarea 3. dar 7. cout << -i <<"\n". int main(){ int i=123.23 - .a. '­'. #include <iostream> using namespace std. // impartire reala }  ­123 123/246=0 123/246=0. ./2 sau float(7)/2 au valoarea 3.5 In cazul in care dorim ca raportul a doua expresii de tip intreg sa dea o valoare reala vom folosi conversia explicita de tip. // operatorul binar * f=a. float f. rezultatul este real. Operatorul modulo nu poate fi aplicat tipurilor reale. este realizata impartirea intreaga. dat de operandul '%'  (modulo).Introducere in ANSI C++ 3.5. Expresii aritmetice. in functie de operator: operator operand operand1 operator operand2 sau Operatorii uzuali folositi in cadrul expresiilor aritmetice si care se comporta asa cum ne asteptam sunt '+'. de forma: float(operator_intreg1) / (operator_intreg2) In acest context. '*'. daca cel putin unul dintre operanzi este de tip real. Impartirea reala si intreaga. Urmatoare problema da exemple de folosire a impartirii: P7. Astfel. cout << i << "/" << a << "=" << i/a << "\n".3 Expresii aritmetice Forma generala este.

apoi aceasta este incrementata. adica variabila=variabila­1. specifici C si C++. sunt cei de incrementare si decrementare: variabila++ ++variabila variabila­­ variabila­­ Operatorul ++ realizeaza incrementarea variabilei pe care este aplicat. valoarea variabilei este incrementata. . Diferenta intre cele doua forme (sufix sau prefix). consta in faptul ca. "\t". cout i/=10. in timp ce in cazul prefix. adica este similar atribuirii variabila=variabila+1. "\t". apoi este folosita in expresia din care face parte. int main(){ int i=123.Introducere in ANSI C++ Exista o serie de operatori de atribuire speciali (forma scurta a atribuirii). 125     100     200     20       Alti operatori. in timp ce –­ realizeaza decrementarea.24 - . valoarea variabilei este folosita neschimbata in expresia din care face parte. i+=2. "\t". cout i*=2. cout i-=25. in cazul sufix. cout } << << << << i i i i << << << << "\t". Atribuirea este echivalenta cu:  variabila = variabila op expresie P8. Forma scurta a atribuirii #include <iostream> using namespace std. operatori ce vor avea forma generala:  variabila op= expresie unde op poate fi orice operator aritmetic prezentat anterior.

b=false. } true=1 false=0 . apoi incrementam i cout << i << "\t" << a << "\t"<< b << "\t".25 - . compilatoarele mai vechi (bcc) nu suporta acest tip. regula care se respecta este faptul ca valoarea 0 inseamna fals din punct de vedere logic. Daca in ANSI C++ avem definit un tip specific (bool).a. a=++i. iar orice valoare diferita de 0 (de obicei valoarea 1) este interpretata ca adevarat. cout << "false=" << b. } 126     125     125      3.b.// atribuim lui a valoarea lui i. int main(){ int i=123. // daca nu apare intr-o expresie este similar cu ++i. cout << "true=" << b << "\n". Valoarea expresiilor logice #include <iostream> using namespace std. i++. P10.Introducere in ANSI C++ P9. apoi il atribuim lui a b=i++. int main(){ bool b.// incrementam i.4 Expresii logice Sunt acele expresii in care rezultatul este interpretat ca adevarat sau fals. b=true. In orice caz. Incrementarea si decrementarea #include <iostream> using namespace std. asa cum arata si exemplul urmator.

!(x>=2).26 - . operator reprezentand atribuirea. Diferite expresii logice pot fi reunite folosind operatorii logici din Tabelul 3. adica x∈[2.2. (x<2)||(x>5). expresii in care sunt comparate doua valori. Operator && || ! Semnificatie si logic sau logic negatie logica Exemplu (x>=2)&&(x<=5).5] adica x∉[2.1 – Operatorii relationali Observam ca testarea egalitatii a doua expresii nu se face folosind '='. Operatorii relationali sunt dati in tabelul urmator: Operator < > <= >= != == Semnificatie mai mic mai mare mai mic sau egal mai mare sau egal diferit egal 3<5 Exemplu (4+1) > (2*2) 2<=3 3>=3 2!=3 3==3 Tabelul 3.2 – Operatorii logici .5] adica x<2 Tabelul 3.Introducere in ANSI C++ Un caz particular de expresii logice il reprezinta expresiile relationale.

} Dati intervalul [a. expresia returneaza expresie2. cout << "Dati intervalul [a. cin >>i. Verificati unde se gaseste prima valoare citita in raport cu intervalul determinat de ultimele doua valori. cout << "apartine intervalului:" << (i>=a)&&(i<=b)).5 Operatorul conditional Are forma generala: expresie1?expresie2:expresie3 Daca expresie1 este evaluata la adevarat. altfel returneaza expresie3.Introducere in ANSI C++ P11. Se citesc trei valori intregi de la tastatura.a. cin >> a. int main(){ int i. In unele cazuri particulare poate fi un inlocuitor pentru instructiunea if. cin >> b. 3. . cout << "b=".b. #include <iostream> using namespace std.b]\na=".27 - . cout << "Dati valoarea:". cout << "\nnu apartine intervalului:" << (i<a)||(i>b).b] a=2 b=5 apartine intervalului:1 nu apartine intervalului:0 Observam ca valoarea de adevar a afirmatiilor este data sub forma 0-fals si 1adevarat.

b). int main(){ int x. int main(){ float a.2)=5 >>a. Interschimbati cele doua valori. cin >>x./x : 0. E = (x!=0) ? 1. float E. afisand valoarea 0 in caz contrar. cin max = (a>b) ? a : cout << "max(" << } a=5 b=2 max(5.b. . Se citesc doua valori intregi de la tastatura." << b << ")=" << max. a << ". unde a si b sunt valori reale citite de la tastatura. #include <iostream> using namespace std. cout << "a=". Calculati expresia max(a. b.5 P13.Introducere in ANSI C++ P12. cin cout << "b=". P14. #include <iostream> using namespace std. apoi afisati rezultatul pe ecran. cout << "x=".28 - . >>b. Calculati expresia E(x)=1/x daca e posibil. } x=2 1/2 = 0.max. cout << "1/" << x << " = " << E.

Necesitatea folosirii parantezelor. Tabele cu prioritatea operatorilor gasiti in [1]. a=b.[5] etc. cout << "a=". int main(){ int a. P15. // rez=((2<=a)&&(a<=5)).5]. cout << "a=".5]:1 . t=a.dupa interschimbare --\n". } a=2 b=5 ­­ dupa interschimbare ­­ a=5     b=2 Ordinea de efectuare a operatiilor in cazul unei expresii complexe este data de prioritatea operatorilor. } a=8 8 apartine intervalului [2.29 - . De cate ori nu stiti exact ordinea in care se vor executa diferite operatii intr-o expresie. cin >> a. int main(){ int a. cin >>a. cout << "a=" << a << "\t" << "b=" << b . rez=(2<=a<=5). b=t.Introducere in ANSI C++ #include <iostream> using namespace std.b. desi in unele cazuri pare sa functioneze !!! #include <iostream> using namespace std. folositi parantezele. cout << a << " apartine intervalului [1. respectiv de folosirea parantezelor.t.5]:" << rez .rez. cin >>b. Acest program NU va verifica apartenenta valorii a intervalului [1. cout << "b=". cout << "-.

30 - . expresie2. // b=a++ cout << a << " " << b << "\n". valoarea returnata la final fiind valoarea si tipul dat de expresien. Urmeaza apoi comparatia 1<=5. // b=++a cout << a << " " << b << "\n". cin >> a.a+=1. } a=3 4 3 5 5 .b. cout << "a=". deci rezultatul final este adevarat. #include <iostream> using namespace std.6 Operatorul virgula Are forma generala: expresie1 . adica 1 in context C/C++.t.t).Introducere in ANSI C++ Observam ca la conditia care pare "8 apartine lui [2. Rezolvarea corecta este cea data in comentariu. 3. int main(){ int a.. P16. .. expresien  Expresiile sunt evaluate de la deapta la stanga. b=(a+=1. Simulati operatorii de preincrementare si postincrementare folosind operatorul virgula (b=a++ si b=++a).5]" rezultatul este adevarat (1). adevarat pentru a=8. b=(t=a..a). Motivul este urmatorul: Expresia 2<=a<=5 este evaluata de la stanga la dreapta. deci primul lucru evaluat este 2<=a.

3 da operatorii pe biti acceptati in C/C++: Operator & Semnificatie si pe biti x&1 Exemplu – reseteaza toti bitii. .3 – Operatori logici pe biti Exemplele din tabel sunt date pentru x de tip intreg.31 - .7 Operatori care actioneaza la nivel de bit Tabelul 3.Introducere in ANSI C++ 3. in afara celui mai putin semnificativ x|1 | sau pe biti – seteaza bitul cel mai putin semnificativ x^0 – x^x – valoare ^ ~ >> << sau exclusiv negatie pe biti deplasare la dreapta deplasare la stanga complementeaza toti bitii nula pentru orice x toti bitii ~x – complementeaza x<<2 x>>3 – similar cu x*=2 – similar cu x/=3 Tabelul 3.

Pp4. strict pozitiv. Pp6.8 Probleme propuse Pp1.Introducere in ANSI C++ 3. calculati si afisati rezultatul expresiei E(a)=max(min(a.32 - . determinati minimul a doua valori intregi citite de la tastatura. Afisati rezultatul expresiei E(a.b)=(a-b)/(a+b). Folosind operatorul conditional. Se citeste un numar real x de la tastatura. Afisati pe ecran suma celor mai mici doua valori. Folosind operatorul conditional. Pp3. Pp7. adica valoarea care nu este nici minimul. Se citesc trei numere intregi de la tastatura.|a-7|). Pp2. Se citeste un numar real x. Se citesc trei numere intregi de la tastatura.7). Pp5. Calculati si afisati rezultatul expresiei (x-1)/x2 . Folosind conversii de tip. . de la tastatura. Se citeste un numar real de la tastatura. Afisati valoarea "din mijloc". valori intregi strict pozitive. afisati partea fractionara a numarului. Se citesc doua numere a si b de la tastatura. nici maximul celor trei valori date.

". . } a=123 123 este pozitiv. if (a<0) cout << a << " este negativ.". altfel se executa instructiune2. cin >> a.". if (a>0) cout << a << " este pozitiv.1 Instructiunea if Exista doua forme ale instructiunii if: if (expresie) instructiune In acest caz. if (expresie) instructiune1 else instructiune2 Daca expresie este evaluata la adevarat se executa instructiune1. 4. int main(){ int a. P1. if (a==0) cout << a << " este nul. Se citeste un numar intreg de la tastaura. daca expresie este evaluata la adevarat (o valoare nenula). dar.Introducere in ANSI C++ Capitolul 4 – Instructiuni conditionale Daca dorim executia unor instructiuni doar daca o conditie este adevarata sau daca dorim ramificarea executiei programului. De obicei expresia dintre paranteze este o expresie logica. In urmatoarele exemple vom arata diverse moduri de a realiza comparatii in C. datorita conventiilor C referitoare la notiunile de adevarat si fals. cout << "a=". atunci se executa instructiunea care urmeaza. expresia poate fi de orice tip. Verificati daca acesta este nul. #include <iostream> using namespace std.33 - . inclusiv expresii aritmetice sau atribuiri. folosim instructiuni conditionale. pozitiv sau negativ.

cin >> a.daca a este nul. In general. adica corespunde valorii false. verificarea unei expresii daca este adevarata sau falsa. conform conventiilor C.Introducere in ANSI C++ sau: a=0 0 este nul. deci se va executa prima ramura a if-ului . if (a) cout << a << " este nenul. P2. Se citeste un numar intreg de la tastaura.daca a este diferit de zero. Verificati daca acesta este nul sau nu. else cout << a << " este nul.34 - .". atunci. se executa cea de a doua ramura. int main(){ int a. cout << "a=". de forma: if (expresie) Nu este nevoie sa scriem varianta echivalenta: if (expresie != 0) if (expresie != false) sau . va fi evaluata in felul urmator: . reprezinta true.". } a=123 123 este nenul. Conditia "ciudata" din if. Sa vedem putin ce se intampla in acest caz. #include <iostream> using namespace std. se realizeaza prin simpla scriere a expresiei intre parantezele if-ului.

char op.. acestea vor fi tratate in mod unitar. '-'. observam ca instructiunea de pe ramura fals a primului if este o alta instructiune if. } a=2 b=3 operatia:+ 2+3=5 In problema 3. In cazul scrierii instructiunilor intr-un bloc. cin >> b.b. ca o singura instructiune. vom grupa aceste instructiuni intr-un bloc (instructiune compusa). cout << "a=". cout << "b=". cin >> op. cin >> a. Afisati valoarea corespunzatoare aplicarii operatiei date asupra intregilor cititi. #include <iostream> using namespace std.}). Se citesc de la tastaura doua numere intregi si un caracter reprezentand operatiile matematice '+'. Vom denumi acest caz ca imbricarea instructiunii if si vom folosi alinierea else cu if-ul corespunzator pentru a imbunatatii lizibilitatea programului. . int main(){ int a.Introducere in ANSI C++ P3.. else if (op=='-') cout << a << '-' << b << '=' << a-b.35 - . Vom numi bloc zona cuprinsa intre acolade ({. if (op=='+') cout << a << '+' << b << '=' << a+b. else cout << "Operatiei neimplementata!". In legatura cu sugestii privind indentarea codului studiati Anexa 3. cout << "operatia:". Daca dorim executia a mai multe instructiuni pe o ramura a instructiunii if.

. int max.c. cin >> c. } else{ min=a. } a=2 b=3 c=1 min(2.1)=3 Datorita faptului ca putem avea mai multe nivele de imbricare a instructiunilor unele avand else si altele nu. cout << "\nmax("<<a<<". } // "ajustam" minimul si maximul in functie de a treia valoare if (c>max) max=c. Mai mult.36 - . cout << "a=".min. int main(){ int a. max=a."<<b<<". cin >> b. Calculati maximul si minimul valorilor.3.1)=1 max(2."<<b<<"."<<c<<")="<<max. trebuie acordata o atentie deosebita corespondentei if­else dorite. Fiecare else va fi in corespondenta cu primul if  care se gaseste inaintea lui in textul sursa cu proprietatea ca nu ii corespunde nici un else si nu este inclus in instructiunea if care il precede."<<c<<")="<<min. if. // calculam minimul si maximul primelor doua valori if (a>b){ min=b. #include <iostream> using namespace std. Se citesc de la tastaura trei numere intregi. cout << "b=". max=b. cout << "min("<<a<<".Introducere in ANSI C++ P4. cin >> a. cout << "c=". o aliniere corecta nu va tine locul de bloc.3.b. if (c<min) min=c.

} p05. Varianta corecta a problemei 5. cin >> a.. //[2] else cout << "E mai mare ca trei". if (a<3) cout << "E mai mic ca trei\n". #include <iostream> using namespace std.Introducere in ANSI C++ P5. int main(){ int a. if (a<3){ cout << "E mai mic ca trei\n". iar else isi gaseste corespondent. #include <iostream> using namespace std. Linia [2] din cod ar trebui aliniata cu instruciunea if. deci nu va gasi corespondet pentru else.) ".cpp: In function `int main()': p05.. cout << "a=". //[2] } else cout << "E mai mare ca trei". pare ca pe ramura true vor fi executate cele doua instructiuni.) Acum liniile [1] si [2] sunt grupate intr-un bloc. . } a=2 E mai mic ca trei Nu mai da eroare . P6. //[1] cout << "Pacat doar ca nu va merge niciodata. afisarea fiind executata in afara acestuia.37 - . datorita imbricarii. int main(){ int a. //[1] cout << "Nu mai da eroare . deci pe ramura true se executa o singura instructiune. cin >> a. Exemple de erori de compilare la surse care par corecte. compilatorul va interpreta if-ul ca fiind fara else (pe ramura true se executa o singura instructiune).cpp:12: error: syntax error before `else' Desi. cout << "a=".".

if ((a<=b) && (b<=c) && (c<=d)) cout << "Numerele citite sunt in ordine crescatoare". cin >> a >> b >> c >> d. Daca da. folosirea expresiilor logice compuse reprezinta o alegere evidenta. P7.Introducere in ANSI C++ In multe probleme. P8. Acelasi efect il putem obtine folosind o variabila de tip intreg in locul celei booleene. } Introduceti patru numere intregi: 2 4 5 8 Numerele citite sunt in ordine crescatoare Putem folosi o variabila booleana pentru a memora rezultatul unor exepresii logice complexe. cout << "Introduceti patru numere intregi:\n".b. int main(){ int a. afisati ratia.38 - . #include <iostream> using namespace std. apoi sa folosim acea variabila ca o conditie in cadrul instructiunii if. Determinati daca patru numere intregi citite de la tastatura sunt in ordine crescatoare sau nu. Determinati daca patru numere intregi formeaza o progresie aritmetica.c. else cout << "Numerele citite nu sunt in ordine crescatoare". .d.

cu ratia: " << b-a. cout << "Introduceti patru numere intregi:\n".Introducere in ANSI C++ #include <iostream> using namespace std. // verificam daca primele trei formeaza o progresie progresie = progresie && (2*c==b+d). if (progresie){ cout << "Numerele citite sunt in progresie\n".d. progresie = (2*b==a+c).0 0   inrest . } else cout << "Nu avem o progresie aritmetica"..b.. P9. int main(){ int a. cu ratia: 2 Un caz uzual in care apare folosirea conditiei multiple este verificarea apartenentei unui numar unui interval dat.c. // acum urmatoarele. cout << "aritmetica.39 - .20 ] f  x =−x pentru x ∈−20. } Introduceti patru numere intregi: 2 4 6 8 Numerele citite sunt in progresie aritmetica. bool progresie. cin >> a >> b >> c >> d. Calculati urmatoarea functie: x pentru x∈[10.

  case constantan:  instructiuni.Introducere in ANSI C++ #include <iostream> using namespace std. else if ((x>-20)&&(x<0)) F=-x. else F=0. instructiunea switch fiind mai eleganta. } x=3 f(3)=0 Nu este recomandata verificarea egalitatii intre doua numere reale. unde eps este o valoare mica. cin >> x. if ((x>=10)&&(x<=20)) F=x. . . Forma generala a instructiunii switch este: switch (expresie){ case constanta1:  instructiuni. . case constanta2:  instructiuni.2 Instructiunea switch In unele aplicatii dorim sa comparam valoarea unei variabile sau a unei expresii cu mai multe valori sau expresii constante. 4.40 - . In acest caz se recomanda folosirea unor conditii de forma abs(a­b) < eps. int main(){ int x. Executia instructiunii are loc in urmatorul mod: . cout << "f(" << x << ")=" << F.F. default: instructiune. Datorita erorilor de calcul. } Optiunea default este optionala. este posibil ca rezultatele calculelor sa nu fie exacte. In acest caz solutia oferita de catre instructiunile if imbricate poate fi greoaie. cout << "x=".

  case constantan:  instructiuni. se foloseste instructiunea break Cum de obicei se intampla acest lucru. break. } cout << a << op << b << "=" << R. forma generala devine: switch (expresie){ case constanta1:  instructiuni. apoi se compara. se executa setul de instructiuni ce urmeaza .h> using namespace std. } . default: instructiune. break. break. apoi afisati rezultatul pe ecran. cin >>op.daca este realizata egalitatea. cout << "b=". pe rand cu fiecare constanta . float R. break.41 - . Daca acest caracter este ‘+’. ‘-’. R=a*b. realizati operatia respectiva intre intregiii de intrare. return(1). break. case constanta2:  instructiuni. . cout << "a=". cout << "operator:". ‘*’ sau ‘/’.b. #include <iostream> #include <math. . Se citesc de la tastatura doua numere intregi si un caracter.daca dupa executarea unei secvente dorim iesirea din switch. char op. int main(){ int a.se evalueaza expresie. cin >>b.} else {cout << "Impartire la zero!". return(1). cin >>a. R=a-b. . if (b!=0) { R=float(a)/b. break.} default:cout << "Operator necunoscut!".Introducere in ANSI C++ . } P10. switch (op){ case '+': case '-': case '*': case '/': R=a+b.

case 2: cout <<"miercuri". #include <iostream> using namespace std. case 1: cout <<"marti". break. break. Afisati ce zi din saptamana va avea o alta data a lunii respective. case 5: cout <<"SAMBATA". 2 – pentru marti. etc). cout << "Data corespunde unei zi de ". zi=(zi+prima_zi-1)%7. switch(zi){ case 0: cout <<"luni". cin >> zi. break.Introducere in ANSI C++ a=2 b=4 operator:/ 2/4=0. break. case 6: cout <<"DUMINICA". break. break. case 4: cout <<"vineri". case 3: cout <<"joi". cin >>prima_zi. cout << "Ziua corespunzatoare datei de 1 a lunii:".42 - . zi. } } Ziua corespunzatoare datei de 1 a lunii:0 Data de verificat:14 Data corespunde unei zi de DUMINICA . int main(){ int prima_zi. Se citeste de la tastatura ziua din saptamana corespunzatoare date de 1 ale unei luni (1 – pentru luni.5 P11. break. cout << "Data de verificat:".

Se citesc 3 numere intregi de la tastatura. a si b citite de la tastatura.43 - . y = xy pentru x0 x∗y pentru x≥0 Pp3. Se citeste x intreg. Pp5. Daca nu. Pp7. Pp2.3 Probleme propuse Pp1. Rezolvati ecuatia de gradul 1. Pp4. afisati mesajul "We have a problem!". afisati numele unei luni cu numarul de ordine citit de la tastatura. afisati-le in ordine crescatoare. Pp8.Introducere in ANSI C++ 4. Calculati: f  x . Daca toate nuemerele citite sunt pozitive. Sa se calculeze ultima cifra a lui 2x. Afisati valorile distincte citite. Se citesc patru numere intregi de la tastatura. Folosind instructiunea switch. Dati un exemplu de problema in care expresia conditionala nu poate tine locul instructiunii if. . Sa se determine ultimele doua cifre ale produsului a*b. Pp6.

in functie de o conditie.b variabile intregi citite de la tastatura aceasta metoda nu poate fi folosita. Acestea sunt while. La afisarea valorilor dintr-un interval [a.. se continua executia cu instructiunea urmatoare Poate cea mai simpla problema care se poate rezolva folosind structuri repetitive este afisarea valorilor intregi din [1. se executa instructiune.se evalueaza expresie . sunt de preferat expresii logice. ca si la instruciunea if. o rezolvare de forma: .. In acest caz.daca rezultatul este false (0). folosim instructiunile repetitive. poate fi utilizata doar daca intervalul dat este mic si definit de catre constante.1 Instructiunea while Forma generala a instruciunii while: while (expresie) instructiune. inclusiv expresii aritmetice sau atribuiri. cout << 1 << 2 << 3 << . Daca se doreste executarea unui grup de instructiuni se va folosi un bloc care sa formeze corpul instructiunii while.44 - .. 5. a. do­while si for.Introducere in ANSI C++ Capitolul 5 – Instructiuni repetitive Daca dorim executia unor instructiuni de mai multe ori. apoi se revine la primul pas .b].daca rezultatul este true (diferit de 0). ..10]. Expresia poate fi de orice tip. Executia instructiunii: . dar.

while (i<=10){ cout << i<< " ". a. .Introducere in ANSI C++ P1.b.b] 1 0 1 0 1 . #include <iostream> using namespace std.45 - . i++.. Afisati numerele de la 1 la 10 pe ecran. a+1.valori mai mici sau egale citesc cu n n valori echidistante din intervalul [a.. int main(){ int i.n valori . a<b) • • • • 1 2 4 8 . . b . Afisati urmatoarele serii de numere pe ecran (a..... i=1.n sunt intregi citite de la tastatura.. } }  citesc1 2 3 4 5 6 7 8 9 10  P2.

cout << "n=". } cout << endl. pas=float(b-a)/n.5 7 1 0 1 0 1 0 1 0 1 0  . i=1. i=1.5 5 5. cin >>a. k=a. i++. while (i<=n){ cout << i%2 << " ". } } n=10 a=2 b=7 1 2 4 8 2 3 4 5 6 7 2 2. while (i<=n){ cout << i<< " ".a. } cout << endl. } cout << endl.5 4 4.n. cout << "a=". cin >>n. k=k+pas. i++.b.5 6 6. while (k<=b){ cout << k << " ". float pas. i=a. i=2*i.46 - . while (i<=b){ cout << i << " ".Introducere in ANSI C++ #include <iostream> using namespace std.5 3 3. cin >>b. cout << "b=". int main(){ int i.k.

while instructiunea se executa cel putin o data. cout << "n=".Introducere in ANSI C++ In unele cazuri corpul instructiunii while poate sa fie vid.daca rezultatul este false (0) se incheie instructiunea si se continua programul . while (expresie). } n=123 120 // while cu corp vid 5. In acest caz vomverondela folosi intructiunea vida .  Observatiile de la instructiunea while raman valabile si pentru aceasta instructiune. int main(){ int n. chiar si in cazul in care expresie este falsa la prima iteratie.daca rezultatul este true (diferit de 0) se revine la primul pas . (while fara corp) #include <iostream> using namespace std. Afisati cel mai mare numar multiplu de 10 mai mic ca numarul citit. cin >>n. in cazul instructiunii do.se executa instructiune . P3.47 - . .se evalueaza expresie . while ((n--)%10!=0). Se citeste un numar intreg de la tastatura. cout << n+1.2 Instructiunea do-while Forma generala a instruciunii do ­ while: do  instructiune. Diferenta dintre while si do-while este aceea ca. Modul de executie al instructiunii: .

Se citeste de la tastatura un numar real cu 3 zecimale. c++. "Mutati" virgula pe toate pozitiile interioare posibile in cadrul numarului initial.1 P4.c. Afisati pe ecran rezultatul. if (c1>c2){t=c1. }while(c<=c2)." << int(c) << endl.} c=c1.t. Afisati pe ecran caracterele si codurilor lor ASCII din intervalul dat de catre caracterele citite. Figura 5. int main(){ char c1. }  A C A ­ 65 B ­ 66 C ­ 67 P5. cate un numar pe un rand. .    while (expresie)  instructiune.     while (expresie). do{ cout << c << " .48 - .Introducere in ANSI C++ Urmatoarele secvente de instructiuni sunt echivalente:   if (expresie)       do      instructiune. c1=c2. #include <iostream> using namespace std. cin >> c1 >> c2. c2=t. Se citesc de la tastatura doua caractere.c2.

int main(){ float n. n=n*100. reinit) instructiune.789 1278.. n=n/10.9 127.cat timp expresie este adevarata . } n=12.Introducere in ANSI C++ #include <iostream> using namespace std.se executa init . expr2. sau.49 - . expr3) instructiune. Modul de executie al instructiunii: .89 12. do{ cout << n << endl. Instructiunea for este instructiunea ce implementeaza in C ciclul cu numar cunoscut de pasi (desi vom vedea ca nu este limitata la acest tip de cicluri). } while(n>1).2789 5.789 1. cout << "n=". de obicei: for(init. Forma generala a instruciunii for: for(expr1. cin >> n.3 Instructiunea for In general instructiunile while si do-while poarta numele de cicluri cu numar necunoscut de pasi. cond_de_oprire .

p=2*p. a<b): – – – – – 1..3. 1. for(i=1.p. in ordine crescatoare puterile lui 2 mai mici decat n primele n puteri ale lui 2 #include <iostream> using namespace std..Introducere in ANSI C++ .i<=n.i>=-n.se executa instructiune . P6.. 2. int main(){ int n.i<=b.n sunt intregi citite de la tastatura.i<=10. cout << endl.50 - ..b.b].. -n valorile intregi din intervalul [a. cout << endl..i<=n.se executa reinit Instructiunea for este folosita. for(i=a.i++) cout << i << " ". . in principal.a..10 n...i++){ cout << p << " ". .i--) cout << i << " ". n-1. for(i=n. pentru parcurgerea seriilor de numere. for(i=1.b. Afisati urmatoarele serii de numere pe ecran (a. cout << endl. -1. -2. 0. for(i=1. cin >> n >> a >> b.i++) cout << i << " ".i=2*i) cout << i << " ". cout << endl. } } 5 3 8 1 2 3 4 5 6 7 8 9 10 ..i. p=1.2.

i<=n/2. for(i=1. in total n valori #include <iostream> using namespace std. instructiunea for devine echivalenta ca functionalitate cu bucla while. In figura 5. for(i=1. } } n=7 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1  Cum partea de reinitializare din cadrul buclei for contine orice expresie.i++){ cout << b << " ". Afisati. cin >> n.Introducere in ANSI C++ 5 4 3 2 1 0 ­1 ­2 ­3 ­4 ­5 3 4 5 6 7 8 1 2 4 1 2 4 8 16  P7.i++) cout << 1 << " " << 0 << " ". folosind trei metode diferite urmatoarea serie de numere pe ecran: 1 0 1 0 1 0 . b=!b.51 - . for(i=1.i.. cout << "n=". int main(){ int n.. cout << endl..i<=n. if (n%2==1) cout << 1. nu numai incrementare/decrementare.i++) cout << i%2 << " ". b=1. cout << endl.2 este data echivalenta dintre instructiunile for si while: .i<=n.b.

urmatoarea bucla fiind bucla infinita: for(. . i<=n.i++. In plus.. i<10 . int main(){ int n. for(i=1.       expr3. cout << "n=". Afisati tabela cu codurile ASCII. in cadrul instructiunii for.expr2.2 Folosirea expresiei virgula reprezinta o varianta prin care putem controla mai multe variabile in cadrul aceleiasi bucle for. Afisati urmatoarele serii de numere pe ecran: • • 1 9 2 8 3 7 ..52 - .j=9.j.).   while (expr2){  instructiune. .p*=2) cout << p << " ". } n=5 1 9 2 8 3 7 4 6 5 5 6 4 7 3 8 2 9 1 1 2 4 8 16  Putem folosi.Introducere in ANSI C++   expr1.   }  for(expr1. Figura 5..i. mai multi contori.. cin >> n.p=1. cout << endl. i++.j--) cout << i << " " << j << " ".expr3)       instructiune.. P10. eventual de tipuri diferite. for(i=1.p. 9 1 1 2 4 8 . cate 10 pe un rand. P8. toate partile din for sunt optionale. in total n valori #include <iostream> using namespace std.

53 - ... Instructiunea break va cauza iesirea doar din cadrul buclei curente.. int main(){ unsigned char c. eventual in functie de o alta conditie decat cea din bucla. <­60    =­61    >­62    ?­63    @­64    A­65    B­66    C­67    D­68    E­69 F­70    G­71    H­72    I­73    J­74    K­75    L­76    M­77    N­78    O­79 ......c<255. folosim instructiunea break. if (c%10==9) cout << endl. Sintaxa: break..... De obicei vom folosi instructiunea break pentru a nu complica conditia din bucla. Tot pentru controlul fluxului de executie putem folosi instructiunea continue....4 break si continue In cazul care se doreste iesirea din bucla curenta imediat...Introducere in ANSI C++ #include <iostream> using namespace std.. fluxul executiei din cadrul buclei curente este intrerupt.. Sintaxa: continue. 5.c++){ cout << c << "-" << int(c) << "\t". dar executie revine la conditia de oprire din bucla. in cazul in care avem mai multe bucle imbricate.. for(c=0.. Analog instructiunii break.. iesirea facandu-se in bucla imediat superioara..... } } .. .

1/1.d<=i/2.12 ­0.1  . 1/9..precision(2). } } 0.25 0.11 ­0.1 0.. #include <iostream> using namespace std.2 0./i << " ". cu doua zecimale exacte: • 1/10. cout. } } n=20 1 2 3 5 7 11 13 17 19  P12. . for(d=2.d++) if (i%d==0){prim=false.14 ­0. int main(){ int n. break. Afisati pe ecran urmatoarele numere. Afisati pe ecran numerele prime mai mici decat n.25 ­0. int main(){ int i.11 0. for(i=10..d. cout << 1.33 ­0. bool prim. 1/8. 1/-2.14 0.17 0.i. cin >>n. .i<=n.54 - .5 ­0. cout << "n=".} if (prim) cout << i << " ". 1/-10 #include <iostream> using namespace std.33 0.17 ­0.i--){ if (i==0) continue.i++){ prim=true. for(i=1.2  ­0..12 0.Introducere in ANSI C++ P11.i>=-10.5 1 ­1 ­0. 1/-1.

Folosind instructiunea goto.b]. int main(){ int i. 3 6 3 4 5 6  .Introducere in ANSI C++ 5. identificata printr-o eticheta se poate realiza prin instructiunea goto.a. salt: cout << i << " ".55 - . afisati pe ecran numerele intregi din intervalul [a. folosirea instructiunilor if. iar depanarea este mai facila. folosirea acesteia nu este recomandata. i++. cin >> a >> b.5 instructiunea goto Trecerea fluxului de executie la o pozitie oarecare.b. if­else si while  putand realiza acelasi lucru. Chiar daca este o instructiune pusa la dispozitie in cadrul limbajului C. Definirea etichetei se face in felul urmator: eticheta: iar utilizarea instructiunii goto: goto eticheta. #include <iostream> using namespace std. i=a. if (i<=b) goto salt. } // se revine la eticheta salt P13.

cam asa".6.56 - .3 n 1234 10 1230 123 4 n%10 n/10 Figura 5. Accesul la cifrele unui numar este dat de Figura 5.6 Probleme tip In acest subcapitol vom prezenta o serie de algoritmi ce vor fi rezolvati folosind instruciuni repetitive.Introducere in ANSI C++ 5. Vom prezenta o serie de "scheme generale" de rezolvari de algoritmi.3 De aici obtinem urmatoarele: c= n% 10 – calculul ultimei cifre n=n/10 – eliminarea ultimei cifre Si mai departe. parcurgerea unui numar intreg pozitiv. rezolvarea este. n=n/10.  foloseste(c). . } unde foloseste(c) este o secventa de instructiuni dependenta de enuntul problemei. Aceste scheme sunt reguli de forma: "daca o problema suna asa.1 Probleme pe cifrele unui numar Acest gen de probleme prelucreaza numerele intregi la nivel ce cifre componente. de obicei. 5. cifra cu cifra: while (n>0){ // cat timp mai avem cifre c= n% 10.

.57 - . cin >> n. cout << "n=".n=n/10) foloseste(n%10). Afisati cifrele unui numar. while(n>0){ c=n%10. } // } n=1942 2 4 9 1 for(. P14. cout << c << endl. cate o cifra pe un rand. n=n/10.n.Introducere in ANSI C++ O alta varianta este cea folosind instructiunea for: for(.n>0.c. Ultima instructiune for (cea comentata) rezolva acceasi problema intr-o varianta compacta. .n/=10) cout << n%10 << endl. #include <iostream> using namespace std. int main(){ int n.

d++) // dintre toti divizorii posibili if (n%d==0) foloseste(d). // selectam divizorii P15.6.2 Probleme de divizibilitate Un numar n este divizibil cu numar d daca restul impartirii lui n la d este zero. int main(){ int n.Introducere in ANSI C++ 5. #include <iostream> using namespace std.d++) if (n%d==0) cout << d << " ".d<=n. Afisati divizorii unui numar intreg pozitiv citit de la tastatura.d<=n. • • Verificati daca este prim descompuneti-l in factori primi . Se citeste de la tastatura un numar intreg pozitiv. } n=120 1 2 3 4 5 6 8 10 12 15 20 24 30 40 60 120 P16.d. cin >> n.58 - . deci: n%d==0  ­ verificarea daca d|n Plecand de la aceasta conditie. for(d=1. cout << "n=". parcurgerea divizorilor unui numar intreg pozitiv n: for(d=1.

Calculati cmmdc(a.d++) if (n%d==0){ prim=false. while(n>1) if (n%d==0){ cout << d << " ". for(d=2. } else d++. } if (prim) cout << n << " este prim\n".Introducere in ANSI C++ #include <iostream> using namespace std.d<=n/2.b) si cmmmc(a. Se citesc doua numere intregi pozitive de la tastatura. bool prim. cout << "n=". } n=120 120 nu este prim 2 2 2 3 5 P17. break.b).d. . n=n/d. else cout << n << " nu este prim\n".59 - . cin >> n. d=2. int main(){ int n. prim=true.

} cmmdc=aa.60 - ." << b <<")=" << cmmmc.aa.bb." << b <<")=" << cmmdc << endl. } 24 36 cmmdc(24. produse.r. bb=b. cmmmc=(a*b)/cmmdc.Introducere in ANSI C++ #include <iostream> using namespace std. cin >> a >> b. aa=a. numarari Avem urmatoarele scheme generale: Suma: S=0 Pentru toate valorile X de insumat S=S+X Produsul: P=1 Pentru toate valorile X de inmultit P=P*X .cmmdc. while(bb!=0){ r=aa%bb.36)=72 5.b. int main(){ int a.36)=12 cmmmc(24. cout << "cmmmc(" <<a <<". bb=r. cout << "cmmdc(" <<a <<". aa=bb.6.3 Sume.cmmmc.

cout << Sm << " " << fact << " " << S..18654 P19. Se citesc doua numere intregi a si b (a<b). float S. for(fact=1./i..Introducere in ANSI C++ Numarari (contorizari): ct=0 Pentru toate valorile X de parcurs if (conditie(X)) ct++ P18. i++) S+=1. 1/b (in cazul impartirii la 0 termenul nu apare) #include <iostream> using namespace std.fact. Calculati: • • • Suma numerelor pare din interval a! S=1/a+1/(a+1)+ .i.i=a. for(S=0.i++) Sm+=i. } 4 11 60 24 1. int main(){ int a.Sm.61 - .i=1. for(Sm=0.i=a.b. i<=a. cin >> a >> b. i++) fact*=i. Calculati: • • • Suma cifrelor numarului Produsul cifrelor pare Prima cifra a numarului . i<=b . i<=b. Se citeste un numar intreg pozitiv de la tastatura.

ct.n/=10) if (n%10 == pc) ct++.P=1. n .ct=0. cout << S << " " << P << " " << pc << " " << ct. if (c%2==0) P*=c. S+=c. cin >> n.S.n>=10. pc=n. for(n=nn. Se citeste un numar intreg pozitiv n de la tastatura. n .62 - . Calculati: • • Suma divizorilor numarului Cate numere prime mai mici ca n exista . int main(){ int n.n/=10).n/=10){ c=n%10.Introducere in ANSI C++ • De cate ori apare prima cifra in numar #include <iostream> using namespace std.c.pc. for(S=0.nn. } 12141 9 8 1 3 P20. nn=n.P. } for(n=nn.

d++) if (i%d==0) prim=false. cout << "n=".i<n.63 - . for(d=2.Introducere in ANSI C++ #include <iostream> using namespace std. S=0. if (prim) ct++.d<=i/2. } n=10 18 4 5. cin >> n. ct=0.i.d<=n.ct. for(i=2. bool prim. int main(){ int n.d.4 Maxime si minime Calcularea valorile minime sau maxime dintr-o serie de valori reprezinta o problema des intalnita in practica. for(d=1.S. } cout << ct. cout << S << " ".d++) if (n%d==0) S+=d.6.i++){ prim=true.Avem: Maxime: max = ­infinit Pentru toate valorile X de parcurs if (X>max) max=X Minime: min = infinit Pentru toate valorile X de parcurs if (X<min) min=X .

Se citeste un numar intreg pozitiv de la tastatura. Utilizatorul.pc.n>=10.64 - .S. P21. for(n=nn. infinit reprezinta valoarea minima pe care o poate lua X si depinde de tipul de date cu care lucram. Biblioteca values. cout << S << " " << P << " " << pc << " " << ct. S+=c. nn=n.n/=10){ c=n%10. for(S=0.ct. avem urmatoarele rezolvari: a. n . } 25221 12 8 2 3 5.6. cin >> n. pc=n. } for(n=nn. -MAXINT.P. ca prima faza. if (c%2==0) P*=c. n . introduce numarul de valori ce vor fi citite ulterior: . int main(){ int n.P=1.n/=10).c.5 Citirea mai multor numere de la tastatura In cazul in care dorim prelucrarea a mai multe numere citite.h ofera in acest sens o serie de constante predefinite utile.ct=0.Introducere in ANSI C++ In aceste scheme. MAXFLOAT etc. Calculati: • • Cifra maxima a numarului De cate ori apara cifra minima #include <iostream> using namespace std.n/=10) if (n%10 == pc) ct++.nn. cum ar fi MAXINT.

x.i.max. for(i=1. } cout << max << " " << P.h> using namespace std.Introducere in ANSI C++ cin >> n. P=1.i<=n. Se citeste un numar n. Se cunoaste o conditie cat timp se vor citi valori: cin >> X. int main(){ int n. max=-MAXINT. apoi n valori reale de la tastatura. } 5 1 1 5 2 1 5 10 . } // citim valoare // cat timp conditia e respectata // il utilizam conform enuntului // citim numarul P22. cin >> X.i<=n. foloseste(X).i++){ cin >> X. for(i=1. cin >> n. while (cond(X)){ foloseste(X). } // numarul de valori de citit // de n ori // citim numarul // il utilizam conform enuntului b.65 - . Calculati: • • maximul produsul #include <iostream> #include <values.P. if (x>max) max=x.i++){ cin >> x. P=P*x.

} 2 3 1 4 6 1 1 1 6 1 12 0 30 1 apare de 5 ori 5.i. 1 2. } cout << S << endl. else if (x<min){ min=x. cin >> x.n b: 1 2 2 3 3 3 .66 - .. Se citesc numere intregi pana la intalnirea valorii 0.. } cin >> x.. n n . int main(){ int x. cout << min << " apare de " << ct_min << " ori"..n .6 Generarea unor serii complexe de numere P24..h> using namespace std.Introducere in ANSI C++ P23. ct_min=1.ct_min. Se citeste n (intreg pozitiv).S.min. ct_min=0... min=MAXINT. S=0.. Afisati pe ecran: a: 1 1 2 1 2 3 . if (x==min) ct_min++. while (x!=0){ if (x%2==0) S=S+x.6. Calculati: • • Suma valorilor pare Minimul si de cate ori apare acesta #include <iostream> #include <values.

1 ...2..i<=k. cin >>n.... cout << " ".....k++){ for(i=1. for(k=1.i<=k.. Afisati pe ecran.. 6: 1.. } cout << endl.. for(k=1.i...... int main(){ int n.6 – numarul urmat de divizori .i++) cout << i << " ".i++) cout << k << " ".......k++){ for(i=1..2 . } } 5 1  1 2  1 2 3  1 2 3 4  1 2 3 4 5 1  2 2  3 3 3  4 4 4 4  5 5 5 5 5  P25. 12345 23456 34567 45678 5 6 7 8 9 (n=5) ....Introducere in ANSI C++ #include <iostream> using namespace std..k.k<=n. cout << " "....67 - ..k<=n.. Se citeste n (intreg pozitiv). 1 1:1 2:1.....3. sub forma data: 1 121 12321 ....

d++) if (k%d==0) cout << d << ".i<=n.i++) cout << " ". for(d=1.k<=n. cout << k << endl.Introducere in ANSI C++ #include <iostream> using namespace std.d<=k/2. for(i=1.k<=n.3 4: 1.k++){ cout << k << ": ".i<=k.i. } cout << "-------------" <<endl.k. for(k=1.i>=1.k++){ for(i=1. for(k=1.4 ­­­­­­­­­­­­­ 2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 8 .68 - .k<=n.k++){ for(i=1.". } } 4       1     1 2 1   1 2 3 2 1 1 2 3 4 3 2 1 ­­­­­­­­­­­­­ 1: 1 2: 1.i++) cout << i+k << " ". } cout << "-------------" << endl.2.2 3: 1.i++) cout << i << " ".i<=n-k. for(k=1. int main(){ int n. cout << endl.d. cin >>n. for(i=k-1. cout << endl.i--) cout << i << " ".

. apoi n numere intregi de la tastatura.. Pp2..n..... Pp6..2 3:3. indiferent de cate ori apar... Se citeste n intreg.....69 - ... n 1:1 2:2.n 10101 01010 10101 01010 1 0 1 0 1 (n=5) Pp7... De exemplu 123 si 11321 sunt formate din aceleasi cifre...... Refaceti solutiile propuse ale problemelor rezolvate in acest capitol.. + 1 P = 1! + 2! + .1. + (3n-2)2 Pp3. Pp5. Pp8. Afisati pe ecran urmatoarele serii de numere. Calculati ultima cifra a expresiei E= ab. Determinati daca cele doua numere sunt formate din aceleasi cifre. a si b valori intregi pozitive citite de la tastatura. astfel incat sa folositi alt tip de instructiune repetitiva fata de cea utilizata in rezolvarea initiala (de exemplu in loc de for folositi while).7 Probleme propuse Pp1. Se citesc doua numere intregi de la tastatura... n:n...3. Afisati numarul citit care are cei mai multi divizori. n ... +n! S = 12 + 42 + 72 + .n.Introducere in ANSI C++ 5.... Se citesc numere intregi de la tastatura pana la intalnirea unui numar negativ. Afisati pe ecran tabla inmultirii pana la 10. Afisati: – – cel mai mare si cel mai mic numar prim suma numerelor care au cifrele in ordine crescatoare .. Se citeste numarul intreg pozitiv n de la tastatura. Pp4.3 .. folosind pentru fiecare expresie un alt tip de instructiune repetitiva: E = n + n/2 + n/3 + . Se citeste de la tastatura un numar intreg n.. Calculati valoarea urmatoarele expresii. pastrand formatul: 1 212 32123 ..........

70 - .. . unde vi au un tip convertibil la tip P1.// vector de reali complet initializat cout cout cout cout } Vectorul A ocupa 400 octeti Vectorul B ocupa 40 octeti << << << << "Vectorul "Vectorul "Vectorul "Vectorul A B X X ocupa ocupa ocupa are " " << sizeof(A) << " octeti". << sizeof(X)/sizeof(int)<< " valori". int main(){ int A[100]. iar acest lucru devine un impediment major in momentul in care. " << sizeof(X) << " octeti".. // vector de intregi neinitilalizat int B[10]={1.Introducere in ANSI C++ Capitolul 6 – Vectori (matrici) In momentul in care complexitatea programelor creste.// vector de intregi partial initializat float X[]={3.v2. 5... tip nume[]={v1.vn}. daca dorim utilizarea unui vector acesta trebuie sa fie declarat. devine evidenta necesitatea folosirii unor tipuri de date complexe. Folosirea variabilelor simple permite stocarea unei singure valori..2. avem nevoie de stocarea si realizarea de diferite operatii pe 100 de numere intregi. sa zicem.. 6.4}. Exemple de declarari/initializari de vectori si cat ocupa acestia in memorie.14.5}. " << sizeof(B) << " octeti".vn}. Un vector (tablou unidimensiunal) este o structura de date care poate stoca mai multe valori de acelasi tip...1 Declararea si initializarea Exact ca si in cazul variabilelor simple.3. 2. C++ ofera mai multe moduri de a declara/initializa un vector. sub forma urmatoare: tip nume[dimensiune] sau unde vi au un tip convertibil la tip sau tip nume[dimensiune]={v1. #include <iostream> using namespace std.

iar in cazul in care nu avem specificata dimensiunea aceasta este data de numarul de valori cu care initializam vectorul.71 - . In acest caz se aloca in memorie un numar de 10 intregi.3. primele patru valori fiind initializate.2 . si. in continuare. ? A[9] Figura 6. s-ar putea ca ele sa fie initializate cu valoare 0. dar este mai bine sa nu contam pe acest fapt. avem urmatoarele atribuiri: A[0]=5. In memorie situatia va asemanatoare cu cea descrisa in figura 6. in final.. 9 A[9] Figura 6...1 Observam ca primul element este A[0]. Accesul la elementele unui vector se face folosind indici. Primele patru elemente.4}. In functie de compilator. vom avea urmatoarea situatie (Figura 6.2): 5 A[0] 2 A[1] 3 4 ? . Daca. ultimul element valid va fi A[9]. al doilea A[1].1: 1 A[0] 2 A[1] 3 4 ? . cele initializate. in rest nu stim ce valori exista in vector. Fie urmatorea declaratie de vector: int A[10]={1.2. au valori cunoscute.Introducere in ANSI C++ Vectorul X ocupa 12 octeti Vectorul X are 3 valori Observam ca specificarea dimensiunii va duce la alocarea unui spatiu de memorie suficient pentru a pastra toate valorile din vector.. A[9]=A[1]+A[2]+A[3].

n-1}.. #include <iostream> using namespace std. vom folosi o variabila ca indice. cout << "A: " << A[4] << " " << A[3] << " ". Se citesc cinci valori ale unui vectori de intregi. asa cum se observa in problema urmatoare: P2. unde i va fi o valoare intrega ce reprezinta un indice valid in vector. int main(){ int A[5].. Accesul la elementele vectorului se va face folosind o notatie de forma A[i]. cout << "Dati elementele vectorului A:".1. exista posibilitatea de a accesa vectorul elemente cu element prin intermediul unor indici constanti.daca numarul de elemente din vector difera de la rulare la rulare Pentru a rezolva aceste situatii. cout << A[2] << " " << A[1] << " " << A[0].Introducere in ANSI C++ 6. In cazul in care dorim sa realizam citirea si afisarea unui vector. unde i va parcurge indicii vectorului. adica o valoare din multimea {0.daca avem un numar mare de elemente in vector .. cin >> A[0] >> A[1] >> A[2] >> A[3] >> A[4]. Citirea unui element va fi de forma: cin >> A[i]. Afisati vectorul in ordine inversa.2 Citirea si scrierea vectorilor Vom prezenta in continuare primele operatii pe vectori.72 - . } Dati elementele vectorului A:2 4 1 3 5 A: 5 3 1 4 2 Aceasta abordare nu acopera urmatoarele cazuri: .. . in loc sa accesam valorile din vector folosind indici constanti.

element cu element .n). cout << "A: ". element cu element for(i=0.i<n. pentru a creste flexibilitatea programului. iar n este lungimea actuala a acestuia. for(i=0.i>=0.i--) cout << A[i] << " ". cout << "Dati elementele vectorului A:". lungime limitata doar de modul in care am declarat vectorul. #include <iostream> using namespace std. } Dati elementele vectorului A:3 4 5 6 7 A: 7 6 5 4 3 In general. for(i=4. Se citesc cinci valori ale unui vectori de intregi. Se citeste un vector de la tastatura.n. P4.// vectorul si lungimea curenta (0<= n <=100) cin >>n. Afisati vectorul pe ecran. } 4 3 4 1 2 3 4 1 2 // afisarea. atunci cand ne referim la un vector. for(i=0. (varianta 2) #include <iostream> using namespace std. int i.i++) cin >> A[i].Introducere in ANSI C++ P3. vom da posibilitatea utilizatorului sa foloseasca vectori de lungime variabila.i++) cin >> A[i]. int main(){ int A[5].i.i<5. int main(){ int A[100]. ne vom referi la o pereche de forma (A.73 - .i++) cout << A[i] << " ".i<n. Afisati vectorul in ordine inversa. De acum inainte. unde A este vectorul. // citim lungimea vectorului // apoi vectorul.

i++){ cout << "A[" << i << "]=". Modul in care folosim elementele vectorului depinde de la problema la problema. orice varianta practica.n. for(i=0. in general.i++) foloseste(A[i]).i<n.i++) cout << A[i] << ". Afisati vectorul pe ecran. } n=3 A[0]=7 A[1]=15 A[2]=9 A=(7. accesul la elementele vectorului (A. Dupa cum observam in ultimele exemple. cin >>n. cout << A[n-1] << ")". folosind o varianta de citire/scriere user-friendly.n) respecta. (varianta cosmetizata) #include <iostream> using namespace std. for(i=0.Introducere in ANSI C++ Aspectul „sec” al aplicatiei este remediat in exemplul urmator: P5.9) In general recomand folosirea variantei simple daca lucram programul „pe foaie”. int i. pe calculator.i<n-1. Se citeste un vector de la tastatura. int main(){ int A[100].74 - . cout << "n=". urmatoarea schema generala: for(i=0. } cout << "A=(". .".i<n.15. cin >> A[i].

i<n. C[i]=n-1-i.i<n.. " ".. for(i=0.75 - . " ". for(i=0. cin >>n.i++) cout << C[i] << "\nD:".. int main(){ int A[100]. " ".2..6.1.4.C[100]. cout << "n=".i++) for(i=0.1. C: n-1.0 D: 0. Urmatoarele exemple ilustreaza cateva cazuri mai des intalnite in practica.i++) cout << B[i] << "\nC:". for(i=0. 2. "A:".0. #include <iostream> using namespace std.i<n.i++) for(i=0.. . for(i=0..Introducere in ANSI C++ 6.0.B[100].n...i<n..i++) cout << A[i] << " "\nB:".n-2.i<n.i++) cout << D[i] << .D[100]. int i. D[i]=i%2.i<n.0..1. B[i]= (i%2==0)? 0:i. ". Generati si afisati pe ecran urmatorii vectori de lungime n.4.0.3. for(i=0. Se citeste de la tastatura un numar intreg 1<=n<=100..i++) for(i=0.2.3 Generari de vectori Uneori elementele vectorilor nu vor fi valori citite de la tastatura ci valori construite in functie de enunt.i<n. B: 0. A: 1. In problema urmatoare exploatam relatia dintre indicele si valoarea memorata pe pozitia respectiva: P6.i<n.i++) cout cout cout cout } n=10 A:1 2 3 4 5 6 7 8 9 10 B:0 1 0 3 0 5 0 7 0 9 C:9 8 7 6 5 4 3 2 1 0 D:0 1 0 1 0 1 0 1 0 1  << << << << A[i]=i+1..

" ".5.4.i++) C[0]=1. for(i=1. P7.D[20].. B[i]= B[i-1]+B[i-2]...i<n. for(i=0.i<n.i++) cout << C[i] << "\nD:". D: 0.i<n. int main(){ int A[20].i++) cout << B[i] << "\nC:".0.0.2.2.1. "A:".4. for(i=0.i++) D[0]=0. for(i=2.i<n. " ". for(i=0. for(i=1. cout << "n=".76 - .. B: 1.3..16.i. apoi afisati pe ecran urmatorii vectori de lungime n.8. " ".i<n. Generati recursiv.i++) B[0]=B[1]=1.3. #include <iostream> using namespace std..2..1.i<n.i++) cout << D[i] << .i<n..B[20]. C[i]=2*C[i-1].i++) cout cout cout cout } n=10 A:1 2 3 4 5 6 7 8 9 10 B:1 1 2 3 5 8 13 21 34 55 C:1 2 4 8 16 32 64 128 256 512 D:0 1 0 1 0 1 0 1 0 1  << << << << A[i]=A[i-1]+1. "... Se citeste de la tastatura un numar intreg 1<=n<=20. A: 1. daca enuntul problemei permite folosirea unei relatii prin care construim un element in functie de cele deja generate.1.8.i++) cout << A[i] << " "\nB:". long C[20]. cin >>n.i<n.. for(i=1.n. C: 1. A[0]=1.Introducere in ANSI C++ Generarea recursiva a vectorilor este o varianta intuitiva de rezolvare. for(i=0. D[i]=!D[i-1]..

Se citeste un vector de la tastatura.b. int main(){ int A[100]. Generati un vector de lungime citita de la tastatura. va returna un numar de tip long int pseudo-aleator. produsul elementelor pare din vector c. continand valori aleatoare in intervalul [a. stdlib. for(i=0.i<n.Introducere in ANSI C++ Generarea de valori aleatoare in vectori poate fi utila daca dorim testarea unor algoritmi pe vectori si dorim sa evitam introducerea de valori de la tastatura. maximul valorilor din vector . vom obtine valoarea aleatoare in intervalul dorit.b].b-a]. int i. } n=10 a=30 b=40 A:36 40 36 32 31 34 30 36 33 31 Functia rand(). cin >>n. numere pozitive. cout << "b=".i++) A[i]=a + rand()%(b-a+1).i++) cout << A[i] << " ". cin >>b. Afisati: a. P9. probleme intalnite des in practica. suma valorilor din vector b. definita intr-o biblioteca standard ANSI C++. cout << "A:". P8. cout << "n=".a. in cazul acesta [0. Operatia modulo va face ca valoarea aleatoare „sa cada” in intervalul ales de noi. 6.4 Cateva probleme simple Vom da mai departe cateva probleme simple cu vectori. for(i=0. a<b.n.77 - . #include <iostream> using namespace std. Adunand la aceasta valoare a. cin >>a. cout << "a=".i<n.

i<n.10]. Calculati si afisati pe ecran: E=A[0]/A[1]+A[2]/A[3]+ . } cout << "Suma: " << S... int main(){ int A[100].n... for(i=0. if (A[i]%2==0) P=P*A[i].max(A[0]. S=0. cout << "n=".A[2n-1]) .i<n.P=1. } n=6 1 ­1 2 ­2 3 ­3 Suma: 0 Produsul valorilor pare: ­4 Maximul: 3 minimul valorilor pozitive: 1 P10. n citit de la tastatura.Introducere in ANSI C++ d..P.i++){ S=S+A[i].i++) cin >> A[i]... for(i=0. +A[2n-2]/A[2n-1] F=max(A[0]) + max(A[0]. n<10.A[1]) + . minimul valorilor pozitive #include <iostream> using namespace std.i. cin >>n.. int S.78 - . Generati un vector aleator de 2n elemente din [1. cout << "\nProdusul valorilor pare: " << P.A[1].

max=-MAXINT. int main(){ int A[20].i<2*n. cout << "\nE: " << E. for(i=0. int F. F=F+max. float E.n.i<2*n. cout << "n=". sortat crescator b. for(i=0. } cout << "Vectorul:".i<2*n. cout << "\nF: " << F. este sir Fibonacci (primele doua vaori sunt 1. E=0.max.Introducere in ANSI C++ #include <iostream> #include <values. for(i=0. } n=2 Vectorul:4 7 8 6 E: 1.79 - .i++) cout << A[i] << " ".i++) A[i]=1+rand()%10. Verificati daca un vector citit de la tastatura este sau nu: a.h> using namespace std. cin >>n.i.i++){ if(A[i]>max) max=A[i]. F=0. simetric .i<2*n-1.90476 F: 27 P11.i+=2) E = E + float(A[i])/A[i+1]. for(i=0. in rest fiecare element de obtine insumand cele doua valori anterioare) c.

n. cout << "este Fibonacci. sau: n=6 1 6 2 2 6 1 Vectorul dat nu este crescator. ". cout << "este simetric. nu este simetric. for(i=0. cout << "este crescator.i++) if (A[i]!=A[i-1]+A[i-2]) fibo=false. int main(){ int A[100]. sim.i++) if (A[i]>A[i+1]) cresc=false. este Fibonacci.fibo && i<n-1. if (!cresc) cout << "nu ". ".sim && i<j. . for(i=0.i++) cin >> A[i].". if (!fibo) cout << "nu ". cout << "Vectorul dat ". cin >>n. if ((A[0]==1)&&(A[1]==1)) fibo=true.j=n-1. for(i=2.j.80 - . este simetric. for(i=0.i. nu este Fibonacci. bool cresc.i<n-1.j--) if (A[i]!=A[j]) sim=false. } n=5 1 1 2 3 5 Vectorul dat este crescator. cout << "n=". fibo. cresc=true.i++.i<n. sim=true.Introducere in ANSI C++ #include <iostream> using namespace std. if (!sim) cout << "nu ".

.Introducere in ANSI C++ 6.A[i+1].A[n-1] care sunt mai mici ca A[0].. Sortarea prin selectie #include <iostream> using namespace std.repetam algoritmul descris la pasul anterior pe cazul general. [4]. for(i=0. for(i=0. A[i]=A[j]. } cout << "Vectorul sortat: " . [6].j++) if (A[j]<A[i]){ t=A[i].i++) cin >> A[i]. for(i=0.. [8]).A[n-1] . aducand pe pozitia A[i] minimul dintre A[i]... int main(){ int A[100].. cout << "n=". prin interschimbarea lui A[0] cu acele elemente dintre A[1].i++) for(j=i+1. este problema reasezarii elementelor in asa fel incat ele sa respecte o relatie de ordine (crescatoare).j<n.n.aducem pe prima pozitie elementul minim din vector.t.j. Prezentam in continuare trei metode de sortare consacrate. cin >>n..i<n.A[2].81 - . A[j]=t..5 Sortarea si interclasarea Problema sortarii unui vector.i<n.i.la sfarsit toate valorile sunt pe pozitiile corecte .i++) cout << A[i] << " ". P12. } n=5 2 4 5 1 3 Vectorul sortat: 1 2 3 4 5 Ideea „din spatele”algoritmului este urmatoarea: . Problema este bine reprezentata in literatura de specialitate (vezi [1].i<n-1.

} n=5 2 4 5 1 3 Vectorul sortat: 1 2 3 4 5 Ideea este urmatoarea: . elementul maxim a ajuns sigur pe ultima pozitie .82 - .i. cout << "n=". for(i=0.i<n-1.i<n.comparam.k++) for(i=0.i<n.Introducere in ANSI C++ P13.i++) if (A[i]>A[i+1]){ t=A[i]. for(k=1. A[i]=A[i+1].t.cum la fiecare trecere cel putin un element ajunge la locul corect. Bubble Sort #include <iostream> using namespace std.daca elementul din stanga este mai mare ca cel din dreapta.k<=n-1. cin >>n.i++) cin >> A[i]. din maxim n-1 treceri vor avea vectorul sortat crescator . pana la ocuparea pozitiei corecte .in urma primei treceri prin vector. toate valorile succesive din vector .i++) cout << A[i] << " ". for(i=0.n. int main(){ int A[100]. rand pe rand.k. atunci interschimbam elementele . } cout << "Vectorul sortat: " .repetari succesive ale algoritmului vor duce la deplasari ale elementelor mari spre sfarsit. A[i+1]=t.

for(i=0.i<n.i<10.Introducere in ANSI C++ P14. for(i=0. cout << "\nVectorul sortat: " .k. int main(){ int A[100]. Pentru problema noastra am considerat m=10.i. cin >>n. se stie ca intervalul in care A[i] poare lua valori este de forma [0.i++) A[i]=rand()%10. cout << "n=".j<=ct[k].i++) cout << A[i] << " ". de cate ori trebuie in vectorul rezultat .i<n. Sortarea prin numarare Pentru a putea aplica sortarea prin numarare.k<10. } n=10 Vectorul initial: 3 6 7 5 3 5 6 2 9 1 Vectorul sortat: 1 2 3 3 5 5 6 6 7 9  Functionarea algoritmului: .numaram fiecare valoare de cate ori apare in vector . int ct[100].j++) A[i++]=k.n.m]. cu m cunoscut si nu foarte mare. for(i=0. // contorizarea valorilor din vector for(i=0. // completarea valorilor in vector i=0.j.83 - .i++) ct[A[i]]++.odata avut vectorul de contori.i<n. for(i=0. cout << "Vectorul initial: ".i++) ct[i]=0. #include <iostream> using namespace std. de la cea mai mica la cea mai mare.i<n. nu avem decat sa completam valorile.i++) cout << A[i] << " ". for(k=0.k++) for(j=1.

k. B[0]=1. while(i<n) C[k++]=A[i++]. int main(){ int A[100]. Interclasarea vectorilor #include <iostream> using namespace std.m.i<n.for(i=0.i<m.i.i<n. cout << "\nB: ".i++) cout << C[i] << " ". cout << "A: ".i++) A[i]=A[i-1]+1+rand()%3. P15. cout << "\nC: ".B[100]. . while ((i<n)&&(j<m)) if (A[i]<A[j]) C[k++]=A[i++].i++) cout << B[i] << " ".i<m.i++) B[i]=B[i-1]+1+rand()%4. primind doi vectori sortati. for(i=1.for(i=0.Introducere in ANSI C++ Interclasarea se definiste ca fiind algoritmul care.i++) cout << A[i] << " ". for(i=1. n=2+rand()%10.i<m+n. while(j<m) C[k++]=B[j++]. for(i=0.n. } A: 2 4 5 7 10 B: 1 4 5 7 9 12 16 C: 1 2 4 4 5 5 7 7 9 12 16 10  Vectorii au fost generati aleator. i=j=k=0. dar in ordine crescatoare. else C[k++]=B[j++]. A[0]=2.j. m=2+rand()%10. obtine un al treilea vector sortat continand elementele vectorilor initiali. int C[100].84 - .

6}}. float B[4][3]={{1. din comoditate.2}. cout << "A[10][10] ocupa " << sizeof(A) << " octeti". {5... pentru o declaratie de forma int A[10][10] indicii corespunzatori sunt dati in Figura 6. tip nume[dimensiune1][dimensiune2].3. valori ce vor fi completate in matrice pe linii. sunt matricile bidimensionale. int main(){ int A[10][10]. {3. numite de acum. dand un „vector de vectori” de valori. Astfel. . } A[10][10] ocupa 400 octeti B[4][3] ocupa 48 octeti 6. Exista posibilitatea initializarii elementelor unei matrici.7 Citirea si afisarea matricilor Accesul la elementele unei matrici se face tot prin intermediul indicilor. pe langa vectori. P16.[dimensiunen] Cele mai folosite. #include <iostream> using namespace std. Declararea unei matrici: tip nume[dimensiune1][dimensiune2]  sau.Introducere in ANSI C++ 6.85 - . cout << "\nB[4][3] ocupa " << sizeof(B) << " octeti". pe langa matricile unidimensionale (vectorii).6 Declararea matricilor Limbajul C++ permite. matrici bidimensionale si multidimensionale. matrici.4}. Declarari de matrici. Cantitatea de memorie ocupata de matrici. mai general.

cin >>m. cout << endl. A[0][2] A[1][2] . ... cout << "m="..cin >>n. Linia 9 A[9][0] A[9][1] A[9][2] ...i<n.i. } } n=2 m=2 A[0][0]=1 A[0][1]=2 . } for(i=0. cin >> A[i][j]. #include <iostream> using namespace std. A[0][9] A[1][9] ..j<n. A[0][1] A[1][1] .Introducere in ANSI C++ Coloana 0 Coloana 1 Coloana 9 Linia 0 Linia 1 A[0][0] A[1][0] ...j.3 P17.. for(i=0.i<n. ..n. Afisati matricea. int main(){ int A[10][10]. A[9][9] Figura 6..j++){ cout << "A[" << i<< "][" << j << "]=".i++) for(j=0.86 - . Se citeste o matrice de la tastatura.j<n.i++){ for(j=0.j++) cout << A[i][j] << " "....m. cout << "n=".

cout << endl. {7.5.i.6}. In general.j<n.j<m. parcurgerea pe linii a unei matrici are loc astfel: for(i=0.87 - .8. int n=3.9}}. Afisati pe coloane o matrice initializata din cod #include <iostream> using namespace std.Introducere in ANSI C++ A[1][0]=3 A[1][1]=4 1 2 3 4 Analog citirii vectorilor.j++) foloseste(A[i][j]). } } 1 4 7 2 5 8 3 6 9 . int main(){ int A[10][10]={ {1.i++) cout<<A[i][j]<<" ".3}. 6. {4. citirea efectiva a elementelor din matrice este precedata de specificarea numarului de linii si de coloane.j. iar al doilea coloana. Primul indice reprezinta linia.i++) for(j=0.j++){ for(i=0.m=3.i<n.8 Probleme cu matrici P18.2.i<n. for(j=0.

i<n. Generati si afisati urmatoarele matrici: 1   1   1   1 2   2   2   2 3   3   3   3 4   4   4   4 #include <iostream> using namespace std. B[10][10].j<n. } for(i=0. B[i][j]=(i+j+1)%2.i++){ for(j=0.v.i<n. for(i=0. } for(i=0.Introducere in ANSI C++ P19.j++){ A[i][j]=i+1.j<n.m.i. v=1. cout << endl.i++) for(j=0.i<n. C[i][j]=v++. cin >> m. int main(){ int A[10][10].j++) cout << B[i][j] << " ". cout << endl.j<n. cin >> n. } for(i=0.88 - . C[10][10].j<n. cout << "n=".j++) cout << C[i][j] << " ". cout << "m=". } } 1   0   1   0 0   1   0   1 1   0   1   0 0   1   0   1 1   2   3   4   5   6   7   8   9   10  11  12   13  14  15  16   . int n. cout << endl.i++){ for(j=0.j.i++){ for(j=0.j++) cout << A[i][j] << " ".i<n.

} for(i=0.j++) cout << A[i][j] << " ".4: i+j<n-1 == i+ j n1 i>j i= =j i<j i+j>n-1 Figura 6.j++){ if (i<j) if (i+j<n-1) A[i][j]=2. Relatia dintre indici raportata la diagonale este data in Figura 6. n.j. cin >> n.i++){ for(j=0. else A[i][j]=4.j<n.4 P20. cout << "n=". else A[i][j]=3.Introducere in ANSI C++ In cazul in care numarul de linii si cel de coloane este identic spunem despre matrice ca este patratica. else if (i+j<n-1) A[i][j]=5. } } . for(i=0. if ((i==j)||(i+j==n-1)) A[i][j]=1.i++) for(j=0. int main(){ int A[10][10]. Completati o matrice sub forma: 1 5 5 5 5 1 2 1 5 5 1 4 2 2 1 1 4 4 2 2 1 1 4 4 2 1 3 3 1 4 1 3 3 3 3 1 #include <iostream> using namespace std.i<n.89 - . cout << endl. vorbim despre diagonala principala si cea secundara.j<n. In acest caz.i<n.i.

A[n-1][j]=t%10. int main(){ int A[10][10]. Considerand fiecare rand al matricii ca fiind numarul in baza 10 corespunzator.i<n. t=0. #include <iostream> using namespace std. for(j=n-1. cout << endl.90 - .j++) cin >> A[i][j].j>=0. for(i=0.j--){ for(i=0.j.Introducere in ANSI C++ P21.j<n.j<n. } for(i=0. cin >> n.t.i.i<n-1.i++) for(j=0.i<n-1. cout << "n=". n. O matrice contine cifre pe primele n-1 linii. completati pe ultima linie suma numerelor zecimale de pe liniile date.i++) t+=A[i][j].j++) cout << A[i][j] << " ". } } 0 2 4 5 0 0 9 1 1 2 3 4 1 5 7 0 .i++){ for(j=0. t=t/10.

De exemplu a: 1. Mutati valorile pozitive la incepu si cele negative la sfarsitul vectorului (dintr-o singura parcurgere).2. O matrice contine valori in intervalul [1..3.1.. Se citesc doi vectori de intregi de la tastatura..9 Probleme propuse Pp1.. (tribonacci :)) Pp2. Pp7. Determinati daca cei doi vectori sunt formate din aceleasi valori. afisand mesaje sugestive pe ecran. Calculati: S=a[0]*a[1]+a[1]*a[2] + .. Generati un vector continand n valori intregi in intervalul [-100.91 - . Se citeste un vector de la tastatura.. Pp6.. (primele n numere prime) c: 1 1 1 3 5 9 17 .3 si b:1. Pp8.Introducere in ANSI C++ 6. + a[n-2]*a[n-1] E = suma valorilor cu indice prim F = produsul ultimelor cifre Pp3. Generati un vector continand valori din [1. ca linie sau coloana. Generati si afisati vectorii (n intreg citit de la tastatura): a: 1 0 2 0 3 0 . in ordine descrescatoare.1 satisfac proprietatea ceruta. Se citeste o matrice de la tastaura. Verificati de cate ori regasim vectorul in matrice. indiferent de ordine si cate ori apar.100].. Un vector contine cifre. b: 1 2 3 5 7 11 . Verificati daca elementele de pe diagonale sunt in ordine crescatoare sau descrescatoare. Pp4.100]. Care este cel mai mare numar de trei cifre care poate fi format din cifrele vectorului? Pp5. Se citesc o matrice patratica de nxn si un vector de lungime n.2.100] care NU se regasesc in matrice. .

// initializare nerecomandata << << << << "Vectorul "Vectorul "Vectorul "Vectorul S s X Y ocupa ocupa ocupa ocupa " " " " << << << << sizeof(S) sizeof(s) sizeof(X) sizeof(X) << << << << " " " " octeti\n".c2.'y'.. #include <iostream> using namespace std.// sir initializat X[]="abc". Exemple de declarari/initializari de siruri. // initializare corecta Y[]={'x'. . // sir neinitilalizat s[20]="Ana are laptop". 7. octeti\n"..cn” Urmatorul stil de initializare nu este recomandat... plus o serie functii de uz general pe siruri de caractere definite in biblioteca standard.Introducere in ANSI C++ Capitolul 7 – Siruri de caractere Datorita gradului de utilizare. exista functii de citire/scriere specifice.. octeti".1 Declaratie si initializare Forma generala a declaratiei unui sir de caractere este: char nume[dimensiune] sau sau char nume[dimensiune]=”c1c2. desi este suportat de catre compilator: char nume[dimensiune]={c1..cn”.'z'}. octeti\n". int main(){ char char char char cout cout cout cout } Vectorul S ocupa 100 octeti Vectorul s ocupa 20 octeti Vectorul X ocupa 4 octeti Vectorul Y ocupa 4 octeti S[100]. acestui tip structurat de date i s-a acordat o atentie deosebita... char nume[]=”c1c2.cn} P1.92 - .

Diferenta dintre un caracter si sirul de caractere corespunzator. in urma declaratiei char X[]=”abc”. int main(){ cout << "Caracterul \'A\' ocupa " << sizeof('A') << " octeti\n".1 Acelasi lucru se intampla atunci cand folosi constante de tip sir de caractere. cout << "Sirul \"A\" ocupa " << sizeof("A") << " octeti\n". Pentru exemplul de mai sus avem urmatoarea situatia dinfigura 7... compilatorul adaugand automat terminatia NULL. P2. In general. in cazul in care declaram o variabila de tip sir de caractere.1: ‘ a’ X[0] ‘ b’ X[1] ‘ c’ ‘ \0’ ? .Introducere in ANSI C++ Vom exemplifica in constinuare modul de memorare a sirurilor de caractere in C. In exemplul anterior observam ca.93 - . #include <iostream> using namespace std. Cum unui caracter ii este necesar un octet pentru a fi memorat. Figura 7. } Caracterul 'A' ocupa 1 octeti Sirul "A" ocupa 2 octeti Este necesara folosirea secventelor escape pentru afisarea ‘ si ”. Caracterul ‘\0’ este caracterul cu codul ASCII egal cu zero si este diferit de caracterul ‘0’. Diferenta de reprezentare dintre un caracter si sirul de caractere identic este evidentiat de exemplul urmator. Motivul este cel ca in limbajul C este folosit terminatorul NULL pentru a marca sfarsitul unui sir de caractere. . trebuie tinut cont de terminatorul NULL. deci practic trebuie sa declaram cu dimensiune cu 1 mai mare decat a sirului efectiv. observam ca s-a alocat un octet in plus. in memorie X ocupa 4 octeti.

Citirea/scierea sirurilor de caractere.getline(S1.2: ‘ A’ ‘ A’ ‘ \0’ Caracterul ‘ A’ Sirul de caractere “A” Figura 7. cin. int main(){ char S1[100]. #include <iostream> using namespace std. nu mai este necesara memorarea lungimii actuale (datorita terminatorului NULL) si nu trebuie sa citim caracter cu caracter.100).S2[100].94 - . // citeste pana la primul caracter "alb" cout << "Primul sir introdus: " << S1 << "\n".Introducere in ANSI C++ Diferenta de reprezentare este evidentiata de Figura 7.2 7. Urmatorul exemplu da diferite moduri de citire/scriere: P3. cout << "Al doilea sir introdus: " << S2. cout << "Introduceti un sir: ". cin >> S2. // citeste inclusiv spatiile cout << "Introduceti inca un sir: ". } Introduceti un sir: Ana are laptop Introduceti inca un sir: Ana are laptop Primul sir introdus: Ana are laptop Al doilea sir introdus: Ana .2 Operatii de citire/scriere pe siruri de caractere Citirea si scrierea sirurilor de caractere este mult simplificata fata de citirea vectorilor.

adica pana la apasarea tastei Enter se face folosind: cin. Daca dorim citirea caracter cu caracter. Observam conditia de oprire S[i]. acest lucru este posibil (in stilul citirii vectorilor).dimensiune). Daca S este un sir de caractere. echivalenta cu S[i]!=NULL.getline(S. dar trebuie sa avem grija de terminatorul NULL. Verificarea daca un caracter este sau nu litera mare: If ((c>=’A’)&&(c<=’Z’)) foloseste(c). tab. folosind o constructie de forma cin >> S. In cuvinte. . La citire. Alte scheme utile: Verificarea daca un caracter este sau nu cifra: If ((c>=’0’)&&(c<=’9’)) foloseste(c). schema de mai sus ar fi: „de la primul caracter si pana la caracterul NULL. 7.S[i].Introducere in ANSI C++ Observam ca citirea nu trebuie facuta caracter cu caracter. adaugarea terminatorului NULL este realizata in mod automat.95 - . flosim urmatoare schema generala: for(i=0. foloseste caracterul curent”. functiile pe siruri de caractere tinand cont de acesta. enter). Citirea intregului rand.  citirea se opreste la primul caracter „alb” (spatiu.i++) foloseste(S[i]). unde dimensiune este numarul maxim de caractere care va fi citit.3 Accesul la caracterele unui sir Daca dorim parcurgerea unui sir de caractere.

for(i=1.ct. } Introduceti un sir: Ana are laptop Numarul de cuvinte:3 . else ct=0.getline(S. Se citeste un sir de caractere cantinand cuvinte separate de unul sau mai multe spatii. if (S[0]!=' ') ct=1.'a' + 'A'.100).i++){ if ( (S[i]>='a')&&(S[i]<='z') ) S[i] = S[i] .Introducere in ANSI C++ P4. cout << "Introduceti un sir: ". int i. Inlocuiti literele mici cu litere mari si invers. cin.i++) if ( (S[i-1]==' ') && (S[i]!=' ') ) ct++. int main(){ char S[100].96 - . } Introduceti un sir: abcDEF123 ABCdef123 P5. int main(){ char S[100]. Afisati numarul de cuvinte. Se citeste un sir de caractere fara spatii. #include <iostream> using namespace std. } cout << S.'A' + 'a'.S[i]. cin >> S. cout << "Numarul de cuvinte:"<<ct. int i. else if ( (S[i]>='A')&&(S[i]<='Z') ) S[i] = S[i] .S[i]. #include <iostream> using namespace std. for(i=0. cout << "Introduceti un sir: ".

strcat(S. primul cuvant fiind numarat separat daca sirul nu incepe cu spatiu. strcmp(S1.S2) if (strchr(S.nr. else     cout << "Diferite". 7.baza) . Returneaza 0 daca S1==S2 <0 daca S1<S2 >0 daca S1>S2 Returneaza numarul intreg corespunzator sirului dat Returneaza o valoare pozitiva daca un caracter (respectiv sir) apare intr-un sir. 0 in caz contrar Depoziteaza in S sirul corespunzator numarului nr.97 - .S2) strcat(S1.1: Functie strlen(S) strcpy(S1."123".S2)==0)     cout << "Egale".S2) Efect Returneaza lungimea sirului dat ca paramentru Copiaza S2 peste S1 Concaterneaza S2 la S2 Compara lexicografic sirurile date ca parametri.c))    cout << "L­am gasit!" itoa(S. Cele mai utilizate sunt date in Tabelul 7."abcd") strcpy(S. numarul de cuvinte este determinat numarand cate succesiuni de forma spatiu-caracter avem in sir.c) strstr(S1."Imi place ").h sunt definite o serie de functii utile pe siruri de caractere ."C++").S2) atoi(S) i=atoi("123") strchr(S.1 Exemple strlen("trei") ­> 4 strcpy(S.10) itoa(S.Introducere in ANSI C++ In problema P5. if (strcmp(S1.4 Functii specifice sirurilor de caractere In biblioteca standard string. in baza baza Tabelul 7.

astfel scazand eficienta algoritmului. int i. for(i=0. dar este suportata de multe compilatoare. Nu este recomandata parcurgerea unui sir de caractere sub forma for(i=0. Se citeste un sir de caractere. #include <iostream> #include <string..Introducere in ANSI C++ Observatii: – itoa nu este implementata in standardul ANSI C++.h> using namespace std. apelul functie strlen parcurgand de fiecare data tot sirul. Mai departe dam implementari posibile ale acestor functii. cout << "Lungimea (strlen):"<< strlen(S). int main(){ char S[100].. P6.S[i].100).i++).i<strlen(S). cout << "Introduceti un sir: ".i++) . .getline(S.98 - . rezolvand problemele date atat folosind functiile de bilbioteca cat si implementand din cod. Afisati lungimea acestuia. } Introduceti un sir: Ana are laptop Lungimea:14 Lungimea (strlen):14 Observam ca functia strlen nu contorizeaza si terminatorul NULL. cin.// i va contine la sfarsit lungimea cout << "Lungimea:"<< i << "\n".

cout << "X: :"<< X << "\n".Introducere in ANSI C++ P7.getline(S.cpp:23: error: invalid operands of types ‘char [100]’ and ‘char  [100]’ to binary ‘operator+ .99 - . Copiati-l in alt sir. p07. int main(){ char S[100].Y[100]. va da mesajul de eroare: p09. trebuie sa avem grija de terminator. cum ar fi afisarea. cout << "Introduceti un sir: ".i++) X[i]=S[i]. de forma: S1=S2. Se citeste un sir de caractere. strcpy(Y. O atribuire de forma: X=S1+S2. Concaternati doua siruri de caractere. int i.100). va da un mesajul de eroaren1=atoi(S1). observam ca folosirea functiei de biblioteca simplifica mult programul. nu vor actiona dupa asteptari.X[100]. cout << "Y (strcpy):"<< Y. Atribuire directa intre doua siruri de caractere (posibila in alte limbaje). #include <iostream> #include <string. X[i]='\0'. for(i=0. in caz contrar alte operatii pe sir.S).cpp:21: error: ISO C++ forbids assignment of arrays P8.S[i].h> using namespace std. Analog exemplelor anterioare. } Introduceti un sir: Ana are laptop X:        :Ana are laptop Y (strcpy):Ana are laptop // copiere din cod In cazul in care facem copierea din cod. cin. In implementarea urmatoare am comentat apelul functiei strcat.

for(i=0. iar litera mare va fi considerata mai mica fata de litera mica corespunzatoare (conform codurilor ASCII). // strcat(S. cout << S. Am comentat in acest caz varianta in care am rezolvat fara apelul functiei strcmp."Salut "). Urmatoare exemple sunt sugestive: "A" < "a" "unu" == "unu" "pom" < "pomisor" "trei" > "patru"  !!!! P9.nume). int main(){ char nume[100]. j=strlen(S).i++) S[j++]=nume[i].nume[i].Introducere in ANSI C++ #include <iostream> #include <string.100 - . strcpy(S.getline(nume. In acest caz se va tine cont de ordinea lor lexicografica (cea din dictionar).Verificati ordinea lor lexicografica.j. cin.h> using namespace std. S[j]='\0'. int i.S[100]. Se citesc doua siruri de caractere. .100). } Introduceti numele: Ana Salut Ana Exista posibilitatea de a compara doua siruri de caractere. cout << "Introduceti numele: ".

int rez.100).h> using namespace std. cin.getline(S2.i++).S1[i] && S2[i] && S1[i]==S2[i].S2)==0) cout << " este egal cu ".S2[10]. cout << "Introduceti sirul 1: ". cout << S1 << " + " << S2 << " = " << rez.S2[100]. cin. cout << "Introduceti numarul 1: ". Se citesc doua siruri de caractere reprezentand numere intregi. int main(){ char S1[100]. else cout << " este mai mare ca "..getline(S2. #include <iostream> #include <string.10). cout << "\""<<S2<<"\"".Introducere in ANSI C++ #include <iostream> #include <string.101 - . cin.getline(S1. apoi afisati pe ecran rezultatul. n2=atoi(S2). } Introduceti numarul 1: 123 Introduceti numarul 2: 234 123 + 234 = 357 .n2. else if (strcmp(S1. // // // // for(i=0. rez=n1+n2.. cout << "Introduceti numarul 2: ". if (S1[i]==S1[i]) cout << "EGALE!" else if (S1[i]<S2[i]) cout << "S1<S2" else cout << "S1>S2". int i. } Introduceti sirul 1: trei Introduceti sirul 2: patru "trei" este mai mare ca "patru" P10.100). int main(){ char S1[10].getline(S1. n1=atoi(S1). Faceti suma lor.j.10). if (strcmp(S1.S2)<0) cout << " este mai mic ca ". cout << "\""<<S1<<"\"". cin. cout << "Introduceti sirul 2: ".n1.h> using namespace std.

Introducere in ANSI C++ P11. Verificati daca un nume apare intr-un sir.
#include <iostream> #include <string.h> using namespace std; int main(){ char nume[10],S[100]; int rez,n1,n2; cout << "Introduceti numele: "; cin.getline(nume,10); cout << "Introduceti sirul: "; cin.getline(S,100); if (strstr(S,nume)) cout << "\"" << nume << "\" apare in sirul \"" << S << "\""; else cout << "\"" <<nume<< "\" nu apare in sirul \"" << S << "\""; } Introduceti numele: Radu Introduceti sirul: Toni Alina Radu Cristi "Radu" apare in sirul "Toni Alina Radu Cristi"

7.5 Matrici de caractere
Utilizarea unui numar mare de siruri de caractere intr-o aplicatie implica folosirea unui sir de siruri de caractere. Urmatoarele exemple arata definirea si initalizarea unei matrici de caractere:
char S[10][10]={"Ana", "are","laptop"};

"laptop",

Pentru exemplul de mai sus, S[0] este "Ana", iar S[3],...,S[9] sunt siruri vide.

S[1]

este "are",

S[2]

este

In general, fiecare rand al unei matrici de caractere reprezinta un sir de caractere.

- 102 -

Introducere in ANSI C++ P12. Se citesc doua siruri reprezentand zile ale saptamanii. Folosind o matrice de caractere initializata cu zilele saptamanii, afisati zilele curinse intre cele citite de la tastatura.

#include <iostream> #include <string.h> using namespace std; int main(){ char zile[7][10]={

"luni", "marti", "miercuri", "joi", "vineri", "sambata", "duminica" };

char z1[10],z2[10]; int poz1,poz2,i; cout << "Introduceti ziua 1: "; cin.getline(z1,10); cout << "Introduceti ziua 2: "; cin.getline(z2,10); poz1=poz2=-1; for(i=0;i<7;i++){ if (strcmp(z1,zile[i])==0) poz1=i; if (strcmp(z2,zile[i])==0) poz2=i; } cout << "-----------------------\n"; if ((poz1==-1)||(poz2==-1)) cout << "Zile incorecte!"; else for(i=poz1;i<=poz2;i++) cout << zile[i] << "\n"; }

Introduceti ziua 1: marti Introduceti ziua 2: joi ­­­­­­­­­­­­­­­­­­­­­­­ marti miercuri joi

- 103 -

Introducere in ANSI C++

7.6 Alte aplicatii
P13. Se citeste un sir de caractere de la tastatura. Afisati toate prefixele si sufixele acestuia.
#include <iostream> #include <string.h> using namespace std; int main(){ char cuvant[100]; char copie[100]; int i,j; cin >> cuvant; cout << "Prefixe:\n"; strcpy(copie,cuvant); for(i=strlen(cuvant);i>0;i--){ copie[i]='\0'; // "mutam" sfarsitul cuvantului la stanga cout << copie<< " "; } cout << "\nSufixe:\n"; for(i=0;cuvant[i];i++){ for(j=i;cuvant[j];j++) cout << cuvant[j]; cout << " "; } } abcdef Prefixe: abcdef abcde abcd abc ab a Sufixe: abcdef bcdef cdef def ef f 

- 104 -

Introducere in ANSI C++ P14. Se citesc de la tastatura siruri de caractere pana la intalnirea sirului "stop". Afisati cuvantul de lungime maxima.

#include <iostream> #include <string.h> using namespace std; int main(){ char S[100],Smax[100]; cin >> S; strcpy(Smax,S); while (strcmp("stop",S)){ if (strlen(S)>strlen(Smax)) strcpy(Smax,S); cin >>S; } cout << "Cuvantul cel lung: " << Smax; }

mic mare scurt lung stop Cuvantul cel lung: scurt

- 105 -

Se citeste un sir S. Care este numarul minim de operatii elementare astfel incat sa obtinem din sirul initial unul avand toate literele mici sau toate literele mari. Se citeste de la tastatura un sir de caractere continand litere mici si spatii. cate unul pe un rand. Afisati cuvintele conponente. Sortati cuvintele lexicografic. Prin operatie elementara intelegem transformarea din litera mica in litera mare sau invers. Afisati cel mai lung cuvant care contine doar vocale. Un sir de caractere contine doar litere mici si litere mari. continand cuvinte separate de exact un spatiu si doua cuvinte. . O matrice de caractere contine cate un cuvant pe un rand. pana la citirea cuvantului "gata". Pp4. calculati suma lor in alt sir. apoi afisati-le pe ecran. Pp2. Pp6. Pp5. C1 si C2. Se citesc de la tastatura cuvinte (fara spatii). In locuiti toate aparitiile cuvantului C1 din testul S cu cuvantul C2. Pp3.Introducere in ANSI C++ 7. Considerand sirurile ca fiind numere in baza 10. Se citesc de la tastatura doua siruri de caractere continand doar cifre.7 Probleme propuse Pp1.106 - .

8. In acest caz vom folosi in program doar variabilele definite.Introducere in ANSI C++ Capitolul 8 – Structuri si alte tipuri utilizator Dupa cum am vazut.’: variabila. Daca lipseste nume_structura. in momentul definirii unei structuri a unor variabile de acel tip. Variabilele definite in bloc repezinta datele ce dorim sa le grupam. Sintaxa permite declararea directa. Accesul la elementele unei structuri se face folosind operatorul ‘. In acest capitol vom urmarii gruparea informatiilor corelate de tipuri diferite.nume_data . Atat nume_structura cat si lista_variabile sunt optionale. } lista_variabile. neexistand posibilitatea definirii altor variabile de forma data. } lista_variabile. In C++.1 Structuri Gruparea informatiilor corelate de tipuri diferite se face prin utilizarea structurilor. tip care poate fi folosit la declararea unor variabile. dar pot lipsi ambele in acelasi timp.107 - . un vector grupeaza sub un nume mai multe valori de acelasi tip. nume_structura devine un nou tip de data. avem o structura omonima: struct { declaratii_de_variabile. nume_structura lista_variabile. prin aceasta. Avem: struct nume_structura{ declaratii_de_variabile.

struct persoana{ nume char[20]. varsta). int main(){ persoana P={"Gates".V2. } Gates Gheorghe 31 In memorie o variabila de tip structura ocupa o zona continua de memorie. Figura 8. este valida.prenume << " " << P. Initializarea unei structuri se face intr-o maniera analoaga initializarii vectorilor. #include <iostream> using namespace std.1 Tipurile de date definite prin cuvantul cheie struct pot fi transmise ca parametri sau pot fi returnate din functii. daca cele doua variabile sunt de acelasi tip. P1.30}. int varsta. }.varsta++.varsta. atunci atribuirea V1=V2. Definiti structura persoana. Deci daca avem: nume_structura V1. continand (nume. // definirea structurii cerute struct persoana{ char nume[20]. nume varsta inaltime 20 bytes sizeof(int) bytes sizeof(int) bytes Figura 8. Definiti o variabila initializata de tipul persoana. mariti varsta cu 1. char prenume[20]. cout << P. }. P. int varsta. float inaltime. . apoi afisati pe ecran.Introducere in ANSI C++ Exista posibilitatea de a face atribuiri intre doua variabile de tip structura.1 ilustreaza reprezentarea in memorie a unei structuri. prenume.nume << " " << P.108 - ."Gheorghe".

} complex suma(complex x.im*x.im = x.re*x.re << "+i*" << S. } float modul(complex x){ return sqrt(x. return T.im*y.re = x.re*y.109 - . float im. S=suma(z1.23607 .re + y. T.re . return T.2}. cout << "P=" << P.im*y. complex produs(complex.re << "+i*" << P. struct complex{ float re.im). m=modul(z1).im << endl.im = x.-1}.x.im. T. cout << "m=" << m.re.im + x. T.re + x.im.z2={5. complex y){ complex T. T. } S=6+i*1 P=7+i*9 m=2. }.im << endl.z2).complex).P. P=produs(z1.complex). complex suma(complex. #include <iostream> #include <math. } complex produs(complex x.z2).re*y. // z1= 1+2i si z2=5-i float m.im + y.h> using namespace std.re. Definiti structura complex (re. Implementati functiile suma.im). float modul(complex). cout << "S=" << S. produs si modul.Introducere in ANSI C++ P2.re = x. complex y){ complex T. int main(){ complex z1={1.S.

} } Ana  12 8 2003 Luci 21 5 1998 Tom  5 12 2000 Luci  21/5/1998 Tom  5/12/2000 Ana  12/8/2003 .i<nr-1.nume.luna. data datan. P3. cin >> P[i]. apoi afisati-le in ordine crescatoare dupa anul nasterii.t.datan.luna.an).i++){ cin >> P[i]. int j.zi << "/".luna << "/" << P[i].datan. }.nume << " " << P[i].i<nr.i<nr. }.j++) if (P[i]. struct data{ int zi.datan.an.zi >> P[i]. } for(i=0. #include <iostream> using namespace std.datan. Definiti structura persoana (nume. cout << P[i].j<nr.an){ t=P[i].datan. } for(i=0. int main(){ persoana P[10].nr=3.i. data_nasterii). unde data nasterii este o alta structura (zi. P[i]=P[j]. Cititi de la tastatura 3 persoane. P[j]=t.datan.i++) for(j=i+1. for(i=0.Introducere in ANSI C++ Putem defini vectori de structuri sau structuri care contin alte structuri.datan.110 - .i++){ cout << P[i]. struct persoana{ char nume[20].an << endl.an > P[j].luna >> P[i].datan.an.

Definiti o uniune constinand un intreg si un sir de 4 caractere. P4. } lista_variabile. datele interne vor ocupa aceeasi zona de memorie.Introducere in ANSI C++ 8. in cazul structurilor se aloca memorie pentru fiecare variabila declarata in structura.2 Uniuni Dupa cum am vazut. Folositi uniunea pentru a modifica octetii din componenta intregului. . in total uniunea ocupand cat ocupa cea mai mare (dinpunct de vedere al necesarului de memorie) variabila componenta.111 - . cantitatea totala de memorie obtinandu-se adunand cantitatea de memorie necesara fiecarei variabile componente in parte. In cazul care grupam date folosind uniuni. Sintaxa: union nume_structura{ declaratii_de_variabile.

i=0.c[1]=0. I. cout << "F000h = " << I.i.c[3]=0.c[0]=255. I. I. cout << "000Fh = " << I.i << endl.i << endl.112 - . union intreg{ unsigned int i. } 0000h = 0 F000h = 4278190080 0F00h = 16711680 00F0h = 65280 000Fh = 255 . char c[4]. cout << "0F00h = " << I. I. I. I. I. cout << "0000h = " << I.Introducere in ANSI C++ #include <iostream> using namespace std.c[2]=0. cout << "00F0h = " << I. int main(){ intreg I.c[3]=255. }.c[2]=255.c[1]=255. I.i << endl.i << endl.

dreptunghi D.10.r=5.D." << F.x <<".x <<".5 Dreptunghi: (1. struct dreptunghi{ punct A.x <<".C.P." << F. F. struct cerc{ punct P.A. struct triunghi{ punct A. int r.B.A.A.D.y <<") ". }.B.C. #include <iostream> using namespace std. cout << " (" << F. union figura{ cerc C.y=10.B.20)  .D." << F.D. Definiti o uniune prin care putem memora oricare dintre figurile geometrice urmatoare: cerc.113 - . }.x=1. }." << F.y <<".Introducere in ANSI C++ P5. dreptunghi.B.P.r << endl.D.C.x=15.P. }.A.C. F. triunghi.2)  (15. }.B. // dreptunghi F.x=10.D. } Cerc:10.P.B.C. F. F. cout << "Dreptunghi: (" << F.D. // cerc cout << "Cerc:" << F.y. triunghi T.y <<") ". int main(){ figura F.D. F. F.y=20. struct punct{ int x.y=2.C.C.

Tipul variabilelor din campul de biti trebuie sa fie unsigned int.luna << " " << D. Definiti si utilizati un camp de biti pentru stocarea unei date calendaristice. }.114 - . } 29 4 73 Pentru acest exemplu avem urmatoare situatie in memorie: struct data{ unsigned zi:5. #include <iostream> using namespace std. int main(){ data D={29.4.Introducere in ANSI C++ 8. struct data{ unsigned zi:5.3 Campuri de biti C++ permite alocarea de variabile la nivel de bit. unsigned luna:4.2 . unsigned luna:4. }.. unsigned var2:nr_biti. .73}..zi << " " << D. }lista_variabile. zi 0 4 5 luna 8 9 an 15 Figura 8. unsigned an:7. unsigned an:7.an. P6. cout << D. struct nume_structura{ unsigned var1:nr_biti.

for(i=luni. Analog structurilor. enum saptamana {luni. putem defini tipuri enumerate: enum nume_enumerare {lista_nume}. sambata. nume_enumerare devine un tip de data care poate fi folosit ulterior. P7. marti. int i.Introducere in ANSI C++ 8.ct. Implicit. void Mesaj(int). i++) Mesaj(i). Definiti si utilizati o enumerare pentru lucrul cu zilele saptamanii. int main(){ saptamana S. joi. Datele de tip enumerare sunt considerate de tip int. i<=duminica. vineri. duminica}. else cout << "liber ".4 Tipul enumerat Pentru o mai mare claritate. Putem forta valorile dorite prin atribuiri. } treaba treaba treaba treaba treaba liber liber  . #include <iostream> using namespace std. miercuri.115 - . numele dintre acolade vor fi asociate cu valori de la 0 din 1 in 1. } void Mesaj(int S){ if ((S>=luni)&&(S<=vineri)) cout << "treaba ".

bine=7. enum calificative { insuficient=4.116 - . Definiti si utilizati o enumerare care asociaza notele si calificativele. if (nota<=insuficient) cout << "mai incearca!". } Dati o nota:8 e ok! . suficient=5. else if (nota==excelent) cout << "perfect!". int main(){ int nota. #include <iostream> using namespace std.Introducere in ANSI C++ P8. else cout << "e ok!". else if (nota<=suficient) cout << "la limita!". excelent=10 }. cin >> nota. cout << "Dati o nota:".

Introducere in ANSI C++ 8. Se citeste de la tastatura un vector de elemente de tipul definit anterior. Se citeste o matrice de dreptunghiuri astfel definite.5 Probleme propuse Pp1. apoi afisati in ordine crescatoare dupa numarul de selectii. Pp4. sub forma an. Definiti un vector continand elemente de acest tip. Afisati dreptunghiul cu aria maxima. Pp3. .117 - . Pp2. O structura contine coordonatele (intregi) stanga sus si dreapta jos ale unui dreptunghi. luna. Definiti o structura de lucru cu numare rational si implementati operatiile de adunare. cititi de la tastatura 5 valori. Sortati crescator dupa varsta.zi. scadere si inmultire. O structura contine numele si numarul de selectii ale unui jucator de fotbal. O structura contine numele si data nasterii unei persoane. apoi afisat pe ecran.

apel) si vom clasifica functiile in functie de utilizarea lor. este evident ca in cazul problemelor complexe este necesare o impartire in module a programului. parametri de iesire. aceasta trebuie sa fie cunoscuta de catre compilator. 9. Un prototip reprezinta pentru o functie ceva similar declaratiei de variabila pentru o variabila.1 Cum o functie modeleaza un algoritm (subalgoritm). Modularizarea poate fi realizata in C/C++ folosind functii. folosita in acest material. Forma generala a unui prototip al unei functii asociata algoritmului general din figura 9. Acest lucru se poate realiza definind functia inainte de locul apelului. parametri de intrare. este folosirea prototipurilor. vom descrie datele de intrare si cele de iesire din functie.2 Inainte de utilizarea unei functii. fara a scrie rezolvarea. O functie reprezinta o colectie de declaratii si instructiuni de sine statatoare care rezolva o anumita subproblema. Folosind un prototip vom descrie comportamentul functiei.118 - . definire. altfel spus. functie in care am scris tot codul dorit. valoare returnata.2 este: .1 Generalitati Forma generala a unui algoritm este urmatoarea: date de intrare Algoritm date de iesire Figura 9. forma generala a unei functii este data de: date de intrare Functie date de iesire Figura 9. A doua modalitate.Introducere in ANSI C++ Capitolul 9 – Functii Daca pana acum am folosit la scrierea programelor noastre doar functia main. Vom prezenta mai departe modul de utilizare a functiilor (prototip.

Daca in loc de tip returnat nu scriem nimic. pe larg: tip_returnat nume_functie(lista_parametri){ declaratii si instructiuni } Apelul sau utilizarea efectiva a functie are loc sub forma: nume_functie(lista_parametri). mai putin in ainteriorul altei functii.2 Functii care nu primesc si nu returneaza nimic Forma generala a unei astfel de functii este: Functie Figura 9. in cazul parametrilor.Introducere in ANSI C++ tip_returnat nume_functie(lista_parametri). tipul returnat implicit este int. Prototipurile aasociate acestui caz sunt de forma: void nume_functie(). sau Observam ca. pentru acest caz. . Apelul functiei.3 Specificam lipsa valorii returnate folosind tipul de date void.119 - . poate avea loc in orice zona a codului sursa. Pe locul apelului va aparea o valoare de tip tip_returnat. Definirea functiei. tipul void poate sa lipseasca. va fi de forma: nume_functie(). 9. void nume_functie(void). Definirea unei functii este de forma functie = antet + bloc sau. Numele functie poate fi orice identificator valid. Tipul returnat si lista parametrilor vor da catalogarea din subcapitolele urmatoare.

variabile declarate in cadrul blocului functiei. void Mesaj(void). P1. Faptul ca functia nu primeste date de intrare nu ne impiedica sa folosim o serie de variabile de lucru pentru rezolvarea problemei. } void Mesaj(){ cout << "*******************" << endl. #include <iostream> using namespace std.120 - . cout << "*******************" << endl. apoi afisati. int main(){ Mesaj().Introducere in ANSI C++ Parantezele de dupa numele functiei nu sunt optionale. un bradulet pe ecran. Realizati o functie care afiseaza un mesaj de intampinare pe ecran. } ******************* * Bine ati venit! * ******************* P2. . Realizati o functie care sterge ecranul prin trecerea la rand nou de 30 de ori. cout << "* Bine ati venit! *" << endl. folosind o alta functie. In general acest tip de functii vor afisa ceva pe ecran.

121 - . endl. endl. iar apelul: . 9. endl.i++) cout << endl. dar primesc date de intrare Analog cazului anterior acest ip de functii vor afisa de obicei rezultatele pe ecran. int main(){ Sterge(). } void Sterge(){ int i. Bradulet().i<=30.3 Functii care nu returneaza nimic.Introducere in ANSI C++ #include <iostream> using namespace std. } void Bradulet(){ cout << " * " cout << " *** " cout << " ***** " cout << " ******* " cout << " | " }     *    ***   *****  *******     | << << << << << endl. for(i=1.4 Prototipul: void nume_functie(lista_parametri). void Bradulet(). void Sterge(). Forma generala este: date de intrare Functie Figura 9. endl.

Introducere in ANSI C++
nume_functie(lista_parametri);

Vom descrie pentru acest caz, pas cu pas, ce se intampla in cazul apelului unei functii. Fie urmatoare problema: P3. Realizati o functie care, primind ca parametri doua numere intregi a si b, afiseaza pe ecran valorile pare din intervalul [a,b].
#include <iostream> using namespace std; void afisare(int,int); int main(){ afisare(2,7); } // prototip

// apel

void afisare(int a, int b){ int i; for(i=a;i<=b;i+=2) cout << i; } 246

// antet

Se observa ca atunci cand scriem prototul functiei se specifica doar tipul parametrilor de intrare. La scrierea antetului vom da si numele parametrilor de intrare, nume prin care vor fi accesati acestia in blocul functiei. Stiva, o zona de memorie speciala in care sunt salvate, in momentul apelului o serie de informatii despre functia apelata, cum ar fi adresa de revenire, parametri si variabilele declarate in functie (variabile locale). Avem urmatorii pasi: Pas 1. Inainte de apel:
Pozitia in program Stiva

int main(){ afisare(2,7); } vf

Figura 9.5

- 122 -

Introducere in ANSI C++ Pas 2. Apelul (intrarea in functie)
Pozitia in program Stiva

int main(){ afisare(2,7); } void afisare(int a, int b){ int i; ... } vf ? 7 2 i b a

Figura 9.5 In momentul apelului, se aloca pe stiva variabilele ce reprezinta parametri de intrare si variabilele definite in functie. Parametri a si b ai functiei (numiti parametri formali) vor prelua valorile date la apel (parametri actuali). In cazul in care apelul are ca parametri expresii, acestea trebuie sa aiba un tip compatibil cu al parametrilor formali. In acest caz, are loc evaluarea expresiei, rezultatul fiind atribuit parametrului corespunzator. Acest tip de apel poarta numele de apel prin valoare. Pas 3. Inainte de revenire
Pozitia in program Stiva

int main(){ afisare(2,7); } void afisare(int a, int b){ int i; ... } vf 8 7 2 i b a

Figura 9.6

- 123 -

Introducere in ANSI C++ Observam modificarea valorii variabilei locale i, conform instructiunilor executate. Pas 4. Revenirea din functie
Pozitia in program Stiva

int main(){ afisare(2,7); } vf

Figura 9.7

La iesire din functie, stiva revine la nivelul anterior apelului, iar variabilele locale si parametri formali dispar. Programul continua cu prima instructiune de dupa apel. P4. Realizati o functie care afiseaza un bradulet pe ecran, cu dimensiunea data de un parametru.

- 124 -

Introducere in ANSI C++

#include <iostream> using namespace std; void Bradulet(int); void Spatii(int); void Stelute(int); int main(){ Bradulet(3); Bradulet(5); } void Spatii(int n){ int i; for(i=1;i<=n;i++) cout << " "; } void Stelute(int n){ int i; for(i=1;i<=n;i++) cout << "*"; } void Bradulet(int n){ int i; cout << endl; for(i=1;i<=n;i++){ Spatii(n-i); Stelute(2*i-1); cout << endl; } Spatii(n-1); cout << "|" ; }   *  *** *****   |     *    ***   *****  ******* *********     |

- 125 -

Introducere in ANSI C++ P5. Folosind functii, afisati pe ecran urmatoare piramida de numere: 1 121 12321 ....................

#include <iostream> using namespace std; void void void void Spatii(int); Crescator(int); Descrescator(int); Piramida(int);

int main(){ Piramida(5); } void Piramida(int n){ int i; for(i=1;i<=n;i++){ Spatii(n-i); Crescator(i); Descrescator(i-1); cout << endl; } } void Crescator(int n){ int i; for(i=1;i<=n;i++) cout << i; } void Spatii(int n){ int i; for(i=1;i<=n;i++) cout << " "; } void Descrescator(int n){ int i; for(i=n;i>=1;i--) cout << i; }     1    121   12321  1234321 123454321

- 126 -

.. } unde expresie este convertibil la tip_returnat.8 Prototipul: tip_returnat nume_functie(). pe locul apelului "apare" valoarea returnata. cout << nume_functie(). P6. . return expresie. Exemple de apeluri: var=nume_functie(). sau: ..Introducere in ANSI C++ 9.. Forma generala a definirii functiei: tip_returnat nume_functie(){ .127 - .4 Functii care nu primesc date de intrare dar returneaza o valoare Forma generala este: date de iesire Functie Figura 9. // var compatibil cu tip_returnat if (expresie == nume_functie()) .. Realizati o functie care returneaza valoarea lui Pi cu doua zecimale exacte. moment in care se iese din functie. tip_returnat nume_functie(void).  Valoarea va fi returnata din functie folosind instructiunea return. La revenirea din apel.

while(X<1000){ if (X>mx) mx=X. int main(){ cout << max(). } 3. cin >> X. int max(). Realizati o functie care citeste de la tastatura valori intregi (<1000) pana la intalnirea valorii 1000 si returneza minimul acestor valori.mx. cin >> X. } int max(){ int X. } return mx. } float Pi(){ return 3.128 - . float Pi().14 P7. #include <iostream> using namespace std. int main(){ cout << Pi(). } 12 45 29 1000 45 . mx=X.Introducere in ANSI C++ #include <iostream> using namespace std.14.

La intalnirea acestei instructiuni. iar pe locul apelului va aparea valoarea returnata. P8.5 Functii care primesc un numar oarecare de parametri de intrare si returneaza o singura valoare Este probabil cea mai utilizata varianta de functie.b.c) .Introducere in ANSI C++ 9. if (nume_functie(lista_parametri)==expresie) cout << nume_functie(lista_parametri) sau: sau: Valoarea este returnata din functie prin folosirea instructiunii return.129 - . Exemple de apeluri: var = nume_functie(lista_parametri).9 Prototipul: tip_returnat nume_functie(lista_parametri). Forma generala: date de intrare Functie data de iesire Figura 9. Realizati urmatoarele functii: • • • max(a.b) modul(a) min(a. se revine automat din functie.

cout << "b=". } int modul(int x){ return (x>0)?x:-x. Realizati functiile cu urmatoarele prototipuri: • int sumac(int). else return (y<z)?y:z.3)=3 |­2|=2 min=­2 Observam diferite modalitati de a apela functiile cerute in enunt. float z){ if (x<y) return (x<z)?x:z. float. cout << "min=" << x<< endl. float y. } int max(int a.Introducere in ANSI C++ #include <iostream> using namespace std. cout << "c=".b) << endl. cin >>c. } float min(float x.b. int). cout << "|"<< a+b+c << "|=" << modul(a+b+c)<< endl.130 - . int b){ if (a>b) return a. else return b. int modul(int). float min(float. x=min(float(a)/b . P9. cout << "max(" << a << "." << b << ")=" << max(a. } a=­6 b=3 c=1 max(­6.c. int max(int. cin >>a. float x. cout << "a=". float(c)/a). float). float(b)/c. int main(){ int a. // suma cifrelor unui numar . cin >>b.

} int primac(int n){ while (n>=10) n=n/10. sumadiv(int). return S. return n. // factorialul unui numar #include <iostream> using namespace std. cout cout cout cout } int sumac(int n){ int S.b. S=0. primac(int).i++) P*=i.n/=10) S+=n%10. for(d=1. fact(int).Introducere in ANSI C++ • • • int sumadiv(int). cout << "a=". // prima cifra a unui numar int fact(int).i<=n. cout << "b=". return S. } int fact(int n){ int i. cin >> a.S. } int sumadiv(int n){ int d.P. int int int int sumac(int). "primac(" << a << ")=" << primac(a) << endl. for(.d<=n. // // // // suma cifrelor unui numar suma divizorilor unui numar prima cifra a unui numar factorialul unui numar int main(){ int a.131 - .n>0. . "fact(" << b << ")=" << fact(b) << endl. S=0.d++) if (n%d==0) S=S+d. cin >> b. } a=5123 << << << << "sumac(" << a << ")=" << sumac(a) << endl. for(i=1. "sumadiv(" << a << ")=" << sumadiv(a) << endl. // suma divizorilor unui numar int primac(int). P=1. return P.

} bool prim(int n){ int d. for(d=2. bool prim(int).Introducere in ANSI C++ b=4 sumac(5123)=11 sumadiv(5123)=5280 primac(5123)=5 fact(4)=24 P10.d<=n/2. if (prim(x)==true) cout << x << " este prim \n". if (perfect(x)) cout << x << " este perfect \n". Realizati urmatoarele functii ce returneaza valori logice: bool prim(int).d=1.d++) if (n%d==0) return false. // verifica daca un numar este prim sau nu bool perfect(int). return S. } bool perfect(int n){ return sumad(n)==n. for(S=0.132 - . // verifica daca un numar este egal cu suma divizorilor sai #include <iostream> using namespace std. else cout << x << " nu este prim \n". cout << "x=". } int sumad(int n){ int S. return true. int main(){ int x. cin>>x.d<=n/2.d++) if (n%d==0) S+=d. } x=28 .d. else cout << x << " nu este perfect \n". int sumad(int). bool perfect(int).

} int prim_mic(int n){ while(!prim(n)) n--. afisati cel mai mare numar prim mai mic ca n (numar intreg citit de la tastatura). #include <iostream> using namespace std.133 - .10 Vom prezenta in continuare doua variante de realizare. Folosind functii. cout << " este " << prim_mic(x).6 Functii ce returneaza mai multe valori Forma generala: date de intrare Functie date de iesire Figura 9. return true. . cout << "Cel mai mare numar prim mai mic ca " << x. bool prim(int). } bool prim(int n){ int d.Introducere in ANSI C++ 28 nu este prim 28 este perfect P11. cout << "x=". int prim_mic(int). return n.d++) if (n%d==0) return false. } x=100 Cel mai mare numar prim mai mic ca 100 este 97 9. for(d=2. cin>>x. int main(){ int x.d<=n/2.

. Realizati o functie care calculeaza suma si produsul a doua numere reale. Definirea functiei va respecta urmatoarea structura: nume_structura  nume_functie(lista_parametri){ nume_structura  T. return T.. Vom grupa sub numele unei structuri datele care vor fi returnate de catre functie... . } Structura T din cadrul functiei va contine datele de returnat. P12. . var = nume_functie(lista_parametri). iar prototipul va fi de forma: nume_structura  nume_functie(lista_parametri). Apelul va fi de forma: nume_structura var. .Introducere in ANSI C++ O prima varianta este folosirea structurilor..134 - .

cout << a. doua_numere sp(float. . sau: void nume_functie(lista_parametri_intrare_si_iesire). struct doua_numere{ float suma.Introducere in ANSI C++ #include <iostream> using namespace std. In acest caz. a=sp(3.5).135 - .5).suma << " " <<a. int main(){ doua_numere a.float). vom folosi parametri referinte. parametrul formal devine un alias al celui actual.produs. float b){ doua_numere T. T.suma=a+b. prototipul ca fi de forma: void nume_functie(lista_parametri_intrare. In cazul in care dorim modifiarea lor. return T. lista_parametri_iesire). Dupa cum am vazut.produs=a*b. } 8 15 A doua varianta este folosirea referintelor (2. float produs. }. } doua_numere sp(float a. T. medificarea acestuia modificand de fapt paramatrul actual. chiar daca acestia sunt variabile (se lucreaza cu copii pe stiva). Apelul: nume_functie(lista_parametri). transferul parametrilor prin valoare nu duce la modificarea parametrilor actuali. In acest caz.

min << " " <<a.Introducere in ANSI C++ Evident. alte_doua_numere sp(int. Functie care interschimba doua variabile. cout << a. P13. } alte_doua_numere sp(int a. }.min. a=sp(6. int b){ alte_doua_numere T.max= (a+b)-T. in acest caz paramatri actuali trebuie sa fie variabile de un tip compatibil parametrul formal corespunzator. int main(){ alte_doua_numere a.2). struct alte_doua_numere{ int min. } 2 6 P14. Realizati o functie care returnezeaza maximul si minimul a doua valori intregi. .int).max. Valorile vor fi deci "returnate" prin modificarea variabilelor din apel. T. #include <iostream> using namespace std. return T.max. T.136 - .min=(a<b)?a:b.

int& b){ int t. .Introducere in ANSI C++ #include <iostream> using namespace std. Deci durata de viata a unei variabile locale este din momentul declaratiei si pana la sfarsitul blocului. iar domeniul de vizibilitate este zona in care putem utiliza variabila respectiva.a=b. mai putin alte blocuri interioare in care declaram o variabila cu acelasi nume. cin >>b. cout << "b=". void interschimbare(int& . cout << a << " " << b. Durata de viata si domeniu de vizibilitate Durata de viata a unei variabile reprezinta timpul cat timp aceasta este alocata in memorie. este consacrat ca variabilele locale sa fie asociate cu blocurile functiilor.b. apare la intrarea in bloc (functie) si dispare la iesirea din bloc (functie). Variabile locale (fara folosirea functiilor).b). interschimbare(a.137 - . } void interschimbare(int& a. Am vazut ca o variabila locala este alocata pe stiva. Chiar daca putem defini variabile in orice bloc.b=t. t=a. P15. Definirea variabilelor in cadrul blocurilor va face ca variabilele sa fie locale acelui bloc. cin >>a. int&). int main(){ int a. cout << "a=". } a=2 b=5 5 2 9.7 Variabile locale si globale. Domeniul de vizibilitate este dat de blocul variabilei.

pentru a accesa variabila globala din cadrul zonei respective. putem folosi operatorul scope. int main(){ int a=11. // b din bloc si a din blocul main } } 5 12 5 100 11 6 Variabilele globale sunt variabile declarate in afara oricarui bloc. . Totusi.Introducere in ANSI C++ #include <iostream> using namespace std. ::. iar ::var cea globala. Domeniu de vizibilitate este intreg programul. cout << a << " " << b << endl.138 - . // a din bloc si b din blocul main { int b=100. cout << a << " " << b << endl. In general nu este recomandata folosirea variabilelor globale. // a din blocul exterior si b din blocul interior } } { int b=6. chiar si in cazul in care variabila globala este "acoperita" de catre una locala cu acelasi nume. { int a=5. In acest caz var va fi variabila locala.b=12. mai putin blocurile in care a fost definita o variabila locala cu acelasi nume. posibilitatea modificarii acestora din cadrul oricarei functii putand duce la erori logice (bugs) greu de depanat. cout << a << " " <<b << endl. Durata de viata este din momentul declararii si pana la incheierea programului.

// locala in main f(). } 5 2 2 100 Folosirea variabilelor globale nu este recomandata. int a=2. // variabila globala void f(){ int a=5. // locala in f cout << a << " " << ::a << endl. Desi nu vom avea erori de compilare.139 - . Varianta 1 – in cazul folosirii variabilelor locale .Introducere in ANSI C++ P16. La afisarea unei piramide de numere. cout << a << " " << b << endl. folosirea variabielor globale poate duce la erori logice. modificarea variabilei contor din main in cadrul functiei apelate va duce la o bucla infinita. P17. Urmatoarea problema ilustreaza un astfel de bug datorat folosirii variabilei globale in locul unora locale. accesibilitatea acesteia din orice functie putand duce la erori logice greu de depanat. } int main(){ int b=100. Variabile locale si variabile globale #include <iostream> using namespace std.

i++){ Descrescator(i). } } void Descrescator(int n){ int i.i--) cout << i. // i declarat local for(i=1. void Descrescator(int).i<=4. // int i.i>=1. cout << endl.i--) cout << i. void Descrescator(int). int i. // i declarat local for(i=n. // i declarat local for(i=n.Introducere in ANSI C++ #include <iostream> using namespace std. } 1 21 321 4321 // i declarat global Varianta 2 –in cazul folosirii variabilelor globale #include <iostream> using namespace std. } 1 1 // i declarat global .i++){ Descrescator(i).i<=4. cout << endl. int main(){ int i. } } void Descrescator(int n){ // int i. int main(){ // int i.i>=1.140 - . // i declarat local for(i=1.

Alt exemplu de supradefinire a functiilor .c). int c){ return max(max(a. } int max(int a. } int max(int a. int b. folosind max(a.. P18. #include <iostream> using namespace std. int max(int. int main(){ cout << max(2. int max(int. int b){ return (a>b)?a:b.c). Calculati max(a.141 - .1).Introducere in ANSI C++ .b).5.8 Supradefinirea functiilor C++ permite folosirea a mai multe functii cu acelasi nume. } 5 P19. (se intra in bucla infinita) 9.b).b.int.. Diferentierea dintre functii va fi facuta dupa tipul si/sau numarul parametrilor.int)..int).

..cpp:7: note:                 void este(float) p19..14 este un real e este un caracter In cazul in care am fi avut apeluri ca in exemplul de mai jos ... void este(int). am fi obtinut erori de compilare de forma: p19...cpp:6: note: candidates are: void este(int) p19.... } ..14))...cpp:14: error: call of overloaded ‘este(double)’ is ambiguous p19.142 - . este('e').14). int main(){ este(123).. este(char('e'))... } void este(char n){ cout << n << " este un caracter" << endl. este(3. } void este(int n){ cout << n << " este un intreg" << endl.Introducere in ANSI C++ #include <iostream> using namespace std.cpp:8: note:                 void este(char) . void este(float). int main(){ este(int(123)).cpp: In function ‘int main()’: p19. este(float(3.. } 123 este un intreg 3. } void este(float n){ cout << n << " este un real" << endl... void este(char)..

int main(){ afisare(1. } 1 3 5 7 1 2 3 4 5 6 7 8 . Valorile implicite vor fi specificate in prototip. sub forma: tip_ret nume_functie(param_neinitializati.i+=pas) cout << i << " ".8. void afisare(int a. In acest caz. In momentul apelului.8).i<=b.2). putem folosi parametri impliciti pentru acea functie. afisare(1. Functie cu parametri impliciti care afiseaza un interval.9 Functii cu parametri impliciti In cazul in care apelul unei functii se face de obicei cu aceleasi valori. for(i=a. sau: tip_ret nume_functie(param_initializati).// in acest caz ultimul parametru ca fi cel implicit } void afisare(int a.143 - . putem omite parametri cu valori implicite. cout << endl.int pas=1).int b. #include <iostream> using namespace std.int b. cu un pas dat. param_initializati). valorile parametrilor lipsa vor fi date de valorile implicite.Introducere in ANSI C++ Deci apelurile in cazul functiilor supradefinite nu au voie sa introduca ambiguitati.int pas){ int i. functia care va fi apelata fiind unic determinata in momentul apelului. P20. 9. de la dreapta la stanga.

int d=-MAXINT). int mx(int.mx(c. int main(){ cout << max(5.int c=-MAXINT.Introducere in ANSI C++ P21.10 Parametri vectori Prototipul ca fi de forma: tip_returnat nume_functie(tip []. int)’ is ambiguous p21.5. } 5 8 In cazul in care functia ajutatoare ce calculeaza maximul a doua valori ar fi avut numele max (supradefinind functia cu parametri impliciti).h> using namespace std.d)).8. } int mx(int a.int b=-MAXINT.cpp:7: note:                 int max(int.cpp: In function ‘int main()’: p21.cpp:10: error: call of overloaded ‘max(int.b). int) p21. cout << max(1.144 - . Functie cu parametri impliciti care calculeaza minimul a maxim patru valori.int b){ return (a>b)?a:b.3) << endl. int max(int a=-MAXINT. } int max(int a. int. int c. De obicei numarul efectiv de valori din vector va fi transmis printr-un alt . #include <iostream> #include <values. int b. int d){ return mx(mx(a. alti_parametri).2) << endl. ar fi existat o ambiguitate si am fi avut o eroare de forma: p21. int) 9. Apelul: nume_functie(Vector. alti_parametri). int).cpp:6: note: candidates are: int max(int. int.

P22. Parametri nu se aloca pe stiva ca o variabila simpla.Introducere in ANSI C++ parametru. Functii care realizeaza urmatoarele operatii pe vectori: • • • • initializare cu valori aleatoare citire afisare suma elementelor . deci un vector de lungime 100 nu va ocupa din stiva 100*sizeof(tip) octeti. Transmiterea vectorului va a vea un comportament analog transmiterii prin referinta.145 - . modificarile facute pe elementele vectorului in cadrul functiei fiind regasite in vectorul cu care s-a apelat functia.

i++) S+=a[i].n). cout << "\nn=".m). for(i=0. int n){ int i. int main(){ int a[100]. int). cin >> n. } void initializare(int a[].m). return S. // vectorul a de lungime efectiva n initializare(a. for(i=0. citire(b. } void afisare(int a[]. cout << suma(b. for(i=0. void void void long initializare(int []. } n=3 83 86 77 n=4 1 2 3 4 10 .i<n.n). cin >> n. } long suma(int a[]. int &n){ int i. cout << "\nn=". int &n){ int i.i<n. for(S=i=0. afisare(a. int n){ int i.i++) a[i]=random()%100.Introducere in ANSI C++ #include <iostream> using namespace std.146 - . afisare(int []. } void citire(int a[].i++) cin >> a[i]. int b[10].n.m. int &).S.i++) cout << a[i] << " ". int).i<n. citire(int [].i<n. int &). suma(int []. cout << endl.

void diferenta(int []. int m.// multimea in care tine rezultatul operatiilor intersectia(a.m=4. int []. // completam prima multime l=n. bool este(int [].m. int b[]. int c[]. int n. } void diferenta(int a[]. int c[].i++) if (a[i]==val) return true.// verifica daca o valoare este sau nu intr-o multime int main(){ int a[]={2. diferenta #include <iostream> using namespace std.l).b.int n. int [].int). int&).int.n=3.4.a[i])) c[l++]=a[i].m.l). int. int []. int n.m.b.c.i++) if (!este(b. int n){ cout << endl. Realizati functii care fac: intersectia.n.i<m.i<n.l). int n. int&).147 - .i<n. int&l){ int i.l). int&l){ int i.b[i])) c[l++]=b[i]. for(i=0. int m. } void intersectia(int a[]. int []. // prima multime int b[]={1. int&l){ int i.Introducere in ANSI C++ P23. afisare(c.i<n.n.m. int.4. for(int i=0. l=0. } void afisare(int a[]. int []. int b[]. Fie doi vectori reprezentand multimi de valori intregi.i++) cout << a[i] << " ".m. } bool este(int a[].int val){ int i.b. diferenta(a.8}. int&). void intersectia(int [].i++) if (!este(a. // a doua multime int c[10].c. void reuniunea(int []. int m. int. afisare(c.n. reuniunea(a. reuniunea. for(i=0. int. int c[]. l=0. int.i<n.l).14}. void afisare(int [].int). } . for(i=0.n. for(i=0. for(i=0.8. } void reuniunea(int a[].l.c. int []. afisare(c. int b[].i++) if (este(b.i++) c[i]=a[i].i<n.a[i])) c[l++]=a[i]. int. return false.l).

Introducere in ANSI C++ 4 8 2 4 8 1 14 2  9. refaceti rezolvarile folosind functii. Reluati toate problemele rezolvate de pana cum. acolo unde este posibil. .11 Probleme propuse Ppx.148 - . si.

forma generala a unei functii recursive va fi urmatoarea: tip_returnat nume_functie(lista_parametri_formali){ if (!conditie_de_oprire){ . n ⋅ (n − 1)!. P1..149 - . nume_functie(lista_parametri_actuali) }  } Recursivitatea poate fi utilizată pentru a rezolva elegant multe probleme... n = 0 n!=  . avem: . In practica. 9) complexitatea algoritmilor recursivi este de obicei mai mare decat a "fratilor" iterativi. Sa se realizeze o functie recursiva ce calculeaza n! Plecam de la formula recursiva de calcul 1. .1 Recursivitatea directa In cazul in care functia contine in corpul ei un apel la ea insasi vorbim despre recursivitate directa.Introducere in ANSI C++ Capitolul 10 – Recursivitate Numim functie recursiva o functie care se autoapeleaza (direct sau indirect). dar funcţiile recursive sunt adesea mai lente decât corespondentele lor nerecursive: la fiecare apel depun în stivă valorile parametrilor (dacă există) şi adresa de revenire (Cap. 10.. n > 0 Rescriind formula intr-o varianta mai apropiata de implementarea C/C++.

condiţia de ieşire este 0! care.Introducere in ANSI C++ 1. n > 0 Trecerea la următorul program este naturala: #include <iostream> using namespace std. long fact(int). n = 0 fact (n) =  n * fact (n − 1). prin definiţie. ceea ce duce la primul apel recursiv (2) calculeaza 2*fact(1) – apel recursiv (3) calculeaza 1*fact(0) – apel recursiv (4) returneaza 1 – revenire din fact(0) (5) returneaza 1 – revenire din fact(1) (6) returneaza 2 – revenire din fact(2) (7) returneaza 6 – revenire din fact(3) . cin >> n. În problema factorialului. return n*fact(n-1). } 4 4!=24 //conditia de oprire //apel recursiv: n!=n(n-1)! La orice funcţie recursivă trebuie precizată o condiţie de ieşire. int main(){ int n. altfel returnează rezultatul înmulţirii dintre valoarea parametrului şi factorialul apelat cu valoarea parametrului minus 1. este 1. cout << n << "!=" << fact(n). Dacă parametrul primit de fact este 0. atunci funcţia returnează 1. Pentru fact(3) avem urmatoarea succesiune de operatii: (1) calculeaza 3*fact(2). } long fact(int n){ if(n==0) return 1.150 - .

} vf 3 n Iesirea in recursivitate long fact(2){ if(2==0) return 1. return 2*fact(1). return 3*fact(2).151 - . } vf 0 1 2 3 n n n n Figura 10. Realizati o functie recursiva care calculeaza 2n. return n*fact(n-1).Introducere in ANSI C++ Figura 10. . } Intrarea in recursivitate vf 2 3 n n long fact(1){ if(1==0) return 1.1 ilustreaza succesiune de apeluri recursive: long fact(3){ if(3==0) return 1. } vf 1 2 3 n n n long fact(0){ if(0==0) return 1.1 P2. return 1*fact(0).

cout << "fibo("<< n << ")=" << fibo(n) << endl. Calculati fibo(n) intr-o functie recursiva (cel de-al n-lea termen din sirul lui Fibonacci). if(n<=2) return 1. apeluri:15 . return fibo(n-1)+fibo(n-2). } long doila(int n){ if(n==0) return 1. Cate apeluri recursive au avut loc? #include <iostream> using namespace std. int main(){ int n. } 6 fibo(6)=8 Nr. cin >> n. int nr_apeluri. long fibo(int). } long fibo(int n){ nr_apeluri++. cout << "2^"<< n << "=" << doila(n).Introducere in ANSI C++ #include <iostream> using namespace std. } 3 2^3=8 P3.152 - . return 2*doila(n-1). cin >> n. cout << "Nr. apeluri:" << nr_apeluri. long doila(int). // retinem numarul de apeluri ale functiei int main(){ int n. nr_apeluri=0.

Introducere in ANSI C++ Folosirea variabilei globale a permis contorizarea simpla a intrarilor in functia recursiva.153 - . void invers(). P4. Inversarea unui text citit de la tastatura folosind o functie recursiva. c=getchar(). int main(){ invers(). iar prin adaugarea de valori apoi scoaterea lor din stiva. Numarul mare de apeluri recursive. } void invers(){ char c. } abcd dcba . Urmatoarea aplicatie va folosi faptul ca variabilele locale sunt alocate pe stiva. cout << c. if (c!='\n') invers(). numar care creste exponential. #include <iostream> using namespace std. face ca aceasta implementare sa nu fie practica. acestea isi inverseaza ordinea.

} int g(int x.2 Recursivitatea indirecta In cazul in care apelul recursiv se face prin intermediul unei alte functii. } 19 .int). else return g(x. int f(int.Introducere in ANSI C++ 10. P5.int y){ if (x>=y) return x. } int f(int x. y  .20). y = unde x .int y){ if ((x+y)>=5) return x+y-5. y−1 . pentru x y5 #include <iostream> using namespace std. int main(){ cout << f(5. numim acest tip de apel recursivitate indirecta. int g(int.154 - . y = xy−5. pentru xy≥5 2∗ f 0. pentru x y g x . else return 2*f(0.int). pentru x≥y g  x . Calculati: f  x .y).y-1).

Functie recursiva care afiseaza cifrele unui numar. Realizati o functie recursiva care calculeaza cmmdc-ul elementelor din vector.. g(1)=1 g(n+2)=5*f(n)-g(n) f(n+1)=g(n+1)-f(n-1) . pentru n>=2 A[0]=A[1]=1 Pp2..Introducere in ANSI C++ 10. Functie recursiva care descompune un numar in factori primi. Scrieti functii recursive pentru a afisa urmatoare piramida de numere: 1 12 12 3 . Realizati o functie recursiva pentru a afisa primii n termeni ai sirului A. Pp4..155 - . Fie n numar natural citit de la tastatura. Pp5.. definit ca: A[n]=3*A[n-1]+2*A[n-2].3 Probleme propuse Pp1.. Fie un vector de numere intregi pozitive definit global... pentru f si g definite: f(0)=f(1)=1 g(0)=2. Afisati f(n) si g(n).. Pp3. Pp6..

respectiv de a scrie datele de iesire in altul.stdout). . Dupa executarea functiei.stdin).Introducere in ANSI C++ Capitolul 11 – Fisiere Pana acum am citit datele de intrare de la tastatura. Pentru redirectarea intrarii avem: freopen(nume_fisier. Vom avea ceva de forma: stdin 35 9 12 stdout Algoritm Suma: 29 Figura 11. vor accesa de fapt fisierele care au devenit intrari si iesiri standard.1 11. intrarea standard va fi nume_fisier. Pentru redirectarea iesirii avem: freopen(nume_fisier. In acest caz. iesirea standard va fi nume_fisier. "r". "w". Dupa executarea functiei. este modificare intrarii si iesirii standard. respectiv iesire. Tastatura si ecranul reprezinta dispozitivele standard de intrare.1 Redirectarea intrarii/iesirii Probabil cea mai simpla posibilitate de a citi date dintr-un fisier. cin si cout. stdin Algoritm stdout Figura 11.156 - .2 Functia care permite redirectarea stdin si stdout este freopen. iar cele de iesire au fost afisate pe ecran.

freopen("iesire.i<=10. Afisati pe ecran suma lor.p02 55 . cout << a+b. S=0.b. #include <iostream> using namespace std. S += x.txt" contine numere 2 numere intregi. } Dati fisierul de intrare:intrare. } cout << S.stdin).S.stdin).txt".i. } intrare.txt: 2 5 iesire. freopen("intrare. cin >> FileName. Se citeste de la tastatura numele unui fisier care contine 10 numere intregi.157 - ."r". #include <iostream> using namespace std.stdout).Introducere in ANSI C++ P1."w". cin >> a >> b. cout << "Dati fisierul de intrare:". int main(){ int a.txt" suma acestor doua numere. char FileName[20]. freopen(FileName."r".txt: 7 P2. int main(){ int x. Fisierul "intrare.txt". Scrieti in fisierul "iesire.i++){ cin >> x. for(i=1.

vom folosi: flux_intrare. sau: ofstream flux_iesire(nume_fisier). In cazul in care se specifica un nume de fisier. sau daca dorim. Mai sus sir va fi sirul de caractere in care va fi realizata citirea. nr).open(nume_fisier). fiserul este deschis si eventualele date existente sunt sterse. fisierul este deschis si este pozitionat la inceput. flux_iesire << expresie. ifstream si ofstream sunt clase definite in biblioteca fstream si permit declararea unor variabile care vor fi asociate cu fisierele cu care dorim sa lucram. respectiv: ofstream flux_iesire. folosind operatorii >> si <<: flux_intrare >> variabila. .Introducere in ANSI C++ 11.158 - . iar nr reprezinta numarul maxim de caractere care va fi citit. tab). Declaratiilor vor fi de forma: ifstream flux_intrare. enter. sau: ifstream flux_intrare(nume_fisier). In acest moment. acel fisier va fi deschis in mod automat si va fi accesibil prin intermediul variabilei flux_iesire sau flux_intrare. Accesul la fluxuri de va face analog lucrului cu cin si cout. iar caracterele albe dintre doua variabile consecutive citite vor fi ignorate. la nu moment dat sa schimbat fiserul asociat cu o anumita variabila flux. Citirea unei variabile va fi incheiata la intalnirea unui caracter alb (spatiu. folosim apeluri de forma: flux. iar daca este de iesire. Daca nu. Daca dorim citirea unui sir de caractere. inclusiv spatii.2 Fluxuri de intrare/iesire C++ pune la dispozitie fluxurile fisier ifstream (pentru date de intrare) si ofstream (iesire).getline(sir. daca fluxul este de intrare.

p04" contine 5 nume de persoane.i++){ f >> nume >> prenume. Afisati pe ecran persoanele care au numele de patru caractere.b. Fisierul "intrare.p04: Voinea Mircea  Tica Silviu  Toth Haralambie  Ion Ion  Gheorghe Gheorghe ecran: Tica Silviu .159 - . for(i=1. date pe cate un rand sub forma nume prenume. #include <fstream> #include <iostream> using namespace std. fout << a+b. char nume[20]. Scrieti in fisierul "iesire. ofstream fout("iesire. ifstream f("intrare.txt: 2 5 iesire. prenume[20]. } } intrare.p04"). dar rezolvare cu fluxuri) #include <fstream> using namespace std. ifstream fin("intrare.txt"). int main(){ int a. (identic cu P1. int main(){ int i.txt").Introducere in ANSI C++ P3. } intrare.txt" suma acestor doua numere. fin >> a >> b. if (strlen(nume)==4) cout << nume << " " << prenume << endl.txt" contine numere 2 numere intregi.i<=5. Fisierul "intrare.txt: 7 P4.

pe primul rand un numar intreg n. n numere reale. iar pe urmatorul separat de cate un spatiu.i<=n.p05" contine. enuntul va da ca fiserul de intrare un fisier in care.p05 1 2 3 4 1  2 3 4  . Scrieti numere in alt fisier. cate 5 pe un rand. ca prima valoare se va da numarul de valori care vor fi citite ulterior din fisier. } P5. ofstream fout("iesire. if (i%5==0) fout << endl. in ordine crescatoare. int main(){ int i. fout << x << " ".p05").3 Citirea unui numar cunoscut de valori dintr-un fisier La multe probleme.i++){ flux_intrare >> X.p05 8 1 2 3 4 1 2 3 4 iesire. #include <fstream> using namespace std.p05"). avem urmatoarea abordare: flux_intrare >> Nr_valori.Introducere in ANSI C++ Toth Haralambie 11.x. Fisierul "numere. for(i=1.n. foloseste(X).160 - . In acest caz. for(i=1.i<=Nr_valori. ifstream fin("numere. fin >> n.i++){ fin >> x. } } numere.

txt"). atunci o instructiunea flux_intrare >> var.x. returneaza NULL.j<n. iar pe urmatorele n randuri cate n numere intregi care vor forma informatii dintr-o matrice scrisa pe linii.i<n. Afisati pe ecran matricea. Folosindu-ne de aceasta vom avea: while (flux_intrare >> X) foloseste(X). int main(){ int i.j++) cout << a[i][j] << " ".j. Fisierul "matrice. } } matrice. f >> n.i++) for(j=0. cout << endl.n.161 - . #include <fstream> #include <iostream> using namespace std.4 Citirea pana la sfarsitul fisierului Daca fluxul a ajuns la sfarsit sau daca a avut loc o eroare la citirea unei valori din flux. for(i=0. pe primul rand un numar intreg n.a[10][10]. ifstream f("matrice.txt 3 1 2 3 4 5 6 7 8 9 ecran 1 2 3 4 5 6 7 8 9 11.i++){ for(j=0.txt" contine. for(i=0.j++) f >> a[i][j].j<n. .Introducere in ANSI C++ P6.i<n.

f. ofstream g("copie. int main(){ ifstream f.250).getline(linie.linie[250]. Scrieti in fisierul "frecv. while(!f.162 - .txt").Introducere in ANSI C++ O alta varianta implica testarea sfarsitului de fisier folosint functia: flux_intrare. cout << "Dati numele fisierului:".eof() Aceasta functie va returna true daca s-a ajuns la sfarsitul fluxului si false in caz contrar.p08" caracterele care apar in fiserul de intrare si de cate ori apar ele. char FileName[20]. cin >> FileName. } P7.open(FileName). Se citeste numele unui fisier text de la tastatura. #include <fstream> #include <iostream> using namespace std.txt". Fie fisierul "intrare.eof()){ f. g << linie << endl. Vom avea: while (!flux_intrare. . } } P8.eof()){ flux_intrare >> X. Realizati o copie a acestuia in fiserul "copie. foloseste(X).p08".

163 - . ofstream g("frecv.i++) ct[i]=0.i++) ct[S[i]]++.p08"). for(i=0.100).i<256. while(!f.i.getline(S. int ct[256]. char S[100]. for(i=0. int main(){ ifstream f("intrare.Introducere in ANSI C++ #include <fstream> using namespace std.p08 abc abc abc dede ffffffffff frecv.i<256.p08   2 a 3 b 3 c 3 d 2 e 2 f 10 .i++) if (ct[i]) g << char(i) << " " << ct[i] << endl. } intrare.S[i].p08").eof()){ f. } for(i=0.

Contorizati literele mici care apar in text. in ordine crescatoare dupa frecvente. Pp6.5 Probleme propuse Pp1. Inversati liniile unui fisier text al carui nume este citit de la tastatura. Numarati cuvintele dintr-un fiser text.164 - . Pp2. .’ si ‘. Un fisier contine nu text in limba engleza. Cititi o matrice dintr-un fisier.Introducere in ANSI C++ 11.’. Pp3. apoi afisati literele mici din ext. ‘. Pp4. Separatorii dintre cuvinte sunt Enter. scriind rezultatul in alt fisier. Scrieti inversa matricii in alt fisier. Pp5. Scrieti numerele pare intr-un fiser si cele impare in altul. Un fisier contine numere intregi. Verificati daca n fisiere citite de la tastatura sunt identice ca si continut.

pointerul indicand o zona de memorie oarecare. tip definit de utilizator.. &variabila = "adresa la vare este memorata variabila" In cazul in care avem o constructie de forma &variabila.1 Declaratie si operatii elementare La declararea unei variabile. Acest tip de pointer se numeste pointer liber. daca este o instructiune (nu o declaratie) Pentru a putea lucra direct cu adresele de memorie declaram pointeri: tip *pointer1. daca apare in context de declaratie de variabila adresa unei variabile. . etc. unde tip este un tip de data oarecare (int. daca apare in context de declaratie valoarea care se gaseste la adresa indicata de un pointer. Determinarea adresei la care se gaseste o variabila se face folosind operatorul &.165 - . float. se foloseste operatorul de redirectare *... Un pointer este o variabila care contine o adresa de memorie. in context de instructiune Prin simpla declaratie a unui pointer. . valoarea acestuia nu este initializata. 12. pointern.). *pointer2. Pentru a utiliza valoarea care este memorata intr-o locatie indicata de un pointer.Introducere in ANSI C++ Capitolul 12 – Pointeri Accesul la o locatie de memorie folosita de program este realizata printr-o adresa unica. acesteia i se asociaza o locatie de memorie. iar folosirea acestuia inainte de initializare poate avea rezultate dezastruoase (nu poate folosi nimanui modificarea unei zone oarecare de memorie!). acesta poate insemna: – – o referinta. Semnul * poate sa insemne: – – declaratie de pointer.

++(*q)..// afisarea unui pointer liber!!! p=&a.b=2. // copie_a este un alias al lui a int *p. q=&b.. int *q=&var.   P1. .*q. cout << &p << " " << &q << endl. *p=*p+10. int main(){ int a=1. echivalent: Observam ca pointerii liberi vor aparea ca pointeri valizi! Exista posibilitatea de a initializa un pointer la declarare. Operatii elementare cu pointeri #include <iostream> using namespace std. } 0x8048906 0xbff9eefc 0xbff9eef8 0xbff9ef04 0xbff9ef04   0xbff9ef00 0xbff9ef00 11 11   3 3 La rulari succesive adresele afisate pot sa difere.Introducere in ANSI C++ In cazul in care dorim sa specificam ca un pointer nu indica o adresa valida vom folosi constanta NULL.. // declararea variabilelor intregi a si b int &copie_a = a. // declararea pointerilor la intregi p si q cout << p << endl.. if (p) . sau.166 - . // initializarea pointerului nul Conditia de testarea daca un pointer este valid va fi: if (p!=NULL) . cu NULL sau cu adresa unei variabile anterior declarate: int *p=NULL. p=NULL. cout << &a << " " << p << " " << &b << " " << q<< endl. cout << a << " " << *p << " " << b << " " << *q. // p contine adresa lui a // a=a+10 // q contine adresa lui b // ++b.

b . 3 copie_a a 11 . q p Figura 12. Figura 12...1 Observam ca p indica o adresa oarecare din memorie. Dupa declaratii: q ? 0xbff9eef8 p 0x8048906 0xbff9eefc b 2 0xbff9ef00 copie_a a 1 0xbff9ef04 . pentru a creste claritatea. Dupa atribuiri: q .3..). 0xbff9ef00 0xbff9eef8 p 0xbff9ef04 0xbff9eefc b 3 0xbff9ef00 copie_a a 11 0xbff9ef04 . . contin valori etc.3 Incercarea de a asocia pointeri de un anumit tip cu adresele unor variabile de tipuri diferite va duce la erori de compilare... pointerii p si q vor avea valori valide. in urmatoarele figuri in care vor mai aparea pointeri.. a si copie_a sunt de fapt una si aceeasi variabila. variabilele a si b sunt initializate.Introducere in ANSI C++ Starea memoriei in cazul problemei P1 poate fi urmatoarea: 1. acestia vor fi desenati ca in Figura 12.2 In acest moment. modificarea locatiilor de memorie indicate ducand la modificarea valorii variabilelor a si b. Figura 12.. Desi pointerii se comporta similar unor variabile obisnuite (au o adresa asociata in memorie..167 - . 2.... ..

ultimelPointeri void si utilizarea lore doua atribuiri vor da urmatoarele erori: p02. P3.168 - .*p.cpp:14: error: cannot convert ‘int*’ to ‘double*’ in assignment O categorie aparte de pointeri sunt pointerii void: void *pointer. ofera o flexibilitate crescuta aplicatiilor noastre. acest tip de pointer pare sa aiba un grad de utilizare redus. Cu toate acestea. int main(){ int a. La prima vedere. in combinatie cu operatorul de conversie explicita de tip (cast). // aceste atribuiri nu sunt valide // intreg si pointer la int // intreg si pointer la double In cazul in care vom scoate comentariile. q=&b. double b. p=&a.*q. fiind obligatoriei folosirea operatorului cast pentru a specifica tipul indicat in acel moment de pointerul void.cpp: In function ‘int main()’: p02.cpp:13: error: cannot convert ‘double*’ to ‘int*’ in assignment p02. Tipul indicat de un pointer #include <iostream> using namespace std.Introducere in ANSI C++ P2. ceea ce va duce la urmatoarea problema: dereferentierea nu va putea fi facuta direct. Pointerii void si modul lor de utilizare . Acest tip de pointer va putea indica zone de memorie de dimensiune variabila (dimensiune data in cazul altor pointeri de tipul de data indicat). q=&a. // // } p=&b.

34. efectul fiind incrementarea intregului indicat de pointerul p: (*(int *)p)++ O situatie aparte o reprezinta pointerii la pointeri. deci ca prim pas trebuie sa specificam tipul spre care pointeaza. p=&i.169 - . (*(double *)p) = (*(double *)p)*3. in cazul nostru int: (int *)p Pentru a accesa zona de memorie vom dereferentia pointerul de mai sus: *(int *)p sau *((int *)p) La sfarsit. (*(int *)p)++. p=&d. double d=12. void *p. aplicam operatorul de incrementare. p=&c.02 b Vom explica mai departe urmatoarea expresie: (*(int *)p)++. cout << i << " " << d << " " << c << endl. char c='a'. Pointerul p este de tip void.Introducere in ANSI C++ #include <iostream> using namespace std. . cout << i << " " << d << " " << c. } 1 12. urmatoarea aplicatiei ilustrand un astefel de caz.34 a 2 37. int main(){ int i=1. (*(char *)p) = 'b' .

} 123 123 // pointer la int // pointer la pinter la int // pointer la pointer la pointer la int :) Situatia din problema anterioara este descrisa in Figura 12. 12.2 Aritmetica pointerilor In subcapitolul anterior am folosit operatori de referentiere/dereferentiere pentru a lucra cu pointeri. = pn va face ca pointerii p1. int main(){ int i=123.. t q p i 123 Figura 12. q=&p.. In C++ exista o serie de alte operatii specifice lucrului cu variabile de tip pointer.Introducere in ANSI C++ P4.. p=&i. int *p.. int ***t. .2. . . t=&q. O Expresie de forma: p1 = p2 = .4 12.1 Atribuirea Operatorul = se comporta analog atribuirii dintre doua variabile oarecare.4. pn sa indice toti locatia de memorie indicata initial de pn.170 - . Pointeri la pointeri. #include <iostream> using namespace std. cout << i << " " <<***t. p2. int **q.

p1=p2=p3. <=. cout << *p3 << " " << *((int *)pv). double *p4. pv=p1. void *pv.*p2. iar ultimii verifica daca un pointer indica o locatie de memorie mai mica sau mai mare fata de alt pointer. !=... < .Introducere in ANSI C++ 123 ? ? p1 p2 . Afisati locatia cea mai mica si locatia cea mai mare de memorie alocate in . >= pot fi folositi cu operanzi pointeri.2 Operatorii relationali Operatorii ==. Atribuirea pointerilor #include <iostream> using namespace std. P5. p4=p1. indiferent de tipul lor de baza.5 Pointerii care apar in expresia de atribuire trebuie sa fie de acelasi tip. P6..*p3. Primii doi operatori verifica daca doi pointeri indica sau nu aceeasi locatie de memorie. int main(){ int i=123. // // atribuire corecta // eroare la compilare (pointerii nu au acelasi tip) cout << i << " " << *p1 << " " << *p2 << " ". acestia putand retine valoarea oricaror pointeri.5). In general expresii relationale apar intre pointeri care indica acelasi obiect in memorie (vezi 12. >. int *p1. } 123 123 123 123 123 12. pn p1 p2 123 .171 - .. pn Figura 12.2. O situatie aparte apare in cazul in care utilizam pointeri void. p3=&i.

cout << pmic << " " << pmare. pmic=pmare=&a. de tipuri diferite // comparatie dintre doi pointer if (pmare>=q) pmare=q. p=&q. comparatie dintre pointeri de acelasi tip p=&p. pmare=(p>pmare)?p:pmare. pmic=(p<pmic)?p:pmic. pmare=(&pmic>pmare)?&pmic:pmare.172 - – .Introducere in ANSI C++ program. #include <iostream> using namespace std. p indica p !!! // // pmic=(&pmic<pmic)?p:pmic. pointer si un intreg (eroare) } 0xbff6f618 0xbff6f614 0xbff6f610 0xbff6f60c 0xbff6f608 0xbff6f604 0xbff6f604 0xbff6f614 // comparatie dintre un Observatii: – in program am alocat variabile de 4 tipuri diferite. pmic=(p<pmic)?p:pmic. adresa cea mai mica este data de pointerul in care retinem adresa cea mai mare :) . // comparatie dintre un pointer si o referentiere p=&pmare. int *q. *pmic. cout << &p << " "<< &pmic << " "<< &pmare << endl. deci e obligatorie folosirea pointerilor void pointerii sunt alocati in memorie ca orice alta variabila. int main(){ double a. pmare=(p>pmare)?p:pmare. int b. // if (p>0x10000). *pmare. cout << &a << " "<< &b << " "<< &q << " ". void *p. pmic=(p<pmic)?p:pmic. q=&b. pmare=(p>pmare)?p:pmare. if (pmic<q) pmic=q.

Acest tip de operatii nu vor putea avea ca operanzi pointeri void. Este permisa folosirea formelor scurte de atribuire += si ­=. // p indica urmatoarea locatie de memorie de tipul dat p­­. --p. Adunarea si scaderea dintre un pointer si un intreg #include <iostream> using namespace std. q-=10.3 Scaderea si adunarea cu un intreg Operatiile de scadere si de adunare dintre un pointer vor "deplasa" pointerul in memorie inapoi sau inainte fata de pozitia initiala. in functie de tipul de baza al pointerului. int *p=&a. p++. P7.b. cout << p << " " << q << endl. } 0xbfcb90ac 0xbfcb90a8 0xbfcb90b0 0xbfcb90d0 0xbfcb90ac 0xbfcb90a8 .173 - . q=q+10. cout << p << " " << q << endl. tip *p.*q=&b. int main(){ int a. // q indica la stanga lui p cu i pozitii  Practic. // p "sare" spre dreapta in memorie cu i pozitii  q = p ­ i. valoarea efectiva cu care se modifica pointerul la aceste operatii este un multiplu de sizeof(tip).2.  // p indica locatia de memorie anterioara de tipul dat p = p + i. p++ . cout << p << " " << q << endl.Introducere in ANSI C++ – putem compara direct un pointer si adresa unei variabile oarecare 12.

in ambele cazuri cunoscandu-se exact cantitatea de memorie necesara. new tip . 12.174 - .Introducere in ANSI C++ Pentru exemple utile vezi 12. In situatiile in care cantitatea de memorie necesara alocarii datelor cu care lucram nu este cunoscuta decat in timpul rularii se folosesc functii de alocare/dealocare dinamica a memoriei. C++ ofera operatorii new si delete pentru a aloca dinamic memoria.5.4 Diferenta a doi pointeri Daca p si q sunt doi pointeri cu acelasi tip de baza (diferit de void) operatia: p­q returneaza un intreg si va da numarul de obiecte de tipul indicat de p si q care se gasesc intre cei doi pointeri (vezi 12.aloca o zona de memorie de dimensiune sizeof(tip) si returneaza un pointer la zona alocata. respectiv NULL daca nu s-a putut realiza alocarea dealoca o zona de memorie indicata de un pointer. Variabilele globale sunt alocate in momentul compilarii si cele locale sunt alocate pe stiva la rulare. toate programele noastre au folosit variabile alocate static. alocarea dinamica trebuie facuta intr-o constructie de forma: if (p=new tip){ foloseste p delete p. de dimensiunea tipului de baza a pointerului p delete p  - In general. } else  trateaza eroarea la alocare .5 pentru exemple).2. 12.3 Alocarea dinamica a memoriei Pana in acest moment.

*q.Introducere in ANSI C++ P8.4 Pointeri la structuri O situatie relativ speciala este cazul in care tipul de baza al unui pointer este o structura. In acest caz este introdus operatorul ­>. delete q. } else cout << "Eroare la alocare!". Folosirea pointerilor la structuri.dealoca zona de memorie alocata anterior delete [] p  12. respectiv NULL daca nu s-a putut realiza alocarea . if ((p= new int) && (q= new int)){ cin >> *p >> *q.175 - . delete p. } 2 3 2+3=5 Pentru a aloca/dealoca mai multe obiecte de acelasi tip. cout << *p << "+" << *q << "=" << *p+*q.membru p­>membru P9. int main(){ int *p. urmatoarele doua notatii fiind echivalente pentru p un pointer la o structura: (*p). Alocarea dinamica a memoriei #include <iostream> using namespace std.5 pentru exemple): p = new tip[nr] - aloca o zona de memorie de dimensiune sizeof(tip)*nr si returneaza un pointer la zona alocata. . se pot folosi urmatoarele forme ale operatorilor new si delete (vezi 12.

Introducere in ANSI C++ #include <iostream> using namespace std.6 A fiind un pointer. Deci.7: . z. Faptul ca A este un pointer constant implica faptul ca acesta nu va putea fi modificat in program. in cazul declaratiei: int A[10].5 Legatura dintre pointeri si tablouri 12. cout << p->im << "*i". z. A este un pointer la primul intreg din vector.6 ilustreaza o situatie posibila in memorie in cazul declaratiei anterioare.im. struct complex{ float re. Figura 12.*p.re << char((p->im<0)?' ':'+').1 Accesul la elementele unui tablou folosind pointeri In C si in C++ numele unui tablou este un pointer constant la primul element al tabloului. }.im=-1. ca in Figura 12... } z= 2 ­1*i 12. ? Figura 12. int main(){ complex z. *A va reprezenta valoarea primului element.5. cout << "z= " << (*p). notatiile A[0] si *A fiind echivalente. p=&z. Folosind aritmetica pointerilor si faptul ca A este pointer la primul element.re=2. accesul la elementele tabloului va putea fi realizat intr-o varietate de forme.176 - . ? A ? ? ? 10 intregi ? .

? Figura 12. } A:11 12 13 14 15 16  Parcurgerea unui tablou A.p­A<n. Diferite modalitati de acces la elementele unui tablou #include <iostream> using namespace std. .177 - .Introducere in ANSI C++ ? *A ? A[1] ? *(A+2) ? 10 intregi ? *(3+A) 4[A] . O alta variantaimplica pozitionarea unui pointer pe pozitia imediat urmatoare ultimului element din tablou si folosirea acestui pointer la verificarea sfarsitului de vector: sf=A+n.13. cout << 4[A] << " " << *p << " ".p++) foloseste(*p). Impementati functiile de initializare random.15.7 P10. P11.16}. se poate face fara a folosi notatia indexata folosind urmatoarea schema generala: for(p=A. cout << *(A+2) << " " << *(3+A) << " "..p<sf. p=A+5.12. int *p.14. de citire si de afisare a vectorilor fara a folosi notatia indexata. int main(){ int A[10]={11. de lungime n. cout << "A:" << *A << " " << A[1] << " ".. // sau sf=&A[n]. for(p=A.p++) foloseste(*p).

m). int &). void afiseaza(int []. afiseaza(A. } void citeste(int A[]. cout << endl. afiseaza(B. void init(int []. } void init(int A[]. citeste(B. int).i<n.p<sf.n). int n){ int i. for(i=0. int B[10].n).m. int n){ int *p. int &n){ int *p. n=5.178 - .i++) cout << *(A+i) << " ".p++) cin >> *p. for(p=A. *sf.p++) *p=rand()%10. init(A. int). for(p=A. sf=A+n.p-A<n. void citeste(int []. int main(){ int A[10]. } n=3 10 20 30 3 6 7 5 3 10 20 30 .m). cin >> n. } void afiseaza(int A[].Introducere in ANSI C++ #include <iostream> using namespace std. cout << "n=".n.

Introducere in ANSI C++ 12. Accesul la elementele vectorului poate fi facut indexat sau folosind pointeri.5. . delete []A.179 - .n). foloseste(A. Mutati valorile de 0 la inceput si cele de 1 la sfarsitul vectorului. Fie un vector alocati dinamic si initializat cu valorile 0 si 1. A fiind un pointer la tip: cin >> n. folosim urmatoarea schema generala. A= new tip[n].2 Alocarea dinamica a tablourilor Pnetru a aloca un vector abia dupa ce cunoastem numarul exact de elemente. P12.

*dr=1. cin >> n. A=new int[n].180 - . void rezolva(int [].i<n. *dr. delete []A. int &n){ int *st. afiseaza(A. int). cout << "n=". int n){ int i.} } } void afiseaza(int A[].n). } void init(int A[]. init(A. } void rezolva(int A[].n). int n){ int i. } n=10 1 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1 .i++) cout << A[i] << " ".i++) A[i]=rand()%2. dr=A+n-1. if (st<dr){*st=0.n. while(st<dr){ while ((st<dr)&&(*st==0)) st++. cout << endl. while ((st<dr)&&(*dr==1)) dr--. rezolva(A. for(i=0. int). st=A. int &). void afiseaza(int []. for(i=0.n).i<n.n).Introducere in ANSI C++ #include <iostream> using namespace std. int main(){ int *A. void init(int []. afiseaza(A.

Introducere in ANSI C++ 12.. unde N este o constanta de tip intreg.. . In acest caz.8 P13. Vector[0]. A[9][9] Figura 12. A[0] va fi un pointer la primul element al vectorului ce reprezinta prima linie a matricii.. A[9] A[9][0] A[9][1] A[9][2] . .. A[0][1] A[1][1] . Analog. A[0] A[1] A[0][0] A[1][0] ... A[i] este un pointer spre linia i a matricii....3 Vectori de pointeri Declararea unui vector de pointeri se face similar declaratiei unui vector de un tip oarecare: tip *Vector[N]....5. Pe exemplul dat. Fie o matrice patratica de intregi initializata random.. A[0][2] A[1][2] . Sortati crescator fiecare linie a matricii... A[0][9] A[1][9] . Fie urmatoarea declaratie de matrice: int A[10][10]. Vector[1].181 - .. Vector[n­1] vor fi pointeri spre tip. ..

} } int sort(int A[].j. afis(A. int &n){ int i.j<n.n).j++) cout << A[i][j] << " ". A[i]=A[j]. int). } int init(int A[10][10]. int &).j<n. for(i=0. int afis(int [][10].Introducere in ANSI C++ #include <iostream> using namespace std. for(j=0.i++) for(j=0.i<n. } } 3 6 7 5 3 5 6 2 9 1 2 7 0 9 3 6 3 5 6 7 2 3 5 6 1 2 7 9 0 3 6 9 .i++){ cout << endl.i++) for(j=i+1.182 - .j<n. A[j]=t.i. int sort(int []. int main(){ int A[10][10].t. afis(A.j.j. init(A.j++) A[i][j]=rand()%10.i<n. for(i=0.i<n-1. int n){ int i.j++) if (A[i]>A[j]){ t=A[i].i++) sort(A[i]. for(i=0. int).i<n. } int afis(int A[][10].n).n). int init(int [10][10]. int n){ int i.n). cout << endl. for(i=0. n=4.n.

} luni marti miercuri joi vineri sambata duminica duminica joi luni marti miercuri sambata vineri . char t[10]. } void sort(char Zi[7][10]){ int i. Zi[j]). afis(Zi). #include <iostream> #include <string> using namespace std. strcpy(t.s2). Afisati zilele in ordine lexicografica. } void inter(char *s1. void inter(char *.i++) for(j=i+1.j. cout << endl.183 - . "vineri". "duminica"}. void sort(char [7][10]). Fie o matrice de caractere initializata cu zilele saptamanii. "joi".Zi[j])>0) inter(Zi[i]. int main(){ char Zi[7][10]={"luni". void afis(char [7][10]).s1).i++) cout << Zi[i] << " ". } void afis(char Zi[7][10]){ for(int i=0. "sambata". for(i=0. afis(Zi).i<6. sort(Zi).j++) if (strcmp(Zi[i].j<7.t).Introducere in ANSI C++ Un caz in care folosirea vectorilor de pointeri se dovedeste utila este cazul in care lucram cu matrici de caractere. "marti". char *s2){ char t[10]. char *). P14. strcpy(s1. "miercuri".i<7. strcpy(s2.

mai putin situatia in care tip este void. Functie care realizeaza interschimarea a doua variabile de tip intreg. 12... parametrul efectiv corespunzator parametrului formal pointer trebuie sa fie un pointer care acelasi tip de baza. Acesta ultima facilitate va permite apelul functiei folosind pointerul si ofera posibilitatea de a transmite parametri de tip functie. tip &p. ... tip*.){ foloseste(p).  Parametrul pointer se comporta ca orice alt tip de parametru. de a returna pointeri din functie si de a defini un pointer la o functie.). } si tip_returnat nume_functie(.. tip *p.. ...184 - . La apel.. } In cazul in care se doreste modificare pointerului (nu a valorii indicate de catre acesta) se va folosi o referinta la pointer: tip_returnat nume_functie(. tip*&..). in cazul in care dorim modificarea unor parametri in cadrul unei functii va conduce la un rezultat similar.6... P15.. ... Urmatoarele doua definitii de functii sunt echivalente: tip_returnat nume_functie(.){ foloseste(*p). folosind parametri pointeri. dar in general utilizarea pointerului in cadrul functiei se va face in varianta dereferentiata.1 Functii cu parametri pointeri Prototipul unei functii care are ca parametri pointeri este de forma: tip_returnat nume_functie(.. . Folosirea pointerilor sau a referintelor.. .6 Legatura dintre pointeri si functii In C/C++ avem posibilitatea de a transmite parametri de tip pointer unei functii...Introducere in ANSI C++ 12.. El va fi alocat pe stiva (e variabila locala).

Functie care interschimba doi pointeri la int. *a=*b. int *). cout << *p << " " << *q << endl. *q=&y. t=*a. inter(&x. inter(p. #include <iostream> using namespace std.y=2. int *p=&x. } 1 2 2 1 Observam ca apelul trebuie facut cu adresele variabilelor de interschimbat! P16. a=b. int *&).185 - .Introducere in ANSI C++ #include <iostream> using namespace std. int *&b){ int *t. int main(){ int x=1. t=a. b=t.&y).q). cout << x << " " << y << endl. int *b){ int t. void inter(int *. *b=t. void inter(int *&. int main(){ int x=1. } 1 2 2 1 Daca nu am fi folosit referinte la pointeri interschimarea ar fi avut loc doar in . } void inter(int *a. } void inter(int *&a.y=2. cout << *p << " " << *q << endl. cout << x << " " << y << endl.

cout << *p << " " << *q << endl. in 9. t=*a. int *p=&x. cout << *p << " " << *q << endl. *q=&y. int main(){ int x=1. P17. } void inter(int **a. int **b){ int *t. Urmatoarea varianta este echivalenta. Functie care interschimba doi pointeri la int (varianta 2). primind ca parametri doi vectori alocati static si lungimile acestora.186 - . int **). . deci tranmiterea acestui nume este un caz particular e tranmitere de parametru pointer. Am stabilit ca numele unui vector este un pointer la primul sau element. P18. void inter(int **.&q). Realizati o functie care. *a=*b.y=2. #include <iostream> using namespace std.10. inter(&p. } 1 2 2 1 Un caz de transmitere de pointer a fost discutat anterior. *b=t. realizeaza interschimbarea lor (ca si continut).Introducere in ANSI C++ cadrul functiei.

int *).4}. simpla interschimbare a pointerilor reprezentand numele vectorilor este imposibila. afis(A. cout << "B:".B. int [].B.*m. int &.Introducere in ANSI C++ #include <iostream> using namespace std. void afis(int []. primind ca parametri doi vectori alocati dinamic si lungimile acestora.n).n. cout << endl. int ). acestia fiind pointeri constanti. cout << "A:".*m). int m){ n=m. . int B[].n).T. int &n. for(int i=0.187 - . int B[]. int &. Realizati o functie care.m=3. } void afis(int A[].3.m).l). afis(A. copiaza(B. int *m){ int T[100].&m).A. int [].l. afis(B.i++) cout << A[i] << " ". } void inter(int A[].20.i<n.30}. int n){ for(int i=0. P19.m).l. int). inter(A.n. } void copiaza(int A[].n). realizeaza interschimbarea lor (ca si continut).n=4. copiaza(T. cout << "B:". B[10]={10. int &n. copiaza(A.i<n. void copiaza(int []. } A:1 2 3 4 B:10 20 30 A:10 20 30 B:1 2 3 4 In problema anterioara. cout << "A:". afis(B.2. int main(){ int A[10]={1. void inter(int [].i++) A[i]=B[i].

Introducere in ANSI C++ #include <iostream> using namespace std. int *&B. afis(B.n).m). simpla interschimbare a pointerilor reprezentand vectorii si a lungimii acestora fiind suficienta. for(int i=0. void afis(int [].i++) B[i]=(i+1)*10. void inter(int *&.6. B=T. Din nou este de remarcat folosirea referintelor la pointeri! 12.i<n. for(int i=0. cout << endl. } A:1 2 3 4 B:10 20 30 A:10 20 30 B:1 2 3 4 In acest caz inteschimbarea are loc mult mai simplu. t=n. nefiind necesare mutarea in memorie a elementelor tablourilor. int &.n). inter(A.i<n. cout << "A:".i<m. cout << "B:".m=3.m).i++) cout << A[i] << " ". int *&. n=m. } void inter(int *&A. afis(B. T=A. int &n.188 - . *B=new int[3].2 Functii care returneaza pointeri Prototipul unei functii care returneaza pointeri este de forma urmatoare: tip * nume_functie(lista_parametri). int main(){ int *A=new int[4]. int ). int n){ for(int i=0.m).n=4. afis(A. A=B. m=t. int &). .t. cout << "A:".B.i++) A[i]=i+1.n. } void afis(int A[]. afis(A. cout << "B:". int &m){ int *T.

return T.189 - . } int * creare(int &n){ int *T. A=creare(n). int * creare(int &). Afisati prima linie dintr-o matrice patratica ce contine cel putin o valoare nula (se stie ca matricea contine cel putin un zero). void stergere(int *. } void afis(int A[]. } for(int i=0. } 5 1 2 3 4 5 A:1 2 3 4 5 P21.i++) cout << A[i] << " ". void afis(int []. } void stergere(int *A. P20. cin >> n.Introducere in ANSI C++ O astfel de functie poate fi apelata din orice loc al programului in care are sens sa apara un pointer care nu se va modifica. cout << "A:".n). if (!(T= new int[n])){ cout << "Eroare la alocare!". #include <iostream> using namespace std. int n){ for(int i=0.i<n.i<n. Functii de alocare/dealocare dinamica a vectorilor. stergere(A. int n){ if (A) delete []A. cout << endl.int).i++) cin >> T[i]. int). afis(A. . exit(1).n). int main(){ int *A.n.

190 - . } void afis(int A[].int n){ int i. } 1 2 0 3  In aceasta problema. .2.Introducere in ANSI C++ #include <iostream> using namespace std.int ). void afis(int *. deci o functie va putea primi ca parametru o alta functie! Forma generala a unei declaratii de pointer la functie: tip_returnat (* nume_pointer) (lista_parametri). int n){ for(int i=0.0.3}. for(i=0.3.5}.i<n. In plus. primeste ca parametru un pointer rezultat un urma apelului unei alte functii (prima). Acest pointer va putea fi transmis ca parametru.2.i++) cout << A[i] << " ".1. 12.6. {1.j<n. o functie (afis). acestea facand diferentierea dintre o declaratie de pointer la functie si un prototip de functie care returneaza un pointer.n). {2.2}}. afis(prima(A. int). {0. Parantezele care cuprind * si numele pointerului nu sunt optionale.i<n.3 Pointeri la functii O facilitate foarte puternica oferita de C/C++ este posibilitatea definirii si folosirii pointerilor la functii. int * prima(int [4][4].n). numele unei functii (fara paranteze si parametri) este un pointer.j++) if (A[i][j]==0) return A[i].3.i++) for(j=0.n=4.0. int main(){ int A[4][4]={{1. } int * prima(int A[4][4].4.j.4}.

cout << p(10) << " ". int dublu(int). } double calcul(double x.Introducere in ANSI C++ P22. #include <iostream> using namespace std. cout << p(x). double (* )(double. void afisare(char *. double calcul(double. double (* )(double).0). 2.3). double). afisare("pow". // declaratie pointer la functie p=dublu.sin." << y<< ")=".2.191 - . double (* p)(double). cout << p(10). Apelul unei functii folosind un pointer la functie. int main(){ int (* p)(int). double x. int main(){ afisare("sin".y). } sin(0)=0 . Functie are primeste ca parametru alta functie. void afisare(char *. double y){return x*x+y*y.double).} int triplu(int x){return 3*x. } void afisare(char *text. double (* p)(double.double).} void afisare(char *text. cout << p(x. int triplu(int). calcul.3). #include <iostream> #include <cmath> using namespace std.double). p=triplu.pow. double.} 20 30  P23. double x){ cout << endl << text << "(" << x << ")=". afisare("functia mea". int dublu(int x){return 2*x. double y){ cout << endl << text << "(" << x << ".double).

tan. Tip_pointer_functie p[4]={sin.Introducere in ANSI C++ pow(2. cout << "x sin cos tan abs\n".6.cos. In acest caz. } } x     sin    cos   tan   abs 0      0     1     0     0 10  ­0.65    10 20   0..84  0.41   2.3)=13 P24.abs}. typedef double (* Tip_pointer_functie)(double).192 - .width(6). cout. for(i=0.91  0.i<4. cout << p[i](x). unde lista_parametri contine cel putin un parametru.).x. } cout << endl. Folosirea unui vector de pointeri la functii.x+=10){ cout << x << " ". numarul si tipul parametrilor ai unei functii este cunoscut inainte de apelul efectiv.4    30  12..99  0. int main(){ int i.54 ­0.3)=8 functia mea(2.precision(2).15  ­6. folosim functii cu numar variabil de parametri: tip_returnat nume(lista_parametri.4 Functii cu numar variabil de parametri In anumite situatii. Compilatorul nu poate face nici un fel de verificare asupra parametrilor .2    20 30  ­0.x<=30.. iar cele trei puncte "anunta" compilatorul ca s-ar putea sa mai apara si alti parametri.i++){ cout. #include <iostream> #include <cmath> using namespace std. for(x=0.

. parametri necunoscuti .. ...10 Observam ca parametri necunoscuti se gasesc la adrese imediat urmatoare ultimului parametru cunoscut.9 ilustreaza un posibil caz de apel: Stiva . . situatie memorie este: p1 p2 parametri cunoscuti pn . .Introducere in ANSI C++ nespecificati explicit si accesul la acestia trebuie facut "de mana". in functie de informatii auxiliare oferite in cadrul parametrilor clar specificati (vezi situatia functiei printf din cstdio). daca se poate determina la rulare numarul si tipul parametrilor necunoscuti (prin informatii date de parametri cunoscuti). Figura 12. .193 - . pn p2 p1 parametri necunoscuti parametri cunoscuti Figura 12.. Functie cu numar variabil de parametri care calculaeza o expresie de forma: c1 op1 c2 op2 c3 . unde ci sunt intregi si opi este + sau -... tinem cont de urmatoarele: – – – parametri se aloca pe stiva parametri se aloca in ordine inversa a scrierii lor in lista de parametri stiva creste in memorie de sus in jos Figura 12. opn cn+1... deci...9 Conform observatiilor anterioare. . acestia vor putea fi accesati folosind pointeri. P25.. Pentru a vedea cum anume putem accesa parametri nespecificati.....

). dupa cum se vede la ultimul apel. char **t.. . unde lipseste un parametru in acest caz folosim o valoare oarecare.2. // initializam E si mutam p pe al doiela param.){ int E.. imposibil de detectat de catre compilator } int calcul(char *op.i.*s. return E. nec. } 10 ­15 11403253 Observatii: – – pozitionarea pe primul parametru necunoscut se poate face si mai simplu compilatorul nu poate verifica daca functia a fost corect apelata..p++) // ne "deplasam" in paralel pe //operanzi si pe operatori if (*s=='+') E+=*p. p=(int *) t.1).194 - . cout << calcul("-+-+". int calcul(char *.-5) << endl. p++. t++. // apel incorect..2. // pointer prin care accesam operanzii t=&op. cout << calcul("+".-1. int main(){ cout << calcul("+++".4) << endl.-3.s++. for(s=op.4. else E-=*p. // pozitionam p pe primul parametru necunoscut E=*p.3.*s. int *p. .1.Introducere in ANSI C++ #include <iostream> using namespace std. un interg care este peste varful stivei! – .

} 10 ­3 . . cout << suma(5.Introducere in ANSI C++ Un caz particular de functie cu numar variabil de parametri este cazul in care ultimul parametru cunoscut este un intreg care specifica numarul de parametri necunoscuti care urmeaza.i++) foloseste(p[i]). p=&nr.i++) S+=p[i].195 - ..1..  p[2].p[nr]. for(int i=1. Forma generala pentru de lucru cu astfel de functie este: tip_returnat nume(int nr. int main(){ cout << suma(4. Functie cu numar necunoscut de parametri care realizeaza suma valorilor (primul parametru da numarul de parametri necunoscuti). .2.-1.4) << endl.){ tip *p=&nr.i.).2.){ int S. paramentri nocunoscuti fiind de tip int.-3..4. } int suma(int nr...-5) << endl. } In acest caz... int suma(int. for(i=1. return S. .*p.3. parametri sunt dati practic de elementele vectorului p: p[1].i<=nr..i<=nr. #include <iostream> using namespace std. P26.. S=0. .

196 - . Pp3. Realizati o functie cu numar variabil de parametri care calculeaza cmmdcul parametrilor.7 Probleme propuse Pp1. .Introducere in ANSI C++ 12. Rescrieti functiile de la problemele rezolvate din capitolele cu vectori si cu siruri de caractere folosind pointeri (fara acces indexat). Pp2. Realizati o functie care primeste ca parametri: – – – o functie de forma int f(int) un vector de intregi lungimea vectorului si returneaza valoare minima atinsa de functia f pentru parametri fiind valorile din vector.

permite deschiderea unei text sursa salvat anterior . .save .la prima salvare se deschide fereastra save as.navigarea prin meniuri se face cu cursorii si tasta Enter pentru selectare ..afisarea ferestrei output .help .navigare intre ferestre .rularea programului Tabelul A1 – Shortcut-uri generale F2 F3  alt+F3  F5  alt+F5 F6 F10 ^F9 . Shortcut-uri uzuale folosite in mediul Borland C++ 3.maximizare fereastra curenta .inchide fereastra curenta .197 - .in acest mod putem vizualiza rezultatele afisate pe ecran .open .intrare in meniuri .close .Introducere in ANSI C++ Anexe A1..1 Shortcut F1 ^F1 Efect .va da informatii despre cuvantul pe care se gaseste in acel moment cursorul de editare .help context sensitive .

Introducere in ANSI C++

Shortcut
Shift + Cursori ^Insert

Efect - selectare text - copy - este copiata in clipboard zona selectata - paste - copiere din clipboard la pozitia cursorului - stergerea zonei selectate - undo - se revine cu un pas inapoi in procesul de editare - Atentie: la salvare se sterge istoricul Undo - redo - se merge cu un pas inainte in procesul de editare - este activat doar dupa operatii Undo

Shift + Insert

^Delete Alt+Backspace

Shift+Alt+Backspace

Tabelul A2 - Scurtaturi legate de editor

A2 Erori uzuale si cauze posibile (Borland C++ 3.1)

Eroare
Declaration terminated  incorrectly Declaration syntax error Statement missing ;

Cauza posibila ';' dupa main(), inainte de '{' lipseste ';' dupa o declaratie lipseste ';' cu un rand mai sus

- 198 -

Introducere in ANSI C++ Eroare
Undefined symbol _main in  module c0.ASM

Cauza posibila s-a gresit numele functiei main (de exemplu s-a scris mein) s-a uitat #include <iostream.h> schimbati '<<' cu '>>' sau invers lipseste o directiva #include sau am gresit numele functiei (de exemplu crlscr in loc de clrscr) trebuie declarata variabila intr-o conditie s-a pus = in loc de ==  (este de fapt un warning, dar in 99% din cazuri programul nu va functiona corect)

Undefines symbol 'cout' Illegal structure operation Function 'cutarescu' should  have a prototype

Undefined symbol 'a' Possibly incorrect assignment 

A3 Indentarea programelor C++
Cand scrii cod, nu conteaza cat de scurt si de simplu ti se pare, scrie-l intr-o maniera care il face usor de citit. Foloseste un standard al indentarii pentru codul tau si nu te abate de la el de-a lungul intregului program.

A3.1. Regulile de baza ale indentarii
De fiecare data indenteaza corpul unei instructiuni cu o distanta constanta fata de primul caracter al instructiunii (prin corp al unei instructiuni intelegem setul de actiuni pe care le controleaza acea instructiune). Instructiunile care au corp includ buclele, instructiunile conditionale si subprogramele. De exemplu, fie urmatoarea instructiune if-else: - 199 -

Introducere in ANSI C++
if  (a==0) { z_aparitii++; printf(“Zero a aparut de %d ori\n”,z_aparitii); } else { nz_aparitii++; printf(“valori diferite de zero sunt %d\n”,z_aparitii); }

Motivul pentru care folosim indentarea devine evident daca studiem alternativa urmatoare:
if  (a==0) { z_aparitii++; printf(“Zero a aparut de %d ori\n”,z_aparitii); } else { nz_aparitii++; printf(“valori diferite de zero sunt %d\n”,z_aparitii); }

Chiar daca vom intelege pana urma ce face sursa data, timpul necesar va fi sensibil mai mare fata de primul caz. Care este numarul de spatii cu care ar trebui sa indentati corpul unei instructiuni? In principiu, o indentare eficienta respecta regulile urmatoare: cel putin 2 spatii (1 spatiu nu va faca o diferenta notabila) nu mai mult de 8 spatii (altfel ramaneti fara spatiu pentru instructiuni) aplicand aceeasi indentare in toata sursa

Sugerez folosirea TAB-ului (setat, daca permite editorul, pe 4 spatii), fiind mai usor de folosit. In cazul functiilor definite de utilizator, respectiv functia main, aplicati regulile de mai sus. De exemplu:
int main(){ int a,b; // declaratii de variabile float r; printf(“Dati numitorul:”);

- 200 -

Introducere in ANSI C++
scanf(“%d”,&b); . . . }

Celelalte subprograme vor fi aliniate la functia main. In cazul in care numarul de parametri este mare, este posibil ca antetul functiei sa nu incapa pe in rand. In acest caz, indentarea parametrilor se va face in asa fel incat numele si tipul returnat de functie sa fie usor de cazut. Deci,
int o_functie_oarecare(int indice_de_plecare, int contor_folositor,      arbore *radacina,informatie_utila Info[]);

sau:
int o_functie_oarecare( int indice_de_plecare,  int contor_folositor,          arbore *radacina, informatie_utila Info[]);

dar nu:

int o_functie_oarecare(int indice_de_plecare, int contor_folositor,  arbore *radacina,informatie_utila Info[]);

A3.2 Stiluri de indentare ale blocurilor
Printre multitudinea de variante, s-au remarcat doua: A3.2.1 Aliniaza “{“ cu “}” Prin alinierea acoladelor, cititorul nu va avea dubii in legatura cu blocul din care face parte o anumita instructiune. De exemplu:
if  (a==0) { z_aparitii++; printf(“Zero a aparut de %d ori\n”,z_aparitii); } else  {

- 201 -

Deci “}” marcheaza. printf(“valori diferite de zero sunt %d\n”.z_aparitii). if-else si switch A3.3.202 - . printf(“Zero a aparut de %d ori\n”. } A3. este acceptabila amplasarea ei pe aceeasi linie cu if-ul. } Un dezavantaj minor al acestei abordari este acela ca numarul de linii ocupat este mare. nu este necesara prezenta acoladelor.3 Instructiuni de selectie: if. iar aceasta metoda “pierde” linii. sau: if (numar < 0)  . Exemplu: if  (a==0)  { z_aparitii++. Oricare dintre urmatoarele varianta poate fi considerata o optiune buna: if (numar < 0) numar = 0.Introducere in ANSI C++ nz_aparitii++. Programatorilor le place sa vada cat mai mult cod pe ecran la un moment dat. devine logica alinierea acoladei inchise la instructiunea a carei corp o inchide.z_aparitii).z_aparitii).1 if cu corp simplu Daca nu avem decat o singura instructiune de executat. Acolada deschisa va fi amplasata la sfarsitul primei linii a instructiunii. printf(“valori diferite de zero sunt %d\n”. A3. blocurile au rolul de a grupa instructiuni ce formeaza corpul unei instructiuni. }  else { nz_aparitii++. atat sfarsitul blocului cat si sfarsitul corpului instructiunii. Folosind aceasta observatie.2.2 Aliniaza “}” cu instructiunea ce controleaza blocul In programare. Daca instructiunea este indeajuns de scurta.

sau: if (numar < 0) { numar = 0. A3. } A3.2). Repet. apoi folositi-o de fiecare data. alegeti o varianta care vi se potriveste.3. chiar daca nu este neaparat necesara. else  printf(“Sunt negativ sau zero!”). } Pentru ultima varianta. folosirea acoladelor nu este necesara.2 if cu corp compus if (contor > 0) { printf(“Numar pozitiv la orizont!”). sau: if (numar > 0) { printf(“Sunt pozitiv!”). } A3. A3. O varianta posibila ar fi cea data in sectiunea (2. acesta este unul din cazurile in care isi dovedeste utilitatea. in acest caz acoladele sunt necesare. Aveti de ales intre: . poate duce la cresterea lizibilitatii sursei.3. } else { printf(“Sunt negativ sau zero!”).3. folosirea acoladelor.4 if-else cu corp compus Evident.3. dar nici nu deranjeaza. if (numar > 0) printf(“Sunt pozitiv!”). contor­­.3 if-else cu corp simplu Exact ca in cazul if-ului simplu.203 - .Introducere in ANSI C++ numar = 0.5 if-else in combinatia corp simplu si corp compus Daca ati ales varianta in care folositi acoladele chiar si pentru corpuri simple.

} else { printf(“Totul e OK”). break.204 - . numitor = ­ numitor. Cele doua variante consacrate ar fi: switch (litera) { case ‘ ‘:  printf(“Spatiu \n”). } A3. } else printf(“Totul e OK”). break. } respectiv: switch (litera) { case ‘ ‘: printf(“Spatiu \n”). break. break. . default: printf(“Nimic interesant.3.Introducere in ANSI C++ if (numitor < 0) { printf(“Numitor negativ!”). numitor = ­ numitor. si: if (numitor < 0) { printf(“Numitor negativ!”).”).”). case ‘a’: case ‘e’: case ‘i’: case ‘o’: case ‘u’: printf(“Vocala \n”). default: printf(“Nimic interesant.6 Instructiunea switch Se poate pleca de la premiza ca instructiunea switch are corpuri multiple. case ‘a’: case ‘e’: case ‘i’: case ‘o’: case ‘u’: printf(“Vocala \n”). daca ne gandim ca fiecare case este inceputul unui alt bloc de cod.

while ( (vector[i++]<0) && (i<numar_elemente) ) { /* sunt un bloc vid */.2 while cu corp simplu Observatiile de la sectiunea anterioara raman valabile.1 while fara corp Desi pare ciudat pentru un incepator. avem urmatoarele situatii: . sau: i=0. Urmatoarea secventa de program. Deci.Introducere in ANSI C++ } A3. daca corpul este destul de mic. pozitioneaza indicele din vector pe prima valoare pozitiva: i=0. while ( (vector[i++]<0) && (i<numar_elemente) ) . while ( (vector[i++]<0) && (i<numar_elemente) ) { . } A3. } O alta posibilitate ar fi cea de a insera un comentariu prin care se indica blocul vid: i=0. instructiuni repetitive fara corp (mai ales for) se regasesc in C++ mai des decat ar parea la prima vedere.205 - . se recomanda variantele: i=0.4. while ( (vector[i++]<0) && (i<numar_elemente) )  . for si do-while A3.4 Instructiuni repetitive: while.4. Pentru a nu ignora punct-virgula de la sfarsitul randului (si deci a avea impresia ca instructiunea ce urmeaza while-ului face parte din corpul instructiunii).

4 for in toate variantele Nimic nou sub soare.4. sau: i = ­1.4. while ((i< numar_elemente)&&(a[i]<0)). } A3. while ((i<numar_elemente) && (vector[i] != valoare_cautata)) { i++.Introducere in ANSI C++ i = 0. while ((i< numar_elemente)&&(a[i]<0)).  } while ((i< numar_elemente)&&(a[i]<0)). while ((i<numar_elemente) && (vector[i] != valoare_cautata)) i++. respectati regulile de la while. } A3. do i++. i = 0.206 - . while ( i < Maxim ) { printf(“%d” . . do  i++. i=i*2. while ((i<numar_elemente) && (vector[i] != valoare_cautata))  i++.4. i = 0. i=1.5 do-while fara corp sau cu corp simplu Avem variantele: i = ­1. sau: i = ­1.3 while cu corp compus Nu exista variante altele decat cele discutate in (3). i). A3. do { i++.

 i++) { [2]        scanf("%d".4. Considerand fiecare TAB de la inceput de rand ca fiind nivelul indentarii. A3. Daca numarul de imbricari nu este mare. [2]        else { [3] suma ­= numar. [1]        } [1]        printf("\nSuma este:%d\n”. Un caz special il reprezinta instructiunile if-else imbricate.Introducere in ANSI C++ Este de preferat ultima varianta. [1]        int   suma = 0 . vom putea usor considera o instructiune ca finnd in afara unei bucle. while la inceput de rand putand duce la confuzii. A3. [1]        printf("\nIntroduceti cinci numare intregi pozitive\n"). nu avem nici o problema. [2]        if (numar>0)  [3] suma += numar.207 - . desi ea face parte din corpul ei. In caz contrar ne trezim in situatia de a nu mai avea spatiu in partea dreapta a randului. [0] } Se poate enunta urmatoarea regula: “fiecare corp se indenteaza cu un nivel in plus”.&numar).6 do-while cu corp compus Nimic nou de remarcat. Fara imbricare. i<=5.suma ). putem avea urmatoarea situatie: [0] int main (void) [0] { [1]        int   i. [1]        for (i=1.5 Indentarea instructiunilor imbricate Indentarea este cu atat mai importanta in cazul in care avem instructiuni complexe ce fac parte din alte instructiuni complexe. numar. Urmatorul exemplu da o posibila solutie:  if (nota >= 9) .

* ­>* * / % + ­ << >> . ­> ++ ­­  dynamic_cast static_cast  reinterpret_cast  const_cast typeid ++ ­­ ~ ! sizeof new  delete Descriere scope Grupare Left­to­ right Left­to­ right 2 postfix unary (prefix) indirection and  reference (pointers) unary sign operator type casting pointer­to­member multiplicative additive shift Right­ to­left Left­to­ right Left­to­ right Left­to­ right Left­to­ right Right­ to­left 3 * & + ­ 4 5 6 7 8 (type) . else if (score >= 5) printf(“La limita”). else if (score >= 7) printf(“OK”). else if (nota >= 8) printf(“Bine”). A4 Precedenta operatorilor Nivel 1 Operator :: () [] .208 - .Introducere in ANSI C++ printf(“Foarte Bine”). else if (score >= 6) printf(“Satisfacator”). else printf(“Nasol”).

 default. class. while. operator. using. sizeof. if.  char. bitand. for. not_eq. return.  new. break. typeid. xor. or. false. public. relational equality bitwise AND bitwise XOR bitwise OR logical AND logical OR conditional assignment comma Left­to­ right Left­to­ right Left­to­ right Left­to­ right Left­to­ right Left­to­ right Left­to­ right Right­ to­left Right­ to­left Left­to­ right A5 Cuvintele cheie Lista cu cuvintele cheia ANSI C++ este: and. typename. compl. short. inline.209 - . bool. private. bitor. friend. union. extern. goto.  static_cast.  double. do. try. not. switch. delete. xor_eq  .  volatile. catch. export. case. wchar_t. else. explicit. reinterpret_cast.  float. true. auto. or_eq. asm. const_cast. long. signed. throw. template. virtual. this.  typedef. and_eq. static. const. int. namespace.  register.Introducere in ANSI C++ 9 10 11 12 13 14 15 16 17 18 < > <= >= == != & ^ | && || ?: = *= /= %= += ­= >>= <<=  &= ^= != . unsigned. mutable. protected. struct. void. enum. dynamic_cast. continue.

„Culegere de probleme de informatica”. 2002 [6] Thomas H. 2002 . 2001 [5] Dragos Acostachioaie . editura Donaris.„Introducere in algoritmi”. editura Teora.Rovest . 2002 [4] Bogdan Patrut .„Aplicatii in C si C++”. editura Agora.„Programare C si C++ sub Linux”. Ronald R. 2000 [7] Carmen Popescu . Cormen. Editura Polirom.Introducere in ANSI C++ Bibliografie [1] Kris Jamsa. 2001 [2] Bjarne Stroustrup – „C++”.210 - . 2003 [3] Breazu Macarie – „Programarea Orientata pe Obiecte – Principii”. Lars Klander . editura Teora. editura ULBS. editura Teora.„Totul despre C si C++”. Charles E. Leiserson.

.....1.....3 Instructiunea for........................4 Expresii logice..............................................18 3...............Introducere in ANSI C++ Cuprins Introducere...................................................44 5.............................6 Probleme propuse........................40 4............................................................................................1 Instructiunea while........................................................................33 4.............................44 5.........................................................18 3................33 4..........................2 Hi man!.7 2.............................17 Capitolul 3 – Expresii C++..................2 Conversii de tip.....................................................................................................................................................................1 Notiunea de algoritm.....3........................................................................2 1........................1 Capitolul 1 – Primul program..............................................49 .......................16 2............6 2.............................................3 1..........5 Referinte (alias-uri)...............4 1...........................47 5.........7 Operatori care actioneaza la nivel de bit............................................................................................................................1 Structura generala a unui program C++..........................................5 Capitolul 2 – Notiuni de baza...27 3......................5 Operatorul conditional............3 Expresii aritmetice...............................................................................................................23 3....8 Probleme propuse.........................14 2..................................2 Instructiunea switch.........................3 Probleme propuse.........................2 Folosind compilatorul g++............................................................................3 Compilarea si rularea programului..................................................2 Citirea si afisarea datelor................................................................................................................................................................................................211 - ...........................................................9 2.............................................................................................................................1 Instructiunea if.......4 1.......25 3.......................................1 In mediul Borland C++ 3.......................................................................................................................6 2.............................................................43 Capitolul 5 – Instructiuni repetitive.................20 3.....2 Instructiunea do-while...............................................30 3...........................6 Operatorul virgula.......................1 Atribuirea................32 Capitolul 4 – Instructiuni conditionale........................................2 1...........3..................................................................................31 3................................................3 Tipuri de date................................................................... Variabile si constante.....................4 Secvente escape..........................

......................................................................................................................................5 Citirea mai multor numere de la tastatura...........................75 6............1 Declararea si initializarea............85 6.....69 Capitolul 6 – Vectori (matrici).......................................................3 Campuri de biti....................................4 Maxime si minime.......................................................................................................87 6...............1 Declaratie si initializare..................6..6 Probleme tip..........1 Probleme pe cifrele unui numar....6 Declararea matricilor.............................92 7...53 5.............................58 5..............................................................................................................................6...................117 Capitolul 9 – Functii........................................................107 8..........................................................................4 Tipul enumerat.............111 8........... numarari...................6..................2 Operatii de citire/scriere pe siruri de caractere.......... produse.............................................3 Generari de vectori.............92 7..................................................63 5............................................................................9 Probleme propuse.....212 - ........................................................................70 6.......................................................................7 Citirea si afisarea matricilor...................................................................................................................3 Accesul la caracterele unui sir...................114 8........70 6......6.......56 5......4 break si continue....94 7.................118 9.................91 Capitolul 7 – Siruri de caractere..................4 Functii specifice sirurilor de caractere......................................2 Uniuni..............................................................................................................Introducere in ANSI C++ 5......................2 Citirea si scrierea vectorilor...................3 Sume..............................................2 Probleme de divizibilitate..........................56 5........................................................................................................................5 Sortarea si interclasarea.......................5 instructiunea goto...........................................................107 8.................6.4 Cateva probleme simple......................................................................5 Probleme propuse...................................................................................6 Generarea unor serii complexe de numere .........................85 6.......................................................55 5...........................8 Probleme cu matrici..............97 Capitolul 8 – Structuri si alte tipuri utilizator..................................................................................6......................72 6..........115 8..................................119 ...................................................7 Probleme propuse...........95 7............64 5........................77 6....................66 5........................................................................................................................2 Functii care nu primesc si nu returneaza nimic.........1 Structuri.........................................1 Generalitati.....118 9..............................60 5.......81 6......................

...................................137 9................................................................2 Aritmetica pointerilor............................5 Legatura dintre pointeri si tablouri.4 Pointeri la structuri.............................2 Alocarea dinamica a tablourilor..................141 9..........................................................................................181 12.....................170 12.................144 9......5.....4 Citirea pana la sfarsitul fisierului.....3 Functii care nu returneaza nimic....156 11..........174 12...................................1 Recursivitatea directa..............11 Probleme propuse............133 9.............................5......127 9........................................164 Capitolul 12 – Pointeri...........2..1 Accesul la elementele unui tablou folosind pointeri.................................................213 - ..........2 Recursivitatea indirecta...................156 11.................................7 Variabile locale si globale...............................................................1 Redirectarea intrarii/iesirii.....................149 10...................5..........................176 12...2 Fluxuri de intrare/iesire............................165 12.3 Citirea unui numar cunoscut de valori dintr-un fisier............................................................143 9........................................................................................................................121 9........ dar primesc date de intrare............................................................................................................................................................165 12.9 Functii cu parametri impliciti...............................8 Supradefinirea functiilor...............5 Probleme propuse.............6 Legatura dintre pointeri si functii.....................................171 12...............................................................................................................................................1 Atribuirea...2 Operatorii relationali............160 11...................................................173 12.................................3 Alocarea dinamica a memoriei.......158 11.........................184 ........................................................3 Vectori de pointeri.............................................................10 Parametri vectori...................2............5 Functii care primesc un numar oarecare de parametri de intrare si returneaza o singura valoare...........................................................................................................176 12.1 Declaratie si operatii elementare...............3 Probleme propuse............................................ Durata de viata si domeniu de vizibilitate......149 10.Introducere in ANSI C++ 9........2...................175 12..............................................179 12...........................................................170 12.............................161 11........................................129 9.....................2.........3 Scaderea si adunarea cu un intreg...........................148 Capitolul 10 – Recursivitate............6 Functii ce returneaza mai multe valori................4 Diferenta a doi pointeri.................................155 Capitolul 11 – Fisiere.........154 10...........................4 Functii care nu primesc date de intrare dar returneaza o valoare.......174 12..............................

..2 Stiluri de indentare ale blocurilor...........................................................................205 A3................................... if-else si switch........................6.........................201 A3..............7 Probleme propuse.........210 .......................196 Anexe......................................................207 A4 Precedenta operatorilor...........................................6..................................................................................................2 Functii care returneaza pointeri...........199 A3...................................202 A3.....1)...199 A3........... for si do-while..198 A3 Indentarea programelor C++.....................6................................188 12.............................3 Pointeri la functii.....6.....................................................1... Shortcut-uri uzuale folosite in mediul Borland C++ 3...................................................................4 Functii cu numar variabil de parametri................1...................192 12........................209 Bibliografie..............................................184 12.................................................... Regulile de baza ale indentarii.........208 A5 Cuvintele cheie.........197 A2 Erori uzuale si cauze posibile (Borland C++ 3............................................1 Functii cu parametri pointeri.............................................................................197 A1..4 Instructiuni repetitive: while........5 Indentarea instructiunilor imbricate........Introducere in ANSI C++ 12......3 Instructiuni de selectie: if........................................................................190 12........214 - .........................

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->