Documente Academic
Documente Profesional
Documente Cultură
Introducere
-1-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 1/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
# 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-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 2/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
int main(){ // linia 2
printf("Hi man!"); // linia 3
} // linia 4
ecran.
-3-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 3/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
int main(){ // linia 2
cout << "Hi man!"; // linia 3
} // linia 4
int main(){ // linia 2
// linia 3
} std::cout << "Hi man!"; // linia 4
-4-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 4/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 5/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Rezolvarea
Date de intrare Date de iesire
problemei
Inainte de a incepe rezolvarea problemei trebuie sa ne fie clar care sunt datele
initiale de la care se pleca, respectiv ce anume se cere. In acest caz, datele de
intrare sunt reprezentate de catre a si b, iar data de iesire va fi S, care respecta
datele problemei (adica S=a+b).
-6-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 6/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Algortimul este:
Date de intrare (a,b)
citeste a si b
Rezolvarea problemei
S=a+b
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-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 7/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 8/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Algorimii
Datele cu carelucreaza
lucreazacualgoritmii
date. In exemplul cu suma, datele
au ca si corespondent de lucru
in C++ au fost a,b
constantele si si S.
variabilele. Fiecare constanta sau variabila din C++ are asociata un tip.
Tipurile fundamentale ale C++ sunt prezentate in Tabelul 2.1:
-9-
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 9/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
-pozitive
prin disparitia semnului, este dublat numarul de valori
de memorat
short - reduce intervalul de reprezentare
long - mareste intervalul de reprezentare
Tabelul 2.2 – Modificatorii de tip
Tipurile de date sunt folosite pentru a defini variabilele cu care dorim sa lucram
in program.
Pe langa constantele prezentate in Tabelul 2.1, vom folosi si constante de tip sir
de caractere, reprezentand succesiuni de caractere cuprinse intre ghilimele.
Exemplu de siruri de caractere pot fi: ”ABC”, ”Sunt un sir de caractere!”,
”1+2=3”.
Prin variabila intelegem o entitate capabila sa-si modifice valoarea. In C++,
inainte de a folosi o variabila, aceasta trebuie declarata. Forma generala a unei
declaratii este:
tip nume; sau:
tip v1, v2, ..., vn;
- 10 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 10/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
cout << "Sunt caracterul: " << c << endl;
cout << "Sunt intregul: " << i << endl;
cout << "Sunt intregul mare: " << l << endl;
cout << "Sunt intregul fara semn: " << u << endl;
cout << "Sunt intregul mare fara semn: " << U << endl;
cout << "Sunt numarul real: " << f << endl;
cout << "Numar real (da' mai mare, daca vreau): "<<d<< endl;
}
- 11 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 11/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
in memoria calculatorului.
P4. Verificati cat ocupa in memoria calculatorului dumneavoastra diverse tipuri
de date.
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 12/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
#include <iostream>
using namespace std;
int main(){
int a,b,c,E; // declararea variabilelor
cout << endl; // trecem la rand nou
cout << "a="; // scriem un mesaj ajutator
cin >>a; // citim prima variabila
- 13 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 13/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
\b
- backspace
\a - sunet de alerta
\nnn - nnn reprezinta un cod ASCII in baza 8
Tabelul 2.3 – Secvente escape
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 14/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 15/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
C/C++ permite definirea unor alias-uri ale variabilelor. Forma generala este:
tip a;
tip &porecla=a;
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
cout << "Sunt variabila a:" << a << endl;
cout << "Sunt tot variabila a:" << copie_a << endl;
cout << "Sunt a, si mi se spune:" << porecla << endl;
}
- 16 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 16/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 17 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 17/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 18/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 19/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Este posibil
rezultatul, cacare
caz in tipuleste
expresiei sa nu
realizata fie identicimplicita
o conversie cu tipul de
variabilei
tip si, inunde
unelememoram
cazuri,
vom avea un avertisment la compilare. In general, conversia de tip este realizata
fara probleme daca variabila si expresia sunt ambele de tip intreg (int, char, long
etc.) sau de tip real (float, double etc.), iar variabila este reprezentata pe un numar
egal sau mai mare de octeti decat rezultatul expresiei.
In urmatoare doua exemple vom evidentia cele doua cazuri de conversie
implicita.
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 20/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 21/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 22/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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)
- 23 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 23/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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";
}
++variabila
variabila--
variabila--
- 24 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 24/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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";
}
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 25/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
= diferit 2 =3
== egal 3==3
Diferite expresii logice pot fi reunite folosind operatorii logici din Tabelul 3.2.
- 26 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 26/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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);
}
returneaza expresie . 3
- 27 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 27/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 28/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 29/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 30/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 31 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 31/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Pp1. Se expresiei
rezultatul citeste un(x-1)/x
numar2 real
. x, strict pozitiv, de la tastatura. Calculati si afisati
Pp2. Se citeste un numar real de la tastatura. Folosind conversii de tip, afisati
partea fractionara a numarului.
Pp3. Se citesc doua numere a si b de la tastatura, valori intregi strict pozitive.
Afisati rezultatul expresiei E(a,b)=(a-b)/(a+b).
Pp4. Folosind operatorul conditional, determinati minimul a doua valori intregi
citite de la tastatura.
Pp5. Se citeste un numar real x de la tastatura. Folosind operatorul conditional,
calculati si afisati rezultatul expresiei E(a)=max(min(a,7),|a-7|).
Pp6. Se citesc trei numere intregi de la tastatura. Afisati valoarea "din mijloc",
adica valoarea care nu este nici minimul, nici maximul celor trei valori date.
Pp7. Se citesc trei numere intregi de la tastatura. Afisati pe ecran suma celor mai
mici doua valori.
- 32 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 32/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Daca dorim executia unor instructiuni doar daca o conditie este adevarata sau
daca dorim ramificarea executiei programului, folosim instructiuni conditionale.
else instructiune2
executa instructiune . 2
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 33/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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)
else cout
cout <<<<
a a
<<<< " este
" este nenul.";
nul.";
}
a=123
123 este nenul.
- 34 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 34/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 35/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
cout << "min("<<a<<","<<b<<","<<c<<")="<<min;
cout << "\nmax("<<a<<","<<b<<","<<c<<")="<<max;
}
a=2
b=3
c=1
min(2,3,1)=1
max(2,3,1)=3
- 36 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 36/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
std;
using namespace
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";
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 37/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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";
}
- 38 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 38/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
progresie = (2*b==a+c); // verificam daca primele trei
formeaza o progresie
progresie = progresie && (2*c==b+d); // acum
urmatoarele...
if (progresie){
cout << "Numerele citite sunt in progresie\n";
cout << "aritmetica, cu ratia: " << b-a;
}
else
cout << "Nu avem o progresie aritmetica";
}
x pentru x ∈[ 10,20 ]
f x =− x pentru x ∈−20,0
0 in rest
- 39 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 39/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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
. . .
default: instructiune;
- 40 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 40/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- daca dupa executarea unei secvente dorim iesirea din switch, se foloseste
instructiunea break
Cum de obicei se intampla acest lucru, forma generala devine:
switch (expresie){
. . .
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 41/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
a=2
b=4
operator:/
2/4=0.5
#include <iostream>
using namespace std;
int main(){
int prima_zi, zi;
cout << "Ziua corespunzatoare datei de 1 a lunii:"; cin
>>prima_zi;
cout << "Data de verificat:"; cin >> zi;
zi=(zi+prima_zi-1)%7;
- 42 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 42/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Pp1instructiunii
locul . Dati un exemplu
if. de problema in care expresia conditionala nu poate tine
Pp2. Calculati:
- 43 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 43/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Daca dorim executia unor instructiuni de mai multe ori, in functie de o conditie,
folosim instructiunile repetitive. Acestea sunt while, do-while si for.
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 44/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
std;
using namespace
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)
• 1 0 1 0 1 ... - n valori
- 45 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 45/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int i,a,b,n;
float pas,k;
cout << "n="; cin >>n;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
i=1;
while (i<=n){
cout << i<< " ";
i=2*i;
}
cout << endl;
i=a;
while (i<=b){
cout << i << " ";
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 46/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
instructiune;
while (expresie);
- 47 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 47/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Figura 5.1
P4. Se citesc de la tastatura doua caractere. Afisati pe ecran caracterele si
codurilor lor ASCII din intervalul dat de catre caracterele citite.
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 48/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 49/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- se executa instructiune
- se executa reinit
– 1,2,3,...,10
#include <iostream>
using namespace std;
int main(){
int n,a,b,i,p;
cin >> n >> a >> b;
for(i=1;i<=10;i++) cout << i << " ";
cout << endl;
for(i=n;i>=-n;i--) cout << i << " ";
cout << endl;
5 3 8
1 2 3 4 5 6 7 8 9 10
- 50 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 50/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
for(i=1;i<=n;i++) cout << i%2 << " ";
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
- 51 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 51/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
P8 . Afisati urmatoarele serii de numere pe ecran:
• 1 9 2 8 3 7 ... 9 1
#include <iostream>
using namespace std;
int main(){
int n,i,j,p;
cout << "n="; cin >> n;
for(i=1,j=9; i<10 ;i++,j--)
cout << i << " " << j << " ";
cout << endl;
for(i=1,p=1; i<=n; i++,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
PutemInfolosi,
diferite. in cadrul
plus, toate instructiunii
partile for,optionale,
din for sunt mai multiurmatoarea
contori, eventual de tipuri
bucla fiind bucla
infinita:
for(;;);
- 52 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 52/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 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
................
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 53/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 54/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Trecerea
se poate fluxului
realiza de executie lagoto
prin instructiunea o pozitie
. oarecare, identificata printr-o eticheta
Chiar nu
acesteia daca
esteeste o instructiune
recomandata, pusa lainstructiunilor
folosirea dispozitie in cadrul limbajului C, folosirea
if, if-else si while
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 55/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
In acest subcapitol
instruciuni vom prezenta
repetitive. Vom prezenta oo serie
serie de
de algoritmi ce vor fi rezolvati
"scheme generale" folosind
de rezolvari de
algoritmi. Aceste scheme sunt reguli de forma: "daca o problema suna asa,
rezolvarea este, de obicei, cam asa".
1234 10
1230 123
4
n%10 n/10
Figura 5.3
De aici obtinem urmatoarele:
- 56 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 56/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
}
// for(;n;n/=10) cout << n%10 << endl;
}
n=1942
2
4
9
1
- 57 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 57/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 58/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
}
if (prim) cout << n << " este prim\n";
else cout << n << " nu este prim\n";
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 59/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 60/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
4 11
60 24 1.18654
- 61 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 61/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 62/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int n,d,S,ct,i;
bool prim;
cout << "n="; cin >> n;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 63/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 64/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
• 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;
}
cout << max << " " << P;
}
5
1 1 5 2 1
5 10
- 65 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 65/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
#include <values.h>
using namespace std;
int main(){
int x,i,min,ct_min,S;
min=MAXINT; ct_min=0; S=0;
cin >> x;
while (x!=0){
if (x%2==0) S=S+x;
if (x==min) ct_min++;
else if (x<min){
min=x;
ct_min=1;
}
cin >> x;
}
cout << S << endl;
cout << min << " apare de " << ct_min << " ori";
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 66/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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
12 32 1 .... 34567
.................... 6: 1,2,3,6 – numarul urmat de divizori 45678
1 ................ 1 ...... 5 6 7 8 9 (n=5)
- 67 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 67/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 68/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
1 1:1 10101
212 2:2,2 01010
32 12 3 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:
– cel mai mare si cel mai mic numar prim
– suma numerelor care au cifrele in ordine crescatoare
- 69 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 69/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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";
- 70 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 70/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
1 2 3 4 ? ... ?
A[9]=A[1]+A[2]+A[3];
- 71 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 71/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int A[5];
cout << "Dati elementele vectorului A:";
cin >> A[0] >> A[1] >> A[2] >> A[3] >> A[4];
cout << "A: " << A[4] << " " << A[3] << " ";
cout << A[2] << " " << A[1] << " " << A[0];
}
Pentru
indici a rezolva
constanti, vomaceste
folosisituatii, in loccasaindice.
o variabila accesam valorile
Accesul din vector folosind
la elementele vectorului
se va face folosind o notatie de forma A[i], unde i va fi o valoare intrega ce
reprezinta un indice valid in vector, adica o valoare din multimea {0,1,...,n-1}.
Citirea unui element va fi de forma:
cin >> A[i];
- 72 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 72/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
cout << "Dati elementele vectorului A:";
for(i=0;i<5;i++) cin >> A[i];
cout << "A: ";
(i=4;i>=0;i--) cout << A[i] << " ";
for
}
#include <iostream>
using namespace std;
int main(){
int A[100],n,i;// vectorul si lungimea curenta (0<= n <=100)
cin >>n; // citim lungimea vectorului
for(i=0;i<n;i++)
cin >> A[i]; // apoi vectorul, element cu element
for(i=0;i<n;i++)
cout << A[i] << " "; // afisarea, element cu element
}
4
3 4 1 2
3 4 1 2
- 73 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 73/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int A[100],n;
int i;
cout << "n="; cin >>n;
for(i=0;i<n;i++){
cout << "A[" << i << "]=";
cin >> A[i];
}
cout << "A=(";
for(i=0;i<n-1;i++)
cout << A[i] << ",";
cout << A[n-1] << ")";
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 74/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Uneori elementele
construite in functie devectorilor nu vor fi valori
enunt. Urmatoarele cititeilustreaza
exemple de la tastatura
catevacicazuri
valori mai
des intalnite in practica.
In problema urmatoare exploatam relatia dintre indicele si valoarea memorata
pe pozitia respectiva:
P6 . Se citeste de la tastatura un numar intreg 1<=n<=100. Generati si afisati
pe ecran urmatorii vectori de lungime n.
A: 1,2,3,4,...
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;
cout << "n="; cin >>n;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 75/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
A: 1,2,3,4,...
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];
cout << "n="; cin >>n;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 76/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
P8 . Generati un vector de lungime citita de la tastatura, continand valori
aleatoare in intervalul [a,b], a<b, numere pozitive.
#include <iostream>
using namespace std;
int main(){
int A[100],n;
int i,a,b;
cout << "n="; cin >>n;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
for(i=0;i<n;i++) A[i]=a + rand()%(b-a+1);
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 77/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
std;
using namespace
int main(){
int A[100],n,i;
int S,P;
cout << "n="; cin >>n;
for(i=0;i<n;i++) cin >> A[i];
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 78/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
#include <values.h>
using namespace std;
int main(){
int A[20],n,i;
float E;
int F,max;
cout << "n="; cin >>n;
for(i=0;i<2*n;i++) A[i]=1+rand()%10;
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;
}
cout << "Vectorul:";
for(i=0;i<2*n;i++)
cout << A[i] << " ";
cout << "\nE: " << E;
cout << "\nF: " << F;
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 79/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,j;
bool cresc, fibo, sim;
cout << "n="; cin >>n;
for(i=0;i<n;i++) cin >> A[i];
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;
cout << "Vectorul dat ";
if (!cresc) cout << "nu ";
cout << "este crescator, ";
if (!fibo) cout << "nu ";
cout << "este Fibonacci, ";
if (!sim) cout << "nu ";
cout << "este simetric.";
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 80/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Problema
incat sortarii ounui
ele sa respecte vector,
relatie este problema
de ordine reasezarii
(crescatoare). elementelor
Problema in asa fel
este bine
reprezentata in literatura de specialitate (vezi [1], [4], [6], [8]). Prezentam in
continuare trei metode de sortare consacrate.
P12. Sortarea prin selectie
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,j,t;
cout << "n="; cin >>n;
for(i=0;i<n;i++) cin >> A[i];
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;
}
cout << "Vectorul sortat: " ;
for(i=0;i<n;i++) cout << A[i] << " ";
}
n=5
2 4 5 1 3
Vectorul sortat: 1 2 3 4 5
- 81 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 81/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
std;
using namespace
int main(){
int A[100],n,i,k,t;
cout << "n="; cin >>n;
for(i=0;i<n;i++) cin >> A[i];
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;
}
cout << "Vectorul sortat: " ;
for(i=0;i<n;i++) cout << A[i] << " ";
}
n=5
2 4 5 1 3
Vectorul sortat: 1 2 3 4 5
- 82 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 82/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Pentru a putea aplica sortarea prin numarare, se stie ca intervalul in care A[i]
poare lua valori este de forma [0,m], cu m cunoscut si nu foarte mare. Pentru
problema noastra am considerat m=10.
#include <iostream>
using namespace std;
int main(){
int A[100],n,i,k,j;
int ct[100];
cout << "n="; cin >>n;
for(i=0;i<n;i++) A[i]=rand()%10;
cout << "Vectorul initial: ";
for(i=0;i<n;i++) cout << A[i] << " ";
// contorizarea valorilor din vector
for(i=0;i<10;i++) ct[i]=0;
for(i=0;i<n;i++) ct[A[i]]++;
// completarea valorilor in vector
i=0;
for(k=0;k<10;k++)
for(j=1;j<=ct[k];j++)
A[i++]=k;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 83/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 84/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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";
}
- 85 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 85/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Figura 6.3
P17 . Se citeste o matrice de la tastatura. Afisati matricea.
#include <iostream>
using namespace std;
int main(){
int A[10][10],n,m,i,j;
cout << "n=";cin >>n;
cout << "m=";cin >>m;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
cout << "A[" << i<< "][" << j << "]=";
cin >> A[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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 86/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 87/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
3 3 3 3 1 0 1 0 9 10 11 12
4 4 4 4 0 1 0 1 13 14 15 16
#include <iostream>
using namespace std;
int main(){
int A[10][10], B[10][10], C[10][10];
int n,m,i,j,v;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 88/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
i 1
-
= n
=
=
j =
j
i +
i<j
i+j>n-1
Figura 6.4
P20. Completati o matrice sub forma:
1 2 2 2 2 1
5 1 2 2 1 3
5 5 1 1 3 3
5 5 1 1 3 3
5 1 4 4 1 3
1 4 4 4 4 1
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 89/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 90/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
pe ecran.
Pp7. Se citesc o matrice patratica de nxn si un vector de lungime n. Verificati de
cate ori regasim vectorul in matrice, ca linie sau coloana.
Pp8. O matrice contine valori in intervalul [1,100]. Generati un vector continand
valori din [1,100] care NU se regasesc in matrice, in ordine descrescatoare.
- 91 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 91/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Datorita gradului de utilizare, acestui tip structurat de date i s-a acordat o atentie
deosebita; exista functii de citire/scriere specifice, plus o serie functii de uz general
pe siruri de caractere definite in biblioteca standard.
#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";
}
- 92 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 92/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
P2. Diferenta dintre un caracter si sirul de caractere corespunzator.
#include <iostream>
using namespace std;
int main(){
cout << "Caracterul \'A\' ocupa " << sizeof('A') << " octeti\n";
cout << "Sirul \"A\" ocupa " << sizeof("A") << " octeti\n";
}
- 93 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 93/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
char S1[100],S2[100];
cout << "Introduceti un sir: ";
cin.getline(S1,100); // citeste inclusiv spatiile
cout << "Introduceti inca un sir: ";
cin >> S2; // citeste pana la primul caracter "alb"
cout << "Primul sir introdus: " << S1 << "\n";
cout << "Al doilea sir introdus: " << S2;
}
- 94 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 94/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
for(i=0;S[i];i++)
foloseste(S[i]);
If ((c>=’0’)&&(c<=’9’))
foloseste(c);
If ((c>=’A’)&&(c<=’Z’))
foloseste(c);
- 95 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 95/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
cout << "Introduceti un sir: ";
cin >> S;
for(i=0;S[i];i++){
( (S[i]>='a')&&(S[i]<='z') ) S[i] = S[i] - 'a' + 'A';
if
else if ( (S[i]>='A')&&(S[i]<='Z') ) S[i] = S[i] - 'A' + 'a';
}
cout << S;
}
ABCdef 23
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;
cout << "Introduceti un sir: ";
cin.getline(S,100);
if (S[0]!=' ') ct=1;
else ct=0;
for(i=1;S[i];i++)
if ( (S[i-1]==' ') && (S[i]!=' ') ) ct++;
cout << "Numarul de cuvinte:"<<ct;
}
- 96 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 96/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Tabelul 7.1
- 97 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 97/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Observatii:
– itoa nu este implementata in standardul ANSI C++, dar este suportata de
multe compilatoare.
Mai departe dam implementari posibile ale acestor functii, rezolvand
problemele date atat folosind functiile de bilbioteca cat si implementand din cod.
P6 . Se citeste un sir de caractere. Afisati lungimea acestuia.
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char S[100];
int i;
cout << "Introduceti un sir: ";
cin.getline(S,100);
- 98 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 98/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char S[100],X[100],Y[100];
int i;
cout << "Introduceti un sir: ";
cin.getline(S,100);
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 99/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char nume[100],S[100];
int i,j;
cout << "Introduceti numele: ";
cin.getline(nume,100);
strcpy(S,"Salut ");
j=strlen(S);
for(i=0;nume[i];i++) S[j++]=nume[i];
S[j]='\0';
// strcat(S,nume);
cout << S;
}
"unu" == "unu"
- 100 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 100/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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);
#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;
}
- 101 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 101/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 << "\"";
}
Pentru exemplul de mai sus, S[0] este "Ana", S[1] este "are", este
S[2]
- 102 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 102/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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";
}
- 103 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 103/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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:
Sufixe:
- 104 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 104/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
}
- 105 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 105/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Pp1. Se citesc
Considerand de lacatastatura
sirurile doua siruri
fiind numere in bazade10,
caractere continand
calculati suma lordoar
in altcifre.
sir.
Pp2. Se citeste de la tastatura un sir de caractere continand litere mici si spatii.
Afisati cuvintele conponente, cate unul pe un rand.
Pp3. Un sir de caractere contine doar litere mici si litere mari. Prin operatie
elementara intelegem transformarea din litera mica in litera mare sau invers. Care
este numarul minim de operatii elementare astfel incat sa obtinem din sirul initial
unul avand toate literele mici sau toate literele mari.
Pp4. Se citesc de la tastatura cuvinte (fara spatii), pana la citirea cuvantului
"gata". Afisati cel mai lung cuvant care contine doar vocale.
Pp5. Se citeste un sir S, continand cuvinte separate de exact un spatiu si doua
cuvinte, C1 si C2. In locuiti toate aparitiile cuvantului C1 din testul S cu cuvantul
C2.
Pp6. O matrice
lexicografic, apoi de caractere
afisati-le contine cate un cuvant pe un rand. Sortati cuvintele
pe ecran.
- 106 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 106/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Dupa cum am vazut, un vector grupeaza sub un nume mai multe valori de
acelasi tip. In acest capitol vom urmarii gruparea informatiilor corelate de tipuri
diferite.
8.1 Structuri
Gruparea informatiilor corelate de tipuri diferite se face prin utilizarea
structurilor. Avem:
struct nume_structura{
declaratii_de_variabile;
} lista_variabile;
declaratii_de_variabile;
} lista_variabile;
- 107 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 107/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 108/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
}
complex T;
T.re = x.re*y.re - x.im*y.im;
T.im = x.re*y.im + x.im*y.re;
return T;
}
float modul(complex x){
return sqrt(x.re*x.re + x.im*x.im);
}
S=6+i*1
P=7+i*9
m=2.23607
- 109 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 109/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 110/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 111/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 112/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
F.C.P.x=10; F.C.P.y=10; F.C.r=5; // cerc
cout << "Cerc:" << F.C.P.x <<"," << F.C.P.y <<"," << F.C.r
<< endl;
F.D.A.x=1; F.D.A.y=2; // dreptunghi
F.D.B.x=15; F.D.B.y=20;
cout << "Dreptunghi: (" << F.D.A.x <<"," << F.D.A.y <<") ";
cout << " (" << F.D.B.x <<"," << F.D.B.y <<") ";
}
Cerc:10,10,5
Dreptunghi: (1,2) (15,20)
- 113 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 113/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
unsigned var1:nr_biti;
unsigned var2:nr_biti;
...
}lista_variabile;
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 114/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
enum
saptamana {luni, marti, miercuri,
joi, vineri, sambata, duminica};
void Mesaj(int);
int main(){
saptamana S;
int i,ct;
for(i=luni; i<=duminica; i++)
Mesaj(i);
}
void Mesaj(int S){
if ((S>=luni)&&(S<=vineri))
cout << "treaba ";
else
cout << "liber ";
}
- 115 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 115/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 116/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 117 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 117/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
- 118 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 118/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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);
- 119 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 119/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 120/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 121/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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); // prototip
int main(){
afisare(2,7); // apel
}
246
int main(){
afisare(2,7); vf
Figura 9.5
- 122 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 122/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
valoare.parametrului corespunzator. Acest tip de apel poarta numele de apel prin
Pas 3. Inainte de revenire
int main(){
afisare(2,7);
} vf i
8
void afisare(int a, int b){
7 b
2 a
int i;
...
Figura 9.6
- 123 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 123/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 124/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 125/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
1 21 32 21 1
....................
#include <iostream>
using namespace std;
void Spatii(int);
void Crescator(int);
void Descrescator(int);
void 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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 126/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Figura 9.8
Prototipul:
tip_returnat nume_functie(); sau:
tip_returnat nume_functie(void); ,
....
return expresie;
}
P6 . Realizati o functie care returneaza valoarea lui Pi cu doua zecimale exacte.
- 127 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 127/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
cin >> X; mx=X;
while(X<1000){
if (X>mx) mx=X;
cin >> X;
}
return mx;
}
12 45 29 1000
45
- 128 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 128/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 129/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int max(int, int);
int modul(int);
float min(float, float, float);
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;
cout << "|"<< a+b+c << "|=" << modul(a+b+c)<< endl;
x=min(float(a)/b , float(b)/c, float(c)/a);
cout << "min=" << x<< endl;
}
int max(int a, int b){
if (a>b) return a;
else return b;
}
int modul(int x){
return (x>0)?x:-x;
}
a=-6
b=3
c=1
max(-6,3)=3
|-2|=2
min=-2
- 130 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 130/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
}
int sumac(int n){
int S;
S=0;
for(;n>0;n/=10) S+=n%10;
return S;
}
int sumadiv(int n){
int d,S;
S=0;
for(d=1;d<=n;d++)
if (n%d==0) S=S+d;
return S;
}
int primac(int n){
while (n>=10) n=n/10;
return n;
}
int fact(int n){
int i,P;
P=1;
for(i=1;i<=n;i++) P*=i;
return P;
}
a=5123
- 131 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 131/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
if (prim(x)==true) cout << x << " este prim \n";
else cout << x << " nu este prim \n";
if (perfect(x)) cout << x << " este perfect \n";
else cout << x << " nu este perfect \n";
}
bool prim(int n){
int d;
for(d=2;d<=n/2;d++)
if (n%d==0) return false;
return true;
}
bool perfect(int n){
return sumad(n)==n;
}
int sumad(int n){
int S,d;
for(S=0,d=1;d<=n/2;d++)
if (n%d==0) S+=d;
return S;
}
x=28
- 132 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 132/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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);
}
bool prim(int n){
int d;
for(d=2;d<=n/2;d++)
if (n%d==0) return false;
return true;
}
int prim_mic(int n){
while(!prim(n)) n--;
return n;
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 133/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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);
- 134 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 134/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
}
doua_numere sp(float a, float b){
doua_numere T;
T.suma=a+b;
T.produs=a*b;
return T;
}
8 15
Apelul:
nume_functie(lista_parametri);
- 135 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 135/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 136/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void interschimbare(int& , int&);
int main(){
int a,b;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
interschimbare(a,b);
cout << a << " " << b;
}
a=2
b=5
5 2
- 137 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 137/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
std;
using namespace
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 138/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 139/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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;
}
}
void Descrescator(int n){
int i; // i declarat local
for(i=n;i>=1;i--) cout << i;
}
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;
}
}
void Descrescator(int n){
// int i; // i declarat local
for(i=n;i>=1;i--) cout << i;
}
1
1
- 140 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 140/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int max(int,int);
int max(int,int,int);
int main(){
cout << max(2,5,1);
}
int max(int a, int b){
return (a>b)?a:b;
}
- 141 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 141/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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'));
}
void este(int n){
cout << n << " este un intreg" << endl;
}
void este(float n){
cout << n << " este un real" << endl;
}
void este(char n){
cout << n << " este un caracter" << endl;
}
...........
int main(){
este(123);
este(3.14);
este('e');
}
...........
- 142 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 142/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
sau:
tip_ret nume_functie(param_initializati);
#include <iostream>
using namespace std;
void afisare(int a,int b,int pas=1);
int main(){
afisare(1,8,2);
afisare(1,8);// in acest caz ultimul parametru ca fi cel implicit
}
void afisare(int a,int b,int pas){
int i;
for(i=a;i<=b;i+=pas) cout << i << " ";
cout << endl;
}
1 3 5 7
1 2 3 4 5 6 7 8
- 143 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 143/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
#include <values.h>
using namespace std;
int mx(int, int);
int max(int a=-MAXINT,int b=-MAXINT,int c=-MAXINT,int d=-MAXINT);
int main(){
cout << max(5,2) << endl;
cout << max(1,5,8,3) << endl;
}
int mx(int a,int b){
return (a>b)?a:b;
}
int max(int a, int b, int c, int d){
return mx(mx(a,b),mx(c,d));
}
5
8
Apelul:
nume_functie(Vector, alti_parametri);
- 144 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 144/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
parametru.
• citire
• afisare
• suma elementelor
- 145 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 145/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void initializare(int [], int &);
void citire(int [], int &);
void afisare(int [], int);
long suma(int [], int);
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);
}
void citire(int a[], int &n){
int i;
cout << "\nn="; cin >> n;
for(i=0;i<n;i++) cin >> a[i];
}
void initializare(int a[], int &n){
int i;
cout << "\nn="; cin >> n;
for(i=0;i<n;i++) a[i]=random()%100;
}
void afisare(int a[], int n){
int i;
cout << endl;
for(i=0;i<n;i++) cout << a[i] << " ";
}
long suma(int a[], int n){
int i,S;
for(S=i=0;i<n;i++) S+=a[i];
return S;
}
n=3
83 86 77
n=4
1 2 3 4
10
- 146 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 146/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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; // care
int c[10],l;// multimea in a doua multime
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 147/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
4 8
2 4 8 1 14
2
- 148 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 148/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Capitolul 10 – Recursivitate
if ( conditie_de_oprire){
...
... nume_functie(lista_parametri_actuali)
1, n = 0
Plecam de la formula recursiva de calcul n! = .
n ⋅ ( n − 1)!, n > 0
- 149 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 149/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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);
}
long fact(int n){
if(n==0) return 1; //conditia de oprire
return n*fact(n-1); //apel recursiv: n!=n(n-1)!
}
4
4!=24
- 150 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 150/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
long fact(3){
if(3==0) return 1;
return 3*fact(2);
} vf 3 n
long fact(2){
if(2==0) return 1; I
n
e
t t
r
a return 2*fact(1); a
t
i r
v e
i a
s
r } i
n vf 2
3 n
n
u
c r
e e
r
c
n
u
i
r
s
a long fact(1){ i
v
e i
r
i t
a 1 n
s
e
if(1==0) return 1; t
e vf
I 2 n
return 1*fact(0); 3 n
}
long fact(0){ 0 n
if(0==0) return 1; vf 1 n
2 n
return n*fact(n-1); 3 n
}
Figura 10.1
- 151 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 151/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
long doila(int);
int main(){
int n;
cin >> n;
cout << "2^"<< n << "=" << doila(n);
}
long doila(int n){
if(n==0) return 1;
return 2*doila(n-1);
}
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;
long fibo(int n){
nr_apeluri++;
if(n<=2) return 1;
return fibo(n-1)+fibo(n-2);
}
6
fibo(6)=8
Nr. apeluri:15
- 152 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 152/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 153/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
In cazul
acest tip de in care
apel apelul recursiv
recursivitate se face prin intermediul unei alte functii, numim
indirecta.
P5. Calculati:
#include <iostream>
using namespace std;
int f(int,int);
int g(int,int);
int main(){
cout << f(5,20);
}
int f(int x,int y){
if (x>=y) return x;
else return g(x,y-1);
}
int g(int x,int y){
if ((x+y)>=5) return x+y-5;
else return 2*f(0,y);
}
19
- 154 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 154/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Pp1. ca:
definit Realizati o functie recursiva pentru a afisa primii n termeni ai sirului A,
g(n+2)=5*f(n)-g(n)
f(n+1)=g(n+1)-f(n-1)
- 155 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 155/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 156/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int a,b;
freopen("intrare.txt","r",stdin);
freopen("iesire.txt","w",stdout);
cin >> a >> b;
cout << a+b;
}
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;
}
- 157 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 157/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
respectiv:
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;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 158/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <fstream>
using namespace std;
int main(){
int a,b;
ifstream fin("intrare.txt");
ofstream fout("iesire.txt");
fin >> a >> b;
fout << a+b;
}
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;
}
}
- 159 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 159/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Toth Haralambie
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 160/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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
foloseste(X);
- 161 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 161/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Aceasta
contrar. functie
Vom avea:va returna true daca s-a ajuns la sfarsitul fluxului si false in caz
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 162/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 163/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Ppin
apar
1
. Un
text,fisier
apoicontine nu textmici
afisati literele in limba engleza.
din ext, Contorizati
in ordine literele
crescatoare dupamici care
frecvente.
Pp2. Verificati daca n fisiere citite de la tastatura sunt identice ca si continut.
Pp3. Numarati cuvintele dintr-un fiser text. Separatorii dintre cuvinte sunt Enter,
‘,’ si ‘.’.
Pp4. Un fisier contine numere intregi. Scrieti numerele pare intr-un fiser si cele
impare in altul.
Pp5. Cititi o matrice dintr-un fisier. Scrieti inversa matricii in alt fisier.
Pp6. Inversati liniile unui fisier text al carui nume este citit de la tastatura,
scriind rezultatul in alt fisier.
- 164 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 164/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Capitolul 12 – Pointeri
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:
– declaratie de pointer, daca apare in context de declaratie
– valoarea care se gaseste la adresa indicata de un pointer, in context de
instructiune
Prin simpla declaratie a unui pointer, valoarea acestuia nu este initializata,
pointerul indicand o zona de memorie oarecare. Acest tip de pointer se numeste
pointer liber, iar folosirea acestuia inainte de initializare poate avea rezultate
dezastruoase (nu poate folosi nimanui modificarea unei zone oarecare de
memorie!).
- 165 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 165/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
int *q=&var;
#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 << endl; // afisarea unui pointer liber!!!
p=&a; // p contine adresa lui a
*p=*p+10; // a=a+10
q=&b; // q contine adresa lui b
++(*q); // ++b;
0x8048906
0xbff9eefc 0xbff9eef8
0xbff9ef04 0xbff9ef04 0xbff9ef00 0xbff9ef00
11 11 3 3
- 166 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 166/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 167/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
std;
using namespace
int main(){
int a,*p; // intreg si pointer la int
double b,*q; // intreg si pointer la double
p=&a;
q=&b;
// p=&b; // aceste atribuiri nu sunt valide
// q=&a;
}
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.
P3. Pointerii void si modul lor de utilizare
- 168 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 168/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#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' ;
1 12.34 a
2 37.02 b
- 169 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 169/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int i=123;
p=&i;
q=&p;
t=&q;
cout << i << " " <<***t;
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 170/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
P5. Atribuirea pointerilor
#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);
}
P6 . Afisati locatia cea mai mica si locatia cea mai mare de memorie alocate in
- 171 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 171/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;
p=&q; pmic=(p<pmic)?p:pmic; pmare=(p>pmare)?p:pmare; //
comparatie dintre pointeri de acelasi tip
p=&p; pmic=(p<pmic)?p:pmic; pmare=(p>pmare)?p:pmare; //
p indica p !!!
pmic=(&pmic<pmic)?p:pmic; pmare=(&pmic>pmare)?&pmic:pmare;
// comparatie dintre un pointer si o referentiere
p=&pmare; pmic=(p<pmic)?p:pmic; pmare=(p>pmare)?p:pmare;
cout << pmic << " " << pmare;
// if (p>0x10000); // comparatie dintre un
pointer si un intreg (eroare)
}
Observatii:
– in program am alocat variabile de 4 tipuri diferite, deci e obligatorie
folosirea pointerilor void
– 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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 172/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int a,b;
int *p=&a,*q=&b;
cout << p << " " << q << endl;
p++;
q=q+10;
cout << p << " " << q << endl;
--p;
q-=10;
cout << p << " " << q << endl;
}
0xbfcb90ac 0xbfcb90a8
0xbfcb90b0 0xbfcb90d0
0xbfcb90ac 0xbfcb90a8
- 173 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 173/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
foloseste p
delete p;
else
- 174 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 174/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int *p,*q;
if ((p= new int) && (q= new int)){
cin >> *p >> *q;
cout << *p << "+" << *q << "=" << *p+*q;
delete p; delete q;
}
else
cout << "Eroare la alocare!";
}
2
3
2+3=5
p->membru
- 175 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 175/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
struct
complex{
float re,im;
};
int main(){
complex z,*p;
z.re=2; z.im=-1;
p=&z;
cout << "z= " << (*p).re << char((p->im<0)?' ':'+');
cout << p->im << "*i";
}
z= 2 -1*i
este un pointer la primul intreg din vector. Faptul ca A este un pointer constant
A
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 176/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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;p-A<n;p++)
foloseste(*p);
ultimului
vector: element din tablou si folosirea acestui pointer la verificarea sfarsitului de
- 177 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 177/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void init(int [], int);
void citeste(int [], int &);
void afiseaza(int [], int);
int main(){
int A[10],n;
int B[10],m;
n=5;
init(A,n);
citeste(B,m);
afiseaza(A,n);
afiseaza(B,m);
}
void init(int A[], int n){
int *p;
for(p=A;p-A<n;p++)
*p=rand()%10;
}
void citeste(int A[], int &n){
int *p, *sf;
cout << "n="; cin >> n;
sf=A+n;
for(p=A;p<sf;p++)
cin >> *p;
}
void afiseaza(int A[], int n){
int i;
for(i=0;i<n;i++)
cout << *(A+i) << " ";
cout << endl;
}
n=3
10 20 30
3 6 7 5 3
10 20 30
- 178 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 178/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
cin >> n;
A= new tip[n];
foloseste(A,n);
delete []A;
- 179 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 179/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void init(int [], int);
void rezolva(int [], int &);
void afiseaza(int [], int);
int main(){
int *A,n;
cout << "n="; cin >> n;
A=new int[n];
init(A,n);
afiseaza(A,n);
rezolva(A,n);
afiseaza(A,n);
delete []A;
}
void init(int A[], int n){
int i;
for(i=0;i<n;i++) A[i]=rand()%2;
}
void rezolva(int A[], int &n){
int *st, *dr;
st=A; dr=A+n-1;
while(st<dr){
while ((st<dr)&&(*st==0)) st++;
while ((st<dr)&&(*dr==1)) dr--;
if (st<dr){*st=0; *dr=1;}
}
}
void afiseaza(int A[], int n){
int i;
for(i=0;i<n;i++) cout << A[i] << " ";
cout << endl;
}
n=10
1 0 1 1 1 1 0 0 1 1
0 0 0 1 1 1 1 1 1 1
- 180 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 180/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
tip oarecare:
tip *Vector[N];
Figura 12.8
- 181 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 181/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int init(int [10][10], int &);
int afis(int [][10], int);
int sort(int [], int);
int main(){
int A[10][10],n,i;
init(A,n);
afis(A,n);
for(i=0;i<n;i++) sort(A[i],n);
cout << endl; afis(A,n);
}
int init(int A[10][10], int &n){
int i,j;
n=4;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A[i][j]=rand()%10;
}
int afis(int A[][10], int n){
int i,j;
for(i=0;i<n;i++){
cout << endl;
for(j=0;j<n;j++)
cout << A[i][j] << " ";
}
}
int sort(int A[], int n){
int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (A[i]>A[j]){ t=A[i]; A[i]=A[j]; A[j]=t; }
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 182/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
#include <string>
using namespace std;
void afis(char [7][10]);
void inter(char *, char *);
void sort(char [7][10]);
int main(){
char Zi[7][10]={"luni", "marti", "miercuri", "joi",
"vineri", "sambata", "duminica"};
afis(Zi);
sort(Zi);
afis(Zi);
}
void afis(char Zi[7][10]){
for(int i=0;i<7;i++) cout << Zi[i] << " ";
cout << endl;
}
void inter(char *s1, char *s2){
char t[10];
strcpy(t,s1); strcpy(s1,s2); strcpy(s2,t);
}
void sort(char Zi[7][10]){
int i,j;
char t[10];
for(i=0;i<6;i++)
for(j=i+1;j<7;j++)
if (strcmp(Zi[i],Zi[j])>0) inter(Zi[i], Zi[j]);
}
- 183 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 183/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
foloseste(*p);
si
tip_returnat nume_functie(..., tip &p, ...){
foloseste(p);
- 184 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 184/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void inter(int *, int *);
int main(){
int x=1,y=2;
cout << x << " " << y << endl;
inter(&x,&y);
cout << x << " " << y << endl;
}
void inter(int *a, int *b){
int t;
t=*a; *a=*b, *b=t;
}
1 2
2 1
#include <iostream>
using namespace std;
void inter(int *&, int *&);
int main(){
int x=1,y=2;
int *p=&x, *q=&y;
cout << *p << " " << *q << endl;
inter(p,q);
cout << *p << " " << *q << endl;
}
void inter(int *&a, int *&b){
int *t;
t=a; a=b; b=t;
}
1 2
2 1
- 185 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 185/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void inter(int **, int **);
int main(){
int x=1,y=2;
int *p=&x, *q=&y;
cout << *p << " " << *q << endl;
inter(&p,&q);
cout << *p << " " << *q << endl;
}
void inter(int **a, int **b){
int *t;
t=*a; *a=*b; *b=t;
}
1 2
2 1
- 186 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 186/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void inter(int [], int &,
void copiaza(int [], int [],
int &, int *);
int [], int);
void afis(int [], int );
int main(){
int A[10]={1,2,3,4},n=4, B[10]={10,20,30},m=3;
cout << "A:"; afis(A,n); cout << "B:"; afis(B,m);
inter(A,n,B,&m);
cout << "A:"; afis(A,n); cout << "B:"; afis(B,m);
}
void afis(int A[], int n){
for(int i=0;i<n;i++) cout << A[i] << " ";
cout << endl;
}
A:1 2 3 4
B:10 20 30
A:10 20 30
B:1 2 3 4
- 187 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 187/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int main(){
int *A=new int[4],n=4, *B=new int[3],m=3;
for(int i=0;i<n;i++) A[i]=i+1;
for(int i=0;i<m;i++) B[i]=(i+1)*10;
cout << "A:"; afis(A,n); cout << "B:"; afis(B,m);
inter(A,n,B,m);
cout << "A:"; afis(A,n); cout << "B:"; afis(B,m);
}
void afis(int A[], int n){
for(int i=0;i<n;i++) cout << A[i] << " ";
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, 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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 188/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
P20. Functii de alocare/dealocare dinamica a vectorilor.
#include <iostream>
using namespace std;
void afis(int [], int);
int * creare(int &);
void stergere(int *,int);
int main(){
int *A,n;
A=creare(n);
cout << "A:"; afis(A,n);
stergere(A,n);
}
void afis(int A[], int n){
for(int i=0;i<n;i++) cout << A[i] << " ";
cout << endl;
}
int * creare(int &n){
int *T;
cin >> n;
if (!(T= new int[n])){
cout << "Eroare la alocare!";
exit(1);
}
for(int i=0;i<n;i++) cin >> T[i];
return T;
}
void stergere(int *A, int n){
if (A) delete []A;
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 189/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
void afis(int *, int);
int * prima(int [4][4],int );
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);
}
void afis(int A[], int n){
for(int i=0;i<n;i++) cout << A[i] << " ";
}
int * prima(int A[4][4],int n){
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if (A[i][j]==0) return A[i];
}
1 2 0 3
- 190 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 190/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int dublu(int);
int triplu(int);
int main(){
int (* p)(int); // declaratie pointer la functie
p=dublu; cout << p(10) << " ";
p=triplu; cout << p(10);
int dublu(int x){return 2*x;}
int triplu(int x){return 3*x;}
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);
}
double calcul(double x, double y){return x*x+y*y;}
sin(0)=0
- 191 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 191/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
pow(2,3)=8
functia mea(2,3)=13
#include <iostream>
#include <cmath>
using namespace std;
typedef double (* Tip_pointer_functie)(double);
int main(){
int i,x;
Tip_pointer_functie p[4]={sin,cos,tan,abs};
cout << "x sin cos tan abs\n";
for(x=0;x<=30;x+=10){
cout << x << " ";
for(i=0;i<4;i++){
cout.width(6); cout.precision(2);
cout << p[i](x);
}
cout << endl;
}
}
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 192/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
...
...
... 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.
P25. Functie cu numar variabil de parametri care calculaeza o expresie de
forma: c1 op1 c2 op2 c3 ... opn cn+1 , unde ci sunt intregi si op i este + sau -.
- 193 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 193/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int calcul(char *, ...);
int main(){
cout << calcul("+++",1,2,3,4) << endl;
cout << calcul("-+-+",-1,2,-3,4,-5) << endl;
cout << calcul("+",1); // apel incorect, imposibil de
detectat de catre compilator
}
int calcul(char *op, ...){
int E,i;
char **t,*s;
int *p; // pointer prin care accesam operanzii
t=&op;
t++;
p=(int *) t; // pozitionam p pe primul parametru necunoscut
E=*p; p++; // initializam E si mutam p pe al doiela param. nec.
for(s=op;*s;s++,p++) // ne "deplasam" in paralel pe
//operanzi si pe operatori
if (*s=='+') E+=*p;
else E-=*p;
return E;
}
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, 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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 194/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
#include <iostream>
using namespace std;
int suma(int, ...);
int main(){
cout << suma(4,1,2,3,4) << endl;
cout << suma(5,-1,2,-3,4,-5) << endl;
}
int suma(int nr, ...){
int S,*p,i;
p=&nr;
S=0;
for(i=1;i<=nr;i++) S+=p[i];
return S;
}
10
-3
- 195 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 195/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 196 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 196/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Anexe
Shortcut Efect
F1 - help
^F1
-- help
va dacontext sensitive
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 197/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Shortcut Efect
^Delete
- 198 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 198/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 199 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 199/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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.
- 200 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 200/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
scanf(“%d”,&b);
. . .
}
sau:
int o_functie_oarecare( int indice_de_plecare,
int contor_folositor,
arbore *radacina,
informatie_utila Info[]);
dar nu:
- 201 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 201/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
nz_aparitii++;
printf(“valori diferite de zero sunt %d\n”,z_aparitii);
}
- 202 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 202/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
numar = 0;
sau:
if (numar < 0) {
numar = 0;
}
- 203 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 203/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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”);
}
respectiv:
switch (litera) {
case ‘ ‘: printf(“Spatiu \n”);
break;
case ‘a’:
case ‘e’:
case ‘i’:
case ‘o’:
case ‘u’: printf(“Vocala \n”);
break;
default: printf(“Nimic interesant.”);
- 204 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 204/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
sau:
i=0;
- 205 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 205/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
i = 0;
while ((i<numar_elemente) && (vector[i] = valoare_cautata)) i++;
i = 0;
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 206/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Este de preferat ultima varianta, while la inceput de rand putand duce la confuzii.
[1] }
[1] printf("\nSuma este:%d\n”,suma );
[0] }
- 207 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 207/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
Left-to-
1 :: scope
right
() [] . -> ++ --
dynamic_cast static_cast Left-to-
2 postfix
reinterpret_cast right
const_cast typeid
++ -- ~ sizeof new
unary (prefix)
delete
Right-
3 indirection and
* & to-left
reference (pointers)
Right-
4 (type) type casting
to-left
Left-to-
5 .* ->* pointer-to-member
right
Left-to-
6 * / % multiplicative
right
Left-to-
7 + - additive
right
Left-to-
8 << >> shift
right
- 208 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 208/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
Left-to-
9 < > <= >= relational
right
Left-to-
10 == = equality
right
Left-to-
11 & bitwise AND
right
Left-to-
12 ^ bitwise XOR
right
Left-to-
13 | bitwise OR
right
Left-to-
14 && logical AND
right
Left-to-
15 || logical OR
right
Right-
16 ?: conditional
to-left
Left-to-
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,
- 209 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 209/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 210/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
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
- 211 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 211/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 212 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 212/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
- 213 -
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 213/214
7/13/2019 INTRODUCERE IN ANSI C++ (V2)
http://slidepdf.com/reader/full/introducere-in-ansi-c-v2 214/214