Sunteți pe pagina 1din 51

- orice variabil/expresie are un tip ce determin

operaiunile care pot fi realizate

- obligatoriu declararea tipului unei variabile se face


naintea oricrei iniializri / atribuiri

- variabilele de acelai tip pot fi declarate ntr-o singur


instruciune

- declararea unei variabile i atribuirea unei valori


acesteia se pot realiza ntr-o singur instruciune

- n general variabilele implicate ntr-un program sunt


declarate la nceputul acestuia
- n C++ exist dou tipuri de variabile fundamentale:

variabile ncorporate (char, int, float, long double,


etc)
- compilatorul tie cum s le reprezinte (ct
memorie aloc)

- compilatorul tie ce fel de operatiuni poate s efectueze


asupra lor
variabile definite de utilizator

- variabile definite de biblioteci standardizate (ca parte


a standardului C++), de exemplu: string, array,
vector, ostream, etc.
- variabile construite pentru propria utilizare (avnd o
sarcin specific)

ambele aceste variabile utilizeaz aceiasi tehnic de


construcie
Necesitatea construirii de variabile de ctre utilizator

Compilatorul nu poate construi toate tipurile de


variabile pe care un utilizator le poate utiliza ntr-un
program

Niciun proiectant de limbaje / dezvoltator de


compilatoare nu le poate cunoate

Ajut la reprezentarea direct a ideilor n cod


Orice concept n C++ are dou componente
eseniale:

Reprezentare, adic ce conine

Operaiuni, adic ce se poate face cu acel coninut


Un concept poate fi fi orice:
PC, automobil, telefon, carte, cas, etc.
Formule, fiiere, imagini, pictograme, foldere, etc.

Reprezentarea conine date, informaii despre


valoarea curent (starea curent) a acelui concept
(dimensiuni, culoare, proprieti, etc.)
Operaiunile reprezint ce poate s execute acel
concept (calcule, apelare audio/video, vizualizare,
deplasare, etc)
O clas este un tip de variabil definit de utilizator

Un obiect al unei clase este o instan (materializare)


a acelei clase

O clas este o descriere general de proprieti i


aciuni. Este o noiune abstract.

Un obiect al unei clase este ceva concret.


O clas este o variabil ce specific:
- cum sunt reprezentate obiectele de acest tip
- cum se pot crea acele obiecte
- cum sunt utilizate
- cum pot fi distruse
Din punct de vedere al vizibilitii variabilele pot fi:
locale, cnd sunt vizibile doar ntr-o zon restrns a
codului (n interiorul funciei n care a fost definit)
globale, cnd sunt accesibile din orice zon a codului
- variabilele locale sunt declarate n interiorul unei
funcii i sunt vizibile doar pentru instruciunile din
interiorul acestei funcii
- variabilele globale sunt declarate la nceputul
programului, dup directivele de preprocesare; sunt
vizibile pentru orice instruciune din cod
#include<iostream>
using namespace std;
int main()
{
int a,b; // variabile locale
;
return 0;
}
#include<iostream>
int a,b; // variabile globale
using namespace std;
int main()
{
;
return 0;
}
Constantele sunt variabile ale cror valori nu se
modific.
const int a=45; va avea valoarea de 45 pentru ntreg
codul, indiferent dac valoarea
variabilei a ar trebui s se modifice
(dup efectuarea de calcule);
declararea acesteia se face n
interiorul funciilor
Declararea constantelor se poate face i n afara
funciei main

const int a = 45;

sau

#define a 45 //directiv preprocesor


Funciile n C++:
eseniale pentru programe complexe
permit mprirea programelor n buci
efectueaz o sarcin specific (metode)
pot fi reutilizate n alte programe
pot fi incluse n biblioteca standard C++
pot fi create de utilizator
Distincie ntre

- declararea unei funcii

- definirea unei funcii


Declararea unei funcii = scrierea prototipului
funciei nainte de funcia main, dup directivele de
preprocesare
Prototipul unei funcii:
numele funciei
int functie (int, double, float);

tipul variabilelor funciei

tipul ntors de funcie


Definirea unei funcii = scrierea tuturor operaiunilor
pe care le va efectua funcia asupra variabilelor
primite ca argumente de la apelant, precum i
ntoarcerea rezultatului
int functie (int a, double b, float c)
{
int t; // declararea variabilei ce va conine valoarea
ntoars ctre apelant
; // operaiuni efectuate asupra variabilelor transmise ca
argumente de ctre apelant
return t; // transmiterea ctre apelant a valorii variabilei t
}
dac funcia apelat aparine bibliotecii standard C++
nu mai este nevoie declararea acesteia; apelare direct
double sin (double);
double cos (double);
double tan (double);
double atan (double);
double cosh (double);
double sqrt (double);
double pow (double, double);
double exp (double);
double log (double);
double log10 (double);
#include <iostream>
using namespace std;
void test(int, double ); // declararea prototipului
int main()
{
cout << "va fi apelat funcia test()";
test( 10, -7.5); // apelarea funciei test()
cout << "ntoarcere n funcia main()." << endl;
return 0;
}
void test(int argument1, double argument2 )
{
cout << "n funcia test()."
<< "1. argument: " << argument1
<< "2. argument: " << argument2 << endl;
}
#include <iostream>
using namespace std;
double aria(double, double); // prototipul funciei
int main()
{
double x = 3.5, y = 7.2, rez;
rez = area( x+3, y+2.4); // apelarea funciei
cout << "aria dreptunghiului cu lungimea" << x+3<< "i
limea" << y+2.4<< "este" << rez;
return 0;
}
double aria(double lung, double lat)
{
return (lung * lat); // ntoarce rezultatul
}
Prototipul funciei furnizeaz compilatorului toate
informaiile referitoare la funcie astfel nct acesta, la
apelarea funciei, s execute urmtoarele sarcini:

