Universitatea Constantin Br ncuşi” din Târgu-Jiu ...Săse afişeze toate numerele perfecte mai...

Post on 03-Jan-2020

13 views 0 download

Transcript of Universitatea Constantin Br ncuşi” din Târgu-Jiu ...Săse afişeze toate numerele perfecte mai...

Programarea calculatoarelor

Universitatea “Constantin Brâncuşi” din Târgu-JiuFacultatea de Inginerie şi Dezvoltare DurabilăDepartamentul de Automatică, Energie, Mediu şi Dezvoltare Durabilă

Lect.dr. Adrian Runceanu

Curs 13

30.12.2015 Programarea calculatoarelor 2

Capitolul 9. Funcții

9.8. Probleme rezolvate cu ajutorul funcţiilor

9.8.1. Funcţii definite de utilizator

9.8.2. Funcţii de tip void

9.9. Probleme propuse spre rezolvare

30.12.2015 Programarea calculatoarelor 3

9.8.2. Funcţii de tip void

Problema 1:

Enunţ:Să se scrie o funcţie care să rezolve o

ecuaţie de gradul II, unde coeficienţii ecuaţieisunt daţi ca parametri.

Funcţia principală va citi coeficienţii a douăecuaţii şi va afişa soluţiile pentru fiecareecuaţie în parte.

30.12.2015 Programarea calculatoarelor 4

#include <iostream.h>#include <math.h>void ecuatie(float a, float b, float c){float delta, x1, x2;delta = b * b – 4 *a* c;if( delta < 0 ) cout<<"ecuatia are solutii complexe";elseif( delta == 0 ){

cout<<"ecuatia are doua radacini egale\n";x1 = x2 = -b / ( 2 * a );cout<<"x1= "<<x1<<"\n";cout<<"x2= "<<x2<<"\n";

}

30.12.2015 Programarea calculatoarelor 5

else

{

x1 = ( -b + sqrt(delta) ) / ( 2 * a );

x2 = ( -b - sqrt(delta) ) / ( 2 * a );

cout<<"ecuatia are urmatoarele radacini: \n";

cout<<"x1= "<<x1<<"\n";

cout<<"x2= "<<x2<<"\n";

}

return;

}

30.12.2015 Programarea calculatoarelor 6

int main(){

int a1, b1, c1, a2, b2, c2;cout<<"Dati coeficientii primei ecuatii \n";cout<<"Dati coeficientul a1 "; cin>>a1;cout<<"Dati coeficientul b1 "; cin>>b1;cout<<"Dati coeficientul c1 "; cin>>c1;ecuatie(a1, b1, c1);cout<<"\n";cout<<"Dati coeficientii celei de-a doua ecuatie \n";cout<<"Dati coeficientul a2 "; cin>>a2;cout<<"Dati coeficientul b2 "; cin>>b2;cout<<"Dati coeficientul c2 "; cin>>c2;ecuatie(a2, b2, c2);

}

30.12.2015 Programarea calculatoarelor 7

Instructiune de apel

Instructiune de apel

9.8.2. Funcţii de tip void

30.12.2015 Programarea calculatoarelor 8

Problema 2:Enunţ:

Se consideră un vector x cu n numere întregi. Săse verifice dacă x reprezintă o mulţime.

Se vor construi:

– o funcţie care să citească vectorul de la tastatură

– o funcţie care să afişeze vectorul

– şi a treia funcţie care să tipărească mesajul“Vectorul dat reprezinta o multime” sau“Vectorul dat NU reprezinta o multime”, în cazcontrar.

30.12.2015 Programarea calculatoarelor 9

9.8.2. Funcţii de tip void

#include <iostream.h>

int x[100], n;

void citire(int x[100], int n)

{

int i;

cout<<"Dati elem. vectorului \n";

for(i=1; i<=n; i++)

cin>>x[i];

return;

}

30.12.2015 Programarea calculatoarelor 10

Functia nu returneazanici o valoare

void multime(int x[100],int n){

int i, j, verific = 1;for(i = 1; i < n; i++)for(j = i + 1; j <= n; j++)

if( x[i] == x[j] ) verific = 0;if( verific == 1 )

cout<<"Vectorul reprezinta o multime";else

cout<<"vectorul NU reprezinta o multime";return;

}

30.12.2015 Programarea calculatoarelor 11

Fiecare element x[i] (i=1,2,…,n-1) este verificat

cu toate celelalteelemente x[j], cu j=i+1,…,n

