Sunteți pe pagina 1din 44

Programarea

calculatoarelor
Universitatea Constatin Brncui din Trgu-Jiu
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
Lect.dr. Adrian Runceanu

Curs 16
02.06.2013 Programarea calculatoarelor 2
Capitolul 11.Tipuri definite de utilizator
11.1. Structuri
11.2. Uniuni
11.3. Probleme rezolvate
11.4. Probleme propuse spre rezolvare
02.06.2013 Programarea calculatoarelor 3
11.3. Probleme rezolvate
Problema 2
S se creeze o structur care s rein partea
real i partea imaginar a unui numr complex,
iar apoi s se creeze cte o funcie pentru
urmtoarele operaii cu numere complexe:
1. adunare
2. scdere
3. nmulire
4. conjugarea unui numr complex
5. calculul modulului unui numr complex

02.06.2013 Programarea calculatoarelor 4
11.3. Probleme rezolvate
#include <iostream.h>
#include <math.h>

typedef struct
{
double re; // re = partea reala a numarului
double im; // im = partea imaginara a numarului
} complex;

02.06.2013 Programarea calculatoarelor 5
11.3. Probleme rezolvate
// prototipurile functiilor pe care le definim dupa functia principala
complex adunare(complex a, complex b);
complex scadere(complex a, complex b);
complex inmultire(complex a, complex b);
complex conjugat(complex a);
double modul(complex a);
int main()
{
complex x, y, z; // x,y,z sunt de tip COMPLEX
int optiune; // variabila folosita pentru a alege varianta dorita
double w; // variabila pentru calculul modulului unui nr. complex
char raspuns; // variabila folosita pentru continuarea introducerii datelor
de intrare

02.06.2013 Programarea calculatoarelor 6
11.3. Probleme rezolvate
do{
cout<<" Introduceti partea reala a numarului X : " ;
cin>>x.re;
cout<<" Introduceti partea imaginara a numarului X : ";
cin>>x.im;
cout<<" Introduceti partea reala a numarului Y : ";
cin>>y.re;
cout<<" Introduceti partea imaginara a numarului Y : ";
cin>>y.im;
cout<<" \n Doriti sa continuati ( D / N ) : "<<endl;
cin>>raspuns;
}while(raspuns=='d' || raspuns=='D');

02.06.2013 Programarea calculatoarelor 7
11.3. Probleme rezolvate
while(1)
{
cout<<" Operatia :\n";
cout<<" 1 : Adunarea a doua numere complexe \n";
cout<<" 2 : Scaderea a doua numere complexe \n";
cout<<" 3 : Inmultirea a doua numere complexe \n";
cout<<" 4 : Conjugatul unui numar complex \n";
cout<<" 5 : Modulul unui numar complex \n";
cout<<" 6,7,8,... : EXIT\n";
cin>>optiune;

02.06.2013 Programarea calculatoarelor 8
11.3. Probleme rezolvate
switch (optiune) {
case 1 :
z=adunare(x,y);
cout<<"Adunare z = "<<z.re<<" + "<<z.re<<"*i"<<endl;
break;
case 2 :
z=scadere(x,y);
cout<<"Scadere z = "<<z.re<<" + "<<z.im<<" *i"<<endl;
break;


02.06.2013 Programarea calculatoarelor 9
11.3. Probleme rezolvate
case 3 :
z=inmultire(x,y);
cout<<"Inmultirea lui x cu y este z = "<<z.re<<" + "<<z.im<<" *i\n";
break;
case 4 :
z=conjugat(x);
cout<<"Conjugatul lui x este z = "<<z.re<<" +"<<z.im<<"*i\n";
break;
case 5 :
w=modul(x);
cout<<"Modulul lui x este w = "<<w<<endl;
break;
default : exit(0);
} // sfarsit instr. switch
} // sfarsit structura while
} // sfarsit functia main

02.06.2013 Programarea calculatoarelor 10
11.3. Probleme rezolvate
// functia pentru adunarea a doua numere complexe

complex adunare(complex a, complex b)
{
complex rezultat;
rezultat.re = a.re + b.re;
rezultat.im = a.im + b.im;
return rezultat;
}

02.06.2013 Programarea calculatoarelor 11
11.3. Probleme rezolvate
// functia pentru scaderea a doua numere complexe

complex scadere(complex a, complex b)
{
complex rezultat;
rezultat.re = a.re - b.re;
rezultat.im = a.im - b.im;
return rezultat;
}

02.06.2013 Programarea calculatoarelor 12
11.3. Probleme rezolvate
// functia pentru inmultirea a doua numere complexe

complex inmultire(complex a, complex b)
{
complex rezultat;
rezultat.re = a.re * b.re - a.im * b.im;
rezultat.im = a.re * b.im + a.im * b.re;
return rezultat;
}

