Programarea calculatoarelor
Universitatea “Constatin Brâncuşi” din Târgu-Jiu Facultatea de Inginerie
Departamentul de Automatică, Energie şi Mediu
Lect.dr. Adrian Runceanu
Curs 16
03.01.2014 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
03.01.2014 Programarea calculatoarelor 3
11.3. Probleme rezolvate
Problema 1 Să se creeze o structură care să rețină partea reală și partea imaginară a unui număr complex, iar apoi să se creeze câte o funcție pentru următoarele operații cu numere complexe: 1. adunare 2. scădere 3. înmulțire 4. conjugarea unui număr complex 5. calculul modulului unui număr complex 03.01.2014 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;
03.01.2014 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
03.01.2014 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');
03.01.2014 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;
03.01.2014 Programarea calculatoarelor 8
11.3. Probleme rezolvate
switch (optiune) { case 1 : z=adunare(x,y); cout<<"Adunare z = "<<z.re<<" + "<<z.im<<"*i"<<endl; break; case 2 : z=scadere(x,y); cout<<"Scadere z = "<<z.re<<" + "<<z.im<<" *i"<<endl; break;
03.01.2014 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
03.01.2014 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; }
03.01.2014 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; }
03.01.2014 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; }
03.01.2014 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; }
03.01.2014 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; }
03.01.2014 Programarea calculatoarelor 15
11.3. Probleme rezolvate Rezultatul executiei programului:
03.01.2014 Programarea calculatoarelor 16
11.3. Probleme rezolvate Problema 2 Să se descompună un număr in factori primi memorând rezultatul sub forma unui vector de structuri. Fiecare element va cuprinde două câmpuri: 1. unul care conține factorul prim 2. și unul care conține puterea la care apare acesta în
descompunere Exemplu:
03.01.2014 Programarea calculatoarelor 17
Date de intrare: m = 28
Date de iesire: descompunerea in factori primi: 22
71
11.3. Probleme rezolvate
#include<iostream.h> struct factor { long f; int p; } x[20]; long m; int n, i;
03.01.2014 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
03.01.2014 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; }
03.01.2014 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; }
03.01.2014 Programarea calculatoarelor 21
11.3. Probleme rezolvate
03.01.2014 Programarea calculatoarelor 22
Rezultatul executiei programului:
11.3. Probleme rezolvate
Problema 3
Se dau două puncte oarecare din plan A1(x1,y1) și A2(x2,y2) prin coordonatele lor reale.
Să se calculeze distanța dintre cele două puncte utilizând pentru aceasta o funcție adecvat definită căreia i se transmit coordonatele celor două puncte, considerându-se o structură de tip punct corespunzător definită. 03.01.2014 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) ));
}
03.01.2014 Programarea calculatoarelor 24
11.3. Probleme rezolvate
typedef struct punct
{
float x;
float y;
};
int main(void)
{
punct a1,a2;
float distanta_ab;
03.01.2014 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;
}
03.01.2014 Programarea calculatoarelor 26
11.3. Probleme rezolvate
03.01.2014 Programarea calculatoarelor 27
Rezultatul executiei programului:
11.3. Probleme rezolvate
Problema 4 - Suma și simplificarea a două fracții
Se citesc de la tastatură numitorii și numărătorii (numere întregi de maxim 9 cifre) a două fracții.
Să se scrie un program care simplifică suma celor două fracții și afișează pe ecran numitorul și numărătorul fracției rezultate.
03.01.2014 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;
03.01.2014 Programarea calculatoarelor 29
11.3. Probleme rezolvate // calculul cmmdc folosind algoritmul lui Euclid prin împărțiri 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; }
03.01.2014 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;
03.01.2014 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 d = cmmdc(suma.numarator, suma.numitor);
suma.numarator = suma.numarator / d;
suma.numitor = suma.numitor / d;
cout << suma.numarator << " / " << suma.numitor;
} 03.01.2014 Programarea calculatoarelor 32
11.3. Probleme rezolvate
03.01.2014 Programarea calculatoarelor 33
Rezultatul executiei programului:
11.3. Probleme rezolvate
Problema 5
Pentru evidența produselor dintr-un depozit, se definește o structură cu următoarele informații:
• codul
• denumirea
• prețul produsului
Citiți informațiile a n produse și afisati produsele cu noile prețuri (valoarea prețului este 7 dacă codul produsului este mai mic decât 500 și 11 în caz contrar).
Afișați produsele cu cel mai mare preț după scumpire.
03.01.2014 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;
03.01.2014 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;
}
}
03.01.2014 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"; }
03.01.2014 Programarea calculatoarelor 37
11.3. Probleme rezolvate
int main()
{
citire();
rezolvare();
}
03.01.2014 Programarea calculatoarelor 38
11.3. Probleme rezolvate
03.01.2014 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
03.01.2014 Programarea calculatoarelor 40
11.4. Probleme propuse spre rezolvare
1. Fie declaraţia:
struct lista
{
int nr;
float nota;
};
Să se scrie o funcţie care să aibă ca parametru un tablou cu maximum 100 de elemente de tip lista şi să returneze ca rezultat valoarea câmpului nr asociată celei mai mari valori a câmpului nota din tablou. 03.01.2014 Programarea calculatoarelor 41
11.4. Probleme propuse spre rezolvare
2. Se consideră un tablou de elemente ce conţin informaţii despre activitatea de producţie a mai multor firme. Fiecare element memorează următoarele informaţii: • codul numeric al firmei • codul numeric al produsului • cantitatea produsă Să se scrie o funcţie care, folosind ca parametri tabloul şi o valoare numerică x, furnizează ca rezultat numărul de firme care produc cea mai mare cantitate de produse al căror cod numeric este x. 03.01.2014 Programarea calculatoarelor 42
11.4. Probleme propuse spre rezolvare
3. Definiţi un tip structură convenabil pentru descrierea unei figuri geometrice plane.
De exemplu, structura va conţine denumirea formei figurii geometrice şi:
- pentru un cerc: raza
- pentru un dreptunghi: dimensiunile celor două laturi
Scrieţi apoi o funcţie care să aibă ca rezultat aria unei figuri geometrice date şi folosiţi-o într-un program.
03.01.2014 Programarea calculatoarelor 43
Întrebări?
03.01.2014 Programarea calculatoarelor 44