void afisare(int x[100],int n)

{

int i;

cout<<"Vectorul este \n";

for(i=1; i<=n; i++)

cout<<x[i]<<" ";

cout<<"\n";

return;

}

30.12.2015 Programarea calculatoarelor 12

int main()

{

cout<<"Dati n = ";

cin>>n;

citire(x,n);

afisare(x,n);

multime(x,n);

}

30.12.2015 Programarea calculatoarelor 13

9.8.2. Funcţii de tip void

Instructiuni de apel

30.12.2015 Programarea calculatoarelor 14

9.8.2. Funcţii de tip void

Problema 3:Enunţ:

Se consideră un număr natural în baza 10. Secere să se scrie câte o funcţie care să afişezereprezentarea numărului dat în bazele 2 şi 8.

Exemplu:

30.12.2015 Programarea calculatoarelor 15

9.8.2. Funcţii de tip void

Pentru n=2510:

reprezentarea numărului în baza 2 este 110012

reprezentarea numărului în baza 8 este 318

#include <iostream.h>

int n;

void baza_2(int n)

{

int i=1, j, x[30], cifre;

while(n != 0)

{

x[i] = n % 2;

n = n / 2;

i++;

}

30.12.2015 Programarea calculatoarelor 16

Se rețin resturile împărțirii numărului la 2

cifre = i-1;

cout<<"Reprezentarea numarului in baza 2 este:";

for(i = cifre; i >= 1; i--) cout<<x[i];

cout<<"\n";

return;

}

30.12.2015 Programarea calculatoarelor 17

9.8.2. Funcţii de tip void

void baza_8(int n){

int i=1, j, x[30], cifre;while(n != 0){

x[i] = n % 8;n = n / 8;i++;

}

30.12.2015 Programarea calculatoarelor 18

9.8.2. Funcţii de tip void

Se rețin resturile împărțirii numărului la 8

cifre = i-1;

cout<<"Reprezentarea numarului in baza 8 este: ";

for(i=cifre; i>=1; i--)

cout<<x[i];

cout<<"\n";

return;

}

30.12.2015 Programarea calculatoarelor 19

9.8.2. Funcţii de tip void

int main()

{

cout<<"Dati n = ";

cin>>n;

baza_2(n);

baza_8(n);

}

30.12.2015 Programarea calculatoarelor 20

9.8.2. Funcţii de tip void

Instructiuni de apel

30.12.2015 Programarea calculatoarelor 21

9.8.2. Funcţii de tip void

Problema 4:Enunţ:

Se consideră un număr natural n. Se cere săse scrie câte o funcţie, pentru următoarelecerinţe:Să se afişeze toate numerele prime mai mici

sau egale cu nSă se afişeze toate numerele perfecte mai

mici sau egale cu nSă se afişeze toate numerele pătrate

perfecte mai mici sau egale cu n30.12.2015 Programarea calculatoarelor 22

9.8.2. Funcţii de tip void

#include <iostream.h>#include <math.h>int n;void numere_prime(int n){

int i, j, prim;cout<<"Numerele prime mai mici sau egale decat "<<n<<" sunt \n";for(i=2; i<=n; i++){

prim = 1;for(j=2; j<=i/2; j++)if( i % j == 0 ) prim=0;

if(prim==1) cout<<i<<" ";}return;

}30.12.2015 Programarea calculatoarelor 23

void numere_perfecte(int n)

{

int i, j, suma;

cout<<"Numerele perfecte mai mici sau egale decat"<<n<<" sunt \n";

for(i=6; i<=n; i++)

{

suma = 0;

for(j=1; j<=i/2; j++)

if( i%j == 0 ) suma = suma + j;

if( suma == i ) cout<<i<<" ";

}

return;

}30.12.2015 Programarea calculatoarelor 24

void numere_patrate_perfecte(int n)

{

int i;

cout<<"Numerele patrate perfecte mai mici sau egaledecat "<<n<<" sunt \n";

for(i=1; i<=n; i++)

if( sqrt(i) == floor( sqrt(i) ) ) cout<<i<<" ";

return;

}

30.12.2015 Programarea calculatoarelor 25

9.8.2. Funcţii de tip void

int main(){

cout<<"Dati n = "; cin>>n;numere_prime(n);cout<<"\n";numere_perfecte(n);cout<<"\n";numere_patrate_perfecte(n);

}30.12.2015 Programarea calculatoarelor 26

9.8.2. Funcţii de tip void

Instructiuni de apel

30.12.2015 Programarea calculatoarelor 27

9.8.2. Funcţii de tip void

Problema 5:

Enunţ:

Scrieţi o funcţie care să aibă ca rezultatafisarea valorii minime existente într-untablou de numere intregi.

30.12.2015 Programarea calculatoarelor 28

9.8.2. Funcţii de tip void

#include <iostream.h>

int x[100], n;

void minim(int x[100], int n)

{

int i, min;

min = x[1];

for(i=2; i<=n; i++)

if( x[i] < min ) min = x[i];

cout<<"Minimul este: "<<min;

return;

}

30.12.2015 Programarea calculatoarelor 29

int main(){

cout<<"Dati numarul de elemente n = "; cin>>n;for(i=1; i<=n; i++)

cin>>x[i];minim(x,n);

}

30.12.2015 Programarea calculatoarelor 30

9.8.2. Funcţii de tip void

30.12.2015 Programarea calculatoarelor 31

9.8.2. Funcţii de tip void

Problema 6:

Enunţ:

Pentru un număr natural n dat, se cere:

să se determine toţi divizorii pozitivi

să se calculeze numărul divizorilor

să se calculeze suma divizorilor

să se calculeze produsul divizorilor numărului n

30.12.2015 Programarea calculatoarelor 32

9.8.2. Funcţii de tip void

#include <iostream.h>int n;

// functie care afiseaza toti divizorii proprii ai numarului n

void divizori(int n){

int i;for(i=1; i<=n; i++)

if( n % i == 0 ) cout<<i<<" ";

return;}

30.12.2015 Programarea calculatoarelor 33

// functie care calculeaza numarul de divizori ai numarului n

int nr_divizori(int n)

{

int i, nr = 0;

for(i=1; i<=n; i++)

if( n % i == 0 ) nr++;

return nr;

}

30.12.2015 Programarea calculatoarelor 34

// functie care calculeaza suma divizorilor numarului n

int suma_divizori(int n){

int i, s = 0;for(i=1; i<=n; i++)

if( n % i == 0 ) s = s + i;return s;

}

30.12.2015 Programarea calculatoarelor 35

// functie care calculeaza produsul divizorilor numarului n

int produs_divizori(int n){

int i, p = 1;for(i=1; i<=n; i++)

if( n % i == 0 ) p = p * i;return p;

}

30.12.2015 Programarea calculatoarelor 36

int main(){

cout<<"Dati n = "; cin>>n;cout<<"\nDivizorii numarului "<<n<<" sunt: ";divizori(n);cout<<"\nNumarul de divizori ai numarului "<<n<<" = "<<nr_divizori(n)<<"\n";

cout<<"\nSuma divizorilor numarului "<<n<<" = "<<suma_divizori(n)<<"\n";

cout<<"\nProdusul divizorilor numarului " <<n<<" = "<<produs_divizori(n)<<"\n";

}

30.12.2015 Programarea calculatoarelor 37

30.12.2015 Programarea calculatoarelor 38

9.8.2. Funcţii de tip void

Problema 7:

Enunţ:

Să se scrie câte o funcţie fără tip care săefectueze:

Citirea unei matrice pătratice

Suma elementelor din matrice aflate pediagonala principală şi produsul celorlalteelemente

Afişarea elementelor din matrice

30.12.2015 Programarea calculatoarelor 39

9.8.2. Funcţii de tip void

#include <iostream.h>int a[50][50],n;void citire_matrice(void){

int i,j;cout<<"Dati dimensiunile matricei \n";cout<<"Dati numarul de linii si de coloane n = ";cin>>n;for(i=1; i<=n; i++)

for(j=1; j<=n; j++){

cout<<"a["<<i<<","<<j<<"]= ";cin>>a[i][j];

}return;

}

30.12.2015 Programarea calculatoarelor 40

void scriere_matrice(void){

int i, j;cout<<"Elementele matricei A sunt: \n";for(i=1; i<=n; i++){

for(j=1; j<=n; j++){

cout.width(4);cout<<a[i][j];

}cout<<"\n";

}return;

}

30.12.2015 Programarea calculatoarelor 41

void suma_produs(void){

int suma=0, produs=1, i, j;for(i=1; i<=n; i++)

for(j=1; j<=n; j++)if( i == j ) suma = suma + a[i][j];

else produs = produs * a[i][j];cout<<"Suma elementelor de pe diagonala

principala este "<<suma<<"\n";cout<<"Produsul celorlalte elementelor este

"<<produs<<"\n";return;

}