verific tipul i numrul argumentelor transmise la


apelare

proceseaz corect valoarea ntoars de ctre funcie

Nu mai este necesar declararea funciei dac


aceasta este definit nainte s fie apelat
#include <iostream>
using namespace std;
double aria(double lung, double lat)
{
return (lung * lat);
}
int main()
{
double x = 3.5, y = 7.2, rez;
rez = area( x, y+2); // apelarea funciei
cout << "aria drept. cu lung." << x<< "i l." << y+2<<"este"<<
rez;
Trecerea valorilor argumentelor la apelarea unei
funcii se mai denumete transfer prin valoare.

Prin acest tip de transfer funcia nu poate modifica


valoarea argumentelor primite deoarece primete
nite cpii ale variabilelor.

Pentru ca o funcie s poat modifica valorile


argumentelor transferate la apelarea acesteia trebuie
s primeasc adresele acestor variabile. Avem
transfer prin referin.
Supradefinirea funciilor

- dou funcii pot s aib acelai nume cu condiia ca


fie numrul de argumente transferabile sa fie diferit,
fie tipul de argumente s fie diferit

- dou funcii pot avea acelai nume i aceleai


instruciuni cu condiia ca fie numrul de argumente
transferabile sa fie diferit, fie tipul de argumente s fie
diferit (abloane de funcii)

- dou funcii nu pot s aib acelai nume, numr i


tip de argumente, diferind doar tipul variabilei
#include <iostream>
using namespace std;
int calcul (int a, int b)
{
return (a*b);
}
double calcul (double a, double b)
{
return (a/b);
}
int main ()
{
int x=2,y=7;
double u=4.6,v=2.3;
cout << calcul (x,y);
cout << calcul (u,v);
return 0;
}

n general nu este indicat utilizarea aceluiai nume


pentru funcii care execut operaii complet diferite.
#include <iostream>
using namespace std;
int suma (int a, int b)
{
return a+b;
}
double suma (double a, double b)
{
return a+b;
}
int main ()
{
cout << suma (10,20);
cout << suma (1.0,1.5);
return 0;
}
- pentru operaiuni care pot fi realizate pentru diferite
tipuri de variabile se pot defini abloane de funcii
iruri

- pentru un numr mare de variabile de acelai tip

- aceste variabile sunt stocate n celule succesive de


memorie

- aceste variabile se numesc elementele irului

- variabilele sunt accesate cu ajutorul unui index

- se mai numesc i vectori


Sintaxa
tip nume[dimensiune];

float a[10]; // reprezint un ir (vector) cu numele a,


avnd 10 elemente de tip float

a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]

ocup n memorie spaiu succesiv ncepnd cu


elementul a[0]
indexul trebuie s fie un numr ntreg pozitiv
Un ir poate fi iniializat cnd este definit
float a[3] = {2.3, 3.5, 3.9};
este echivalent cu
a[0] = 2.3;
a[1] = 3.5;
a[2] = 3.9;
dac este iniializat cnd este definit nu este
necesar declararea dimensiunii

float a[ ] = {2.3, 3.5, 3.9}; // este corect


irurile ocup o mare cantitate de memorie, prin
urmare trebuie mare grij la resursele de memorie

irurile trebuie ntotdeauna iniializate. n caz contrar,


dac sunt utilizate naintea atribuirii unor valori, vor
folosi valorile gsite n celulele de memorie alocate.

int a[50];
for (i=0;i<50;i++)
{
a[i] = 0;
}
float a[3]; // se declar dimensiunea irului

a[1] = 3.5; // i se atribuie valoarea de 3.5 elementului


a[1] din ir

#include <iostream>
using namespace std;
int a [ ] = {10, 20, 30, 40, 50};
int i, rezultat=0;
int main ()
{
for ( i=0 ; i<5 ; i++ )
{
rezultat += a[i]; // echivalent cu rezultat = rezultat + a[i]
}
cout << rezultat;
return 0;
}
iruri multidimensionale

- iruri de iruri (matrice)

- sintax pentru iruri bidimensionale

int a[n][m]; // unde n este numrul de linii, iar m este


numrul de coloane
- aceleai proprieti ca irul unidimensional

- necesarul de memorie crete exponenial cu fiecare


