Universitatea Constatin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Programarea calculatoarelor Lect.dr. Adrian Runceanu
Curs 13 24.05.2013 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 24.05.2013 Programarea calculatoarelor 3
9.8.2. Funcţii de tip void Problema 8: Enunţ: Se consideră un număr natural în baza 10. Se cere să se scrie câte o funcţie care să afişeze reprezentarea numărului dat în bazele 2 şi 8. Exemplu: Pentru n=25 10 : reprezentarea numărului în baza 2 este 11001 2 reprezentarea numărului în baza 8 este 31 8 24.05.2013 Programarea calculatoarelor 4
#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++; Se rețin resturile împărțirii numărului la 2 24.05.2013 Programarea calculatoarelor 5
9.8.2. Funcţii de tip void cifre = i-1; cout<<"reprezentarea numarului in baza 2 este:"; for(i = cifre; i >= 1; i--) cout<<"\n"; return; cout<<x[i]; 24.05.2013 Programarea calculatoarelor 6
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++; Se rețin resturile împărțirii numărului la 8 24.05.2013 Programarea calculatoarelor 7
9.8.2. Funcţii de tip void cifre = i-1; cout<<"reprezentarea numarului in baza 8 este: "; for(i=cifre; i>=1; i--) cout<<x[i]; cout<<"\n"; return; 24.05.2013 Programarea calculatoarelor 8
9.8.2. Funcţii de tip void int main() cout<<"dati n = "; cin>>n; baza_2(n); baza_8(n); 24.05.2013 Programarea calculatoarelor 9
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 10
Problema 9: 9.8.2. Funcţii de tip void Enunţ: Se consideră un număr natural n. Se cere să se scrie câte o funcţie, pentru următoarele cerinţe: Să se afişeze toate numerele prime mai mici sau egale cu n Să se afişeze toate numerele perfecte mai mici sau egale cu n Să se afişeze toate numerele pătrate perfecte mai mici sau egale cu n 24.05.2013 Programarea calculatoarelor 11
#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; 24.05.2013 Programarea calculatoarelor 12
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; 24.05.2013 Programarea calculatoarelor 13
9.8.2. Funcţii de tip void void numere_patrate_perfecte(int n) int i; cout<<"numerele patrate perfecte mai mici sau egale decat "<<n<<" sunt \n"; for(i=1; i<=n; i++) if( sqrt(i) == floor( sqrt(i) ) ) cout<<i<<" "; return; 24.05.2013 Programarea calculatoarelor 14
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); 24.05.2013 Programarea calculatoarelor 15
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 16
Problema 10: Enunţ: 9.8.2. Funcţii de tip void Scrieţi o funcţie care să aibă ca rezultat valoarea minimă existentă într-un tablou de numere intregi. 24.05.2013 Programarea calculatoarelor 17
#include <iostream.h> int x[100], n; int 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]; return min; 24.05.2013 Programarea calculatoarelor 18
9.8.2. Funcţii de tip void int main() cout<<"dati numarul de elemente n = "; cin>>n; for(i=1; i<=n; i++) cin>>x[i]; cout<<"minimul este: "<<minim(x,n)<<"\n"; 24.05.2013 Programarea calculatoarelor 19
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 20
9.8.2. Funcţii de tip void Problema 11: 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 24.05.2013 Programarea calculatoarelor 21
#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; 24.05.2013 Programarea calculatoarelor 22
// 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; 24.05.2013 Programarea calculatoarelor 23
// 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; 24.05.2013 Programarea calculatoarelor 24
// 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; 24.05.2013 Programarea calculatoarelor 25
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"; 24.05.2013 Programarea calculatoarelor 26
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 27
Problema 12: Enunţ: 9.8.2. Funcţii de tip void Să se scrie câte o funcţie fără tip care să efectueze: Citirea unei matrice pătratice Suma elementelor din matrice aflate pe diagonala principală şi produsul celorlalte elemente Afişarea elementelor din matrice 24.05.2013 Programarea calculatoarelor 28
#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; 24.05.2013 Programarea calculatoarelor 29
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; 24.05.2013 Programarea calculatoarelor 30
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; 24.05.2013 Programarea calculatoarelor 31
int main(void) citire_matrice(); scriere_matrice(); suma_produs(); 9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 32
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 33
Problema 13: Enunţ: Fiind dat un tablou bidimensional cu n linii şi n coloane, afişaţi cea mai mare componentă şi poziţiile pe care le ocupă. Exemplu: Date de intrare: n = 2 si matricea: 4 7 9.8.2. Funcţii de tip void Date de ieşire: max = 7 se afla pe pozitiile 1 2 si 2 2 5 7 24.05.2013 Programarea calculatoarelor 34
#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; 24.05.2013 Programarea calculatoarelor 35
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; 24.05.2013 Programarea calculatoarelor 36
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; 24.05.2013 Programarea calculatoarelor 37
9.8.2. Funcţii de tip void int main(void) citire_matrice(); scriere_matrice(); elemente_maxime(); 24.05.2013 Programarea calculatoarelor 38
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 39
Problema 14: Enunţ: Se citeste o matrice patrata de dimensiune nxn si 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: Date de intrare: n = 3 si matricea: 1 2 3 4 5 6 9.8.2. Funcţii de tip void Date de ieşire: Numere prime de pe diagonala principala: 5 Parcurgerea matricii pe coloane: 1 4 7 2 5 8 3 6 9 7 24.05.2013 8 9 Programarea calculatoarelor 40
#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; 24.05.2013 Programarea calculatoarelor 41
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; 24.05.2013 Programarea calculatoarelor 42
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; 24.05.2013 Programarea calculatoarelor 43
void diagonala(void) cout<<"elementele prime de pe diagonala principala\n"; for(int i=1;i<=n;i++) if(prim(a[i][i])==1) cout<<a[i][i]<<" "; cout<<"\n"; return; 24.05.2013 Programarea calculatoarelor 44
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; 24.05.2013 Programarea calculatoarelor 45
int main() citire_matrice(); scriere_matrice(); diagonala(); vector(); 9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 46
9.8.2. Funcţii de tip void 24.05.2013 Programarea calculatoarelor 47
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 24.05.2013 Programarea calculatoarelor 48
9.9. Probleme propuse spre rezolvare Se da un vector v cu n elemente numere intregi. Sa se scrie un program care sa calculeze: a) Suma elementelor din vectorul v b) Numarul componentelor impare din vectorul v c) Elementul maxim din vectorul v Exemplu: Date de intrare: n = 9 v = 2, 9, 15, 6, 3, 12, 66, 8, 5 Date de iesire: a) 126 b) 4 c) 66 24.05.2013 Programarea calculatoarelor 49
9.9. Probleme propuse spre rezolvare Se dau n numere intregi. Sa se scrie un program care sa gaseasca numarul mai mic sau egal decat n, care sa aiba cei mai multi divizori. Se va folosi o functie care calculeaza numarul de divizori ai unui numar. Exemplu: Date de intrare: n = 100 Date de iesire: 60 (are 12 divizori) 24.05.2013 Programarea calculatoarelor 50
9.9. Probleme propuse spre rezolvare Se da un numar natural n. Sa se scrie un program care sa stabileasca raportul dintre numarul divizorilor pari si numarul divizorilor impari ai numarului n. Exemplu: Date de intrare: n = 246 Date de iesire: 1 (4 divizori pari si 4 divizori impari) 24.05.2013 Programarea calculatoarelor 51
9.9. Probleme propuse spre rezolvare Pentru o matrice formată din n linii şi m coloane (1< n, m < 10) să se scrie un program care afişează liniile conţinând k elemente nule (0 < k <= m). Se va afişa un mesaj în situaţia în care nici o linie nu conţine exact k elemente nule. Exemplu: Date de intrare: n=2, m=4, k=2 1 0 2 3 0 3 0 5 Date de iesire: Linia 2 24.05.2013 Programarea calculatoarelor 52
9.9. Probleme propuse spre rezolvare Se dă o matrice pătratică de dimensiune n*n precizată, 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: Date de intrare: n=4 1 11 22 33 11 1 44 55 22 44 1 66 33 55 66 1 Date de iesire: Matricea este simetrica 24.05.2013 Programarea calculatoarelor 53
9.9. Probleme propuse spre rezolvare 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 (p citit de la tastatură) pentru care numărul, pătratul şi cubul reprezentării sale conţin aceeaşi cifră. 24.05.2013 Programarea calculatoarelor 54
9.9. Probleme propuse spre rezolvare Exemplu: Date de intrare: c=5 p=200 Date de iesire: 5 (valorile 5, 25=5 2, 125=5 3 contin cifra 5) 24.05.2013 Programarea calculatoarelor 55
Întrebări? 24.05.2013 Programarea calculatoarelor 56