30.12.2015 Programarea calculatoarelor 42

int main(void){

citire_matrice();scriere_matrice();suma_produs();

}

30.12.2015 Programarea calculatoarelor 43

9.8.2. Funcţii de tip void

Instructiuni de apel

9.8.2. Funcţii de tip void

30.12.2015 Programarea calculatoarelor 44

Problema 8:

Enunţ:

Fiind dat un tablou bidimensional cu n linii şi ncoloane, afişaţi cea mai mare componentă şi poziţiile pecare le ocupă.

Exemplu:

30.12.2015 Programarea calculatoarelor 45

9.8.2. Funcţii de tip void

Date de ieşire: max = 7 se afla pe pozitiile 1 2 si 2 2

Date de intrare: n = 2 si matricea: 4 7 5 7

#include <iostream.h>int a[50][50],n;void citire_matrice(void){

int i,j;cout<<"Dati dimensiunile matricei \n";cout<<"Dati numarul de linii si de coloane n = ";cin>>n;for(i=1; i<=n; i++)

for(j=1; j<=n; j++){

cout<<"a["<<i<<","<<j<<"]= ";cin>>a[i][j];

}return;

}

30.12.2015 Programarea calculatoarelor 46

void scriere_matrice(void){

int i,j;cout<<"Elementele matricei A sunt: \n";for(i=1; i<=n; i++){

for(j=1; j<=n; j++){

cout.width(4);cout<<a[i][j];

}cout<<"\n";

}return;

}

30.12.2015 Programarea calculatoarelor 47

void elemente_maxime(void)

{

int max=-1000,i,j;

for(i=1; i<=n; i++)

for(j=1; j<=n; j++)

if( max < a[i][j] ) max=a[i][j];

cout<<"Maximul din matrice este "<<max<<"\n";

for(i=1; i<=n; i++)

for(j=1; j<=n; j++)

if( max == a[i][j] )

cout<<"linia "<<i<<" si coloana "<<j<<"\n";

return;

}

30.12.2015 Programarea calculatoarelor 48

int main(void){

citire_matrice();scriere_matrice();elemente_maxime();

}

30.12.2015 Programarea calculatoarelor 49

9.8.2. Funcţii de tip void

Instructiuni de apel

9.8.2. Funcţii de tip void

30.12.2015 Programarea calculatoarelor 50

Problema 9:

Enunţ:Se citeste o matrice patratica de dimensiune n cu

elemente numere intregi. Se cere:

Sa se afiseze numerele prime de pe diagonala principala

Sa se formeze un vector cu elementele matricei parcurse in ordine pe coloane

Exemplu:

30.12.2015 Programarea calculatoarelor 51

9.8.2. Funcţii de tip void

Date de ieşire: Numere prime de pe diagonalaprincipala: 5Parcurgerea matricii pecoloane: 1 4 7 2 5 8 3 6 9

Date de intrare: n = 3 si matricea: 1 2 34 5 67 8 9

#include <iostream.h>int a[50][50],n;void citire_matrice(void){

int i,j;cout<<"Dati dimensiunile matricei \n";cout<<"Dati numarul de linii si de coloane n = ";cin>>n;for(i=1; i<=n; i++)

for(j=1; j<=n; j++){

cout<<"a["<<i<<","<<j<<"]= ";cin>>a[i][j];

}return;

}

30.12.2015 Programarea calculatoarelor 52

void scriere_matrice(void){

int i,j;cout<<"Elementele matricei A sunt: \n";for(i=1; i<=n; i++){

for(j=1; j<=n; j++){

cout.width(4);cout<<a[i][j];

}cout<<"\n";

}return;

}

30.12.2015 Programarea calculatoarelor 53

int prim(int x)

{

int ok=1;

for(int i=2;i<=x/2;i++)

if(x%i==0) ok=0;

if(ok==1 && x>=2) return 1;

else return 0;

}

30.12.2015 Programarea calculatoarelor 54

void diagonala(void)

{

cout<<"elementele prime de pe diagonalaprincipala\n";

for(int i=1;i<=n;i++)

if(prim(a[i][i])==1) cout<<a[i][i]<<" ";

cout<<"\n";

return;

}

30.12.2015 Programarea calculatoarelor 55

