Documente Academic
Documente Profesional
Documente Cultură
1
2
3
5
9
0
13 13 13
A=
Declararea matricilor :
Tip_elem nume_mat[nr_max_linii][nr_max_col];
Tip_elem reprezinta tipul elementelor matricei
Nume_mat reprezinta identificatorul variabilei de tip matrice
Exemplu : int a[25][50];
Dimensiunea zonei de memorie ocupata de elemente : sizeof(tip_elem)*nr_max_linii*nr_max_col
Practic, elementele matricei se identifica prin indicele liniei pe care se afla (i) iar indicele coloanei pe care
se afla (j).
a[i][j]
Si in cazul matricelor vorbim de un numar efectiv de linii notat de obicei cu n si numar efectiv de
coloane notate de obicei cu m. Numarul efectiv de elemente este egal cu produsul dintre numarul efectiv
de linii si numarul efectiv de coloane.
Conditii :
0 i<n ; 0 j<m
Citirea
Pentru a atinge atat linia cat si coloana vom folosi doua structure repetitive for :
..
cout<<=n;cin>>n;
cout<<m=;cin>>m;
for(i=0;i<n;i++)
for(j<0;j<m;j++)
{ cout<<a[<<i+1<<j+1<<]=;
cin>>a[i][j];
}
Afisarea
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
cout<<a[i][j]<< ;
cout<<endl;
}
#include<iostream.h>
#include<conio.h>
void main()
{ clrscr();
int a[20][50],n,m,I,j,nrp=0,nro=0,nrn=0;
cout<<n=;cin>>n;
cout<<m=;cin>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(a[i][j]>0)
nr=nrp+1;
else
if(a[i][j]==0)
nro++;
else
if(a[i][j]<0)
nrn=nrn+1;
cout<<nrn=<<nrn<<endl;
cout<<nrp=<<nrp<<endl;
cout<<nro=<<nro<<endl;
}
)(
1 2 3
7 8 9
4 5 6
4 5 6
7 8 9
1 2 3
10 11 12
10 11 12
a[l2-1][j]=aux;
}
Algoritm de interschimbare intre coloane :
..
cout<<c1=;cin>>c1;
cout<<c2=;cin>>c2;
for(j=0;i<n;i++)
{ aux=a[i][c1-1];
a[i][c1-1]=a[i][c2-1]
a[i][c2-1]=aux;
}
Stergerea unei linii sau a unei coloane dintr-o matrice
Stergerea unei linii :
cout<<l=;cin>>l;
for(i=l-1;i<n-1;i++)
for(j=0;j<m;j++)
a[i][j]=a[i+1][j];
n=n-1;
//afisare a[i][j]
Stergerea unei coloane :
cout<<c=;cin>>c;
for(i=0;i<n;i++)
for(j=c-1;j<n-1;j++)
a[i][j]=a[i][j+1];
m=m-1;
//afisare a[i][j]
Aplicatie: Se da o matrice a cu m linii si n coloane cu elemente numere intregi. Se cere :
a) Determinati media aritmetica a elementelor matricii.
b) Stabiliti de cate ori apare o valoare data x ca element al matricii.
c) Determinati numarul de elemente palindrom.
#include<iostream.h>
void main()
{ int a[20][50], i, j, m, n, ogl, ma=0, S=0, nr=0, nrp=0, nro=0, uc, y, x;
float ma;
cout<<n=;cin>>n;
cout<<m=;cin>>m;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cout<<a[<<i+1<<j+1<<]=;
cin>>a[i][j];
}
nr=m*n;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
S=S+a[i][j];
ma=(float)S/nr;
cout<<ma=<<ma<<endl;
cout<<x=;cin>>x;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(a[i][j]==x)
nro=nro+1;
cout<<nro=<<nro<<endl;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
y=a[i][j];
ogl=0;
while(y!=0)
{uc=y%10;
y=y/10;
ogl=ogl*10+uc;
}
if(ogl==a[i][j])
nrp=nrp+1;
}
cout<<nrp=<<nrp<<endl;
}
Matricea patratica
Matricea la care numarul de linii este egal cu numarul de coloane se numeste matrice
patratica.
n=m
Ex declarare: int c[25][25];
Citirea si afisarea matricelor patratice ramane identical cu a unei matrici obisnuite, cu singura
deosebire ca I si j merg pana la n.
a 00 a01 a 02
a 10 a11 a 12
a 20 a21 a 22
gets(s);
puts(s);
i=0;
while(s[i]!=\0)
{ cout<<s[i]<<endl;
i++;
}
i=0;
while(s[i]!=\0)
{
if(s[i]>A&&s[i]<=Z)
nr++;
i++;
}
cout<<nr=<<nr<<endl;
}
}
b) cin.get() este utilizata dupa o functie cin.get cu parametrii pentru a descarca din fluxul
de date ultimul caracter citit care ar impiedica efectuarea unei a doua operatie de citire de
la tastatura.
{ char s1[30], s2[30];
cin.get(s1,30);
cin.get();
cin.get(s2,30);
cin.get();
cout<<s1<< <<s2<<endl;
}
Determinarea lungimii effective a unui sir de caractere
C++ ne pune la dispozitie o functie predefinita pentru a determina lungimea efectiva a unui
sir de caractere.
strlen(sir) se gaseste in string.h
Aplicatie : Se citeste de la tastatura un sir s cu maxim 70 de caractere. Sa se determine
lungimea efectiva a sirului.
#include<iostream.h>
#include<string.h>
void main()
{ char s[71];
int n;
cin.get(s, 70);
n=strlen(s);
cout<<n<<endl;
}
Tipul pointer
Sirurile de caractere pot fi manipulate cu ajutorul unei variabile de tip pointer catre tipul char.
Un pointer este o variabila care retine adresa unei alte variabile.
Compilatorul C++ vede numele unui tablou ca o constanta simbolica de tip adresa, deci ca pe un
pointer constant, si numele sirului de caractere va fi interpretat ca o constanta de tip pointer.
.
{char *p, *q;
p=ana are mere;
cout<<p<<endl;
q=p++;
cout<<q<<endl;
}
p si q se numesc pointer catre char. Un pointer este identificat prin faptul ca are in fata in zona de
declaratii simbolul *.
Copie continutul sirului sursa in sirul destinatie inclusive caracterul NULL, numai ca de aceasta
dada este furnizat un pointer care indica sfarstiul sirului destinatie.
Aplicatie : Se citesc doua siruri cu maxim 30 de caractere. Realizati copierea lui s1 in s2; s2 in
s1.
#include<iostream.h>
#include<string.h>
void main()
{ char s1[31], s2[31];
cout<<primul sir;
cin.get(s1,31);
cin.get();
cout<<al doilea sir;
strcpy(s2,s1);
cout<<s2<<endl;
strcpy(s1,s2);
cout<<s1<<endl;
}
Compararea a doua siruri de caractere
Compararea se realizeaza in functie de codurile ASCI ale caracterelor aflate pe pozitii identice.
(comparare lexico-grafica)
a) Strcmp(s1, s2) intoarce 0 daca s1=s2
Intoarce un rezultat pozitiv daca s1>s2
Intoarce un rezultat negative daca s1<s2
b) Stricmp(s1,s2) lucreaza la fel ca functia anterioara fara sa faca diferenta intre litere mari
si mici
c) Strncmp(s1,s2,n) compara primele n caractere din sirurile s1 si s2 returnand un rezultat
la fel ca strcmp.
d) Strncmpi(s1,s2,n) compara primele n caractere din cele doua siruri fara sa tina cont de
diferenta dintre literele mari si cele mici.
**C++ ne pune la dispozitie o functie predefinita care inverseaza sirul de caractere :
Strrev(sir) functia furnizeaza un pointer care indica adresa sirului inversat
Functia furnizeaza prin intermediul parametrului p, pozitia punctului zecimal iar prin s , semnul.
Fcvt(n,m,&p,&s) functioneaza la fel ca precedent cu deosebirea ca parametrul exprima
numarul de caractere ale partii zecimale.
Inregistrari
Inregistrarea este o structura de date formata dintr-un ansamblu de date neomogene intre care
exista o legatura de continut. Elementele structurii se numesc campuri si pot fi identificate prin nume.
Putem afirma ca inregistararea este o structura de date neomogena, in plus inregistrarea este o structura de
date liniara, adica campurile sunt asezate in locatii succesive de memorie ca si in cazul tabloului de
caractere.
Declarare:
Se foloseste cuvantul rezervat struct si exista 3 variante de declarare:
Var 1:
struct nume_struct
{tip1 camp11,camp12.......camp1n;
.......................................................
tip n campn1,campn2,.......campnn;
};
nume_struct
nume_var;
{char nume[30],pren[30];
float media;
int nrmat;
}e1,e2;
Var 3:
struct
{<descriere_campuri>;
}nume_var;
Ex: struct
{char nume[30],pren[30];
float media;
int nrmat;
}e1,e2;
Tipul struct este un tip de data anonim definit de utilizator. Putem asigna un nume tipului de data
astfel definit folosind cuvantul rezervat typedef si sintaxa typedef<tip>nume_tip;
Lungimea zonei de memorie necesara pentru a retine datele unei variabile de tip struct se obtine
prin insumarea dimensiunilor tuturor campurilor variabilelor de tip struct.
Aplicatie :Sa se defineasca o structura de date care sa contina informatii despre o carte: titlu, anul
aparitiei, pret. Sa se citeasca informatiile despre aceasta carte si sa se afiseze titlul, anul si pretul.
#include<iostream.h>
#include<string.h>
void main( )
{ struct carte
{ char titlu[30],autor[30];
int an_ap;
float pret;
};
carte c;
cout<<Date despre carte:<<endl;
cout<< "titlul :" ; cin.get(c.titlu,30) ;
cin.get( );
cout<<nume autor:;cin.get(c.autor,30);
cin.get( );
cout<<anul aparitiei:;cin>>c.an_ap;
cout<<pret:;cin>>c.pret;
Vector de inregistrari
Etapele pentru declararea unui vector de inregistrari sunt urmatoarele :
- Definirea inregistrarii
- Declarare variabia de tip vector de inregistrari
nume_struct
nume_vector[dim_max];
Exemplu declarare :
struct clasa
{ int etaj, nr_loc;
char numar;
};
clasa v[30];
Accesul la un camp pentru elemental I se va face sub forma nume_vector[i].nume_camp
Exemplu :
v[i].etaj
v[i].nr_loc
v[i].numar
Aplicatie : Intr-o clasa sunt maxim 30 de elevi, fiecare elev fiind identificat prin nume si
prenume. Pastram si informatiile referitoare la media elevului.
Se citesc de la tastatura n numere de elevi in clasa apoi se citesc datele despre cei n elevi.
Sa se afiseze elevii descrescator dupa medie.
#include<iostream.h>
#include<string.h>
void main()
{ struct clasa
{ char nume[30], prenume[30];
float media;
};
elev v[30], aux;
int i, n, j;
cout<<Dati nr. De elevi : ;
cin>>n<<i<<:;
for(i=0; i<n; i++)
{ cout<<Numele pentru elevul : ;
Subprograme
Un program in C++ contine cel putin un subprogram, adica functia radacina main. In
cazul probremelor complexe se practica impartirea respective problem in subprobleme mai
simple.
Pentru fiecare subprobleme mai simple.
Pentru fiecare subproblema se construieste un subprogram care implementeaza doar
subproblema respective (tehnica top-down).
Definim subprogramul ca o secventa de instructiuni ce rezolva o anumita sarcina care poate fi
descrisa, separate de blocul radacina si lansata in executie din cadrul unui bloc ori de cate ori este
nevoie. Intr-o structura modular in care fiecare modul este descries printr-un subprogram,
subprogramele se clasifica astfel :
- Modul apellant : este modulul care pentru rezolvarea propriei sarcini apeleaza alte
module, fiecare dintre ele rezolvand o anumita subproblema.
- Modul apelat : este un modul apelat de un alt modul pentru a-I rezolva o subproblema.
Clasificarea subprogramelor
1. Din punct de vedere a celui care a creat subprogramelor :
a) Subprograme predefinite : sqrt(x), strlen(s) etc
b) Subprograme definite de utilizator
2. Din punct de vedere al modului de returnare a rezultatelor :
a) Functia operand : intoarce un singur rezultat prin insasi numele ei.
b) Functia procedural : intoarce un rezultat, mai multe, sau nici unul.
**Singurul mod in care o functie procedural poate intoarce rezultate este transmiterea
parametrilor prin referinta.
Mecanismul de apel al subprogramelor :
#include<iostream.h>
Void sb()
{.
.}
Void main()
{
Sb();
..
}
La lansarea in executie a unui program se executa mai intai instructiunile
programului principal pana la intalnirea apelului unui subprogram. In acest moment se intrerupe
executia programului principal si se cedeaza executia subprogramului.
Se executa instructiunile subprogramului, dupa care se revine in programul principal la
instructiunea imediat urmatoare celei de apel, instructiune numita si adresa de revenire. Se
continua cu urmatoarele instructiuni din main().
Functia operand
Tipul rezultatului trebuie sa coincida cu tipul expresiei sau sa se poata realiza o conversie
implicita intre cele doua tipuri.
Parametrii formali sunt doar niste simboluri care la apel vor fi inlocuiti cu parametrii
efectivi. Pentru fiecare parametru se specifica tipul acestuia iar in lista parametrii vor fi
despartiti prin virgule.
Int alfa( int a, int b, float c)
Apelul unei functii operand se realizeaza intr-o expresie prin numele functiei urmat de
lista parametrilor efectivi.
Cout<<alfa (x,y,z);
Functii procedurale
Poate sa intoarca o valoare, mai multe sau nici una. Singurul mod in care o functie
procedural poate intoarce un rezultat este prin intermediul parametrilor transmisi prin referinta.
Aplicatie : Se citeste un vector v cu n elemente numere intregi. Se cere sa se ordoneze sis a se
afiseze vectorul.
Pentru rezolvare vom folosi trei functii procedurale :
a) Pentru citire vector
b) Pentru ordonare vector
c) Pentru afisare vector
Sintaxa : void nume_functie (lista_parametrilor_formali)
{<declarare variabile locale>
Instructiuni;
}
Apelul functiei procedural se realizeaza intotdeauna, direct prin insasi numele
subprogramului, urmat de lista parametrilor, urmat de lista parametrilor efectivi.
Exemplu : afis(x,y);
Rezolvare problema :
#include<iostream.h>
int v[30], n;
void citire()
{ int I;
cout<<n=;cin>>n;
for(i=0;i<n;i++)
{ cout<<v[<<i+1<<]=;
cin>>v[i];
}
}
void sort()
{ int I,j,aux;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(v[i]>v[j])
{aux=v[i];
v[i]=v[j];
v[j]=aux;
}
}
void afis()
{ for (inst) i=0; i<n;i++)
cout<<v[i]<< ;
}
void main()
{ citire();
sort();
afis();
}
Transmiterea parametrilor
Catre subprogram parametrii pot fi transmisi :
1. Prin valoare : este situatia in care parametrii pot participa la calculele din subprogram.
Pot fi modificati in subprogram insa nu ne intereseaza aceasta modificare sa se vada si in
programul principal.
2. Prin referinta : este situatia in care ne intereseaza ca modificarile suferite de parametrii in
subprogram sa fie vazute si in programul appellant. In aceasta situatie in stiva de
memorie se salveaza adresa parametrului respectiv. Un parametru transmis prin referinta
este precedat de simbolul &.
Aplicatie : Se citesc doua valori a si b. Sa se interschimbe valorile celor doua variabile folosind
un subprogram.
#include<iostream.h>
void interschimb (int &a, int&b)
{ int aux;
aux=a;
a=b;
b=aux;
}
void main()
{ int a,b;
cout<<a=; cin>>a;
cout<<b=;cin>>b;
interschimb(a,b);
cout<<a<< <<b<<endl;
}
Aplicatie : Functia f primeste prin intermediul parametrului n un numar natural nenul iar prin
intermediul parametrului n un numar natural nenul iar prin intermediul parametrului a un
tablou unidimensional care are n elemente. Functia retunreaza -1 daca numarul de valori strict
negative din a este strict mai mare decat numarul de valori strict pozitive din tablou , valoarea 0
daca numarul de valori strict negative din a este egal cu numarul de valori strict pozitive din
tablou, si valoarea 1 daca numarul de valori strict positive din a este strict mai mare decat
numarul de valori strict negative din a. Scrieti definitia complete a functii f.
#include<iostream.h>
unsigned f(unsigned n, unsigned a[i])
{ unsigned x=0,p=0;
for(i=0;i<n;i++)
if(a[i]>0)
p++;
else
x++;
if(x==p)
return 0;
if(x>p)
return -1;
if(x<p)
return 1;
}
Liste
Se intalnesc in mai multe situatii curente:
-lista de cumparaturi
-o stiva de carti
-lista de asteptare la medic
Definim lista ca fiind o structura de date logica si liniara in care fiecare element cu exceptia
primului si ultimului are un succesor si un predecesor. Elementele unei liste se numesc noduri.
Implementarea listelor se poate realiza:
a) prin alocare secventiala statica, situatie in care nodurile listei sunt stocate intr-un bloc contiguu
de locatii de memorie cu adrese consecutive. Practic sunt implementate ca tablouri e memorie. Algoritmii
pentru operatiile de prelucrare a listelor in aceasta situatie sunt cei folositi pentru operatiile de prelucrare
a vectorilor si necesita foarte mult timp in operatiile de deplasare a elementelor in vecori(inserare,
stergere elemente.
b) prin alocare inlantuita: in aceasta situatie dispunerea elementelor in memorie poate fi
dispersata.
-stergerea unui element (se poate realiza la inceputul, in interiorul sau sfarsitul listei);
-parcurgerea listei (are drept scop vizitarea nodurilor listei pentru a obtine informatia);
-cautarea unui element ce indeplineste o anumita conditie;
-concatenarea a doua liste;
-divizarea unei liste;
Este o lista la care fiecare nod va retine informatia utila sau cheia si adresa nodului
urmator: Pentru a putea gestiona lista vom folosi 2 variabile de tip adresa, variabila prim care
retine adresa primului nod din lista si ultim care retine adresa ultimului element din lista.
Vom defini nodul listei simple inlantuite astfel:
typepedef int adresa;
struct nod
{int inf;
adresa urm;
};
Lista va fi memorata intr-un vector cu elemente de tip lista:
nod lista[100];
Prima si ultima valoare sunt de tip adresa.
Deoarece in cazul alocarii inlantuite nodurile listei nu sunt memorate pe o zona contigua
de memorie vom folosi un vector liber ale carui elemente pot fi doar 0 sau 1.
adresa liber[100];
liber[i] 1 daca la adresa i exista nod memorat;
- 0 daca la adresa i nu exista nod memorat;
Crearea listei simple inlantuite
Exista 2 situatii: