Issuu on Google+

PROBLEME PROPUSE PENTRU TEZA (TIP 2) 1. Se citesc de la tastatura n numere naturale. Să se afișeze la monitor toți divizorii fiecărui numar x în parte. Dacă x este prim afișează "x este nr prim". #include<iostream.h> void main(){ int x,d,g,n; cout<<"n="; cin>>n; for(int i=1;i<=n;i++){ g=0; cout<<"x="; cin>>x; for(d=2; d<=x/2; d++) if (x%d==0) { cout<<d<<endl; g=1; } if(g==0) cout<<x<<" numar prim"<<endl; } } 2.

Se considera programul următor:

#include <iostream.h> int a, b, i; void main(){ a = 0; b = 20; i = 0; do { i = i + 1; a = a + 3; b = b – 2; } while( a <= b ); cout << i << “, ” << a << “, ” << b; }

Ce se va afisa ? 2.

_______________________________

Fie urmatorul program:

#include <iostream.h> int c, n, z; void main(){ cout << ”n=”; cin >> n; z = 0; while( n > 0 ){ c = n % 10; n = n / 10; if( c < 4 ) z = z * 10 + 3 * c; } cout << z; }


a) Scrieţi valoarea afişată dacă pentru n se citeşte valoarea 52081: ____________ ? b) Scrieţi o valoare de 4 cifre care poate fi citită pentru variabila n astfel încât numarul afisat sa aiba 2 cifre, una para si una impara. _________ ? c) Scrieţi cea mai mica valoare de 3 cifre distincte care poate fi citită pentru variabila n astfel încât să se afişeze 0. _________ ? 3. Se citeste un numar natural n si apoi n numerele naturale. Scrieti programul care calculeaza cate au suma cifrelor divizibila cu 3 sau cu 10. (Scrieti programul pe spatele foii). Ex: pentru n = 6 si numerele 20 721 54 293 70 3809 se va afisa 3 4. Variabila x este de tip real. Care dintre urmatoarele expresii C++ are valoarea 1 daca si numai daca numarul real memorat in variabila x apartine intervalului (5, 8] ? a. (x<8) && (x>=5) c. (x>8) || (x<=5)

5.

b. (x<=8) || (x>5) c. (x<=8) && (x>5)

Se considera programul următor:

# include <iostream.h> int a, b, i ; void main(){ a = 10 ; b = 20 ; i = 0 ; while( a != 2*b ){ i = i+1 ; a = a + 2 ; b = b – 2 ; } cout << i << “, “ << a << “, ” << b; }

Ce se va afisa ? 6.

_______________________________

Fie urmatorul program:

#include <iostream.h> int a, b, c; void main(){ cout << “a=”; cin >> a; b = 0; do { c = a % 10; if( c % 2 != 0 ) b = b * 10 + c; a = a/10; } while( a != 0 ); cout << b; }

a) Scrieţi valoarea care se va afişa dacă se citeşte numărul a=615803. ______________ ? b) Scrieţi o valoare care poate fi citită pentru a astfel încât să se afişeze valoarea 0. _________ ? c) Scrieţi cea mai mare valoare cu 3 cifre care poate fi citită pentru a astfel încât să se afişeze o valoare egală cu cea citită. __________ ? 7. Se citeste un numar natural n si apoi n numerele naturale. Scrieti programul care calculeaza cate nu au suma cifrelor divizibila cu 3 sau cu 10. (Scrieti programul pe spatele foii). Ex: pentru n = 6 si numerele 20 721 54 293 70 3809 se va afisa 3 8. Care dintre urmatoarele expresii C++ are valoarea 1 daca si numai daca numarul real memorat in variabila x se afla in intervalul (-2, 2) ?


a. x * x – 4 <= 0 c. ( 2 < x ) && ( x < -2 )

b. 4 – x * x > 0 d. ( x – 2 ) * ( x + 2 ) > 0

9. Sa se scrie un program care afiseaza toti divizorii unui numar intreg x, introdus de la tastatura. (Pentru acest program, cu alte cuvinte trebuie sa impartim numarul citit la toate numerele mai mici decat el, sa verificam daca x se imparte exact la acel numar, si apoi sa afisam toate numerele la care x se divide) #include <iostream.h> #include <math.h> void main (){ int x, d; //x=nr citit; d=numerele la care se va imparti x; cout<<”Divizorii unui numar”<<endl; cout<<”Introduceti numarul: “; cin>>x; cout<<”Divizorii numarului x sunt: “; for (d=1; d<=x; d++){ //pentru d, initial 1, pana la numarul x; if (x%d==0) //verificam daca x se imparte exact la acel presupus divizor cout<<d<<”; “; //daca da, il afisam; } } 10. Sa se afiseze daca un numar introdus de la tastatura este prim. (Pentru a verifica daca un numar este prim, se procedeaza asemanator ca la afisarea divizorilor, doar ca aici nu afisam divizorii, ci testam daca numarul are exact 2 divizori, si anume 1 si el insusi.) #include <iostream.h> #include <math.h> void main (){ int x, d, cnt, aux; //x=nr citit; // d=numerele la care se imparte x; // cnt=variabila care va numara cati divizori are x; // aux=auxiliara care il va memora pe x; cout<<”Introduceti numarul: “; cin>>x; cnt=0; aux=x; for (d=1; d<=x; d++){ if (x%d==0) //daca x se imparte exact la d, atunci cnt=cnt+1; cnt=cnt+1; } if (cnt==2) //apoi verificam daca x are exact 2 divizori cout<<”Numarul “<<aux<<” este prim.”; //si afisam daca acesta este prim else cout<<”Numarul “<<aux<<” nu este prim.”; //sau nu… } 11. Sa se afiseze divizorii primi si la ce putere, ai unui numar introdus de la tastatura. #include<iostream.h> void main(){ int n,d=2,p; cout<<"n=";


cin>>n; while(n>1){ p=0; while(n%d==0){ p=p+1; n=n/d; } if(p) cout<<d<<" la puterea "<<p<<endl; d=d+1; } } 12. Cel mai mare divizor comun se poate calcula folosind doi algoritmi: 1. Algoritmul de aflare a cmmdc prin scadere (algoritm neeficient) 2. Algoritmul de aflare a cmmdc prin impartire - Euclid (algoritm eficient) Fiind date 2 numere naturale a si b, sa se calculeze cmmdc (a,b). Acesta se calculeaza facand impartirea lui a la b, si pastrand restul. Cat timp restul este diferit de 0, se atribuie lui a valoarea b, lui b valoarea restului iar restul se recalculeaza. Cand se iese din structura repetitiva, cmmdc se gaseste in variabila b. #include<iostream> void main(){ int a, b, r; cout<<”a=”; cin>>a; cout<<”b=”; r=a % b; while(r!=0){ a=b; b=r; r=a % b; } cout<<b; } #include<iostream> void main(){ int a, b, r, aa, bb; cout<<”a=”; cin>>a; aa=a; cout<<”b=”; cin>>b; bb=b; r=a % b; while(r!=0){ a=b; b=r; r=a % b;

//cmmdc


} cout<<(aa*bb)/b;

//cmmmc

} 13. Un numar se descompune in cifre prin impartire succesiva la 10. Daca de exemplu, se da un numar n=12345, atunci avem: n%10 este "5", deci ultima cifra a numarului n/10 este 1234, deci numarul fara ultima cifra. Daca dorim sa retinem ultimele 2 cifre din numar, vom folosi n%100. Daca dorim sa retinem ultimele 3 cifre din numar, vom folosi n%1000 etc. Exemplu 1 Se da un numar natural n. Sa se afiseze suma cifrelor sale. (Daca se citeste de la tastatura numarul n=81523, atunci suma cifrelor este S = 3+2+5+1+8 = 19) #include<iostream> void main(){ int n, s=0; cout<<”n=”; cin>>n; while(n!=0){ s = s + n%10; n = n/10; } cout<<”Suma cifrelor numarului ”<<n<<” este”<<s; }

//suma cifrelor

14. Algoritmul pentru compunerea unui numar din cifrele sale Citirea cifrelor numarului se face incepand cu cifra cea mai semnificativa Algoritmul foloseste reprezentarea numarului in baza 10. Varianta 1 Se introduc pe rand de la tastatura cele n cifre ale unui numar incepand cu cifra cea mai semnificativa. Sa se afiseze numarul nr obtinut din aceste cifre. Varianta 2 Se introduc pe rand de la tastatura mai multe numere , care reprezinta cifrele unui numar , incepand cu cifra cea mai semnificativa , pana cand se introduce un numar care nu poate fi cifra. Sa se afiseze numarul nr obtinut din aceste cifre.


Pseudocod - Varianta 1

Pseudocod - Varianta 2

intreg n,p,nr,i,c; inceput citeste n; p <-- 1; pentru i <-- 1,n-1 executa p <-- p*10; sfarsit_pentru; nr <-- 0; pentru i <--1,n executa citeste c; nr <-- nr + c*p; p <-- p div 10; sfarsit_pentru; scrie nr; sfarsit.

intreg c,nr; inceput nr <-- 0; citeste c; cat timp c>=0 and c<=9 executa nr <-- nr*10 + c; citeste c; sfarsit_cat_timp; scrie nr; sfarsit.

Algoritmul pentru determinarea inversului unui numar Algoritmul determina inv inversul numarului n prin extragerea pe rand a fiecarei cifre din numarul n si compunerea unui nou numar cu aceste cifre. De exemplu, daca numarul este 123 , inversul este 321. Pseudocod intreg n,inv; inceput citeste n; inv <--0; cat timp n<>0 executa inv <-- inv*10 + n mod 10; n <-- n div 10; sfarsit_cat_timp; scrie inv; sfarsit.

Exercitiu: treceti algoritmii reprezentati in pseudocod in limbajul C++. 15. Pentru sume si produse va rog sa urmariti materialul Algoritmi elementari prezentat mai jos. http://issuu.com/alifan/docs/algoritmi_elementari 16. Tablouri unidimensionale. - Tablourile unidimensionale mai poarta numele de vectori. - Dati definitia tabloului unidimensional. - Citirea de la tastatura a unui tablou unidimensional:


Secventa de cod: … int i, V[100], n;

// V –tabloul undim. De max 100 de elemente de tip intreg // n – numarul de elemente ce se citesc in tablou // i – contor pt instruct repetitiva for

cout<<”n=”; cin>>n; for(i=0; i<n; i++){ cout<<”V[”<<i<<”]=”; cin>>V[i]; } … - Afisarea/scrierea pe ecran a unui tablou unidimensional: Secventa de cod: int i, V[100], n; … cout<<”V={ ”<<V[0]; for(i=1; i<n; i++) cout<<”, ”<<V[i]; cout<<” }”; … De ex. daca vectorul contine valorile 13 7 -1 10 200 -30 secventa de mai sus afiseaza V={ 13, 7, -1, 10, 200, -30 } - Cautarea secventiala si binara va rog sa o urmariti pe caiete, manuale si de la activitatea din clasa 17. Problema interclasării. Se citesc de la tastatura două tablouri unidimensionale A si B cu valori ordonate. Sa se construiasca un tablou unidimensional C cu valorile din A si B, valorile din C de asemenea sa fie ordonate. #include<iostream.h> int a[25], b[25], c[25]; int n,m,i,j,k; void main(void){ cout<<”Introduceti lungimile celor 2 vectori a si b= “; cin>>m>>n; // cititi elementele celor 2 vectori ordonati crescatori for(i=1;i<=m;i++){ cout<<”a["<<i<<"]=”; cin>>a[i]; } for(i=1;i<=n;i++){ cout<<”b["<<i<<"]=”; cin>>b[i]; } // interclasarea


i=1; j=1; k=0; while((i<=m)&&(j<=n)){ if(a[i]<b[j]){ k++; c[k]=a[i]; i++; } else { k++; c[k]=b[j]; j++; } } // adaugam elementele ramase neparcurse if(i<=m){ while(i<=m){ k++; c[k]=a[i]; i++; } } if(j<=n){ while(j<=n){ k++; c[k]=b[j]; j++; } } // afisez vectorul interclasat for(i=1;i<=k;i++) cout<<c[i]<<â&#x20AC;? â&#x20AC;&#x153;<<endl; }


probltezase2tip2