void vector(void){

int b[200], i, j;cout<<"parcurgerea matricii pe coloane\n";int nr=0;for(j=1;j<=n;j++)

for (i=1;i<=n;i++)b[++nr]=a[i][j];

for(i=1;i<=nr;i++)cout<<b[i]<<" ";

cout<<"\n";return;

}30.12.2015 Programarea calculatoarelor 56

Parcurgerea pe coloane

Formarea vectorului

int main(){

citire_matrice();scriere_matrice();diagonala();vector();

}

30.12.2015 Programarea calculatoarelor 57

9.8.2. Funcţii de tip void

Instructiuni de apel

9.8.2. Funcţii de tip void

30.12.2015 Programarea calculatoarelor 58

Capitolul 9. Funcții

9.8. Probleme rezolvate cu ajutorul funcţiilor

9.8.1. Funcţii definite de utilizator

9.8.2. Funcţii de tip void

9.9. Probleme propuse spre rezolvare

30.12.2015 Programarea calculatoarelor 59

9.9. Probleme propuse spre rezolvare

1. Se da un vector v cu n elemente numereintregi. Sa se scrie un program care sa calculeze:a) Suma elementelor din vectorul vb) Numarul componentelor impare din vectorul vc) Elementul maxim din vectorul vExemplu:Date de intrare: n = 9 v = {2, 9, 15, 6, 3, 12, 66, 8, 5}

30.12.2015 Programarea calculatoarelor 60

Date de iesire: a) 126b) 4c) 66

9.9. Probleme propuse spre rezolvare

2. Se dau n numere intregi. Sa se scrie unprogram care sa gaseasca numarul mai mic sauegal decat n, care sa aiba cei mai multi divizori. Seva folosi o functie care calculeaza numarul dedivizori ai unui numar.

Exemplu:Date de intrare: n = 100

30.12.2015 Programarea calculatoarelor 61

Date de iesire: 60 (are 12 divizori)

9.9. Probleme propuse spre rezolvare

3. Se da un numar natural n. Sa se scrie unprogram care sa stabileasca raportul dintrenumarul divizorilor pari si numarul divizorilorimpari ai numarului n.Exemplu:Date de intrare: n = 246

30.12.2015 Programarea calculatoarelor 62

Date de iesire: 1 (4 divizori pari si 4 divizori impari)

9.9. Probleme propuse spre rezolvare

4. Pentru o matrice formată din n linii şi m coloane(1< n, m < 10) să se scrie un program care afişează liniileconţinând k elemente nule (0 < k <= m).

Se va afişa un mesaj în situaţia în care nici o linie nuconţine exact k elemente nule.Exemplu:

30.12.2015 Programarea calculatoarelor 63

Date de iesire: Linia 2

Date de intrare: n=2, m=4, k=21 0 2 30 3 0 5

9.9. Probleme propuse spre rezolvare

5. Se dă o matrice pătratică de dimensiune n*nprecizată, scrieţi un program care stabileşte dacă:

matricea este simetrică faţă de diagonala principală

matricea este inferior triunghiulară, adică toate elementele situate deasupra diagonalei principale sunt nule

Exemplu:

30.12.2015 Programarea calculatoarelor 64

Date de iesire: Matricea este simetrica

Date de intrare: n=41 11 22 3311 1 44 5522 44 1 6633 55 66 1

9.9. Probleme propuse spre rezolvare

6. Scrieţi o funcţie care să stabilească dacă un număr dat n conţine în reprezentarea sa zecimală o anumită cifră precizată, notată, de exemplu, c.

Se va utiliza apoi această funcţie pentru a afişa toţi întregii cu valori cuprinse între 1 şi p (pcitit de la tastatură) pentru care numărul, pătratul şi cubul reprezentării sale conţin aceeaşi cifră.

30.12.2015 Programarea calculatoarelor 65

9.9. Probleme propuse spre rezolvare

Exemplu:

30.12.2015 Programarea calculatoarelor 66

Date de iesire: 5 (valorile 5, 25=52, 125=53 contin cifra 5)

Date de intrare: c=5p=200

Pentru alte informații teoretice și

aplicative legate de acest capitol se recomandă

capitolul 4 – FUNCȚII din cartea Noțiuni de

programare în limbajul C++, Adrian Runceanu,

Mihaela Runceanu, Editura Academica

Brâncuși, Târgu-Jiu, 2012

(www.utgjiu.ro/editura) aflată la biblioteca

Facultății de Inginerie.

30.12.2015 Programarea calculatoarelor 67

Întrebări?

30.12.2015 Programarea calculatoarelor 68