02.06.2013 Programarea calculatoarelor 13
11.3. Probleme rezolvate
// functia pentru aflarea conjugatului unui numar complex

complex conjugat(complex a)
{
complex rezultat;
rezultat.re = a.re;
rezultat.im = -a.im;
return rezultat;
}
02.06.2013 Programarea calculatoarelor 14
11.3. Probleme rezolvate
// functia pentru calculul modului unui numar complex

double modul(complex a)
{
double rez;
rez = sqrt(a.re * a.re + a.im * a.im);
return rez;
}


02.06.2013 Programarea calculatoarelor 15
11.3. Probleme rezolvate
Rezultatul executiei programului:

02.06.2013 Programarea calculatoarelor 16
11.3. Probleme rezolvate
Problema 3

S se descompun un numr in factori primi
memornd rezultatul sub forma unui vector de structuri.
Fiecare element va cuprinde dou cmpuri:
1. unul care conine factorul prim
2. i unul care conine puterea la care apare acesta n
descompunere
Exemplu:
02.06.2013 Programarea calculatoarelor 17
Date de intrare:
m = 28
Date de iesire:
descompunerea in factori
primi:
2
2
7
1
11.3. Probleme rezolvate
#include<iostream.h>

struct factor
{
long f;
int p;
} x[20];

long m;
int n, i;
02.06.2013 Programarea calculatoarelor 18
11.3. Probleme rezolvate
int main()
{
cout<<"Introduceti numarul: ";
cin>>m;
long a=2;
while( m != 1 )
{
int q=0; //puterea la care apare a in descompunerea
numarului m
02.06.2013 Programarea calculatoarelor 19
11.3. Probleme rezolvate
while( m%a == 0 )
{
m = m/a;
q++;
}
if( q != 0 )
{
n++;
x[n].f = a;
x[n].p = q;
}

02.06.2013 Programarea calculatoarelor 20
11.3. Probleme rezolvate
if( a == 2 ) a = 3;
else a+=2;
} // sfarsit structura while(m!=1)

cout<<"Descompunerea in factori primi: \n";
for(i=1; i<=n; i++)
cout<<x[i].f<<"^"<<x[i].p<<endl;
}

02.06.2013 Programarea calculatoarelor 21
11.3. Probleme rezolvate
02.06.2013 Programarea calculatoarelor 22
Rezultatul executiei programului:
11.3. Probleme rezolvate
Problema 4

Se dau dou puncte din plan oarecare
A1(x1,y1,z1) i A2(x2,y2,z2) prin coordonatele lor
reale.
S se calculeze distana dintre cele dou
puncte utiliznd pentru aceasta o funcie adecvat
definit creia i se transmit coordonatele celor
dou puncte, considerndu-se o structur de tip
punct corespunztor definit.
02.06.2013 Programarea calculatoarelor 23
11.3. Probleme rezolvate
#include <iostream.h>
#include <math.h>
float distanta(float x1, float y1, float x2, float y2)
{
return ( sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ));
}
02.06.2013 Programarea calculatoarelor 24
11.3. Probleme rezolvate
typedef struct punct
{
float x;
float y;
};
int main(void)
{
punct a1,a2;
float distanta_ab;
02.06.2013 Programarea calculatoarelor 25
11.3. Probleme rezolvate
cout<<"\n abcisa punctului A1: "; cin>>a1.x;
cout<<"\n ordonata punctului A1: "; cin>>a1.y;
cout<<"\n abcisa punctului A2: "; cin>>a2.x;
cout<<"\n ordonata punctului A2: "; cin>>a2.y;
//apelarea si transmiterea functiei distanta a coordonatelor punctelor
distanta_ab=distanta(a1.x,a1.y,a2.x,a2.y);
cout<<"\n distanta dintre punctele A si B =
"<<distanta_ab;
}
02.06.2013 Programarea calculatoarelor 26
11.3. Probleme rezolvate
02.06.2013 Programarea calculatoarelor 27
Rezultatul executiei programului:
11.3. Probleme rezolvate
Problema 5 - Suma i simplificarea a dou fracii
Se citesc de la tastatur numitorii i numrtorii
(numere ntregi de maxim 9 cifre) a dou fracii.
S se scrie un program care simplific suma celor
dou fracii i afieaz pe ecran numitorul i
numrtorul fraciei rezultate.
02.06.2013 Programarea calculatoarelor 28
Date de intrare:
Numarator 1
Numitor 2
Numarator 1
Numitor 3
Date de iesire:
Fractia suma simplificata:
5 6
11.3. Probleme rezolvate
# include <iostream.h>

struct fractie
{
long int numitor, numarator;
};

fractie f1, f2, suma;
02.06.2013 Programarea calculatoarelor 29
11.3. Probleme rezolvate
// calculul cmmdc folosind algoritmul lui Euclid prin mpriri repetate
long int cmmdc(long int x, long int y)
{
long int r;
r = x % y;
while( r != 0)
{
x = y;
y = r;
r = x % y;
}
return y;
}
02.06.2013 Programarea calculatoarelor 30
11.3. Probleme rezolvate
int main()
{
cout<<"Dati elementele primei fractii\n";
cout<<"numaratorul = "; cin>>f1.numarator;
cout<<"numitorul = "; cin>>f1.numitor;
cout<<"Dati elementele celei de-a doua fractii\n";
cout<<"numaratorul = "; cin>>f2.numarator;
cout<<"numitorul = "; cin>>f2.numitor;
02.06.2013 Programarea calculatoarelor 31
11.3. Probleme rezolvate
suma.numarator = f1.numarator*f2.numitor +
f2.numarator*f1.numitor;
suma.numitor = f1.numitor*f2.numitor;
long int x = cmmdc(suma.numarator,
suma.numitor);
suma.numarator = suma.numarator / x;
suma.numitor = suma.numitor / x;
cout << suma.numarator << " / " <<
suma.numitor;
}
02.06.2013 Programarea calculatoarelor 32
11.3. Probleme rezolvate
02.06.2013 Programarea calculatoarelor 33
Rezultatul executiei programului:
11.3. Probleme rezolvate
Problema 6
Pentru evidena produselor cosmetice dintr-un
depozit, se definete o structur cu urmtoarele informaii:
codul
denumirea
preul produsului
Citii informaiile a n produse i afisati produsele
cu noile preuri (valoarea preului este 7 dac codul
produsului este mai mic dect 500 i 11 n caz contrar).
Afiai produsele cu cel mai mare pre dup scumpire.
02.06.2013 Programarea calculatoarelor 34
11.3. Probleme rezolvate
#include<iostream.h>
typedef struct produse
{
int cod, pret;
char den[20];
};
produse a[20];
int n,i,c,p;
02.06.2013 Programarea calculatoarelor 35
11.3. Probleme rezolvate
void citire()
{
cout<<"Dati numarul de produse "; cin>>n;
for(i=1;i<=n;i++)
{
cout<<"codul produsului "; cin>>a[i].cod;
cout<<"pretul produsului "; cin>>a[i].pret;
cout<<"denumirea produsului "; cin>>a[i].den;
}
}
02.06.2013 Programarea calculatoarelor 36
11.3. Probleme rezolvate
void rezolvare()
{
for(i=1;i<=n;i++)
if(a[i].cod<500) a[i].pret=7;
else a[i].pret=11;
for(i=1;i<=n;i++)
cout<<"pretul "<<a[i].den<<" este
"<<a[i].pret<<"\n";
cout<<endl;
for(i=1;i<=n;i++)
if(a[i].pret==11) cout<<a[i].den<<"\n";
}
02.06.2013 Programarea calculatoarelor 37
11.3. Probleme rezolvate
int main()
{
citire();
rezolvare();
}
02.06.2013 Programarea calculatoarelor 38
11.3. Probleme rezolvate
02.06.2013 Programarea calculatoarelor 39
Rezultatul executiei programului:
Capitolul 11.Tipuri definite de utilizator
11.1. Structuri
11.2. Uniuni
11.3. Probleme rezolvate
11.4. Probleme propuse spre rezolvare
02.06.2013 Programarea calculatoarelor 40
11.4. Probleme propuse spre rezolvare
1. Fie declaraia:
struct lista
{
int nr;
float nota;
};
S se scrie o funcie care s aib ca parametru
un tablou cu maximum 100 de elemente de tip lista
i s returneze ca rezultat valoarea cmpului nr
asociat celei mai mari valori a cmpului nota din
tablou.
02.06.2013 Programarea calculatoarelor 41
11.4. Probleme propuse spre rezolvare
2. Se consider un tablou de elemente ce
conin informaii despre activitatea de producie a
mai multor firme.
Fiecare element memoreaz urmtoarele
informaii:
codul numeric al firmei
codul numeric al produsului
cantitatea produs
S se scrie o funcie care, folosind ca parametri
tabloul i o valoare numeric x, furnizeaz ca rezultat
numrul de firme care produc cea mai mare cantitate
de produse al cror cod numeric este x.
02.06.2013 Programarea calculatoarelor 42
11.4. Probleme propuse spre rezolvare
3. Definii un tip structur convenabil
pentru descrierea unei figuri geometrice plane.
De exemplu, structura va conine
denumirea formei figurii geometrice i:
- pentru un cerc: raza
- pentru un dreptunghi: dimensiunile celor
dou laturi
Scriei apoi o funcie care s aib ca rezultat
aria unei figuri geometrice date i folosii-o ntr-
un program.
02.06.2013 Programarea calculatoarelor 43


ntrebri?
02.06.2013 Programarea calculatoarelor 44