Documente Academic
Documente Profesional
Documente Cultură
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:
-1-
Introducere in ANSI C++
# 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
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.
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++
-4-
Introducere in ANSI C++
In cazul in care am editat sursa intr-un alt editor, de exemplu notepad, pentru a
rula aplicatia dorita vom realiza manual trecerea spre fisierul executabil, in felul
urmator:
pas 1. Copiem sursa in directorul c:/borlandc/bin (pas facultativ, dar in acest
mod simplificam explicatiile)
pas 2. .. > bcc p01.cpp (in cazul in care sursa a fost corecta, obtinem la acest
pas fisierul p01.obj)
pas 3. .. > tlink p01.obj (obtinem p01.exe)
pas 4. .. > p01.exe (este rulat programul)
-5-
Introducere in ANSI C++
Rezolvarea
Date de intrare Date de iesire
problemei
-6-
Introducere in ANSI C++
Algortimul este:
Date de intrare (a,b)
citeste a si b
Rezolvarea problemei
S=a+b
Date de iesire (S)
afiseaza S
1 De fapt sunt obiecte, dar in acest moment ce sa zic... asteptati volumele viitorre ale lucrarii pentru
explicatii suplimentare (merge si asa ;)), sau vezi [1], [3].
-7-
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
cout << "text"; //afisarea unui text
cout << " de";
cout << " te" << "st!";
}
Linia a doua din sursa va face ca folosirea specificarii spatiului de nume std
(std::cout) sa nu fie obligatorie.
In cazul in care folositi mediul Borland C++ 3.1 inlocuiti
#include <iostream>
using namespace std;
cu
#include <iostream.h>
-8-
Introducere in ANSI C++
-9-
Introducere in ANSI C++
Pe langa aceste tipuri de baza, C++ ofera asa numitii modificatori de tip, folositi
pentru a scimba domeniul valorilor pe are le poate pastra o variabila, prezentati in
Tabelul 2.2:
Modificator Efect
- 10 -
Introducere in ANSI C++
const tip nume=valoare;
P3. Definiti cel putin 5 variabile de tipuri diferite, initializati-le si apoi afisati
valoarile pe ecran.
#include <iostream>
using namespace std;
int main(){
char c='A'; // tip caracter
int i=-123; // intreg "obisnuit"
long int l=12356789; // intreg "mare"
unsigned int u=98; // intreg pozitiv
unsigned long int U=12345678; // intreg mare fara semn
float f=3.14; // numar real
double d=-21.344; // alt numar real
- 11 -
Introducere in ANSI C++
in memoria calculatorului.
#include <iostream>
using namespace std;
int main(){
int i=123;
Programul va afisa:
Un caracter ocupa 1 octet
Un intreg ocupa 4 octeti
Tipul float ocupa 4 octeti
Tipul double ocupa 8 octeti
#include <iostream>
using namespace std;
int main(){
int a,b,S; // declararea variabilelor
cin >>a;
cin >>b; // citirea datelor de intrare
- 12 -
Introducere in ANSI C++
La rularea aplicatiei avem impresia ca ea s-a blocat, avand in fata doar un cursor
care clipeste. Motivul este cel ca, dupa declaratii, se executa instructiunea cin>>a;
iar programul se opreste din executie in asteptarea unei valori introduse de la
tastatura. Acest lucru se realizeaza prin scrierea unei valori urmata de apasarea
tastei Enter. In acest moment variabila a preia valoarea introdusa, apoi se trece la
urmatoarea instructiune. Tratand analog si cea de a doua citire, obtinem in final
afisarea sumei valorilor introduse.
O posibila rulare a aplicatiei va arata de forma:
3
5
8
#include <iostream>
using namespace std;
int main(){
int a,b,c,E; // declararea variabilelor
- 13 -
Introducere in ANSI C++
Secventele escape pot aparea sub forma de caractere de sine statatoare, de forma
'\n'sau '\\', sau in cadrul unor siruri de caractere, cum ar fi ” abc\n\”abc\” ”.
Urmatoarele doua surse rezolva aceeasi problema:
- 14 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
cout << " $ " << endl;
cout << " $$$ " << endl;
cout << " $$$$$ " << endl;
cout << " $$$ " << endl;
cout << " $ " << endl;
}
$
$$$
$$$$$
$$$
$
#include <iostream>
using namespace std;
int main(){
cout << " $ \n $$$ \n $$$$$ \n" << endl;
cout << " $$$ \n $ " << endl;
}
$
$$$
$$$$$
$$$
$
- 15 -
Introducere in ANSI C++
Din momentul definirii unei referinte, variabila initiala va putea fi accesata atat
cu numele ei cat si cu alias-ul. Folosirea referintelor reluata in Capitolul 8, referitor
la functii.
#include <iostream>
using namespace std;
int main(){
int a=123; // variabila intreaga a
int &copie_a=a; // un alt nume pentru a
int &porecla=a; // tot a
Sunt variabila a:123
Sunt tot variabila a:123
Sunt a, si mi se spune:123
- 16 -
Introducere in ANSI C++
- 17 -
Introducere in ANSI C++
3.1 Atribuirea
Forma generala a operatiei de atribuire este:
variabila = expresie;
#include <iostream>
using namespace std;
int main(){
int i;
char c;
float f;
i=3; // intregul i ia valoarea 3
c='A'+2; // caracterul c ia valoarea 'C' (65)
f=2+1.14; // realul f ia valoarea 3.14
cout << "\ni=" << i;
cout << "\nc=" << c;
cout << "\nf=" << f;
}
Interesant este faptul ca in C/C++, spre deosebire de alte limbaje, atribuirea este
o expresie, deci pe locul in care folosim atribuirea apare o valoare. Valoarea
- 18 -
Introducere in ANSI C++
returnata de catre oparatia de atribuire este valoarea expresiei din dreapta. Deci,
daca avem atribuirea a=3, pe locul atribuirii apare valoarea 3. Putem folosi acest
fapt pentru a realiza atribuiri multiple, de forma urmatoare:
variabila1 = variabila2 = ... = variabilan = expresie;
#include <iostream>
using namespace std;
int main(){
int i;
int a,b;
cout << "Rezultatul atribuirii i=3 este:" << (i=3);
i=i+5; // in partea dreapta i are valoare 3, apoi devine 8
a=b=i+2;// a si b vor lua valoarea 10 (i nu se modifica)
cout << "\ni=" << i;
cout << "\na=" << a;
cout << "\nb=" << b;
}
Se va afisa:
Rezultatul atribuirii i=3 este:3
i=8
a=10
b=10
- 19 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=12345;
char c='A';
float f=97.14;
f=i;
i=c;
cout << "\ni=" << i;
cout << "\nc=" << c;
cout << "\nf=" << f;
}
i=65
c=A
f=12345
- 20 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=12345;
char c='A';
float f=97.14;
c=i;
i=f;
cout << "\ni=" << i;
cout << "\nc=" << c;
cout << "\nf=" << f;
}
La compilare, avem:
p04.cpp: In function `int main()':
p04.cpp:11: warning: converting to `int' from `float'
La rulare:
i=97
c=9
f=97.14
- 21 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=12345;
float f=97.14;
cout << "\ni=" << float(i+3);
cout << "\nc=" << (char) 97;
cout << "\nf=" << int(f);
}
i=12348
c=a
f=97
#include <iostream>
using namespace std;
int main(){
char c;
cout << "Dati caracterul:"; cin >>c;
cout << "Caracterul \'" << c;
cout << "\' are codul ASCII " << int(c);
}
Dati caracterul:9
Caracterul '9' are codul ASCII 57
- 22 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=123,a;
float f;
cout << -i <<"\n"; // operatorul unar -
a=2*i; // operatorul binar *
f=a;
cout << i << "/" << a << "=" << i/a << "\n";
// impartire intrega
cout << i << "/" << f << "=" << i/f; // impartire reala
}
123
123/246=0
123/246=0.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, de forma:
float(operator_intreg1) / (operator_intreg2)
In acest context, 7/2 are valoarea 3, dar 7./2 sau float(7)/2 au valoarea 3.5.
- 23 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=123;
i+=2; cout << i << "\t";
i-=25; cout << i << "\t";
i*=2; cout << i << "\t";
i/=10; cout << i << "\t";
}
125 100 200 20
- 24 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=123,a,b;
i++; // daca nu apare intr-o expresie este similar cu ++i;
a=++i;// incrementam i, apoi il atribuim lui a
b=i++;// atribuim lui a valoarea lui i, apoi incrementam i
cout << i << "\t" << a << "\t"<< b << "\t";
}
126 125 125
#include <iostream>
using namespace std;
int main(){
bool b;
b=true;
cout << "true=" << b << "\n";
b=false;
cout << "false=" << b;
}
true=1
false=0
- 25 -
Introducere in ANSI C++
!= diferit 2!=3
== egal 3==3
Diferite expresii logice pot fi reunite folosind operatorii logici din Tabelul 3.2.
- 26 -
Introducere in ANSI C++
P11. Se citesc trei valori intregi de la tastatura. Verificati unde se gaseste prima
valoare citita in raport cu intervalul determinat de ultimele doua valori.
#include <iostream>
using namespace std;
int main(){
int i,a,b;
cout << "Dati valoarea:"; cin >>i;
cout << "Dati intervalul [a,b]\na="; cin >> a;
cout << "b="; cin >> b;
cout << "apartine intervalului:" << (i>=a)&&(i<=b));
cout << "\nnu apartine intervalului:" << (i<a)||(i>b);
}
Dati intervalul [a,b]
a=2
b=5
apartine intervalului:1
nu apartine intervalului:0
- 27 -
Introducere in ANSI C++
int main(){
int x;
float E;
cout << "x="; cin >>x;
E = (x!=0) ? 1./x : 0;
cout << "1/" << x << " = " << E;
}
x=2
1/2 = 0.5
#include <iostream>
using namespace std;
int main(){
float a,b,max;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
max = (a>b) ? a : b;
cout << "max(" << a << "," << b << ")=" << max;
}
a=5
b=2
max(5,2)=5
- 28 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b,t;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
t=a; a=b; b=t;
cout << "-- dupa interschimbare --\n";
cout << "a=" << a << "\t" << "b=" << b ;
}
a=2
b=5
dupa interschimbare
a=5 b=2
#include <iostream>
using namespace std;
int main(){
int a,rez;
cout << "a="; cin >> a;
rez=(2<=a<=5);
// rez=((2<=a)&&(a<=5));
cout << a << " apartine intervalului [1,5]:" << rez ;
}
a=8
8 apartine intervalului [2,5]:1
- 29 -
Introducere in ANSI C++
Observam ca la conditia care pare "8 apartine lui [2,5]" rezultatul este adevarat
(1). Motivul este urmatorul:
Expresia 2<=a<=5 este evaluata de la stanga la dreapta, deci primul lucru
evaluat este 2<=a, adevarat pentru a=8, adica 1 in context C/C++. Urmeaza apoi
comparatia 1<=5, deci rezultatul final este adevarat. Rezolvarea corecta este cea
data in comentariu.
#include <iostream>
using namespace std;
int main(){
int a,b,t;
cout << "a="; cin >> a;
b=(t=a,a+=1,t); // b=a++
cout << a << " " << b << "\n";
b=(a+=1,a); // b=++a
cout << a << " " << b << "\n";
}
a=3
4 3
5 5
- 30 -
Introducere in ANSI C++
- 31 -
Introducere in ANSI C++
- 32 -
Introducere in ANSI C++
4.1 Instructiunea if
Exista doua forme ale instructiunii if:
if (expresie) instructiune
In acest caz, daca expresie este evaluata la adevarat (o valoare nenula), atunci
se executa instructiunea care urmeaza.
if (expresie) instructiune1
else instructiune2
P1. Se citeste un numar intreg de la tastaura. Verificati daca acesta este nul,
pozitiv sau negativ.
#include <iostream>
using namespace std;
int main(){
int a;
cout << "a="; cin >> a;
if (a==0) cout << a << " este nul.";
if (a<0) cout << a << " este negativ.";
if (a>0) cout << a << " este pozitiv.";
}
a=123
123 este pozitiv.
- 33 -
Introducere in ANSI C++
sau:
a=0
0 este nul.
P2. Se citeste un numar intreg de la tastaura. Verificati daca acesta este nul sau
nu.
#include <iostream>
using namespace std;
int main(){
int a;
cout << "a="; cin >> a;
if (a) cout << a << " este nenul.";
else cout << a << " este nul.";
}
a=123
123 este nenul.
- 34 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b;
char op;
cout << "a="; cin >> a;
cout << "b="; cin >> b;
cout << "operatia:"; cin >> op;
if (op=='+') cout << a << '+' << b << '=' << a+b;
else if (op=='-') cout << a << '-' << b << '=' << a-b;
else cout << "Operatiei neimplementata!";
}
a=2
b=3
operatia:+
2+3=5
- 35 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b,c;
int max,min;
cout << "a="; cin >> a;
cout << "b="; cin >> b;
cout << "c="; cin >> c;
// calculam minimul si maximul primelor doua valori
if (a>b){
min=b;
max=a;
}
else{
min=a;
max=b;
}
// "ajustam" minimul si maximul in functie de a treia valoare
if (c>max) max=c;
if (c<min) min=c;
a=2
b=3
c=1
min(2,3,1)=1
max(2,3,1)=3
- 36 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a;
cout << "a="; cin >> a;
if (a<3)
cout << "E mai mic ca trei\n"; //[1]
cout << "Pacat doar ca nu va merge niciodata..."; //[2]
else
cout << "E mai mare ca trei";
}
p05.cpp: In function `int main()':
p05.cpp:12: error: syntax error before `else'
Desi, datorita imbricarii, pare ca pe ramura true vor fi executate cele doua
instructiuni, compilatorul va interpreta if-ul ca fiind fara else (pe ramura true se
executa o singura instructiune), deci nu va gasi corespondet pentru else. Linia [2]
din cod ar trebui aliniata cu instruciunea if, afisarea fiind executata in afara
acestuia.
#include <iostream>
using namespace std;
int main(){
int a;
cout << "a="; cin >> a;
if (a<3){
cout << "E mai mic ca trei\n"; //[1]
cout << "Nu mai da eroare ;) "; //[2]
}
else
cout << "E mai mare ca trei";
}
a=2
E mai mic ca trei
Nu mai da eroare ;)
Acum liniile [1] si [2] sunt grupate intr-un bloc, deci pe ramura true se executa
o singura instructiune, iar else isi gaseste corespondent.
- 37 -
Introducere in ANSI C++
P7. Determinati daca patru numere intregi citite de la tastatura sunt in ordine
crescatoare sau nu.
#include <iostream>
using namespace std;
int main(){
int a,b,c,d;
cout << "Introduceti patru numere intregi:\n";
cin >> a >> b >> c >> d;
if ((a<=b) && (b<=c) && (c<=d))
cout << "Numerele citite sunt in ordine crescatoare";
else
cout << "Numerele citite nu sunt in ordine crescatoare";
}
Introduceti patru numere intregi:
2 4 5 8
Numerele citite sunt in ordine crescatoare
- 38 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b,c,d;
bool progresie;
cout << "Introduceti patru numere intregi:\n";
cin >> a >> b >> c >> d;
if (progresie){
cout << "Numerele citite sunt in progresie\n";
cout << "aritmetica, cu ratia: " << b-a;
}
else
cout << "Nu avem o progresie aritmetica";
}
Introduceti patru numere intregi:
2 4 6 8
Numerele citite sunt in progresie
aritmetica, cu ratia: 2
x pentru x∈[10,20 ]
f x =−x pentru x ∈−20,0
0 inrest
- 39 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int x,F;
cout << "x="; cin >> x;
if ((x>=10)&&(x<=20)) F=x;
else if ((x>-20)&&(x<0)) F=-x;
else F=0;
x=3
f(3)=0
- 40 -
Introducere in ANSI C++
case constanta1: instructiuni; break;
case constanta2: instructiuni; break;
. . .
case constantan: instructiuni;
default: instructiune;
#include <iostream>
#include <math.h>
using namespace std;
int main(){
int a,b;
float R;
char op;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
cout << "operator:"; cin >>op;
switch (op){
case '+': R=a+b; break;
case '-': R=a-b; break;
case '*': R=a*b; break;
case '/': if (b!=0) { R=float(a)/b; break;}
else {cout << "Impartire la zero!"; return(1);}
default:cout << "Operator necunoscut!"; return(1);
}
cout << a << op << b << "=" << R;
}
- 41 -
Introducere in ANSI C++
a=2
b=4
operator:/
2/4=0.5
#include <iostream>
using namespace std;
int main(){
int prima_zi, zi;
zi=(zi+prima_zi-1)%7;
Ziua corespunzatoare datei de 1 a lunii:0
Data de verificat:14
Data corespunde unei zi de DUMINICA
- 42 -
Introducere in ANSI C++
- 43 -
Introducere in ANSI C++
Expresia poate fi de orice tip, inclusiv expresii aritmetice sau atribuiri, dar, ca si
la instruciunea if, sunt de preferat expresii logice. Daca se doreste executarea unui
grup de instructiuni se va folosi un bloc care sa formeze corpul instructiunii while.
Executia instructiunii:
- se evalueaza expresie
- daca rezultatul este true (diferit de 0), se executa instructiune, apoi se
revine la primul pas
- daca rezultatul este false (0), se continua executia cu instructiunea
urmatoare
Poate cea mai simpla problema care se poate rezolva folosind structuri
repetitive este afisarea valorilor intregi din [1,10]. In acest caz, o rezolvare de
forma:
... cout << 1 << 2 << 3 << ...
poate fi utilizata doar daca intervalul dat este mic si definit de catre constante.
La afisarea valorilor dintr-un interval [a,b], a,b variabile intregi citite de la
tastatura aceasta metoda nu poate fi folosita.
- 44 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i;
i=1;
while (i<=10){
cout << i<< " ";
i++;
}
}
citesc1 2 3 4 5 6 7 8 9 10
P2. Afisati urmatoarele serii de numere pe ecran (a,b,n sunt intregi citite de la
tastatura, a<b)
• a, a+1, ..., b
• 1 0 1 0 1 ... - n valori
- 45 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i,a,b,n;
float pas,k;
i=1;
while (i<=n){
cout << i<< " ";
i=2*i;
}
n=10
a=2
b=7
1 2 4 8
2 3 4 5 6 7
2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7
1 0 1 0 1 0 1 0 1 0
- 46 -
Introducere in ANSI C++
In unele cazuri corpul instructiunii while poate sa fie vid. In acest caz
vomverondela folosi intructiunea vida ; .
P3. Se citeste un numar intreg de la tastatura. Afisati cel mai mare numar
multiplu de 10 mai mic ca numarul citit. (while fara corp)
#include <iostream>
using namespace std;
int main(){
int n;
cout << "n="; cin >>n;
while ((n--)%10!=0); // while cu corp vid
cout << n+1;
}
n=123
120
while (expresie);
- 47 -
Introducere in ANSI C++
Figura 5.1
#include <iostream>
using namespace std;
int main(){
char c1,c2,t,c;
cin >> c1 >> c2;
if (c1>c2){t=c1; c1=c2; c2=t;}
c=c1;
do{
cout << c << " - " << int(c) << endl;
c++;
}while(c<=c2);
}
A C
A 65
B 66
C 67
- 48 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
float n;
cout << "n="; cin >> n;
n=n*100;
do{
cout << n << endl;;
n=n/10;
} while(n>1);
n=12.789
1278.9
127.89
12.789
1.2789
sau, de obicei:
for(init; cond_de_oprire ; reinit) instructiune;
- 49 -
Introducere in ANSI C++
- se executa instructiune
- se executa reinit
Instructiunea for este folosita, in principal, pentru parcurgerea seriilor de
numere.
P6. Afisati urmatoarele serii de numere pe ecran (a,b,n sunt intregi citite de la
tastatura, a<b):
– 1,2,3,...,10
#include <iostream>
using namespace std;
int main(){
int n,a,b,i,p;
cin >> n >> a >> b;
p=1;
for(i=1;i<=n;i++){
cout << p << " ";
p=2*p;
}
}
5 3 8
1 2 3 4 5 6 7 8 9 10
- 50 -
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. Afisati, folosind trei metode diferite urmatoarea serie de numere pe ecran:
#include <iostream>
using namespace std;
int main(){
int n,i,b;
cout << "n="; cin >> n;
for(i=1;i<=n/2;i++) cout << 1 << " " << 0 << " ";
if (n%2==1) cout << 1;
cout << endl;
b=1;
for(i=1;i<=n;i++){
cout << b << " ";
b=!b;
}
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, nu
numai incrementare/decrementare, instructiunea for devine echivalenta ca
functionalitate cu bucla while.
In figura 5.2 este data echivalenta dintre instructiunile for si while:
- 51 -
Introducere in ANSI C++
expr1;
while (expr2){ for(expr1;expr2;expr3)
instructiune;
instructiune;
expr3;
}
Figura 5.2
Folosirea expresiei virgula reprezinta o varianta prin care putem controla mai
multe variabile in cadrul aceleiasi bucle for.
• 1 9 2 8 3 7 ... 9 1
#include <iostream>
using namespace std;
int main(){
int n,i,j,p;
cout << "n="; cin >> n;
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, in cadrul instructiunii for, mai multi contori, eventual de tipuri
diferite. In plus, toate partile din for sunt optionale, urmatoarea bucla fiind bucla
infinita:
for(;;);
- 52 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
unsigned char c;
for(c=0;c<255;c++){
cout << c << "-" << int(c) << "\t";
if (c%10==9) cout << endl;
}
}
.............
<60 =61 >62 ?63 @64 A65 B66 C67 D68 E69
F70 G71 H72 I73 J74 K75 L76 M77 N78 O79
................
Instructiunea break va cauza iesirea doar din cadrul buclei curente, in cazul in
care avem mai multe bucle imbricate, iesirea facandu-se in bucla imediat
superioara.
Tot pentru controlul fluxului de executie putem folosi instructiunea continue.
Sintaxa:
continue;
Analog instructiunii break, fluxul executiei din cadrul buclei curente este
intrerupt, dar executie revine la conditia de oprire din bucla.
- 53 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,d,i;
bool prim;
cout << "n="; cin >>n;
for(i=1;i<=n;i++){
prim=true;
for(d=2;d<=i/2;d++)
if (i%d==0){prim=false; break;}
if (prim) cout << i << " ";
}
}
n=20
1 2 3 5 7 11 13 17 19
#include <iostream>
using namespace std;
int main(){
int i;
for(i=10;i>=-10;i--){
if (i==0) continue;
cout.precision(2); cout << 1./i << " ";
}
}
0.1 0.11 0.12 0.14 0.17 0.2 0.25 0.33 0.5 1 1 0.5 0.33 0.25 0.2
0.17 0.14 0.12 0.11 0.1
- 54 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i,a,b;
cin >> a >> b;
i=a;
salt:
cout << i << " ";
i++;
if (i<=b) goto salt; // se revine la eticheta salt
}
P13. Folosind instructiunea goto, afisati pe ecran numerele intregi din intervalul
[a,b].
3 6
3 4 5 6
- 55 -
Introducere in ANSI C++
n
1234 10
1230 123
4
n%10 n/10
Figura 5.3
De aici obtinem urmatoarele:
c= n% 10 – calculul ultimei cifre
n=n/10 – eliminarea ultimei cifre
while (n>0){ // cat timp mai avem cifre
c= n% 10;
foloseste(c);
n=n/10;
}
- 56 -
Introducere in ANSI C++
for(;n>0;n=n/10) foloseste(n%10);
#include <iostream>
using namespace std;
int main(){
int n,c;
cout << "n="; cin >> n;
while(n>0){
c=n%10;
cout << c << endl;;
n=n/10;
}
n=1942
2
4
9
1
- 57 -
Introducere in ANSI C++
n%d==0 verificarea daca d|n
for(d=1;d<=n;d++) // dintre toti divizorii posibili
if (n%d==0) foloseste(d); // selectam divizorii
#include <iostream>
using namespace std;
int main(){
int n,d;
cout << "n="; cin >> n;
for(d=1;d<=n;d++)
if (n%d==0) cout << d << " ";
}
n=120
1 2 3 4 5 6 8 10 12 15 20 24 30 40 60 120
- 58 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,d;
bool prim;
cout << "n="; cin >> n;
prim=true;
for(d=2;d<=n/2;d++)
if (n%d==0){
prim=false;
break;
}
d=2;
while(n>1)
if (n%d==0){
cout << d << " ";
n=n/d;
}
else d++;
}
n=120
120 nu este prim
2 2 2 3 5
- 59 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b,cmmdc,cmmmc,r,aa,bb;
cin >> a >> b;
aa=a; bb=b;
while(bb!=0){
r=aa%bb;
aa=bb;
bb=r;
}
cmmdc=aa;
cmmmc=(a*b)/cmmdc;
cout << "cmmdc(" <<a <<"," << b <<")=" << cmmdc << endl;
cout << "cmmmc(" <<a <<"," << b <<")=" << cmmmc;
}
24 36
cmmdc(24,36)=12
cmmmc(24,36)=72
S=0
Pentru toate valorile X de insumat
S=S+X
Produsul:
P=1
Pentru toate valorile X de inmultit
P=P*X
- 60 -
Introducere in ANSI C++
Numarari (contorizari):
ct=0
Pentru toate valorile X de parcurs
if (conditie(X)) ct++
• a!
#include <iostream>
using namespace std;
int main(){
int a,b,Sm,fact,i;
float S;
cin >> a >> b;
cout << Sm << " " << fact << " " << S;
}
4 11
60 24 1.18654
- 61 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,nn,S,P,pc,ct,c;
cin >> n;
nn=n;
for(S=0,P=1; n ;n/=10){
c=n%10;
S+=c;
if (c%2==0) P*=c;
}
for(n=nn;n>=10;n/=10);
pc=n;
for(n=nn,ct=0; n ;n/=10)
if (n%10 == pc) ct++;
cout << S << " " << P << " " << pc << " " << ct;
12141
9 8 1 3
- 62 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,d,S,ct,i;
bool prim;
S=0;
for(d=1;d<=n;d++)
if (n%d==0) S+=d;
cout << S << " ";
ct=0;
for(i=2;i<n;i++){
prim=true;
for(d=2;d<=i/2;d++)
if (i%d==0) prim=false;
if (prim) ct++;
}
cout << ct;
}
n=10
18 4
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
- 63 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,nn,S,P,pc,ct,c;
cin >> n;
nn=n;
for(S=0,P=1; n ;n/=10){
c=n%10;
S+=c;
if (c%2==0) P*=c;
}
for(n=nn;n>=10;n/=10);
pc=n;
for(n=nn,ct=0; n ;n/=10)
if (n%10 == pc) ct++;
cout << S << " " << P << " " << pc << " " << ct;
25221
12 8 2 3
- 64 -
Introducere in ANSI C++
cin >> n; // numarul de valori de citit
for(i=1;i<=n;i++){ // de n ori
cin >> X; // citim numarul
foloseste(X); // il utilizam conform enuntului
}
cin >> X; // citim valoare
while (cond(X)){ // cat timp conditia e respectata
foloseste(X); // il utilizam conform enuntului
cin >> X; // citim numarul
}
• maximul
• produsul
#include <iostream>
#include <values.h>
using namespace std;
int main(){
int n,x,i,max,P;
max=-MAXINT; P=1;
cin >> n;
for(i=1;i<=n;i++){
cin >> x;
P=P*x;
if (x>max) max=x;
}
5
1 1 5 2 1
5 10
- 65 -
Introducere in ANSI C++
#include <iostream>
#include <values.h>
using namespace std;
int main(){
int x,i,min,ct_min,S;
if (x==min) ct_min++;
else if (x<min){
min=x;
ct_min=1;
}
cin >> x;
}
2 3 1 4 6 1 1 1 6 1 12 0
30
1 apare de 5 ori
a: 1 1 2 1 2 3 ... 1 2...n
b: 1 2 2 3 3 3 ... n n ...n
- 66 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,i,k;
cin >>n;
for(k=1;k<=n;k++){
for(i=1;i<=k;i++) cout << i << " ";
cout << " ";
}
cout << endl;
for(k=1;k<=n;k++){
for(i=1;i<=k;i++) cout << k << " ";
cout << " ";
}
}
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
1 1:1 12345
121 2:1,2 23456
12321 .... 34567
.................... 6: 1,2,3,6 – numarul urmat de divizori 45678
1 ................ 1 ...... 5 6 7 8 9 (n=5)
- 67 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int n,i,k,d;
cin >>n;
for(k=1;k<=n;k++){
for(i=1;i<=n-k;i++) cout << " ";
for(i=1;i<=k;i++) cout << i << " ";
for(i=k-1;i>=1;i--) cout << i << " ";
cout << endl;
}
cout << "-------------" <<endl;
for(k=1;k<=n;k++){
cout << k << ": ";
for(d=1;d<=k/2;d++) if (k%d==0) cout << d << ",";
cout << k << endl;
}
cout << "-------------" << endl;
for(k=1;k<=n;k++){
for(i=1;i<=n;i++) cout << i+k << " ";
cout << endl;
}
}
4
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1: 1
2: 1,2
3: 1,3
4: 1,2,4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
- 68 -
Introducere in ANSI C++
1 1:1 10101
212 2:2,2 01010
32123 3:3,3,3 10101
.................... ...... 01010
n ......1....... n n:n,n,n,...,n 1 0 1 0 1 (n=5)
Pp7. Afisati pe ecran tabla inmultirii pana la 10.
Pp8. Se citeste n intreg, apoi n numere intregi de la tastatura. Afisati:
- 69 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100]; // vector de intregi neinitilalizat
int B[10]={1,2,3,4};// vector de intregi partial initializat
float X[]={3.14, 5, 2.5};// vector de reali complet initializat
cout << "Vectorul A ocupa " << sizeof(A) << " octeti";
cout << "Vectorul B ocupa " << sizeof(B) << " octeti";
cout << "Vectorul X ocupa " << sizeof(X) << " octeti";
cout << "Vectorul X are " << sizeof(X)/sizeof(int)<< " valori";
Vectorul A ocupa 400 octeti
Vectorul B ocupa 40 octeti
- 70 -
Introducere in ANSI C++
Vectorul X ocupa 12 octeti
Vectorul X are 3 valori
1 2 3 4 ? ... ?
5 2 3 4 ? ... 9
- 71 -
Introducere in ANSI C++
P2. Se citesc cinci valori ale unui vectori de intregi. Afisati vectorul in ordine
inversa.
#include <iostream>
using namespace std;
int main(){
int A[5];
cout << "A: " << A[4] << " " << A[3] << " ";
cout << A[2] << " " << A[1] << " " << A[0];
Dati elementele vectorului A:2 4 1 3 5
A: 5 3 1 4 2
- 72 -
Introducere in ANSI C++
P3. Se citesc cinci valori ale unui vectori de intregi. Afisati vectorul in ordine
inversa. (varianta 2)
#include <iostream>
using namespace std;
int main(){
int A[5];
int i;
Dati elementele vectorului A:3 4 5 6 7
A: 7 6 5 4 3
#include <iostream>
using namespace std;
int main(){
int A[100],n,i;// vectorul si lungimea curenta (0<= n <=100)
for(i=0;i<n;i++)
cout << A[i] << " "; // afisarea, element cu element
}
4
3 4 1 2
3 4 1 2
- 73 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],n;
int i;
n=3
A[0]=7
A[1]=15
A[2]=9
A=(7,15,9)
for(i=0;i<n;i++)
foloseste(A[i]);
- 74 -
Introducere in ANSI C++
B: 0,2,0,4,0,6,...
D: 0,1,0,1,0,...
#include <iostream>
using namespace std;
int main(){
int A[100],B[100],C[100],D[100],n;
int i;
for(i=0;i<n;i++) A[i]=i+1;
for(i=0;i<n;i++) B[i]= (i%2==0)? 0:i;
for(i=0;i<n;i++) C[i]=n-1-i;
for(i=0;i<n;i++) D[i]=i%2;
cout << "A:"; for(i=0;i<n;i++) cout << A[i] << " ";
cout << "\nB:"; for(i=0;i<n;i++) cout << B[i] << " ";
cout << "\nC:"; for(i=0;i<n;i++) cout << C[i] << " ";
cout << "\nD:"; for(i=0;i<n;i++) cout << D[i] << " ";
}
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
- 75 -
Introducere in ANSI C++
B: 1,1,2,3,5,8,...
C: 1,2,4,8,16,...
D: 0,1,0,1,0,...
#include <iostream>
using namespace std;
int main(){
int A[20],B[20],D[20],n,i;
long C[20];
A[0]=1;
for(i=1;i<n;i++) A[i]=A[i-1]+1;
B[0]=B[1]=1;
for(i=2;i<n;i++) B[i]= B[i-1]+B[i-2];
C[0]=1;
for(i=1;i<n;i++) C[i]=2*C[i-1];
D[0]=0;
for(i=1;i<n;i++) D[i]=!D[i-1];
cout << "A:"; for(i=0;i<n;i++) cout << A[i] << " ";
cout << "\nB:"; for(i=0;i<n;i++) cout << B[i] << " ";
cout << "\nC:"; for(i=0;i<n;i++) cout << C[i] << " ";
cout << "\nD:"; for(i=0;i<n;i++) cout << D[i] << " ";
}
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
- 76 -
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.
#include <iostream>
using namespace std;
int main(){
int A[100],n;
int i,a,b;
cout << "A:"; for(i=0;i<n;i++) cout << A[i] << " ";
}
n=10
a=30
b=40
A:36 40 36 32 31 34 30 36 33 31
- 77 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],n,i;
int S,P;
S=0;P=1;
for(i=0;i<n;i++){
S=S+A[i];
if (A[i]%2==0) P=P*A[i];
}
n=6
1 1 2 2 3 3
Suma: 0
Produsul valorilor pare: 4
Maximul: 3
minimul valorilor pozitive: 1
- 78 -
Introducere in ANSI C++
#include <iostream>
#include <values.h>
using namespace std;
int main(){
int A[20],n,i;
float E;
int F,max;
E=0;
for(i=0;i<2*n-1;i+=2)
E = E + float(A[i])/A[i+1];
max=-MAXINT;
F=0;
for(i=0;i<2*n;i++){
if(A[i]>max) max=A[i];
F=F+max;
}
n=2
Vectorul:4 7 8 6
E: 1.90476
F: 27
a. sortat crescator
b. este sir Fibonacci (primele doua vaori sunt 1, in rest fiecare element de
obtine insumand cele doua valori anterioare)
c. simetric
- 79 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,j;
bool cresc, fibo, sim;
cresc=true;
for(i=0;i<n-1;i++)
if (A[i]>A[i+1]) cresc=false;
if ((A[0]==1)&&(A[1]==1)) fibo=true;
for(i=2;fibo && i<n-1;i++)
if (A[i]!=A[i-1]+A[i-2]) fibo=false;
sim=true;
for(i=0,j=n-1;sim && i<j;i++,j--)
if (A[i]!=A[j]) sim=false;
n=5
1 1 2 3 5
Vectorul dat este crescator, este Fibonacci, nu este simetric.
sau:
n=6
1 6 2 2 6 1
Vectorul dat nu este crescator, nu este Fibonacci, este simetric.
- 80 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (A[j]<A[i]){
t=A[i]; A[i]=A[j]; A[j]=t;
}
n=5
2 4 5 1 3
Vectorul sortat: 1 2 3 4 5
- 81 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,k,t;
for(k=1;k<=n-1;k++)
for(i=0;i<n-1;i++)
if (A[i]>A[i+1]){
t=A[i]; A[i]=A[i+1]; A[i+1]=t;
}
n=5
2 4 5 1 3
Vectorul sortat: 1 2 3 4 5
- 82 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,k,j;
int ct[100];
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
- odata avut vectorul de contori, nu avem decat sa completam valorile, de la cea
mai mica la cea mai mare, de cate ori trebuie in vectorul rezultat
- 83 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[100],B[100],n,m,i,j;
int C[100],k;
n=2+rand()%10; A[0]=2;
for(i=1;i<n;i++) A[i]=A[i-1]+1+rand()%3;
m=2+rand()%10; B[0]=1;
for(i=1;i<m;i++) B[i]=B[i-1]+1+rand()%4;
cout << "A: "; for(i=0;i<n;i++) cout << A[i] << " ";
cout << "\nB: ";for(i=0;i<m;i++) cout << B[i] << " ";
i=j=k=0;
while ((i<n)&&(j<m))
if (A[i]<A[j]) C[k++]=A[i++];
else C[k++]=B[j++];
while(i<n) C[k++]=A[i++];
while(j<m) C[k++]=B[j++];
cout << "\nC: ";for(i=0;i<m+n;i++) cout << C[i] << " ";
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
- 84 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[10][10];
float B[4][3]={{1,2},
{3,4},
{5,6}};
cout << "A[10][10] ocupa " << sizeof(A) << " octeti";
cout << "\nB[4][3] ocupa " << sizeof(B) << " octeti";
A[10][10] ocupa 400 octeti
B[4][3] ocupa 48 octeti
- 85 -
Introducere in ANSI C++
Coloana 0
Coloana 1
Coloana 9
Linia 0 A[0][0] A[0][1] A[0][2] ... A[0][9]
...
...
...
...
Figura 6.3
#include <iostream>
using namespace std;
int main(){
int A[10][10],n,m,i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << A[i][j] << " ";
cout << endl;
}
}
n=2
m=2
A[0][0]=1
A[0][1]=2
- 86 -
Introducere in ANSI C++
A[1][0]=3
A[1][1]=4
1 2
3 4
for(i=0;i<n;i++)
for(j=0;j<m;j++)
foloseste(A[i][j]);
#include <iostream>
using namespace std;
int main(){
int A[10][10]={ {1,2,3},
{4,5,6},
{7,8,9}};
int n=3,m=3,i,j;
for(j=0;j<n;j++){
for(i=0;i<n;i++)
cout<<A[i][j]<<" ";
cout << endl;
}
}
1 4 7
2 5 8
3 6 9
- 87 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[10][10], B[10][10], C[10][10];
int n,m,i,j,v;
v=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
A[i][j]=i+1;
B[i][j]=(i+j+1)%2;
C[i][j]=v++;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << A[i][j] << " ";
cout << endl;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << B[i][j] << " ";
cout << endl;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << C[i][j] << " ";
cout << endl;
}
}
- 88 -
Introducere in ANSI C++
In cazul in care numarul de linii si cel de coloane este identic spunem despre
matrice ca este patratica. In acest caz, vorbim despre diagonala principala si cea
secundara. Relatia dintre indici raportata la diagonale este data in Figura 6.4:
i+j<n-1
i>j
1
n-
i=
==
=j
j
i+
i<j
i+j>n-1
Figura 6.4
#include <iostream>
using namespace std;
int main(){
int A[10][10], n,i,j;
cout << "n="; cin >> n;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if (i<j)
if (i+j<n-1) A[i][j]=2;
else A[i][j]=3;
else
if (i+j<n-1) A[i][j]=5;
else A[i][j]=4;
if ((i==j)||(i+j==n-1)) A[i][j]=1;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << A[i][j] << " ";
cout << endl;
}
}
- 89 -
Introducere in ANSI C++
P21. O matrice contine cifre pe primele n-1 linii. Considerand fiecare rand al
matricii ca fiind numarul in baza 10 corespunzator, completati pe ultima linie
suma numerelor zecimale de pe liniile date.
#include <iostream>
using namespace std;
int main(){
int A[10][10], n,i,j,t;
t=0;
for(j=n-1;j>=0;j--){
for(i=0;i<n-1;i++)
t+=A[i][j];
A[n-1][j]=t%10;
t=t/10;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << A[i][j] << " ";
cout << endl;
}
}
0 2 4 5
0 0 9 1
1 2 3 4
1 5 7 0
- 90 -
Introducere in ANSI C++
- 91 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
char S[100]; // sir neinitilalizat
char s[20]="Ana are laptop";// sir initializat
char X[]="abc"; // initializare corecta
char Y[]={'x','y','z'}; // initializare nerecomandata
cout << "Vectorul S ocupa " << sizeof(S) << " octeti\n";
cout << "Vectorul s ocupa " << sizeof(s) << " octeti\n";
cout << "Vectorul X ocupa " << sizeof(X) << " octeti\n";
cout << "Vectorul Y ocupa " << sizeof(X) << " octeti";
Vectorul S ocupa 100 octeti
Vectorul s ocupa 20 octeti
Vectorul X ocupa 4 octeti
Vectorul Y ocupa 4 octeti
- 92 -
Introducere in ANSI C++
in memorie X ocupa 4 octeti. Cum unui caracter ii este necesar un octet pentru a
fi memorat, observam ca s-a alocat un octet in plus. Motivul este cel ca in limbajul
C este folosit terminatorul NULL pentru a marca sfarsitul unui sir de caractere.
Pentru exemplul de mai sus avem urmatoarea situatia dinfigura 7.1:
‘ a’ ‘ b’ ‘ c’ ‘ \0’ ? ...
X[0] X[1]
Figura 7.1
Acelasi lucru se intampla atunci cand folosi constante de tip sir de caractere,
compilatorul adaugand automat terminatia NULL. Caracterul ‘\0’ este caracterul
cu codul ASCII egal cu zero si este diferit de caracterul ‘0’.
In general, in cazul in care declaram o variabila de tip sir de caractere, trebuie
tinut cont de terminatorul NULL, deci practic trebuie sa declaram cu dimensiune
cu 1 mai mare decat a sirului efectiv.
Diferenta de reprezentare dintre un caracter si sirul de caractere identic este
evidentiat de exemplul urmator.
#include <iostream>
using namespace std;
int main(){
cout << "Caracterul \'A\' ocupa " << sizeof('A') << " octeti\n";
cout << "Sirul \"A\" ocupa " << sizeof("A") << " octeti\n";
Caracterul 'A' ocupa 1 octeti
Sirul "A" ocupa 2 octeti
- 93 -
Introducere in ANSI C++
‘ A’ ‘ A’ ‘ \0’
#include <iostream>
using namespace std;
int main(){
char S1[100],S2[100];
Introduceti un sir: Ana are laptop
Introduceti inca un sir: Ana are laptop
Primul sir introdus: Ana are laptop
Al doilea sir introdus: Ana
- 94 -
Introducere in ANSI C++
for(i=0;S[i];i++)
foloseste(S[i]);
If ((c>=’0’)&&(c<=’9’))
foloseste(c);
If ((c>=’A’)&&(c<=’Z’))
foloseste(c);
- 95 -
Introducere in ANSI C++
P4. Se citeste un sir de caractere fara spatii. Inlocuiti literele mici cu litere mari
si invers.
#include <iostream>
using namespace std;
int main(){
char S[100];
int i;
for(i=0;S[i];i++){
if ( (S[i]>='a')&&(S[i]<='z') ) S[i] = S[i] - 'a' + 'A';
else if ( (S[i]>='A')&&(S[i]<='Z') ) S[i] = S[i] - 'A' + 'a';
}
cout << S;
}
Introduceti un sir: abcDEF123
ABCdef123
P5. Se citeste un sir de caractere cantinand cuvinte separate de unul sau mai
multe spatii. Afisati numarul de cuvinte.
#include <iostream>
using namespace std;
int main(){
char S[100];
int i,ct;
for(i=1;S[i];i++)
if ( (S[i-1]==' ') && (S[i]!=' ') ) ct++;
Introduceti un sir: Ana are laptop
Numarul de cuvinte:3
- 96 -
Introducere in ANSI C++
Concaterneaza S2 la S2 strcpy(S,"Imi place ");
strcat(S1,S2)
strcat(S,"C++");
- 97 -
Introducere in ANSI C++
Observatii:
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char S[100];
int i;
Introduceti un sir: Ana are laptop
Lungimea:14
Lungimea (strlen):14
apelul functie strlen parcurgand de fiecare data tot sirul, astfel scazand
eficienta algoritmului.
- 98 -
Introducere in ANSI C++
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char S[100],X[100],Y[100];
int i;
strcpy(Y,S);
Introduceti un sir: Ana are laptop
X: :Ana are laptop
Y (strcpy):Ana are laptop
In cazul in care facem copierea din cod, trebuie sa avem grija de terminator, in
caz contrar alte operatii pe sir, cum ar fi afisarea, nu vor actiona dupa asteptari.
Atribuire directa intre doua siruri de caractere (posibila in alte limbaje), de
forma: S1=S2;
va da un mesajul de eroaren1=atoi(S1);
p07.cpp:21: error: ISO C++ forbids assignment of arrays
- 99 -
Introducere in ANSI C++
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char nume[100],S[100];
int i,j;
strcpy(S,"Salut ");
j=strlen(S);
for(i=0;nume[i];i++) S[j++]=nume[i];
S[j]='\0';
// strcat(S,nume);
cout << S;
}
Introduceti numele: Ana
Salut Ana
- 100 -
Introducere in ANSI C++
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char S1[100],S2[100];
int i,j;
cout << "Introduceti sirul 1: "; cin.getline(S1,100);
cout << "Introduceti sirul 2: "; cin.getline(S2,100);
Introduceti sirul 1: trei
Introduceti sirul 2: patru
"trei" este mai mare ca "patru"
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char S1[10],S2[10];
int rez,n1,n2;
cout << "Introduceti numarul 1: "; cin.getline(S1,10);
cout << "Introduceti numarul 2: "; cin.getline(S2,10);
n1=atoi(S1);
n2=atoi(S2);
rez=n1+n2;
cout << S1 << " + " << S2 << " = " << rez;
}
Introduceti numarul 1: 123
Introduceti numarul 2: 234
123 + 234 = 357
- 101 -
Introducere in ANSI C++
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char nume[10],S[100];
int rez,n1,n2;
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"
Pentru exemplul de mai sus, S[0] este "Ana", S[1] este "are", S[2] este
"laptop", iar S[3],...,S[9] sunt siruri vide.
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;
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;
}
Introduceti ziua 1: marti
Introduceti ziua 2: joi
marti
miercuri
joi
- 103 -
Introducere in ANSI C++
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char cuvant[100];
char copie[100];
int i,j;
strcpy(copie,cuvant);
for(i=strlen(cuvant);i>0;i--){
copie[i]='\0'; // "mutam" sfarsitul cuvantului la stanga
cout << copie<< " ";
}
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++
#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;
}
mic mare scurt lung stop
Cuvantul cel lung: scurt
- 105 -
Introducere in ANSI C++
- 106 -
Introducere in ANSI C++
8.1 Structuri
Gruparea informatiilor corelate de tipuri diferite se face prin utilizarea
structurilor. Avem:
struct nume_structura{
declaratii_de_variabile;
} lista_variabile;
- 107 -
Introducere in ANSI C++
Exista posibilitatea de a face atribuiri intre doua variabile de tip structura, daca
cele doua variabile sunt de acelasi tip. Deci daca avem:
nume_structura V1,V2;
#include <iostream>
using namespace std;
int main(){
persoana P={"Gates","Gheorghe",30};
P.varsta++;
cout << P.nume << " " << P.prenume << " " << P.varsta;
}
Gates Gheorghe 31
struct persoana{
nume char[20]; nume 20 bytes
int varsta;
float inaltime; varsta sizeof(int) bytes
}; inaltime
sizeof(int) bytes
Figura 8.1
Tipurile de date definite prin cuvantul cheie struct pot fi transmise ca parametri
sau pot fi returnate din functii.
- 108 -
Introducere in ANSI C++
#include <iostream>
#include <math.h>
using namespace std;
struct complex{
float re;
float im;
};
complex suma(complex,complex);
complex produs(complex,complex);
float modul(complex);
int main(){
complex z1={1,2},z2={5,-1},S,P; // z1= 1+2i si z2=5-i
float m;
S=suma(z1,z2);
P=produs(z1,z2);
m=modul(z1);
cout << "S=" << S.re << "+i*" << S.im << endl;
cout << "P=" << P.re << "+i*" << P.im << endl;
cout << "m=" << m;
}
S=6+i*1
P=7+i*9
m=2.23607
- 109 -
Introducere in ANSI C++
Putem defini vectori de structuri sau structuri care contin alte structuri.
P3. Definiti structura persoana (nume, data_nasterii), unde data nasterii este o
alta structura (zi,luna,an). Cititi de la tastatura 3 persoane, apoi afisati-le in
ordine crescatoare dupa anul nasterii.
#include <iostream>
using namespace std;
struct data{
int zi,luna,an;
};
struct persoana{
char nume[20];
data datan;
};
int main(){
persoana P[10],t;
int j,i,nr=3;
for(i=0;i<nr;i++){
cin >> P[i].nume;
cin >> P[i].datan.zi >> P[i].datan.luna >> P[i].datan.an;
}
for(i=0;i<nr-1;i++)
for(j=i+1;j<nr;j++)
if (P[i].datan.an > P[j].datan.an){
t=P[i]; P[i]=P[j]; P[j]=t;
}
for(i=0;i<nr;i++){
cout << P[i].nume << " " << P[i].datan.zi << "/";
cout << P[i].datan.luna << "/" << P[i].datan.an << endl;
}
Ana 12 8 2003
Luci 21 5 1998
Tom 5 12 2000
Luci 21/5/1998
Tom 5/12/2000
Ana 12/8/2003
- 110 -
Introducere in ANSI C++
8.2 Uniuni
Dupa cum am vazut, in cazul structurilor se aloca memorie pentru fiecare
variabila declarata in structura, cantitatea totala de memorie obtinandu-se adunand
cantitatea de memorie necesara fiecarei variabile componente in parte.
In cazul care grupam date folosind uniuni, datele interne vor ocupa aceeasi zona
de memorie, in total uniunea ocupand cat ocupa cea mai mare (dinpunct de vedere
al necesarului de memorie) variabila componenta.
Sintaxa:
union nume_structura{
declaratii_de_variabile;
} lista_variabile;
- 111 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
union intreg{
unsigned int i;
char c[4];
};
int main(){
intreg I;
I.i=0;
cout << "0000h = " << I.i << endl;
I.c[3]=255;
cout << "F000h = " << I.i << endl;
I.c[3]=0; I.c[2]=255;
cout << "0F00h = " << I.i << endl;
I.c[2]=0; I.c[1]=255;
cout << "00F0h = " << I.i << endl;
I.c[1]=0; I.c[0]=255;
cout << "000Fh = " << I.i;
0000h = 0
F000h = 4278190080
0F00h = 16711680
00F0h = 65280
000Fh = 255
- 112 -
Introducere in ANSI C++
P5. Definiti o uniune prin care putem memora oricare dintre figurile geometrice
urmatoare: cerc, triunghi, dreptunghi.
#include <iostream>
using namespace std;
struct punct{
int x,y;
};
struct cerc{
punct P;
int r;
};
struct triunghi{
punct A,B,C;
};
struct dreptunghi{
punct A,B;
};
union figura{
cerc C;
triunghi T;
dreptunghi D;
};
int main(){
figura F;
- 113 -
Introducere in ANSI C++
P6. Definiti si utilizati un camp de biti pentru stocarea unei date calendaristice.
#include <iostream>
using namespace std;
struct data{
unsigned zi:5;
unsigned luna:4;
unsigned an:7;
};
int main(){
data D={29,4,73};
cout << D.zi << " " << D.luna << " " << D.an;
}
29 4 73
struct data{
unsigned zi:5;
unsigned luna:4; zi luna an
unsigned an:7; 0 4 5 8 9 15
};
Figura 8.2
- 114 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void Mesaj(int);
int main(){
saptamana S;
int i,ct;
treaba treaba treaba treaba treaba liber liber
- 115 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
enum calificative {
insuficient=4,
suficient=5,
bine=7,
excelent=10
};
int main(){
int nota;
cout << "Dati o nota:"; cin >> nota;
if (nota<=insuficient)
cout << "mai incearca!";
else if (nota<=suficient)
cout << "la limita!";
else if (nota==excelent)
cout << "perfect!";
else cout << "e ok!";
}
Dati o nota:8
e ok!
- 116 -
Introducere in ANSI C++
- 117 -
Introducere in ANSI C++
Capitolul 9 – Functii
Daca pana acum am folosit la scrierea programelor noastre doar functia main,
functie in care am scris tot codul dorit, este evident ca in cazul problemelor
complexe este necesare o impartire in module a programului. Modularizarea poate
fi realizata in C/C++ folosind functii. O functie reprezinta o colectie de declaratii si
instructiuni de sine statatoare care rezolva o anumita subproblema. Vom prezenta
mai departe modul de utilizare a functiilor (prototip, definire, parametri de intrare,
parametri de iesire, valoare returnata, apel) si vom clasifica functiile in functie de
utilizarea lor.
9.1 Generalitati
Forma generala a unui algoritm este urmatoarea:
date de intrare date de iesire
Algoritm
Figura 9.1
Cum o functie modeleaza un algoritm (subalgoritm), forma generala a unei
functii este data de:
Figura 9.2
Inainte de utilizarea unei functii, aceasta trebuie sa fie cunoscuta de catre
compilator. Acest lucru se poate realiza definind functia inainte de locul apelului.
A doua modalitate, folosita in acest material, este folosirea prototipurilor. Un
prototip reprezinta pentru o functie ceva similar declaratiei de variabila pentru o
variabila. Folosind un prototip vom descrie comportamentul functiei, fara a scrie
rezolvarea, altfel spus, vom descrie datele de intrare si cele de iesire din functie.
Forma generala a unui prototip al unei functii asociata algoritmului general din
figura 9.2 este:
- 118 -
Introducere in ANSI C++
tip_returnat nume_functie(lista_parametri);
sau, pe larg:
tip_returnat nume_functie(lista_parametri){
declaratii si instructiuni
}
Functie
Figura 9.3
Specificam lipsa valorii returnate folosind tipul de date void.
Prototipurile aasociate acestui caz sunt de forma:
void nume_functie(); sau
void nume_functie(void);
Observam ca, in cazul parametrilor, tipul void poate sa lipseasca. Daca in loc de
tip returnat nu scriem nimic, tipul returnat implicit este int.
Apelul functiei, pentru acest caz, va fi de forma:
nume_functie();
- 119 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void Mesaj(void);
int main(){
Mesaj();
}
void Mesaj(){
cout << "*******************" << endl;
cout << "* Bine ati venit! *" << endl;
cout << "*******************" << endl;
}
*******************
* Bine ati venit! *
*******************
P2. Realizati o functie care sterge ecranul prin trecerea la rand nou de 30 de
ori, apoi afisati, folosind o alta functie, un bradulet pe ecran.
- 120 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void Sterge();
void Bradulet();
int main(){
Sterge();
Bradulet();
}
void Sterge(){
int i;
for(i=1;i<=30;i++) cout << endl;
}
void Bradulet(){
cout << " * " << endl;
cout << " *** " << endl;
cout << " ***** " << endl;
cout << " ******* " << endl;
cout << " | " << endl;
}
*
***
*****
*******
|
Figura 9.4
Prototipul:
void nume_functie(lista_parametri);
iar apelul:
- 121 -
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:
#include <iostream>
using namespace std;
int main(){
afisare(2,7); // apel
}
246
int main(){
afisare(2,7); vf
}
Figura 9.5
- 122 -
Introducere in ANSI C++
int main(){
afisare(2,7);
} vf ? i
void afisare(int a, int b){ 7 b
2 a
int i;
...
}
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
int main(){
afisare(2,7);
} vf 8 i
void afisare(int a, int b){ 7 b
2 a
int i;
...
}
Figura 9.6
- 123 -
Introducere in ANSI C++
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.
- 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);
}
*
***
*****
|
*
***
*****
*******
*********
|
- 125 -
Introducere in ANSI C++
1
121
12321
....................
#include <iostream>
using namespace std;
void Spatii(int);
void Crescator(int);
void Descrescator(int);
void Piramida(int);
int main(){
Piramida(5);
}
1
121
12321
1234321
123454321
- 126 -
Introducere in ANSI C++
date de iesire
Functie
Figura 9.8
Prototipul:
tip_returnat nume_functie(); sau:
tip_returnat nume_functie(void); ,
P6. Realizati o functie care returneaza valoarea lui Pi cu doua zecimale exacte.
- 127 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
float Pi();
int main(){
cout << Pi();
}
float Pi(){
return 3.14;
}
3.14
P7. Realizati o functie care citeste de la tastatura valori intregi (<1000) pana la
intalnirea valorii 1000 si returneza minimul acestor valori.
#include <iostream>
using namespace std;
int max();
int main(){
cout << max();
}
int max(){
int X,mx;
return mx;
}
12 45 29 1000
45
- 128 -
Introducere in ANSI C++
Figura 9.9
Prototipul:
tip_returnat nume_functie(lista_parametri);
Exemple de apeluri:
var = nume_functie(lista_parametri); sau:
if (nume_functie(lista_parametri)==expresie) sau:
cout << nume_functie(lista_parametri)
• max(a,b)
• modul(a)
• min(a,b,c)
- 129 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b,c;
float x;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
cout << "c="; cin >>c;
cout << "max(" << a << "," << b << ")=" << max(a,b) <<
endl;
a=6
b=3
c=1
max(6,3)=3
|2|=2
min=2
- 130 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b;
cout << "a="; cin >> a;
cout << "b="; cin >> b;
cout << "sumac(" << a << ")=" << sumac(a) << endl;
cout << "sumadiv(" << a << ")=" << sumadiv(a) << endl;
cout << "primac(" << a << ")=" << primac(a) << endl;
cout << "fact(" << b << ")=" << fact(b) << endl;
}
a=5123
- 131 -
Introducere in ANSI C++
b=4
sumac(5123)=11
sumadiv(5123)=5280
primac(5123)=5
fact(4)=24
bool perfect(int); // verifica daca un numar este egal cu suma divizorilor sai
#include <iostream>
using namespace std;
bool prim(int);
bool perfect(int);
int sumad(int);
int main(){
int x;
cout << "x="; cin>>x;
for(S=0,d=1;d<=n/2;d++)
if (n%d==0) S+=d;
return S;
}
x=28
- 132 -
Introducere in ANSI C++
28 nu este prim
28 este perfect
P11. Folosind functii, afisati cel mai mare numar prim mai mic ca n (numar
intreg citit de la tastatura).
#include <iostream>
using namespace std;
bool prim(int);
int prim_mic(int);
int main(){
int x;
cout << "x="; cin>>x;
cout << "Cel mai mare numar prim mai mic ca " << x;
cout << " este " << prim_mic(x);
}
x=100
Cel mai mare numar prim mai mic ca 100 este 97
Figura 9.10
Vom prezenta in continuare doua variante de realizare.
- 133 -
Introducere in ANSI C++
O prima varianta este folosirea structurilor. Vom grupa sub numele unei
structuri datele care vor fi returnate de catre functie, iar prototipul va fi de forma:
nume_structura nume_functie(lista_parametri);
Apelul va fi de forma:
nume_structura var;
....
var = nume_functie(lista_parametri);
P12. Realizati o functie care calculeaza suma si produsul a doua numere reale.
- 134 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
struct doua_numere{
float suma;
float produs;
};
doua_numere sp(float,float);
int main(){
doua_numere a;
a=sp(3,5);
cout << a.suma << " " <<a.produs;
}
T.suma=a+b;
T.produs=a*b;
return T;
}
8 15
- 135 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
struct alte_doua_numere{
int min,max;
};
alte_doua_numere sp(int,int);
int main(){
alte_doua_numere a;
a=sp(6,2);
cout << a.min << " " <<a.max;
}
alte_doua_numere sp(int a, int b){
alte_doua_numere T;
T.min=(a<b)?a:b;
T.max= (a+b)-T.min;
return T;
}
2 6
- 136 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b;
interschimbare(a,b);
a=2
b=5
5 2
- 137 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a=11,b=12;
{ int a=5;
cout << a << " " <<b << endl;
// a din bloc si b din blocul main
{ int b=100;
cout << a << " " << b << endl;
// a din blocul exterior si b din blocul interior
}
}
{ int b=6;
cout << a << " " << b << endl;
// b din bloc si a din blocul main
}
5 12
5 100
11 6
- 138 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void f(){
int a=5; // locala in f
cout << a << " " << ::a << endl;
}
int main(){
int b=100; // locala in main
f();
cout << a << " " << b << endl;
}
5 2
2 100
- 139 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void Descrescator(int);
int main(){
int i; // i declarat local
for(i=1;i<=4;i++){
Descrescator(i);
cout << endl;
}
}
1
21
321
4321
#include <iostream>
using namespace std;
void Descrescator(int);
int main(){
// int i; // i declarat local
for(i=1;i<=4;i++){
Descrescator(i);
cout << endl;
}
}
1
1
- 140 -
Introducere in ANSI C++
.... (se intra in bucla infinita)
#include <iostream>
using namespace std;
int max(int,int);
int max(int,int,int);
int main(){
cout << max(2,5,1);
}
- 141 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void este(int);
void este(float);
void este(char);
int main(){
este(int(123));
este(float(3.14));
este(char('e'));
}
123 este un intreg
3.14 este un real
e este un caracter
...........
int main(){
este(123);
este(3.14);
este('e');
}
...........
am fi obtinut erori de compilare de forma:
p19.cpp: In function ‘int main()’:
p19.cpp:14: error: call of overloaded ‘este(double)’ is ambiguous
p19.cpp:6: note: candidates are: void este(int)
p19.cpp:7: note: void este(float)
p19.cpp:8: note: void este(char)
- 142 -
Introducere in ANSI C++
sau:
tip_ret nume_functie(param_initializati);
#include <iostream>
using namespace std;
int main(){
afisare(1,8,2);
afisare(1,8);// in acest caz ultimul parametru ca fi cel implicit
}
1 3 5 7
1 2 3 4 5 6 7 8
- 143 -
Introducere in ANSI C++
#include <iostream>
#include <values.h>
using namespace std;
int main(){
cout << max(5,2) << endl;
cout << max(1,5,8,3) << endl;
}
5
8
Apelul:
nume_functie(Vector, alti_parametri);
- 144 -
Introducere in ANSI C++
parametru.
• citire
• afisare
• suma elementelor
- 145 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a[100],n; // vectorul a de lungime efectiva n
int b[10],m;
initializare(a,n);
afisare(a,n);
citire(b,m);
cout << suma(b,m);
}
n=3
83 86 77
n=4
1 2 3 4
10
- 146 -
Introducere in ANSI C++
P23. Fie doi vectori reprezentand multimi de valori intregi. Realizati functii care
fac: intersectia, reuniunea, diferenta
#include <iostream>
using namespace std;
void afisare(int [],int);
void intersectia(int [], int, int [], int, int [], int&);
void reuniunea(int [], int, int [], int, int [], int&);
void diferenta(int [], int, int [], int, int [], int&);
bool este(int [],int,int);// verifica daca o valoare este sau nu intr-o
multime
int main(){
int a[]={2,4,8},n=3; // prima multime
int b[]={1,4,8,14},m=4; // a doua multime
int c[10],l;// multimea in care tine rezultatul operatiilor
intersectia(a,n,b,m,c,l); afisare(c,l);
reuniunea(a,n,b,m,c,l); afisare(c,l);
diferenta(a,n,b,m,c,l); afisare(c,l);
}
bool este(int a[],int n,int val){
int i;
for(i=0;i<n;i++)
if (a[i]==val) return true;
return false;
}
void intersectia(int a[], int n, int b[], int m, int c[], int&l){
int i;
l=0;
for(i=0;i<n;i++)
if (este(b,m,a[i])) c[l++]=a[i];
}
void reuniunea(int a[], int n, int b[], int m, int c[], int&l){
int i;
for(i=0;i<n;i++) c[i]=a[i]; // completam prima multime
l=n;
for(i=0;i<m;i++)
if (!este(a,n,b[i])) c[l++]=b[i];
}
void diferenta(int a[], int n, int b[], int m, int c[], int&l){
int i;
l=0;
for(i=0;i<n;i++)
if (!este(b,m,a[i])) c[l++]=a[i];
}
void afisare(int a[], int n){
cout << endl;
for(int i=0;i<n;i++) cout << a[i] << " ";
}
- 147 -
Introducere in ANSI C++
4 8
2 4 8 1 14
2
- 148 -
Introducere in ANSI C++
Capitolul 10 – Recursivitate
Numim functie recursiva o functie care se autoapeleaza (direct sau indirect).
...
... nume_functie(lista_parametri_actuali)
}
}
1, n = 0
Plecam de la formula recursiva de calcul n!= .
n ⋅ (n − 1)!, n > 0
Rescriind formula intr-o varianta mai apropiata de implementarea C/C++, avem:
- 149 -
Introducere in ANSI C++
1, n = 0
fact (n) =
n * fact (n − 1), n > 0
Trecerea la următorul program este naturala:
#include <iostream>
using namespace std;
long fact(int);
int main(){
int n;
cin >> n;
cout << n << "!=" << fact(n);
}
4
4!=24
- 150 -
Introducere in ANSI C++
long fact(3){
if(3==0) return 1;
return 3*fact(2);
} vf 3 n
long fact(2){
if(2==0) return 1;
Intrarea in recursivitate
Iesirea in recursivitate
return 2*fact(1);
vf 2 n
}
3 n
long fact(1){
if(1==0) return 1; 1 n
vf 2 n
return 1*fact(0); 3 n
}
long fact(0){ 0 n
1 n
if(0==0) return 1; vf 2 n
return n*fact(n-1); 3 n
}
Figura 10.1
- 151 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
long doila(int);
int main(){
int n;
cin >> n;
cout << "2^"<< n << "=" << doila(n);
}
3
2^3=8
P3. Calculati fibo(n) intr-o functie recursiva (cel de-al n-lea termen din sirul
lui Fibonacci). Cate apeluri recursive au avut loc?
#include <iostream>
using namespace std;
long fibo(int);
int nr_apeluri; // retinem numarul de apeluri ale functiei
int main(){
int n;
cin >> n;
nr_apeluri=0;
6
fibo(6)=8
Nr. apeluri:15
- 152 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
void invers();
int main(){
invers();
}
void invers(){
char c;
c=getchar();
if (c!='\n') invers();
cout << c;
}
abcd
dcba
- 153 -
Introducere in ANSI C++
P5. Calculati:
f x , y = x , pentru x≥y
g x , y−1 , pentru x y
unde
#include <iostream>
using namespace std;
int f(int,int);
int g(int,int);
int main(){
cout << f(5,20);
}
19
- 154 -
Introducere in ANSI C++
- 155 -
Introducere in ANSI C++
Capitolul 11 – Fisiere
Pana acum am citit datele de intrare de la tastatura, iar cele de iesire au fost
afisate pe ecran. Tastatura si ecranul reprezinta dispozitivele standard de intrare,
respectiv iesire.
stdin stdout
Algoritm
Figura 11.1
stdin stdout
35 Suma:
9 12 Algoritm 29
Figura 11.2
Functia care permite redirectarea stdin si stdout este freopen.
Pentru redirectarea intrarii avem:
freopen(nume_fisier, "r",stdin);
- 156 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b;
freopen("intrare.txt","r",stdin);
freopen("iesire.txt","w",stdout);
intrare.txt: 2 5
iesire.txt: 7
P2. Se citeste de la tastatura numele unui fisier care contine 10 numere intregi.
Afisati pe ecran suma lor.
#include <iostream>
using namespace std;
int main(){
int x,i,S;
char FileName[20];
cout << "Dati fisierul de intrare:"; cin >> FileName;
freopen(FileName,"r",stdin);
S=0;
for(i=1;i<=10;i++){
cin >> x;
S += x;
}
cout << S;
}
Dati fisierul de intrare:intrare.p02
55
- 157 -
Introducere in ANSI C++
respectiv:
ofstream flux_iesire; sau:
ofstream flux_iesire(nume_fisier);
Daca nu, sau daca dorim, la nu moment dat sa schimbat fiserul asociat cu o
anumita variabila flux, folosim apeluri de forma:
flux.open(nume_fisier);
In acest moment, daca fluxul este de intrare, fisierul este deschis si este
pozitionat la inceput, iar daca este de iesire, fiserul este deschis si eventualele date
existente sunt sterse.
Accesul la fluxuri de va face analog lucrului cu cin si cout, folosind operatorii
>> si <<:
flux_intrare >> variabila;
flux_iesire << expresie;
Citirea unei variabile va fi incheiata la intalnirea unui caracter alb (spatiu, enter,
tab), iar caracterele albe dintre doua variabile consecutive citite vor fi ignorate.
Daca dorim citirea unui sir de caractere, inclusiv spatii, vom folosi:
flux_intrare.getline(sir, nr);
Mai sus sir va fi sirul de caractere in care va fi realizata citirea, iar nr reprezinta
numarul maxim de caractere care va fi citit.
- 158 -
Introducere in ANSI C++
#include <fstream>
using namespace std;
int main(){
int a,b;
ifstream fin("intrare.txt");
ofstream fout("iesire.txt");
intrare.txt: 2 5
iesire.txt: 7
P4. Fisierul "intrare.p04" contine 5 nume de persoane, date pe cate un rand sub
forma nume prenume. Afisati pe ecran persoanele care au numele de patru
caractere.
#include <fstream>
#include <iostream>
using namespace std;
int main(){
int i;
char nume[20], prenume[20];
ifstream f("intrare.p04");
for(i=1;i<=5;i++){
f >> nume >> prenume;
if (strlen(nume)==4)
cout << nume << " " << prenume << endl;
}
intrare.p04: Voinea Mircea
Tica Silviu
Toth Haralambie
Ion Ion
Gheorghe Gheorghe
ecran:
Tica Silviu
- 159 -
Introducere in ANSI C++
Toth Haralambie
flux_intrare >> Nr_valori;
for(i=1;i<=Nr_valori;i++){
flux_intrare >> X;
foloseste(X);
}
#include <fstream>
using namespace std;
int main(){
int i,n,x;
ifstream fin("numere.p05");
ofstream fout("iesire.p05");
fin >> n;
for(i=1;i<=n;i++){
fin >> x;
fout << x << " ";
if (i%5==0) fout << endl;
}
numere.p05
8
1 2 3 4 1 2 3 4
iesire.p05
1 2 3 4 1
2 3 4
- 160 -
Introducere in ANSI C++
#include <fstream>
#include <iostream>
using namespace std;
int main(){
int i,j,n,x,a[10][10];
ifstream f("matrice.txt");
f >> n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
f >> a[i][j];
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout << a[i][j] << " ";
cout << endl;
}
}
matrice.txt
3
1 2 3
4 5 6
7 8 9
ecran
1 2 3
4 5 6
7 8 9
while (flux_intrare >> X)
foloseste(X);
- 161 -
Introducere in ANSI C++
Aceasta functie va returna true daca s-a ajuns la sfarsitul fluxului si false in caz
contrar. Vom avea:
while (!flux_intrare.eof()){
flux_intrare >> X;
foloseste(X);
}
P7. Se citeste numele unui fisier text de la tastatura. Realizati o copie a acestuia
in fiserul "copie.txt".
#include <fstream>
#include <iostream>
using namespace std;
int main(){
ifstream f;
ofstream g("copie.txt");
char FileName[20],linie[250];
cout << "Dati numele fisierului:"; cin >> FileName;
f.open(FileName);
while(!f.eof()){
f.getline(linie,250);
g << linie << endl;
}
}
- 162 -
Introducere in ANSI C++
#include <fstream>
using namespace std;
int main(){
ifstream f("intrare.p08");
ofstream g("frecv.p08");
char S[100];
int ct[256],i;
for(i=0;i<256;i++) ct[i]=0;
while(!f.eof()){
f.getline(S,100);
for(i=0;S[i];i++) ct[S[i]]++;
}
for(i=0;i<256;i++)
if (ct[i]) g << char(i) << " " << ct[i] << endl;
}
intrare.p08
abc abc
abc dede
ffffffffff
frecv.p08
2
a 3
b 3
c 3
d 2
e 2
f 10
- 163 -
Introducere in ANSI C++
- 164 -
Introducere in ANSI C++
Capitolul 12 – Pointeri
Accesul la o locatie de memorie folosita de program este realizata printr-o
adresa unica. Un pointer este o variabila care contine o adresa de memorie.
unde tip este un tip de data oarecare (int, float, tip definit de utilizator, etc.).
Pentru a utiliza valoarea care este memorata intr-o locatie indicata de un
pointer, se foloseste operatorul de redirectare *.
Semnul * poate sa insemne:
- 165 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a=1,b=2; // declararea variabilelor intregi a si b
int &copie_a = a; // copie_a este un alias al lui a
int *p,*q; // declararea pointerilor la intregi p si q
cout << &p << " " << &q << endl;
cout << &a << " " << p << " " << &b << " " << q<< endl;
cout << a << " " << *p << " " << b << " " << *q;
}
0x8048906
0xbff9eefc 0xbff9eef8
0xbff9ef04 0xbff9ef04 0xbff9ef00 0xbff9ef00
11 11 3 3
- 166 -
Introducere in ANSI C++
Figura 12.2
In acest moment, pointerii p si q vor avea valori valide, modificarea locatiilor de
memorie indicate ducand la modificarea valorii variabilelor a si b.
Desi pointerii se comporta similar unor variabile obisnuite (au o adresa asociata
in memorie, contin valori etc.), in urmatoarele figuri in care vor mai aparea
pointeri, acestia vor fi desenati ca in Figura 12.3, pentru a creste claritatea.
copie_a
b a
... 3 11 ...
q p
Figura 12.3
Incercarea de a asocia pointeri de un anumit tip cu adresele unor variabile de
tipuri diferite va duce la erori de compilare.
- 167 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,*p; // intreg si pointer la int
double b,*q; // intreg si pointer la double
p=&a;
q=&b;
La prima vedere, acest tip de pointer pare sa aiba un grad de utilizare redus. Cu
toate acestea, in combinatie cu operatorul de conversie explicita de tip (cast), ofera
o flexibilitate crescuta aplicatiilor noastre. Acest tip de pointer va putea indica
zone de memorie de dimensiune variabila (dimensiune data in cazul altor pointeri
de tipul de data indicat), ceea ce va duce la urmatoarea problema: dereferentierea
nu va putea fi facuta direct, fiind obligatoriei folosirea operatorului cast pentru a
specifica tipul indicat in acel moment de pointerul void.
- 168 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=1;
double d=12.34;
char c='a';
void *p;
cout << i << " " << d << " " << c << endl;
p=&i;
(*(int *)p)++;
p=&d;
(*(double *)p) = (*(double *)p)*3;
p=&c;
(*(char *)p) = 'b' ;
cout << i << " " << d << " " << c;
}
1 12.34 a
2 37.02 b
- 169 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int i=123;
p=&i;
q=&p;
t=&q;
123 123
Figura 12.4
12.2.1 Atribuirea
Operatorul = se comporta analog atribuirii dintre doua variabile oarecare. O
Expresie de forma:
p1 = p2 = ... = pn
va face ca pointerii p1, p2, ... , pn sa indice toti locatia de memorie indicata
initial de pn.
- 170 -
Introducere in ANSI C++
123 123
? ?
p1 p2 ... pn p1 p2 ... pn
Figura 12.5
Pointerii care apar in expresia de atribuire trebuie sa fie de acelasi tip. O situatie
aparte apare in cazul in care utilizam pointeri void, acestia putand retine valoarea
oricaror pointeri, indiferent de tipul lor de baza.
#include <iostream>
using namespace std;
int main(){
int i=123;
int *p1,*p2,*p3;
double *p4;
void *pv;
p3=&i;
p1=p2=p3;
pv=p1; // atribuire corecta
// p4=p1; // eroare la compilare (pointerii nu au acelasi tip)
cout << i << " " << *p1 << " " << *p2 << " ";
cout << *p3 << " " << *((int *)pv);
}
123 123 123 123 123
P6. Afisati locatia cea mai mica si locatia cea mai mare de memorie alocate in
- 171 -
Introducere in ANSI C++
program.
#include <iostream>
using namespace std;
int main(){
double a;
int b;
int *q;
void *p, *pmic, *pmare;
cout << &a << " "<< &b << " "<< &q << " ";
cout << &p << " "<< &pmic << " "<< &pmare << endl;
pmic=pmare=&a;
q=&b;
if (pmic<q) pmic=q; // comparatie dintre doi pointer
de tipuri diferite
if (pmare>=q) pmare=q;
pmic=(&pmic<pmic)?p:pmic; pmare=(&pmic>pmare)?&pmic:pmare;
// comparatie dintre un pointer si o referentiere
0xbff6f618 0xbff6f614 0xbff6f610 0xbff6f60c 0xbff6f608 0xbff6f604
0xbff6f604 0xbff6f614
Observatii:
– pointerii sunt alocati in memorie ca orice alta variabila; adresa cea mai
mica este data de pointerul in care retinem adresa cea mai mare :)
- 172 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int a,b;
int *p=&a,*q=&b;
p++;
q=q+10;
cout << p << " " << q << endl;
--p;
q-=10;
cout << p << " " << q << endl;
0xbfcb90ac 0xbfcb90a8
0xbfcb90b0 0xbfcb90d0
0xbfcb90ac 0xbfcb90a8
- 173 -
Introducere in ANSI C++
- 174 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int *p,*q;
delete p; delete q;
}
else
cout << "Eroare la alocare!";
}
2
3
2+3=5
- 175 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
struct complex{
float re,im;
};
int main(){
complex z,*p;
z.re=2; z.im=-1;
p=&z;
z= 2 1*i
A este un pointer la primul intreg din vector. Faptul ca A este un pointer constant
implica faptul ca acesta nu va putea fi modificat in program. Figura 12.6 ilustreaza
o situatie posibila in memorie in cazul declaratiei anterioare.
10 intregi
? ? ? ? ? ... ?
A
Figura 12.6
A fiind un pointer, *A va reprezenta valoarea primului element, notatiile A[0] si
*A fiind echivalente. Folosind aritmetica pointerilor si faptul ca A este pointer la
primul element, accesul la elementele tabloului va putea fi realizat intr-o varietate
de forme, ca in Figura 12.7:
- 176 -
Introducere in ANSI C++
10 intregi
? ? ? ? ? ... ?
#include <iostream>
using namespace std;
int main(){
int A[10]={11,12,13,14,15,16};
int *p;
p=A+5;
cout << "A:" << *A << " " << A[1] << " ";
cout << *(A+2) << " " << *(3+A) << " ";
cout << 4[A] << " " << *p << " ";
A:11 12 13 14 15 16
for(p=A;pA<n;p++)
foloseste(*p);
sf=A+n; // sau sf=&A[n];
for(p=A;p<sf;p++)
foloseste(*p);
- 177 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[10],n;
int B[10],m;
n=5;
init(A,n);
citeste(B,m);
afiseaza(A,n);
afiseaza(B,m);
}
sf=A+n;
for(p=A;p<sf;p++)
cin >> *p;
}
n=3
10 20 30
3 6 7 5 3
10 20 30
- 178 -
Introducere in ANSI C++
cin >> n;
A= new tip[n];
foloseste(A,n);
delete []A;
- 179 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int *A,n;
init(A,n);
afiseaza(A,n);
rezolva(A,n);
afiseaza(A,n);
delete []A;
}
n=10
1 0 1 1 1 1 0 0 1 1
0 0 0 1 1 1 1 1 1 1
- 180 -
Introducere in ANSI C++
...
...
...
Figura 12.8
- 181 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[10][10],n,i;
init(A,n);
afis(A,n);
for(i=0;i<n;i++) sort(A[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
- 182 -
Introducere in ANSI C++
#include <iostream>
#include <string>
using namespace std;
int main(){
char Zi[7][10]={"luni", "marti", "miercuri", "joi",
"vineri", "sambata", "duminica"};
afis(Zi);
sort(Zi);
afis(Zi);
luni marti miercuri joi vineri sambata duminica
duminica joi luni marti miercuri sambata vineri
- 183 -
Introducere in ANSI C++
si
tip_returnat nume_functie(..., tip &p, ...){
foloseste(p);
}
- 184 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int x=1,y=2;
cout << x << " " << y << endl;
inter(&x,&y);
cout << x << " " << y << endl;
}
1 2
2 1
#include <iostream>
using namespace std;
int main(){
int x=1,y=2;
int *p=&x, *q=&y;
inter(p,q);
cout << *p << " " << *q << endl;
}
1 2
2 1
- 185 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int x=1,y=2;
int *p=&x, *q=&y;
inter(&p,&q);
cout << *p << " " << *q << endl;
}
1 2
2 1
P18. Realizati o functie care, primind ca parametri doi vectori alocati static si
lungimile acestora, realizeaza interschimbarea lor (ca si continut).
- 186 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[10]={1,2,3,4},n=4, B[10]={10,20,30},m=3;
inter(A,n,B,&m);
A:1 2 3 4
B:10 20 30
A:10 20 30
B:1 2 3 4
P19. Realizati o functie care, primind ca parametri doi vectori alocati dinamic si
lungimile acestora, realizeaza interschimbarea lor (ca si continut).
- 187 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int *A=new int[4],n=4, *B=new int[3],m=3;
inter(A,n,B,m);
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, nefiind necesare mutarea in
memorie a elementelor tablourilor, simpla interschimbare a pointerilor
reprezentand vectorii si a lungimii acestora fiind suficienta. Din nou este de
remarcat folosirea referintelor la pointeri!
- 188 -
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.
#include <iostream>
using namespace std;
int main(){
int *A,n;
A=creare(n);
cout << "A:"; afis(A,n);
stergere(A,n);
}
5
1 2 3 4 5
A:1 2 3 4 5
P21. Afisati prima linie dintr-o matrice patratica ce contine cel putin o valoare
nula (se stie ca matricea contine cel putin un zero).
- 189 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
int A[4][4]={{1,2,3,4},
{2,3,4,5},
{1,2,0,3},
{0,1,0,2}},n=4;
afis(prima(A,n),n);
}
1 2 0 3
- 190 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int dublu(int);
int triplu(int);
int main(){
int (* p)(int); // declaratie pointer la functie
20 30
#include <iostream>
#include <cmath>
using namespace std;
double calcul(double,double);
void afisare(char *, double (* )(double), double);
void afisare(char *, double (* )(double,double), double,double);
int main(){
afisare("sin",sin,0);
afisare("pow",pow,2,3);
afisare("functia mea", calcul, 2,3);
}
sin(0)=0
- 191 -
Introducere in ANSI C++
pow(2,3)=8
functia mea(2,3)=13
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int i,x;
Tip_pointer_functie p[4]={sin,cos,tan,abs};
x sin cos tan abs
0 0 1 0 0
10 0.54 0.84 0.65 10
20 0.91 0.41 2.2 20
30 0.99 0.15 6.4 30
unde lista_parametri contine cel putin un parametru, iar cele trei puncte
"anunta" compilatorul ca s-ar putea sa mai apara si alti parametri.
Compilatorul nu poate face nici un fel de verificare asupra parametrilor
- 192 -
Introducere in ANSI C++
...
...
... parametri
... necunoscuti
...
pn
parametri
p2 cunoscuti
p1
Figura 12.9
Conform observatiilor anterioare, situatie memorie este:
p1 p2 pn ... ...
parametri parametri
cunoscuti necunoscuti
Figura 12.10
Observam ca parametri necunoscuti se gasesc la adrese imediat urmatoare
ultimului parametru cunoscut, deci, daca se poate determina la rulare numarul si
tipul parametrilor necunoscuti (prin informatii date de parametri cunoscuti), acestia
vor putea fi accesati folosind pointeri.
- 193 -
Introducere in ANSI C++
#include <iostream>
using namespace std;
int main(){
t=&op;
t++;
p=(int *) t; // pozitionam p pe primul parametru necunoscut
return E;
}
10
15
11403253
Observatii:
– compilatorul nu poate verifica daca functia a fost corect apelata, dupa cum
se vede la ultimul apel, unde lipseste un parametru
– in acest caz folosim o valoare oarecare, un interg care este peste varful
stivei!
- 194 -
Introducere in ANSI C++
tip_returnat nume(int nr, ...){
tip *p=&nr;
for(int i=1;i<=nr;i++)
foloseste(p[i]);
}
#include <iostream>
using namespace std;
int main(){
p=&nr;
S=0;
for(i=1;i<=nr;i++) S+=p[i];
return S;
}
10
3
- 195 -
Introducere in ANSI C++
– un vector de intregi
– lungimea vectorului
si returneaza valoare minima atinsa de functia f pentru parametri fiind valorile din
vector.
- 196 -
Introducere in ANSI C++
Anexe
Shortcut Efect
F1 - help
^F1 - help context sensitive
- va da informatii despre cuvantul pe care se gaseste in acel
moment cursorul de editare
F2 - save
- la prima salvare se deschide fereastra save as...
F3 - open
- permite deschiderea unei text sursa salvat anterior
alt+F3 - close
- inchide fereastra curenta
F5 - maximizare fereastra curenta
alt+F5 - afisarea ferestrei output
- in acest mod putem vizualiza rezultatele afisate pe ecran
F6 - navigare intre ferestre
F10 - intrare in meniuri
- navigarea prin meniuri se face cu cursorii si tasta Enter
pentru selectare
^F9 - rularea programului
Tabelul A1 – Shortcut-uri generale
- 197 -
Introducere in ANSI C++
Shortcut Efect
Shift + Cursori - selectare text
^Insert - copy
- este copiata in clipboard zona selectata
Shift + Insert - paste
- copiere din clipboard la pozitia cursorului
- 198 -
Introducere in ANSI C++
- 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:
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);
. . .
}
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[]);
- 201 -
Introducere in ANSI C++
nz_aparitii++;
printf(“valori diferite de zero sunt %d\n”,z_aparitii);
}
- 202 -
Introducere in ANSI C++
numar = 0;
sau:
if (numar < 0) {
numar = 0;
}
- 203 -
Introducere in ANSI C++
if (numitor < 0) {
printf(“Numitor negativ!”);
numitor = numitor;
}
else
printf(“Totul e OK”);
si:
if (numitor < 0) {
printf(“Numitor negativ!”);
numitor = numitor;
}
else {
printf(“Totul e OK”);
}
- 204 -
Introducere in ANSI C++
sau:
i=0;
while ( (vector[i++]<0) && (i<numar_elemente) ) {
;
}
- 205 -
Introducere in ANSI C++
i = 0;
while ((i<numar_elemente) && (vector[i] != valoare_cautata)) i++;
i = 0;
while ((i<numar_elemente) && (vector[i] != valoare_cautata))
i++;
i = 0;
while ((i<numar_elemente) && (vector[i] != valoare_cautata)) {
i++;
}
sau:
i = 1;
do
i++;
while ((i< numar_elemente)&&(a[i]<0));
sau:
i = 1;
do {
i++;
} while ((i< numar_elemente)&&(a[i]<0));
- 206 -
Introducere in ANSI C++
Este de preferat ultima varianta, while la inceput de rand putand duce la confuzii.
[1] printf("\nIntroduceti cinci numare intregi pozitive\n");
[1] for (i=1; i<=5; i++) {
[2] scanf("%d",&numar);
[2] if (numar>0)
[3] suma += numar;
[2] else {
[3] suma = numar;
[1] }
[1] printf("\nSuma este:%d\n”,suma );
[0] }
- 207 -
Introducere in ANSI C++
printf(“Foarte Bine”);
else if (nota >= 8)
printf(“Bine”);
else if (score >= 7)
printf(“OK”);
else if (score >= 6)
printf(“Satisfacator”);
else if (score >= 5)
printf(“La limita”);
else
printf(“Nasol”);
A4 Precedenta operatorilor
Leftto
1 :: scope
right
() [] . > ++
dynamic_cast static_cast Leftto
2 postfix
reinterpret_cast right
const_cast typeid
++ ~ ! sizeof new
unary (prefix)
delete
Right
3 indirection and
* & toleft
reference (pointers)
+ unary sign operator
Right
4 (type) type casting
toleft
Leftto
5 .* >* pointertomember
right
Leftto
6 * / % multiplicative
right
Leftto
7 + additive
right
Leftto
8 << >> shift
right
- 208 -
Introducere in ANSI C++
Leftto
9 < > <= >= relational
right
Leftto
10 == != equality
right
Leftto
11 & bitwise AND
right
Leftto
12 ^ bitwise XOR
right
Leftto
13 | bitwise OR
right
Leftto
14 && logical AND
right
Leftto
15 || logical OR
right
Right
16 ?: conditional
toleft
= *= /= %= += = >>= <<= Right
17 assignment
&= ^= != toleft
Leftto
18 , comma
right
A5 Cuvintele cheie
Lista cu cuvintele cheia ANSI C++ este:
and, and_eq, asm, auto, bitand, bitor, bool, break, case, catch,
char, class, compl, const, const_cast, continue, default, delete, do,
double, dynamic_cast, else, enum, explicit, export, extern, false,
float, for, friend, goto, if, inline, int, long, mutable, namespace,
new, not, not_eq, operator, or, or_eq, private, protected, public,
register, reinterpret_cast, return, short, signed, sizeof, static,
static_cast, struct, switch, template, this, throw, true, try,
typedef, typeid, typename, union, unsigned, using, virtual, void,
volatile, wchar_t, while, xor, xor_eq
- 209 -
Introducere in ANSI C++
Bibliografie
[1] Kris Jamsa, Lars Klander - „Totul despre C si C++”, editura Teora, 2001
[2] Bjarne Stroustrup – „C++”, editura Teora, 2003
[3] Breazu Macarie – „Programarea Orientata pe Obiecte – Principii”, editura
ULBS, 2002
[4] Bogdan Patrut - „Aplicatii in C si C++”, editura Teora, 2001
[5] Dragos Acostachioaie - „Programare C si C++ sub Linux”, Editura Polirom,
2002
[6] Thomas H. Cormen, Charles E. Leiserson, Ronald R.Rovest - „Introducere
in algoritmi”, editura Agora, 2000
[7] Carmen Popescu - „Culegere de probleme de informatica”, editura Donaris,
2002
- 210 -
Introducere in ANSI C++
Cuprins
Introducere...............................................................................................................1
Capitolul 1 – Primul program................................................................................2
1.1 Structura generala a unui program C++.........................................................2
1.2 Hi man!.........................................................................................................3
1.3 Compilarea si rularea programului................................................................4
1.3.1 In mediul Borland C++ 3.1...................................................................4
1.3.2 Folosind compilatorul g++....................................................................5
Capitolul 2 – Notiuni de baza.................................................................................6
2.1 Notiunea de algoritm......................................................................................6
2.2 Citirea si afisarea datelor...............................................................................7
2.3 Tipuri de date. Variabile si constante............................................................9
2.4 Secvente escape............................................................................................14
2.5 Referinte (alias-uri)......................................................................................16
2.6 Probleme propuse.........................................................................................17
Capitolul 3 – Expresii C++....................................................................................18
3.1 Atribuirea.....................................................................................................18
3.2 Conversii de tip............................................................................................20
3.3 Expresii aritmetice.......................................................................................23
3.4 Expresii logice.............................................................................................25
3.5 Operatorul conditional.................................................................................27
3.6 Operatorul virgula........................................................................................30
3.7 Operatori care actioneaza la nivel de bit......................................................31
3.8 Probleme propuse.........................................................................................32
Capitolul 4 – Instructiuni conditionale................................................................33
4.1 Instructiunea if.............................................................................................33
4.2 Instructiunea switch.....................................................................................40
4.3 Probleme propuse.........................................................................................43
Capitolul 5 – Instructiuni repetitive.....................................................................44
5.1 Instructiunea while.......................................................................................44
5.2 Instructiunea do-while.................................................................................47
5.3 Instructiunea for...........................................................................................49
- 211 -
Introducere in ANSI C++
- 212 -
Introducere in ANSI C++
- 213 -
Introducere in ANSI C++
- 214 -