Programarea şi utilizarea...

Post on 13-Feb-2020

23 views 0 download

Transcript of Programarea şi utilizarea...

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