dimensiune adugat
#define COLOANA 5
#define LINIE 3
int a [LINIE][COLOANA];
int i,j;
int main ()
{
for (i=0; i<LINIE; i++)
for (j=0; j<COLOANA; j++)
{
a[i][j]=(i+1)*(j+1);
}
}
Stringuri

- iruri de caractere
- se utilizeaz clasa string pentru a le reprezenta i a
le manipula
- obiecte ale clasei string
- n timpul operaiunilor cu stringuri alocarea de
memorie se face automat
- pentru a putea fi utilizate trebuie introdus directiva
de preprocesare
#include <string>
#include <iostream>
#include <string>
using namespace std;
int main ()
{
char intrebare_1[ ] = "cum te numeti? ";
string intrebare_2 = "de unde eti? ";
char raspuns_1[80];
string raspuns_2;
cout << intrebare_1;
cin >> raspuns_1;
cout << intrebare_2;
cout << "buna, " << raspuns_1;
cout << " din " << raspuns_2;
return 0;
}
- un string poate fi iniializat folosind un anumit numr
de caractere sau un string predefinit
- daca nu este iniializat explicit atunci se creaz un
string gol cu lungimea 0 (zero)
- cnd se atribuie o valoare unui string coninutul
actual este nlocuit cu noua valoare
- unui string i se poate atribui un alt string, o
constant string sau un singur caracter
- se utilizeaz funcia getline() pentru a stoca ntr-un
string o linie de text preluat de la tastatur. Aceasta
este o funcie (metod) a clasei string.
- operatorul de extragere (>>) nu poate prelua dect
un cuvnt
- se utilizeaz operatorul + pentru a concatena
(altura) dou/mai multe stringuri
string s, s1(floarea), s2(soarelui);
s = s1 + s2;
rezult atribuirea stringului s a valorii floarea soarelui
se pot supradefini diferii operatori i pentru utilizarea lor
n operaiuni cu stringurile
Scrierea datelor ntr-un fiier. Citirea datelor dintr-
un fiier.

- fiecare caracter dintr-un fiier ocup o poziie de un


byte. Primul byte ocup poziia 0 (din punctul de
vedere al lui C++, un fiier este un simplu ir), al
doilea byte poziia 1, etc.

- poziia curent a fiierului este dat byte-ul care va fi


citit/scris ulterior (fiecare byte care este transferat
duce la creterea poziiei curente a fiierului cu o
unitate)
- n cazul accesului secvenial, datele sunt citite/scrise
bit cu bit, ntr-o ordine fixat. Prima operaiune de
citire ncepe la nceputul fiierului. Dac este nevoie
de o anumit informaie, trebuie citit tot fiierul de la
nceput la sfrit.

- operaiunile de scriere pot crea un nou fiier,


suprascrie unul existent sau prelua unele date ntr-un
fiier existent.

- accesul facil la anumite date dintr-un fiier implic


abilitatea de a stabili poziia curent a fiierului.
Aceast tehnic se numete acces aleator la fiier.
ios

istream ostream

iostream

ifstream ofstream

fstream
- toate aceste clase fac parte din sistemul de
management al fiierelor n C++
- clasa ifstream deriv din clasa istream i permite
citirea fiierelor
- clasa ofstream deriv din clasa ostream i permite
scrierea n fiiere
- clasa fstream deriv din clasa iostream i permite
att operaiuni de citire ct i de scriere pentru
fiiere
- aceste clase sunt declarate n fiierul header
fstream.
- aceste clase motenesc funcionalitatea claselor lor
de baz. Prin urmare operatorii care sunt utilizai (cin
i cout) pentru variabile sunt folosii i aici.
#include <iostream>
#include <fstream> // conine ambele clase
using namespace std;
- pentru a deschide un fiier comanda este
ifstream myfile("test.txt");
- numele fiierului test.txt este trimis la constructorul
clasei ifstream, care l deschide pentru citire.Fiierul
se consider c este n directorul curent (altfel trebuie
indicat calea)
- cnd a fost deschis fiierul poziia curent este la
nceputul fiierului.
- dac fiierul nu exist i trebuie creat comanda este
ofstream yourfile("new.txt");
- aceast declaraie creaz un nou fiier numit new.txt
care va fi deschis pentru scriere. Dac ns acesta
exist deja, comanda i va terge coninutul pentru a-l
putea folosi la o nou sarcin
- se poate utiliza comanda ofstream yourfile; care va
crea un fiier generic, iar apoi acesta poate fi deschis
mai trziu cu comanda
yourfile.open("new.txt");
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
ofstream myfile;
myfile.open ("exemplu.txt");
myfile << "Scriere ntr-un fiier";
myfile.close();
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile ("exemplu.txt");
if (myfile.is_open()){
myfile << "aceasta este o linie nou";
myfile << "aceasta este o alt linie";
myfile.close();
}
else cout << "fiierul nu poate fi deschis";
return 0;}
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
ifstream myfile ("exemplu.txt");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
cout << line << '\n';
}
myfile.close();
}
else cout << "fiierul nu poate fi deschis";
return 0;}

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