Sie sind auf Seite 1von 64

Instalarea Borland C++ 3.

1 pe Windows XP i Windows Vista sau 7 Civa pai pentru instalarea corect a Borland C ++ pe sistemele de operare mai noi. Pentru nceput este nevoie de chitul de instalare pe care-l putei descrca de aici. 1. Extragei arhiva n partiia cu Windows-ul (de obicei este vorba de partiia C) 2. Din folderul de instalare (extras mai devreme) pornii fiierul install.exe 3. La prima afiare apsai tasta enter. 6. La a 4-a afiare mutai selecia pe ultima opiune a meniului: Start installation i apsai tasta enter.

instalare BC++ 4. La a doua afiare selectai partiia chitului de instalare. n cazul de fa este vorba de partiia C

Programul se va instala n partiia C folderul BorlandC. Programul va rula din fiierulBC.EXE . Aceste instruciuni de instalare au fost testate pe Windows XP iWindows 7.

5. La a treia afiare lsai denumirea implicita a directoriului de instalare

Programare n C++: Suma a n numere naturale O problem relativ simpl: - se citete variabila n - se citete cte un element folosind for de la 1 la n i se adaug la variabila s - se afieaz variabila s #include <iostream.h> void main() { int n, i, s=0, nr; cin>> n; for (i=0; i<n; i++) {cin>>nr; s+=nr;} cout<<s; } Programare n C++ : Suma cifrelor unui numr - se citete numrul nr - se mparte la 10 folosind operatorul % i se obine restul - de fiecare dat, se adun restul la o variabil s - numrul se iniializeaz cu (valoarea sa)/10 - se folosete setul de instruciuni pn cnd nr este egal cu zero - se afieaz s. #include <iostream.h> void main() { int nr, s=0; while (nr!=0) {s+=nr%10; nr=nr/10;} cout<<s;

- folosind structura for, se incrementeaz i pn ajunge la valoarea lui n - nainte de fiecare incrementare, se nmulete p cu valoarea respectiv a lui i - se citete p #include <iostream.h> int i,p=1,n; void main() {cin>>n; for(i=1, i<n; i++) p=p*i; cout<<p; } Programare n C++: Rezolvarea ecuaiei de gradul 2 n Z - se consider ecuaia de forma a*x*x+b*x+c=0 - se citesc: a, b i c de la tastatur - se calculeaz delta i se verific - dac delta este mai mic dect zero, programul va afia: Nu are soluie n Z - dac delta este mai mare dect zero, programul va calcula x1 i x2 - se afieaz x1 i x2 #include <iostream.h> #include <math.h>

} Programare n C++: Calcularea lui n factorial (n!) - se citete n de la tastatur - se declara o variabil p egal cu 1 - se declar un contor i cu valoarea iniial 1

int a,b,c,x1,x2,delta; void main() { cin>>a; cin>>b; cin>>c; delta = b*b-4*a*c; if (delta<0) cout<<Ecuatia nu are solutie n Z; else { x1=(-b+sqrt(delta))/(2*a); x2=(-

b-sqrt(delta))/(2*a); cout<<x1; cout<<x2;} } Programare n C++ : Cte cifre distincte are un numr de 3 cifre? Varianta cu if Problema real sun cam aa: Se citete un numr de trei cifre de la tastatur. Scriei un program care s determine i s afieze numrul de cifre distincte.

se citete numrul se desparte numrul in cifre si fiecare cifr se memoreaz n cte o variabil se fac rapoarte ntre toate cifrele i fiecare rezultat se memoreaz n cte o variabil

acolo unde sunt valori identice ale cifrelor, rapoartele vor da 1, altfel vor da 0 i un numr mai mare dect 1

Rezolvarea: se citete numrul se desparte n cifre care se memoreaz n trei variabile diferite se compar variabilele n funcie de rezultatul comparaiilor, programul va afia cte cifre distincte are numrul Programul: #include<iostream.h> int a,b,c,d; void main() { cout<<Citeste nr; cin>>a; b=a%10; c=a%100/10; d=a/100; if (d!=b&&b!=c&&c!=d) cout<<3 cifre distincte; else if ((d!=b&&b==c)||(d==b&&c!=d)||(d==c&&b!=c )) cout<<2 cifre distincte; else cout<<nicio cifra distincta; } Programare n C++ : Cte cifre distincte are un numr de 3 cifre? Varianta fr if Fa de problema iniial, voi aduce o completare n enun i anume: Se citete un numr de trei cifre nenule. Scriei un program care s determine i s afieze numrul de cifre distincte. Un amic mi-a atras atenia c dac nu sunt cifrele nenule va trebui s folosesc funcii precum ceil i abs. Rezolvarea mea, deci:

pentru asta vom elimina numerele distincte de 1 prin efectuarea unei sume de mnuliri

suma se memoreaz ntr-o variabil se afieaza rezultatul diferenei dintre numrul 3 (numrul total de cifre) i variabila de mai sus Programarea: #include <iostream.h> #include <conio.h> int a,b,c,d,q,w,e,r,t,y,u; void main() { cout<<Citeste nr; cin>>a; b=a%10; c=a%100/10; d=a/100; q=b/c; w=c/b; e=c/d; r=d/c; t=b/d; y=d/b; u=q*w+e*r+t*y; cout<<Numarul <<a<< are <<3u<<cifre distincte ; getch(); } Programare n C++: Toate numerele palindrome de 8 cifre Problema sun cam aa: S se scrie un algoritm n C++ care s afieze n ordine cresctoare toate numerele palindrome de 8 cifre. Rezolvarea este destul de simpl. Vom lucra cu o singur variabil de tip long

sau double, ca s putem include toate numerele de 8 cifre. Vom avea o structur pentru n care vom incrementa un contor i de la 10000000 la 99999999. De fiecare dat cnd programul va ntlni un numr n care cifra 1=cifra 8, cifra 2=cifra 7, cifra 3=cifra 6 i cifra 4= cifra 5 nseamn c acela este un numr palindrom (numrul este egal cu oglinditul su) i l va afia. Apoi va face incrementare i tot aa pn la final. Algoritmul: #include <iostream.h> double i; //sau long void main() { for (i=10000000;i<=99999999;i++) if (i/10000000==i%10&&i/1000000%10==i/10%10 &&i/100000%10==i/100%10&&i/10000%10==i/1 000%10) cout<<i<<endl; }

void baza(int n,int b) { int r=n%b; if(n>=b) baza(n/b,b); cout<<r; } void main() { cout<<"n=";cin>>n; cout<<"b=";cin>>b; baza(n,b); } Sa se afle cmmdc pentru 2 numere utilizand varianta recursiva #include<iostream.h> int a,b; int cmmdc(int a,int b) { if(a==b) return a; else if (a>b) return cmmdc(a-b,b); else return cmmdc(a,b-a); } void main() { cout<<"a=";cin>>a; cout<<"b=";cin>>b; cout<<"cmmdc: "<<cmmdc(a,b); } Sirul lui Fibonacci

Functia Ackermann recursiv #include<iostream.h> long ack(unsigned x,unsigned y) { if(x==0) return y+1; if(y==0) return ack(x-1,1); return ack(x-1,ack(x,y-1)); } void main() { unsigned m,n; cout<<"m=";cin>>m; cout<<"n=";cin>>n; cout<<ack(m,n); }

Se citeste n.Sa se calculeze termenul de ordin n al sirului lui Fibonacci in varianta recursiva #include<iostream.h> int n; int f(int n) { if(n==0) return 0; else if(n==1) return 1; else return f(n-1)+f(n-2); } void main() { cout<<"n=";cin>>n; cout<<"termenul de ordin "<<n<<" este: "<<f(n); }

numar in baza b recursiv Sa se scrie o functie recursiva pentru a transforma un numar natural n, din baza 10 in baza b #include<iostream.h> int n,b;

Sa se scrie o functie recursiva pentru a calcula suma cifrelor unui numar

#include <iostream.h> int n; int s(int n) { if(n==0) return 0; else return n%10 + s(n/10); } void main() { cout<<"n=";cin>>n; cout<<"suma cifrelor: "<<s(n); } cautare in vector //suma elementelor pare #include<iostream.h> #include<conio.h> typedef int vector[20]; int n;vector v; int e(int n,int x) { if (n==0) return 0; else if (v[n]==x) return 1; else return e(n-1,x); } void main() { int x,i; cout<<"n=";cin>>n; cout<<"x=";cin>>x; for(i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} if (e(n,x)) cout<<"este"<<endl; else cout<<"nu este"; getch(); } suma elementelor pare //suma elementelor pare #include<iostream.h> #include<conio.h> typedef int vector[20]; int n;vector v; int suma(int n) { if (n==0) return 0; else return suma(n-1) + (v[n]%2==0)*v[n]; } void main() { cout<<"n=";cin>>n; for(int i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} cout<<suma(n)<<endl; getch(); }

Maximul unui vector #include<iostream.h> #include<conio.h> typedef int vector[20]; int n;vector v; int maxim(int n) {int max; if (n==1) return v[1]; else { max=maxim(n-1); if (max<v[n]) return v[n]; else return max; } } void main() { cout<<"n=";cin>>n; for(int i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} cout<<maxim(n)<<endl; getch(); } suma n/((n+1)(n+2) //1/(2*3)+2/(3*4)+...(n/((n+1)(n+2)) #include<iostream.h> #include<conio.h> float e(int k) { return (float)k/((k+1)*(k+2)); } float s(int k) { if (k==1) return (float)1/(2*3); else return e(k)+s(k-1); } suma 1/n //1+1/2+...1/n #include<iostream.h> #include<conio.h> float e(int k) { if (k==1) return 1; else return (float)1/k+e(k-1); } void main() { int n; cout<<"n=";cin>>n; cout<<e(n)<<endl; getch(); }

suma n*(n+1) //1*2+2*3+..+n*(n+1) #include<iostream.h> #include<conio.h> int p(int k) { return k*(k+1); } int s(int k) { if (k==0) return 0; else return p(k)+s(k-1); } void main() { int n; cout<<"n=";cin>>n; cout<<s(n)<<endl; getch(); } combinari //combinari #include<iostream.h> #include<conio.h> long comb(int n,int k) { if (k==0) return 1; else if (k>n) return 0; else return (comb(n-1,k)+comb(n-1,k-1)); } void main() { int k,n; cout<<"n=";cin>>n; cout<<"k=";cin>>k; cout<<//"combinari de"<<n<<"elemente luate cate"<<k<<":"<< comb(n,k)<<endl; getch(); } suma a n componente //sa se calculeze suma componentelor unui vector cu n elemente #include<iostream.h> #include<conio.h> typedef int vector[20]; int n;vector v; int suma(vector v,int n) { if (n==0) return 0; else return (v[n]+suma(v,n-1)); }

void main() { int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} cout<<"suma este"<<suma(v,n)<<endl; getch(); } PROBLEME REZOLVATE BACALAUREAT INFORMATICA C++ -)Scrieti programul C sau C++ care construiete n memorie o matrice p cu n linii si n coloane formata numai din valori 1 si2 astfel nct elementele de pe diagonala secundara si cea principala sa fie egale cu 1, iar restul elementelor din matrice sa fie egale cu 2 #include<iostream.h> int n,i,j,a[23][23]; void matrice(int x) { for(i=1;i<=x;i++) for(j=1;j<=x;j++) if(i==j || i==x-j+1) { a[i][j]=1; } else { a[i][j]=2; } } void afis() { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } } void main() { cout<<"dati n: ";cin>>n; matrice(n); afis(); } -)Realizati urmatoarele cerinte utiliznd limbajul C/C++: a) Scrieti definitia completa a unui subprogram sub cu doi parametri care: primeste prin intermediul parametrilor a si b doua numere naturale formate fiecare din cel mult 8 cifre; elimina cifra unitatilor numarului continut de parametrul a, mutnd-o la sfrsitul numarului continut de parametrul b; returneaza prin intermediul

parametrilor a si b noile numere obtinute. De exemplu, pentru valorile 1234 si 56 ale parametrilor a si b, n urma executarii subprogramului sub valorile returnate prin intermediul parametrilor vor fi 123 si 564. b) Scrieti programul care citeste de la tastatura un numar natural n cu cel mult 8 cifre si care verifica daca numarul n este un palindrom, folosind apeluri ale subprogramului sub. Programul va afisa pe ecran mesajul DA daca numarul este palindrom, altfel va afisa mesajul NU. (Un numar natural n este palindrom daca este egal cu numarul obtinut prin scrierea cifrelor numarului n n ordine inversa.) De exemplu, daca n=12321 atunci se va afisa pe ecran mesajul DA, iar daca n=124321 atunci se va afisa pe ecran mesajul N #include<iostream.h> long n; void sub(long &x,long &y) { y=y*10+x%10;; x=x/10; } void main() { cin>>n; long a=n; long b=0; while(a!=0) { sub(a,b); } if(n==b) cout<<"DA"; else cout<<"NU"; } -)Scrieti programul C sau C++ care citeste de la tastatura un sir de cel mult 30 de litere ale alfabetului englez si creeaza fisierul text BAC.TXT ce contine sirul de caractere dat si toate prefixele acestuia de lungime cel putin 1, fiecare pe cte o linie, n ordinea descrescatoare a lungimii prefixelor. De exemplu, daca se citeste sirul: proba, atunci BAC.TXT va contine: proba prob pro pr p #include<fstream.h> #include<string.h> ofstream g("bac.txt"); char c[30]; void main() {

int t,k,i,j; cin>>c; t=strlen(c); k=t; for(i=0;i<t;i++) { for(j=0;j<k;j++) { g<<c[j]; } g<<endl; k--; } } -) Scrieti programul C sau C++ care construieste n memorie o matrice patratica cu n linii si n coloane formata numai din valori 0,1 si 2 astfel nct elementele de pe diagonala secundara si cea principala sa fie egale cu 0, elementele situate ntre diagonalele matricei, n partea superioari inferioara acesteia, sa fie egale cu 1, iar restul elementelor din matrice sa fie egale cu 2. Valoarea lui n (numar natural, 2<n<23) se citeste de la tastatura, iar matricea se va afisa pe ecran, cte o linie a matricei pe cte o linie a ecranului, cu spatii ntre elementele fiecarei linii (ca n exemplu). De exemplu, pentru n=5 se construieste n memorie si se afiseaza matricea: 0 1 1 1 0 2 0 1 0 2 2 2 0 2 2 2 0 1 0 2 0 1 1 1 0 #include<iostream.h> int a[24][24],i,j,n; void matrice(int x) { for(i=1;i<=x;i++) for(j=1;j<=x;j++) if(i>j && x-i+1>j) a[i][j]=2; else if(i>j && x-i+1<j) a[i][j]=1; else if(i<j && x-i+1>j) a[i][j]=1; else if(i<j && x-i+1<j) a[i][j]=2; else if(i==j || i==x-j+i) a[i][j]=0; } void afis() { for(i=1;i<=n;i++)

{ for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } } void main() { cout<<"dati n: ";cin>>n; matrice(n); afis(); } -)Realizati urmatoarele cerinte utiliznd limbajul C/C++: a) Scrieti definitia completa a unei functii nr cu doi parametri, functie care: primeste prin intermediul parametrilor a si b doua numere reale pozitive; returneaza numarul de numere ntregi cuprinse ntre valorile parametrilor a si b, inclusiv. De exemplu, pentru valorile 10.5 si 7 ale parametrilor a si b, functia va returna valoarea 4 deoarece ntre valorile 7 si 10.5 sunt 4 numere ntregi: 7, 8, 9 si 10. b) Scrieti programul n care se citesc de la tastatura numerele naturale nenule a si k (a apartine[1000,9999], 4 mai mic egal k mai mic egal 9) si n care se determincte numere naturale de cte k cifre se divid cu a, folosind apeluri ale subprogramului nr. Programul va afisa pe ecran numarul de numere determinat. De exemplu, daca a=2007 si k=4, atunci numarul afisat este 4, deoarece sunt 4 numere de 4 cifre care se divid cu 2007 (2007, 4014, 6021, 8028). Observatii: Conceptia prelucrarilor de la a) si b) trebuie sa aiba n vedere criteriul de eficienta privind timpul de executare; daca se rezolva corect cerinta b) fara a se utiliza apeluri ale functiei definite la a), se va acorda un punctaj partial. #include<iostream.h> #include<math.h> int max(float x,float y) { if(x>=y) return x; else return y; } int min(float x,float y) { if(x<y) return x; else return y; } int nr(float a,float b) { int i; int ok=0; a=a*10;

b=b*10; for(i=(int)min(a,b);i<=(int)max(a,b);i++ ) if(i%10==0) ok++; return ok; } void main() { int a,k; float m,n; cout<<"dati a: ";cin>>a; cout<<"dati k: ";cin>>k; m=pow(10,k-1)/a; n=(pow(10,k)-1)/a; cout<<nr(m,n); } -)Scrieti programul C sau C++ care citeste de la tastatura un sir de cel mult 30 de litere ale alfabetului englez si creeaza fisierul text BAC.TXT ce contine sirul de caractere dat si toate sufixele acestuia de lungime cel putin 1, fiecare pe cte o linie, n ordinea crescatoare a lungimii sufixelor, aliniate la stnga. De exemplu, daca se citeste sirul teste, atunci BAC.TXT va contine: e te ste este teste #include<fstream.h> #include<string.h> ofstream g("bac.txt"); char c[30],t,k,i,j; void main() { cin>>c; t=strlen(c); k=t; for(i=0;i<t;i++) { for(j=k-1;j<t;j++) { g<<c[j]; } g<<endl; k--; } } 3.III.1.Scrieti programul C/C++ care construieste n memorie o matrice patratica cu n linii si n coloane formata numai din valori 1 si 2 astfel nct elementele de pe diagonala secundara si cea principala sa fie egale cu 1, elementele situate ntre

diagonalele matricei, n partea superioara si inferioara acesteia, sa fie egale cu 1, iar restul elementelor din matrice sa fie egale cu 2. Valoarea lui n (numar natural, 2<n<23) se citeste de la tastatura, iar matricea se va afisa pe ecran, cte o linie a matricei pe cte o linie a ecranului, cu spatii ntre elementele fiecarei linii (ca n exemplu). De exemplu, pentru n=5 se construieste n memorie si se afiseaza matricea: 1 2 2 2 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 1

De exemplu, dac fi ierul BAC.TXT con ine numerele: 1 245 22 67 34 29 345 8 354 11 7 34 12 45 39 41 26 67 89 1011 se va afia pe ecran numrul: 15, deoarece sunt eliminate numerele subliniate iar irul rezultat este format din 15 numere. #include<fstream.h> ifstream f("bac.txt"); void citire() { int pi=0,pf=0,i=0,x,ok=1; while(!f.eof() && ok==1) { f>>x; i++; if(x%2==0) { ok=0; pi=i; } } while(!f.eof()) { f>>x; i++; if(x%2==0) pf=i; } cout<<pf<<" "<<pi; } void main() { citire(); } VARIANTA 4 4.III.1Scriei programul C sau C++ care citete de la tastatura un numr natural impar n (2<n<23) i construiete n memorie o matrice ptratic cu n linii i n coloane format numai din valori 1, 2 i 3 astfel nct elementele din matrice pe coloana median (situat n mijlocul matricei) i linia median s fie egale cu 1, elementul situat la intersec ia liniei i coloanei mediane s fie egal cu 2, iar restul elementelor din matrice s fie egale cu 3. Matricea se va afi a pe ecran, cte o linie a matricei pe cte o linie a ecranului, cu spa ii ntre elementele fiec rei linii (ca n exemplu). De exemplu, pentru n=5 se construiete n memorie i se afieaz matricea: 3 3 1 3 3 3 3 1 3 3 1 1 2 1 1 3 3 1 3 3 3 3 1 3 3

#include<iostream.h> int a[24][24],i,j,n; void matrice(int n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i>j && n-i+1>j) a[i][j]=2; else if(i<j && n-i+1<j) a[i][j]=2; else a[i][j]=1; } void afis() { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } } void main() { cout<<"dati n: ";cin>>n; matrice(n); afis(); } 3.III.3.Scriei programul C sau C++ care citete din fiierul BAC.TXT un ir s de cel mult un milion de numere naturale, fiecare num r avnd cel mult patru cifre, i care determin n mod eficient din punctul de vedere al timpului de executare i al spa iului de memorie folosit, num rul de componente ale irului ob inut prin eliminarea din cele dou extremit i ale lui s a unui num r minim de componente, astfel nct irul rezultat s nceap i s se termine cu cte un numr par. Fiierul BAC.TXT cortine cel puin un num r par iar numerele din fi ier sunt separate printr-un singur spa iu. Programul va afi a pe ecran num rul de componente ale irului ob inut.

#include<iostream.h> int a[23][23],i,j,n; void matrice(int n)

{ for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==(n+1)/2) a[i][j]=1; else if(j==(n+1)/2) a[i][j]=1; else a[i][j]=3; a[(n+1)/2][(n+1)/2]=2; } void afis() { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } } void main() { cout<<"dati n: ";cin>>n; matrice(n); afis(); } VARIANTA 5 5.III.1.Scriei programul C sau C++ care citete de la tastatura un numr natural n (2<n<30) i construiete n memorie o matrice patratica cu n linii si n coloane format numai din valori ce apartin multimii {1,2,3,...,n} astfel nct elementele din matrice situate pe diagonala secundara sa fie egale cu n, elementele situate pe celelalte dou "semidiagonale" paralele cu diagonala secundara i alturate diagonalei secundare s fie egale cu n-1, elementele situate pe urmtoarele dou "semidiagonale" paralele cu diagonala secundar , de o parte si de alta a acesteia, sa fie egale cu n-2 etc. Matricea se va afisa pe ecran, cte o linie a matricei pe cte o linie a ecranului, cu spatii ntre elementele fiecarei linii #include<iostream.h> int a[30][30],i,j,n; void matrice(int x) { int k=1,l=1; int y=x; for(int m=1;m<=x;m++) { for(i=1;i<=x;i++) { for(j=1;j<=x;j++) { a[x-j+k][j]=y; a[x-j+l][j]=y; } } k++;

l--; y--; } } void afis() { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } } void main() { cout<<"dati n: ";cin>>n; matrice(n); afis(); } 5.III.2.Se defineste subprogramul sub cu doi parametri, subprogram care primeste prin intermediul parametrului n un numar natural de cel mult opt cifre si prin intermediul parametrului k o cifra . Subprogramul determin eliminarea primei apariii a cifrei k n numrul n i returneaz numrul obinut prin intermediul parametrului n. De exemplu, pentru valorile n=152422 i k=2 ale parametrilor, n urma apelului subprogramului sub, parametrul n va returna valoarea 15422. Daca cifra k nu apare n scrierea numarului n, atunci valoarea lui n nu se modifica . a) Scrieti defini ia completa a subprogramului sub. b)Scriei n limbajul C sau C++ programul n care se citesc de la tastatura dou numere naturale nenule a i b cu cel mult opt cifre. Programul va determina i va afia pe ecran numrul de cifre distincte ce intra att n scrierea lui a ct si n scrierea lui b, fara a accesa cifrele numerelor a si i b, folosind apeluri ale subprogramului sub. De exemplu, pentru valorile a=1237248 i b=1245823 programul va determina afiarea pe ecran a valorii 5 deoarece sunt cinci cifre distincte (1,2,3,4 si 8) ce apar att n scrierea lui a ct si n scrierea lui b #include<iostream.h> #include<math.h> int sub(long n,int k) { n=n*10; long n2=n; int h=0; int l=log10(n)+1; int x=l; while(x>0 && h==0) { long ok2=pow(10,x); long ok=n/ok2;

long ok1=ok%10; if(ok1 == k) { long y; y=n%ok2; n=n/10; n=n-n%ok2; n=n+y; h++; } x--; } if(n2!=n) return n/10; else return 0; } void main() { int i=0,j=0,nr=0; long a,b,v[10]; cout<<"dati a: ";cin>>a; cout<<"dati b: ";cin>>b; while(b>0) { i++; v[i]=b%10; b=b/10; } int k; int nr2=i; for(j=1;j<i;j++) for(k=j+1;k<=i;k++) if(v[k]==v[j]) { v[k]=0; nr2--; } for(j=1;j<i;j++) for(k=j+1;k<=i;k++) if(v[k]>v[j]) { int aux=v[k]; v[k]=v[j]; v[j]=aux; } for(j=1;j<=nr2;j++) if(sub(a,v[j])) nr++; cout<<nr; } 5.III.3.Scriei programul C sau C++ care citete de la tastatura un ir s de cel mult 30 de litere i o litera c; programul determin dublarea fiecarei aparitii a literei c n s si scrie noul sir obtinut n fisierul text BAC.TXT.De exemplu, daca se citeste sirul: alfabetar si caracterul a atunci fisierul BAC.TXT va contine sirul: aalfaabetaar. #include<fstream.h> #include<string.h> ofstream g("bac.txt");

char a[30],b[60],c; int i,l,j,k,n; void citire() { cin>>a; } void fct2() { for(i=0;i<strlen(a);i++) b[i]=a[i]; int o=0; k=strlen(a); for(i=0;i<strlen(a);i++) { if(a[i]==c) { k++; o++; for(j=i;j<k;j++) b[j+o]=a[j]; b[j]=a[i]; } } } void main() { citire(); cout<<"dati c: ";cin>>c; fct2(); for(i=0;i<k;i++) g<<b[i]; } PROBLEME REZOLVATE BACALAUREAT INFORMATICA C++ NEINTENSIV 2008 Varianta 001 II.5.Scriei un program C/C++ care citete de la tastatur dou numere naturale nenule n i m(2m10,2n10) i care construiete n memorie i apoi afieaz o matrice A cu n linii (numerotate de la 1 la n) i m coloane (numerotate de la 1 la m) cu proprietatea c fiecare element Aij memoreaz cea mai mic dintre valorile indicilor i i j (1in, 1jm).Matricea se va afia pe ecran, cte o linie a matricei pe cte o linie a ecranului, elementele fiecrei linii fiind separate prin cte un spaiu. Exemplu: pentru n=4 i m=5 se va afia matricea alturat. 1 1 1 1 1 1 2 2 2 2 1 2 3 3 3 1 2 3 4 4

#include<iostream.h> void main() { unsigned int n,m,i,j,A[11][11]; do {cout<<"n=";cin>>n; } while(n<2 || n>10); do {cout << "m="; cin>> m; } while ( m<2 || m>10); for (i=1;i<=n;i++) for (j=1;j<=m;j++) if(i<j) A[i][j]=i; else A[i][j]=j; for (i=1;i<=n;i++) { for (j=1;j<=m;j++) cout <<A[i][j]<<" "; cout <<endl; } } III.3.Fiierul text bac.txt conine, pe o singur linie, cel mult 1000 de numere naturale nenule cu cel mult4 cifre fiecare, numerele fiind separate prin cte un spaiu. Scriei un program C/C++ care citete de la tastatur un numr natural nenul n (n999) i numerele din fiierul bac.txt i care afieaz pe ecran, separate prin cte un spaiu, toate numerele din fiier care sunt divizibile cu n. Dac fiierul nu conine niciun astfel de numr, atunci se va afia pe ecran mesajul NU EXISTA. Exemplu: dac fiierul bac.txt conine numerele: 3 100 40 70 25 5 80 6 3798,pentru n=10 atunci pe ecran se va afia: 100 40 70 80 # include<fstream.h> #include<string.h> void main() { int a ; unsigned n,este=0; fstream f("bac.txt",ios::in); do { cout<<"n=";cin>>n; } while (n==0 || n>999); while(f>>a) { if(a%n==0) {cout<<a<<" "; este=1; } } if(este==0) cout<<"nu"; f.close(); }

III.4.Subprogramul sub, cu trei parametri, primete prin intermediul parametrului: v un tablou unidimensional cu cel mult 100 de componente ce memoreaz numere ntregi cu cel mult 4 cifre; n un numr natural nenul mai mic sau egal cu 100 ce reprezint numrul efectiv de componente ale tabloului primit prin intermediul parametrului v; a un numr ntreg cu cel mult 4 cifre.Subprogramul subreturneaz numrul componentelor tabloului primit prin intermediul parametrului v ale cror valori sunt egale cu valoarea parametrului a. Exemplu: pentru valorile n=5, v=(1,21,9,21,403), a=21 al e parametrilor, n urma apelului, subprogramuluisub va returna valoarea 2. a) Scriei definiia complet a subprogramului sub.b) Scriei un program C/C++ care s citeasc de la tastatur un numr natural nenul n (n100) i n numere ntregi, fiecare avnd cel mult 4 cifre, i care, folosind apeluri utile ale subprogramului sub, s afieze pe ecran mesajul DA dac oricare dou dintre cele n numere citite sunt distincte dou cte dou, sau mesajul NU n caz contrar. Exemplu: pentru n=6 i cele n numere citite de la tastatur: 47 183 69 8 134 -56 se va afia pe ecran mesajul DA #include <iostream.h> #include <conio.h> sub(int v[100],int n, int a) { int i, nr=0 ; for(i=0;i<n;i++) if(v[i]==a) nr++ ; return nr; } void main() { int i,n,v[100],t[100],j,este=1; do { cout<<"n= "; cin>>n ; }while(n==0 || n>100); for(i=0;i<n;i++) do { cout <<"v["<<i<<"]="; cin>>v[i] ; }while(v[i]<-9999 || v[i]>9999); for(i=0;i<n && este==1;i++) if(sub(v,n,v[i])>1) este=0; if(este) cout<<"distincte"; else cout <<"NU"; }

Varianta 002 II.5.Scriei un program C/C++ care citete de la tastatur un cuvnt format din cel mult 20 de caractere, doar litere ale alfabetului englez. Programul determin transformarea cuvntului citit prin nlocuirea fiecrei litere mici a cuvntului cu litera mare corespunztoare, restul literelor nemodificndu-se, ca n exemplu. Programul afieaz pe ecran cuvntul obinut. Exemplu: pentru cuvntul: bACAlaUrEaT se va afia pe ecran: BACALAUREAT #include <string.h> #include <iostream.h> #include <ctype.h> void main() { char cuvant[20]; unsigned int i,l; cout<<"cuvantul:"; cin>>cuvant; l=strlen(cuv); for(i=0;i<l;i++) if(cuvant[i]>=97 && cuvant[i]<=122) cuvant[i]=toupper(cuvant[i]); cout<<cuvant; } III.3.Fiierul text NR.TXT conine pe o singur linie, separate prin cte un singur spaiu, cel mult 100 de numere ntregi, fiecare numr avnd cel mult 4 cifre. Scriei un program C/C++ care citete numerele din fiierul NR.TXT i afieaz pe ecran, separate prin cte un spaiu, n ordine cresctoare, toate numerelenaturale nenule din fiier. Dac nu exist astfel de numere se va afia pe ecran mesajul NU EXISTA. Exemplu: dac fiierul NR.TXT conine numerele: -3 -10 0 7 -5 7 51 -800 6 798, atunci pe ecran se va afia: 6 7 7 51 798 #include<fstream.h> void main() { int k=0,a[100],x,i,aux,inv; fstream f("nr.txt",ios::in); while (f>>x) { if (x>0) { a[k]=x; k++; } } f.close(); if (k==0) cout<<"NU EXISTA"; else { do

{ inv=0; for(i=0;i<k-1;i++) if (a[i]>a[i+1]) { aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; inv=1; } } while (inv); for(i=0;i<k;i++) cout<<a[i]<<" "; } } III.4.Un numr n se numete extraprim dac att el, ct i orice numr obinut prin permutarea cifrelor lui n, sunt numere prime. De exemplu, numrul 113 este un numr extraprim deoarece 113, 311, 131sunt numere prime. a) Scriei definiia complet a unui subprogram f, cu un parametru, subprogram care:- primete prin intermediul parametrului a un numr natural cu cel mult 2 cifre (a>1)returneaz suma exponenilor divizorilor primi din descompunerea n factori primi a valorii parametrului a.Exemplu: pentru a=90subpr ogramul va returna valoarea 4, deoarece a=2*32*5 i 1+2+1=4. b) Scriei un program C/C++ care citete de la tastatur un numr natural n, 2n99, i care determin i afieaz pe ecran, folosind apeluri utile ale subprogramului f, mesajul DA dac n este un numrextraprim, iar altfel afieaz mesajul NU. #include<iostream.h> unsigned n,v[3],p[3],c,extraprim,aux; unsigned f(unsigned a) { unsigned i,nr,s=0; i=2; while (i<=a && a!=0) { nr=0; while (a%i==0 && a!=0) { a=a/i; nr++; } if (nr!=0) s+=nr; else i++; } return s; } void permut(unsigned i) { unsigned j,l,nr; if (i==c) {nr=0; for(l=0;l<c;l++) nr=nr*10+v[p[l]]; if

(f(nr)>1)extraprim=0; } else { p[i]=i; for(j=0;j<=i;j++) { aux=p[i]; p[i]=p[j]; p[j]=aux; permut(i+1); aux=p[i]; p[i]=p[j]; p[j]=aux; } } } void main() { cout<<"n="; cin>>n; unsigned m=n; c=0; while (m!=0) { v[c]=m%10; m=m/10; c++; } extraprim=1; permut(0); if (extraprim) cout<<"DA"; else cout<<"NU"; } Varianta 003 II.5.Scriei un program C/C++ care citete de la tastatur un numr natural n (2n24) i construiete n memorie o matrice cu n linii i n coloane ale crei elemente vor primi valori dup cum urmeaz:elementele aflate pe diagonala principal a matricei vor primi valoarea 0- elementele de pe prima coloan, cu excepia celui aflat pe diagonala principal vor primi valoarea n- elementele de pe a doua coloan, cu excepia celui aflat pe diagonala principal vor primi valoarea n-1...-lementele de pe ultima coloan, cu excepia celui aflat pe diagonala principal vor primi valoarea 1.Programul va afia matricea astfel construit pe ecran, cte o linie a matricei pe cte o linie a ecranului, cu cte un spaiu ntre elementele fiecrei linii (ca n exemplu). Exemplu: pentru n=4 se va afia matricea alturat. 0 3 2 1 4 0 2 1 4 3 0 1 4 3 2 0

#include <iostream.h> void main() { unsigned n,A[24][24],i,j; do { cout<<"n="; cin>>n; } while (n<2 || n>24); for(i=0;i<n;i++) for(j=0;j<n;j++) A[j][i]=n-i; for(i=0;i<n;i++) A[i][i]=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) cout<<A[i][j]<<" "; cout<<endl; } } III.3.Fiierului text NR.TXT conine pe o singur linie, separate prin cte un singur spaiu, cel mult 100 de numere naturale, fiecare numr avnd cel mult 4 cifre. S se scrie un program C/C++ care citete toate numerele din fiier i scrie pe ecran, pe o singur linie, separate prin cte un spaiu, n ordine cresctoare, toate numerele din fiier care au cel puin 3 cifre.Dac fiierul nu conine astfel de numere se va afia pe ecran mesajul NU EXISTA. #include <stdio.h> void main() { int n,a[100],x,i,aux,inv; FILE *f; f=fopen("nr.txt","r"); n=0; while (!feof(f)) { fscanf(f,"%d",&x); if (x>=100) {a[n]=x; n++; } } fclose(f); if (n==0) printf("NU EXISTA"); else { inv=0; for(i=0;i<n-1;i++) if (a[i]>a[i+1]) { aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; inv=1; } } while (inv); for(i=0;i<n;i++) printf("%d ",a[i]); }

III.4.Subprogramul cif, cu doi parametri, primete prin intermediul parametrului a un numr natural cu cel mult 8 cifre i prin intermediul parametrului b o cifr; subprogramul returneaz numrul de apariii ale cifrei b n scrierea numrului a.Exemplu: pentru a=125854 i b=5, subprogramul va returna valoarea 2.a)Scriei definiia complet a subprogramului cif. b) Scriei un program C/C++ care citete de la tastatur un numr natural n cu cel mult 8 cifre, dintre care cel puin una impar, i care determin i afieaz pe ecran, folosind apeluri utile ale subprogramului cif, cel mai mare numr natural care poate fi obinut utiliznd toate cifrele impare ale numrului n.Exemplu: dac n=2152331 atunci se va afia pe ecran numrul 53311. #include <iostream.h> long n;int i; int cif(long a, int b) { int nr=0; while (a!=0) { if (a%10==b) nr++; a=a/10; } return nr; } void main() { do { cout<<"dati n(cu cel putin o cifra impara)="; cin>>n; } while (n<0 || n>99999999); int j,t,numar=0; for(i=9;i>=1;i=i-2) {t= cif(n,i); if (t!=0) for(j=1;j<=t;j++) numar=numar*10+i; } if(numar==0) cout<<"numarul nu are cifre impare"; else cout<<numar; } Varianta 004 004.II.5.Scriei un program C/C++ care citete de la tastatur un numr natural n (2n24) i construiete n memorie o matrice cu n linii i n coloane ale crei elemente vor primi valori dup cum urmeaz:elementele aflate pe diagonala secundar a matricei vor primi valoarea 0elementele de pe prima linie, cu excepia celui aflat pe diagonala

secundar vor primi valoarea nelementele de pe a doua linie, cu excepia celui aflat pe diagonala secundar vor primi valoarea n-1...elementele de pe ultima linie, cu excepia celui aflat pe diagonala secundar vor primi valoarea 1.Programul va afia matricea astfel construit pe ecran, cte o linie a matricei pe cte o linie a ecranului, cu cte un spaiu ntre elementele fiecrei linii (ca n exemplu).Exemplu: pentru n=4 se va afia matricea alturat. 4 4 4 0 3 3 0 3 2 0 2 2 0 1 1 1 #include<iostream.h> void main() { unsigned a[20][20],n,i,j; do { cout<<"n="; cin>>n; } while (n<2||n>24); for(i=0;i<n;i++) a[i][n-1-i]=0; for(i=0;i<n;i++) for(j=0;j<n;j++) if (j!=n-1-i) a[i][j]=n-i; for(i=0;i<n;i++) { for(j=0;j<n;j++) cout<<a[i][j]<<" "; cout<<endl; } }

subprograme eliminare prima cifra subprogram Subprogramul Nr are un singur parametru, k, prin intermediul cruia primete un numr natural de cel puin 3 cifre i cel mult 9 cifre, cu toate cifrele nenule. Subprogramul furnizeaz tot prin intermediul parametrului k, valoarea obinut prin eliminarea primei cifre a numrului transmis la apel. Exemplu: dac subprogramul primete prin intermediul parametrului k valoarea 12438, atunci n urma apelului subprogramului Nr, k va primi valoarea 2438. #include<iostream.h> void nr(int &k) {

int n,o; n=k; o=0; while(n>9) { o=o*10+n%10; n=n/10; } k=0; while(o!=0) { k=k*10+o%10; o=o/10; } } void main() { int k; cin>>k; nr(k); cout<<k; } bacalaureat iulie 2002 varianta 5 Scrieti un subprogram care primeste prin primul parametru a o valoare naturala si returneaza prin al doilea parametru b valoarea reala reprezentand inversul numarului a cu " doua zecimale importante" exacte, urmatoarele zecimale fiind 0. Numim " doua zecimale importante " prima pereche de zecimale succesive ( pornind de la virgula zecimala catre dreapta), astfel incat prima cifra sa fie nenula.De exemplu, pentru a=2 se va returna b=0.50, daca a=14 obtinem b=0.071, iar pentru a=121 subprogramul returneaza b=0.0082 #include<iostream.h> #include<math.h> int a,m; float b; void invers(int a,float & b) { int i,nr; float x,r1,r2; x=1/(float)a;//x este inversul lui a m=0; r1=x; //inmultim inversul cu 10, pana obtinem un numar cu partea intreaga din 2 cifre //rezultatul il pastram in r1, iar inmultirile le numaram in m while(r1<10) { r1=r1*10; m=m+1; } cout<<r1<<endl; nr=floor(r1);//in nr memoram parte intreaga a lui r1 //rezultatul il impartim de m ori la 10 r2=nr; for(i=1;i<=m;i++) r2=r2/10.; b=r2;

} void main() { cout<<"a=";cin>>a; invers(a,b); cout<<b; } subprogram inlocuire cifre Scriei definiia complet a subprogramului numar, cu trei parametri, care primete prin intermediul parametrului n un numr natural format din cel mult 9 cifre, iar prin intermediul parametrilor c1 i c2 cte o cifr nenul. Subprogramul caut fiecare apariie a cifrei c1 n n, i dac aceasta apare, o nlocuiete cu c2. Subprogramul furnizeaz tot prin n numrul astfel obinut. Dac cifra c1 nu apare n n, atunci valoarea lui n rmne nemodificat. #include<iostream.h> void numar( long & n,int c1,int c2) { int p=0,p1=1,c; long nr=n; while(nr) { p=p+1; if(nr%10==c1) { p1=1; for(int i=1;i<p;i++) p1=p1*10; cout<<p1<<endl; c=n%p1; cout<<"c="<<c; cout<<endl; p1=p1*10; n=n/p1; n=n*10+c2; p1=p1/10; n=n*p1+c; cout<<n<<endl; } nr=nr/10; } } void main() { long n; int c1,c2; cin>>n>>c1>>c2; numar(n,c1,c2); cout<<n; } SUBIECTE SI REZOLVARI C++ PENTRU EXAMENUL DE ATESTAT LA INFORMATIC 1.Scriei un program C/C++ care citete de la tastatura un numr natural n (2<n<21) si apoi n linii cu cate n

numere ntregi de cel mult 7 cifre ce formeaz un tablou bidimensional a. Sa se afieze pe ecran diferena dintre suma elementelor de pe diagonala principala si suma elementelor de pe diagonala secundara a matricei a. #include<iostream.h> void main() {int n,i,j; long a[20][20],s1=0,s2=0,d; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {for(j=1;j<=n;j++) {cout<<"a["<<i<<"]["<<j<<"]=";cin>>a[i][ j];}} for(i=1;i<=n;i++) {for(j=1;j<=n;j++) if(i==j) s1=s1+a[i][j];}; for(i=1;i<=n;i++) {for(j=1;j<=n;j++) if(i+j==n+1) s2=s2+a[i][j];} cout<<s1-s2; } 3.Scriei programul C/C++ care citete de la tastatura un numr natural n (n<100) si un sir cu n numere ntregi din intervalul [100 ;999] ; programul construiete un sir de numere rezultat prin nlocuirea fiecrui numr din irul citit cu numrul obinut prin interschimbarea cifrei unitatilor cu cifra sutelor. Numerele din noul sir se vor afia pe ecran separate printr-un singur spaiu. De exemplu , pentru n=3 si irul 123 , 904 , 500 , se afieaz 321 , 409 , 5. #include<iostream.h> void main() {int n,i,o,v[20],c; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} for(i=1;i<=n;i++) {o=0; c=v[i]%10; o=o*10+c; v[i]=v[i]/10; c=v[i]%10; o=o*10+c; v[i]=v[i]/10; o=o*10+v[i]; v[i]=o; cout<<v[i]<<endl; } } 4.Doua tablouri unidimensionale a si b , cu elementele a1 , a2 , , an , respectiv b1 , b2 , bn sunt in relaia a<=b daca : a1<=b1 , a2<=b2 ,

, an<=bn. Scriei program in limbajul C/C++ care citete doua tablouri unidimensionale a si b cu acelai numr de elemente de tip ntreg si verifica daca a<=b saub<=a afind un mesaj adecvat. #include<iostream.h> void main() {int a[10],i,n,j,k,aux,min; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin>>a[i];} for(i=1;i<=n-1;i++) {min=a[i]; k=i; for(j=i+1;j<=n;j++) if(a[j]<min) {min=a[j]; k=j;} aux=a[k]; a[k]=a[i]; a[i]=aux;} for(i=1;i<=n;i++) cout<<a[i]<<" ";} 8.Scriei un program in limbajul C/C++ care afieaz toate numerele naturale formate din cifre identice , mai mari dect 10 si mai mici dect o valoare data n, n<=2.000.000. De exemplu pentru n=195 , se afieaz : 11 , 22 , 33 , 44 , 55 , 66 , 77 , 88 , 99 , 111. #include<iostream.h> int n,i; int identic(int n) {int d,c; c=n%10; while (n>0) {d=n%10; if(d==c) n=n/10; else return 0;} if(n==0) return 1;} void main() {cout<<"n=";cin>>n; for (i=10;i<=n;i++) {if(identic(i)) cout<<i<<endl;}} 10.Scriei un program C/C++ care citete de la tastatura trei numere naturale x, y si k, (1<x<y<2000000, k<1000) si afieaz pe ecran k numere prime din intervalul [x, y]. Daca nu exista k numere prime n intervalul [x,y] se vor afia toate numerele prime gsite iar pe linia urmtoare se va afia mesajul s-au gsit mai puine numere prime: urmat de numrul acestora. De exemplu, pentru x=3, y=12 si k=5 se vor afia pe ecran: 3 5 7 11 s-au gsit mai puine numere prime:4

#include<iostream.h> void main() {int x,y,k,n,d,a,p; cout<<"x=";cin>>x; cout<<"y=";cin>>y; cout<<"k=";cin>>k; a=0; n=x; while ((n>=x)&&(n<=y)&&(a<k) ) {d=2;p=1; while((d<=n/2)&&(p==1)) if(n%d==0) p=0; else d++; if(p) {cout<<n<<endl;a++;} n++;} if(a<k) cout<<"au fost gasite mai putine nr prime"<<a;} 12.Scriei un program C/C++ care citete din fiierul text BAC.TXT , cel mult 100 de numere naturale aflate pe o singura linie, formate din cel mult 9 cifre fiecare, separate prin spatii si dintre acestea le afieaz pe ecran doar pe acelea care au proprietatea de a fi palindrom. Daca nu se gsesc numere palindrom, se va afia pe ecran valoarea 1. Un numr are proprietatea de a fi palindrom daca citit de la dreapta la stnga sau de la stnga la dreapta are aceeai valoare. De exemplu 1221 este palindrom, in timp ce 1210 nu este palindrom. Exemplu : daca din fiierul BAC.TXT se citesc numerele : 7341 , 8228 , 660 , 2 , 80 , 131 , atunci pe ecran se vor afia : 828 , 2 , 131. #include<iostream.h> int palindrom(int n) {int copie=n,oglindit,c; oglindit=0; {while(n!=0) c=n%10; oglindit=oglindit*10+c; n=n/10;} return (copie==oglindit);} void main() {int v[100],n,i,p; p=0; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} for(i=1;i<=n;i++) if(palindrom(v[i])) {cout<<v[i]; p=1;} if(p==0) cout<<"-1";} 14.Pentru orice numr natural nenul n definim n factorial (notat n!)

ca fiind produsul tuturor numerelor naturale nenule mai mici sau egale cu n (n! = 1*2*3**n) De exemplu : 3!=1*2*3=6 5!=1*2*3*4*5=120 . Scriei un program C/C++ care determina numrul de cifre nule aflate pe ultimele poziii consecutive ale valorii obinute in urma evalurii lui n!, n fiind un numr natural de cel mult 4 cifre. De exemplu daca n=10, n!=3628800 rezultatul va fi 2 deoarece 3628800 are dou zerouri la sfrit. #include<iostream.h> void main() {long int n,x=1,nr=0,c,p=1; cout<<"n=";cin>>n; for(int i=1;i<=n;i++) p=p*i; while(x==1) {c=p%10; if(c==0) {nr=nr+1; p=p/10;} else x=0;} cout<<nr;} 15.Scriei un program C/C++ care citete din fiierul text DATE.IN cel mult 100 de numere naturale nenule aflate pe o singura linie, formate din cel mult 4 cifre fiecare, separate prin spatii si scrie in fiierulDATE.OUT numerele, in ordinea inversa fata de cea in care au fost citite, pe o singura linie separate prin spatii. De exemplu daca din fiierul DATE.IN se citesc numerele 93 207 15 1982 3762, atunci coninutul fiierului DATE.OUT va fi 3762 1982 15 207 93. #include<fstream.h> void main() {int n,i,v[100]; fstream f("date.in",ios::in); fstream g("date.out",ios::out); f>>n; for(i=1;i<=n;i++) f>>v[i]; for(i=n;i>0;i--) g<<v[i]; f.close(); g.close();} 17.Scriei un program C/C++ care citete de pe prima linie a fiierului text BAC.TXT trei numere naturalea, b, c formate din cel mult patru cifre fiecare, separate prin cate un spaiu si afieaz pe ecran cel mai mare divizor comun al acestora. De exemplu, daca din fiier se citesc numerele : 9 27 15, atunci se afieaz 3.

#include<iostream.h> int cmmdc (int x,int y) {while (x!=y) if(x>y) else y=y-x; return x;} void main() {int a,b,c,d; fstream("bac.txt";ios::in); f>>a>>b>>c; f.close; d=cmmdc(a,b); cout<<cmmdc(c,d);} 19.Scriei un program care verifica daca un numr natural k(1<k<100000) citit de la tastatura este prim. Programul va afia pe ecran mesajul DA sau mesajul NU; #include<iostream.h> int prim(int n) {int prim=1; for(int d=2;d<=n/2;d++) if(n%d==0) prim=0; if(prim) return 1; else return 0;} void main() {int n; cout<<"n=";cin>>n; if(prim(n)) cout<<"da"; else cout<<"nu";} 21.Se considera fiierul text date.in care conine exact 19 numere distincte formate fiecare din maxim 2 cifre. Sa se afieze in fiierul text date.out numrul care lipsete din fiierul date.in. #include<fstream.h> void main() {int v[100],n,i,j,p; fstream f("date.in",ios::in); fstream g("date.out",ios::out); for(i=1;i<=19;i++) f>>v[i]; f.close(); for(i=10;i<=99;i++) {p=1; for(j=1;j<=19;j++) if(i==v[j]) p=0; if(p) g<<i;} g.close();} 22.Se citete de la tastatura un numr natural nenul n (n<1000). Scriei un program C/C++ care construiete fiierul

text bac.txt care sa contina, pe prima linie, toi divizorii lui n in ordine strict descresctoare. Divizorii vor fi separai prin spaiu. De exemplu, daca n=10 , atunci fiierul bac.txt va conine : 10 , 5 , 2 , 1 #include<iostream.h> #include<fstream.h> void main() {int d,n; cout<<"n=";cin>>n; fstream g("bac1.txt",ios::out); for(d=n;d>=1;d--) if(n%d==0) g<<d<<" "; g.close();} 25.Se citete de la tastatura un numr natural nenul n care are cel mult 9 cifre. Sa se afieze in fiierul Date.out numrul k, natural, astfel nct produsul 1*2**(k-1)*k sa aib o valoare cat mai apropiata de numrul n. De exemplu, daca se citete numrul n=25 fiierul Date.out are urmtorul coninut: 4. iar daca se citete numrul n=119 fiierul Date.out are urmtorul coninut: 5 #include<iostream.h> #include<fstream.h> void main() {int k,p,r,n; cout<<"n=";cin>>n; k=1; fstream g("date.out",ios::out); p=1; while(p<=n) {p=p*k; k++;} p=p/(k-1); r=p*k; if((n-p)<=(r-n)) g<<"numarul k este "<<k-2; else g<<"numalul k este "<<k-1;

g.close(); } 27.Scriei un program care citete un numr natural n>1 cu maximum 9 cifre, si afieaz valoarea celui mai mic divizor prim a lui n, precum si puterea la care acest divizor apare in descompunerea in factori primi a numrului n. #include<iostream.h> int n,p,c; void cmmd(int n) {int gasit=0,d=2; while((d<n/2)&&(gasit==0)) {if(n%d==0) {c=d; gasit=1;} else d++;} p=0; while(n%c==0) {n=n/c; p=p+1;}} void main() {cout<<"n=";cin>>n; cmmd(n); cout<<c<<" la puterea "<<p; } 28.S se scrie un program care s calculeze i s afieze pe ecran produsul cifrelor pare i suma cifrelor impare a unui numr natural n citit de la tastatur. #include<iostream.h> unsigned int n, s, p=1, c; void main()

{ cin>>n; while(n) { c=n%10; if(c%2==0) p=p*c; else s=s+c; n=n/10; } cout<< p <<" "<< s; } 29.Sa se verifice daca doua cuvinte introduse de la tastatura (cuvintele avnd maxim 50 de caractere fiecare) sunt rime, adic ultimele p caractere ale celor doua cuvinte coincid, unde p (2<=p<=10) este dat. #include<iostream.h> #include<string.h> char s1[51], s2[51]; int p, x, y, ok=0; void main() { cin>> s1>>s2>>p; x=strlen(s1)-1; y= strlen(s2)-1; for( int i=1;i<=p && ok==0 ;i++) { if(s1[x]!=s2[y]) ok=1; x--;

y--; } if(ok) cout<<"Nu sunt rime"; else cout<<"Sunt rime"; } 30.Scriei un program care construiete o matrice ptrat de ordin n format din valorile 1 si 2 astfel nct elementele de pe diagonala principala si secundar sa fie egale cu 1 iar restul elementelor cu 2. Valoarea lui n se citete de la tastatur: n numr natural (2<23), iar matricea se va afia pe ecran, cate o linie a matricei pe fiecare rnd pe ecran cu spatii intre elementele fiecrei linii. Exemplu: Fie n=5. Se va afia: 1 2 2 2 1 2 1 2 1 2 2 2 1 2 2 2 1 2 1 2 1 2 2 2 1 #include<iostream.h> int a[10][10], i, j, n; void main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i==j || i+j==n+1) a[i][j]=1; else a[i][j]=2; for(i=1;i<=n;i++)

{ for(j=1;j<=n;j++) cout<< a[i][j]; cout<< endl; } } 31.Scriei un program care citete de la tastatur un sir de cel mult 50 de caractere si construiete fiierul atestat.txt ce conine irul si prefixele acestuia de lungime cel puin 1, fiecare pe cate o linie, in ordinea descresctoare a lungimii prefixelor. Exemplu: Daca se citete irul proba atunci atestat.txt va conine: proba prob pro pr p #include<fstream.h> #include<string.h> char s[51]; int n; void main() { cin>>s; ofstream f("atestat.txt"); n=strlen(s); while(n>=0) { for(int i=0; i< n; i++) f << s[i]; f<< endl;

n--; } f.close(); } 32.S se scrie un program care s numere cuvintele dintr-un text citit din fiierul cuvinte.txt. Textul conine cuvintele separate numai printr-un spaiu, fr semne de punctuaie, singurul semn de punctuaie este . de la sfritul textului. Numrul de cuvinte se va afia pe ecran. Exemplu: Fiierul cuvinte.txt conine textul: Ana are mere. se afieaz: 3 #include<fstream.h> #include<string.h> void main() { ifstream f("cuvinte.txt"); char s[100]; int k=1,n; f.getline(s,100);n=strlen(s); for(int i=0;i< n;i++) if(s[i]==' '&& s[i+1]!=' ') k++; cout<< k; f.close(); } 33.Scriei programul care citete de la tastatur o valoare natural n (2n100), construiete in memorie si apoi afieaz pe ecran o matrice a cu n linii si n coloane, numerotate de la 1 la n, car conine numerele naturale, in ordine cresctoare, de la 1 la n2, dispuse pe coloane, in ordine cresctoare. Astfel coloana 1 va conine numerele de la 1 la n, coloana 2 numerele de la n+1 la 2*n, coloana 3 de la 2*n+1 la 3*n si aa mai departe, ca in exemplu. Matricea se va afia pe ecran, cate o linie a matricei pe cate o linie a ecranului, elementele fiecrei

linii fiind separate intre ele prin cate un spaiu. Exemplu: pentru n = 4 se va afia matricea: 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 #include<iostream.h> int a[10][10], k=1,s,n; void main() { cout<<"n="; cin>>n; for(int j=1;j<=n;j++) for(int i=1;i<=n;i++) { a[i][j]=k; k++; } for(int i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<< a[i][j]<<" "; cout<< endl; } } 34.Se d n numr natural. S se afieze cel mai apropiat numr prim fat de n. Programul va conine cel puin un subprogram. Exemplu: n=24 se va afia 23, pentru n=26 se va afia 29 #include<iostream.h>

int prim(int x) { if(x==0 || x==1) return 0; for(int i=2;i<=x/2;i++) if(x%i==0) return 0; return 1; } void main() { unsigned n, x, y; cout<< "n="; cin>>n; x=n+1; y=n-1; while(prim(x)==0) x++; while(prim(y)==0) y--; if(x-n>n-y) cout<< y; else cout<< x; } 35.Se considera un vector cu n (1< n<100) componente numere naturale. Sa se determine componentele vectorului cu cei mai muli divizori. Se va folosi un subprogram pentru citirea vectorului si unul pentru calculul numrului de divizori ai unui numr. #include<iostream.h> int n, a[100]; void citire () { int i;

cin>>a[i]; } int div(int x) { int i, nr=0;

for(i=2;i<=x;i++) if(x%i==0) return nr; } void main() { int i,max=0; nr++;

cin>>n; citire(); for(i=1;i<=n;i++) if(div(a[i])>max) max=div(a[i]); for(i=1;i<=n;i++) if(div(a[i])==max) cout<< a[i]<<" "; } 36.Se consider un ir de n numere ntregi. S se verifice dac o valoare x, citit de la tastatur, apare sau nu n vector. n caz c se afl printre valorile din vector se va preciza i n ce poziie apare. n caz contrar se va afia mesajul NU. #include<iostream.h> void main() { int n, v[100], i, x, p=0;

cin>>n>>x; for(i=1;i<=n;i++) { cin>>v[i]; if(v[i]==x)p=i; }

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

if(p==0) else

cout<<"nu";

cout<< "Valoarea "<< x<< "apare in pozitia "<< p; } vectori Sa se scrie un program care afiseaza elementul minim par al unui sir. #include<iostream.h> void main() { int i,n,v[20],min,gasit=0; cout<<"n=";cin>>n; for(i=1;i<=n;i++) cin>>v[i]; for(i=1;i<=n && !gasit;i++) if(v[i]%2==0) { min=v[i]; gasit=1; } for(i=1;i<=n;i++) if(v[i]%2==0 &&v[i]<min) min=v[i]; cout<<min; } Se citete un vector cu n componente numere ntregi. S se afieze doar numerele impare aflate pe poziii pare din vector #include<iostream.h> void main() { int n,i,d,v[20]; cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } for(i=0;i<n;i++) if((i%2==0)&&(v[i]%2==1)) cout<<v[i]<<" "; } Se citeste un vector cu n componente nr intregi. Sa se adauge in vector pe pozitia poz(citita de la tastatura), un nou element avand ca valoare numarul elementelor negative din vector.Sa se afiseze vectorul rezultat in urma adaugarii. #include<iostream.h> void main() { int i,n,v[20],nr=0,k;

cout<<"n=";cin>>n; cout<<"poz=";cin>>poz; for(i=1;i<=n;i++) cin>>v[i]; for(i=1;i<=n;i++) if(v[i]<0) nr++; for(i=n+1;i>=poz;i--) v[i+1]=v[i]; v[poz]=nr; for(i=1;i<=n+1;i++) cout<<v[i]<<" "; } Se citesc n valori intr-un vector a.Sa se construiasca si sa se afiseze un al doilea vector format doar din acele valori din vectorul a care au suma cifrelor un numar par. #include<iostream.h> void main() { int n,i,d,v[20],a[20],s,c,j=1; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } for(i=1;i<=n;i++) { d=a[i]; s=0; while(d) { c=d%10; s=s+c; d=d/10; } if(s%2==0) { v[j]=a[i];j=j+1;} } for(i=1;i<j;i++) cout<<v[i]<<" "; } Se citeste un vector .Sa se afiseze pe ecran pe cate un rand divizorii fiecarui numar din vectorul v. #include<iostream.h> void main() { int n,i,d,v[20]; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } for(i=1;i<=n;i++) for(d=2;d<=v[i]/2;d++) if(v[i]%d==0) cout<<d<<endl; } Se da un vector V format din variabile de tip intreg.

cerinte 1.Cititi in vector elemente de la tastatura(nr elemente este n) 2.Afisati suma elementelor negative din vector 3.Afisati produsul elementelor pe pozitii impare 4.Scrieti intr-un fisier media aritmetica a elementelor aflate in vectorul V #include<fstream.h> #include<iostream.h> void main() { int i,n,v[20],s=0,p=1; float ma=0; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; for(i=1;i<=n;i++) if(v[i]<0) s=s+v[i]; cout<<"s="<<s<<endl; for(i=1;i<=n;i++) if(i%2==1) p=p*v[i]; cout<<"p="<<p<<endl; fstream f("ma.txt",ios::out); for(i=1;i<=n;i++) ma=ma+v[i]; ma=(float)ma/n; f<<ma; f.close(); } Se citeste un vector de componente numere intregi pozitive.Sa se afiseze numarul care se repeta de cel mai multe ori in vector. #include<iostream.h> void main() { int aux,n,i,j,nr,m,max,y,a[20],v[20]; cout<<"n=";cin>>n; for (i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin>>a[i];} aux=-1; max=a[1]; for(i=2;i<=n;i++) if(max<a[i]) max=a[i]; m=max; for(i=1;i<=m;i++) v[i]=0; for(i=1;i<n;i++) {nr=1; y=a[i]; if(y!=aux) for(j=i+1;j<=n;j++) if(y==a[j]) { nr++;a[j]=aux; } v[y]=nr; } max=v[1];j=1 ; for(i=2;i<=m;i++) if(max<v[i]){max=v[i];j=i;} cout<<"numarul "<<j<<" se repeta de "<<max<<" ori"; }

Se citeste un vector a cu cel mult 9 valori cifre. Sa se afiseze pe randuri separate permutarile circulare ale vectorului. #include<iostream> void Permutare( int a[10] , int n ) { int aux = a[1]; for ( int i = 1 ; i <= n -1; i++ ) a[i] = a[i+1]; a[n] = aux; } void Afisare( int x[10] ,int n) { int i; for ( i = 1 ; i <= n ;i++) cout << x[i] << ' '; cout << '\n'; } void main() { int i , x[10] cin >> n; for ( i = 1 ; cin >> x[i]; for ( i = 1 ; { Permutare ( x Afisare ( x , } }

, n; i <= n ; i++ ) i <= n; i++ ) , n ); n );

Fiind dat un vector v cu n elemente numere intregi , sa se afiseze de cate ori gasim doua elemente consecutive egale intre ele. #include<iostream> void main() { int v[100],n,k; cin>>n; for(int i=0;i<n;i++) cin>>v[i]; k=0; for(int i=1;i<n;i++) if(v[i]==v[i-1]) k++; cout<<k; }

Se citesc doi vectori cu componente numere naturale.Fiecare vector are elementele sortate crescator. Se cere sa se construiasca un al treilea vector care contine elementele celor doua in ordine crescatoare. #include<iostream.h> void main(void) { int i,n,j,m,k; float x[50],y[50],z[100]; cout<<"Dati numarul de elemente ale vectorului x ";cin>>n; for(i=1;i<=n;i++) { cout<<"x[<<i<<]= "; cin>>x[i]; } cout<<"Dati numarul de elemente alevectoruluii y ";cin>>m; for(j=1;j<=m;j++) { cout<<"y[<<j<<]= "; cin>>y[j]; } i=1;j=1;k=0; while( (i<=n) && (j<=m) ) if(x[i]<y[j]){k++;z[k]=x[i];i++;} else {k++;z[k]=y[j];j++;} if(i<=n) for(j=i;j<=n;j++) {k++;z[k]=x[j];} else for(i=j;i<=m;i++) {k++;z[k]=y[i];} cout<<endl<<"Vectorul z cu elementele interclasate este "; for(i=1;i<=k;i++) cout<<z[i]<< ; } Se da un vector x cu n numere reale si se cere sa se modifice astfel incat sa se intercaleze intre oricare doua elemente consecutive, media lor aritmetica. #include<iostream.h> void main( ) { int i,n,j; float x[50],y[50]; cout<<"Dati numarul de elemente ale tabloului ";cin>>n; for(i=1;i<=n;i++) { cout<<"x[<<i<<]= "; cin>>x[i]; } i=1;j=1; while(i<=n) { y[j]=x[i]; y[j+1]=(x[i]+x[i+1])/2; i=i+1; j=j+2; } cout<<"Elementele sunt: "<<endl;

for(i=1;i<=j-2;i++) cout<<y[i]<< ; } Se da un vector cu n componente numere intregi si un numar intreg a. Sa se numere cate elemente sunt mai mari decat a si sa se construiasca un vector cu aceste elemente. #include<iostream.h> void main(void) { int i,n,j,a; float x[50],y[50]; cout<<"Dati numarul de elemente ale tabloului ";cin>>n; for(i=1;i<=n;i++) { cout<<"x[<<i<<]= "; cin>>x[i]; } cout<<"Dati numarul a = ";cin>>a; j=0; for(i=1;i<=n;i++) if (a<=x[i]) { j++;y[j]=x[i]; } cout<<"Sunt <<j<< numere mai mari decat "<<a<<endl; cout<<"Elementele sunt: "<<endl; for(i=1;i<=j;i++) cout<<y[i]<< ; } Fie un vector x cu n elemente numere reale si numerele intregi a si b. Sa se calculeze media aritmetica a elementelor din vector cuprinse intre valorile a si b. #include<iostream.h> void main(void) { int a,b,i,n,suma=0; float x[50],media; cout<<"Dati numarul de elemente ale vectorului ";cin>>n; for(i=1;i<=n;i++) { cout<<"x[<<i<<]= "; cin>>x[i]; } cout<<"Dati numarul a = ";cin>>a; cout<<"Dati numarul b = ";cin>>b; for(i=1;i<=n;i++) if( (a<=x[i]) && (x[i]<=b) ) suma+=x[i]; media=suma/n; cout<<"Media aritmetica a elementelor din tablou, aflate intre <<a<< si <<b<< este <<media; } Se citeste un vector cu n componente numere intregi.Sa se verifice daca elementele sunt distincte.

#include<iostream.h> int v[10],n,i,j,gasit; void main() { cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } gasit=0; for(i=0;i<n && !gasit;i++) for(j=i+1;j<n && !gasit;j++) if(v[i]==v[j]) gasit=1; if(gasit) cout<<"elementele nu sunt distincte"; else cout<<"elementele sunt distincte"; } Se citeste un vector cu componente numere intregi.Se cere sa se afiseze cel mai mare numar intreg gasit. #include<iostream.h> int v[10],n,i,max; void main() { cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } max=v[0]; for(i=1;i<n;i++) if(v[i]>max) max=v[i]; cout<<"max="<<max; } numar ce se repeta in vector //de cate ori apare un nr ce se repeta #include<iostream.h> void main() { int aux,n,i,j,nr,a[20]; cout<<"n=";cin>>n; for (i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin>>a[i];} aux=-1; for(i=1;i<=n;i++) {nr=1; if(a[i]!=aux) {for(j=i+1;j<=n;j++) if(a[i]==a[j]) {nr++;a[j]=aux;} cout<<"nr"<<a[i]<<"apare de "<<nr<<" ori"; cout<<endl;} } } Probleme rezolvate in C++ Divide et impera

Divide et impera se bazeaz pe principiul descompunerii problemei n dou sau mai multe subprobleme (mai uoare), care se rezolv, iar soluia pentru problema iniial se obine combinnd soluiile subproblemelor. De multe ori, subproblemele sunt de acelai tip i pentru fiecare din ele se poate aplica aceeai tactic a descompunerii n (alte) subprobleme, pn cnd (n urma descompunerilor repetate) se ajunge la probleme care admit rezolvare imediat. Nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici. Se poate afirma c numrul celor rezolvabile prin "divide et impera" este relativ mic, tocmai datorit cerinei ca problema s admit o descompunere repetat. Divide et impera este o tehnic ce admite o implementare recursiv. Principiul general prin care se elaboreaz algoritmi recursivi este: "ce se ntmpl la un nivel, se ntmpl la orice nivel" (avnd grij s asigurm condiiile de terminare). Aadar, un algoritm prin divide et impera se elaboreaz astfel: la un anumit nivel avem dou posibiliti: 1. s-a ajuns la o problem care admite o rezolvare imediat (condiia de terminare), caz n care se rezolv i se revine din apel; 2. nu s-a ajuns n situaia de la punctul 1, caz n care problema curent este descompus n (dou sau mai multe) subprobleme, pentru fiecare din ele urmeaz un apel recursiv al funciei, dup care combinarea rezultatelor are loc fie pentru fiecare subproblem, fie la final, naintea revenirii din apel. Sortarea prin interclasare (merge-sort)

Utilizand metoda divide et impera, sa se sorteze prin interclasare un sir #include<iostream.h> int a[20],n; void mergesort(int i,int m,int j){int b[20],x=i,k=1,y=m+1;

while(x<=m && y<=j) if (a[x]<a[y]) b[k++]=a[x++]; else b[k++]=a[y++]; while (x<=m) b[k++]=a[x++]; while (y<=j) b[k++]=a[y++]; int t=i; for (k=1;k<=(j-i)+1;k++) a[t++]=b[k]; } void divimp(int i,int j) {if (i<j) {int m=(i+j)/2; divimp(i,m); divimp(m+1,j); mergesort(i,m,j);} } void main() { cout<<"n="; cin>>n; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]="; cin>>a[i]; } divimp(1,n); cout<<"vectorul sortat este: "<<endl; for(i=1;i<=n;i++) cout<<a[i]<<' '; } Sa se calculeze cmmdc pentru n numere utilizand metoda divide et impera

cout<<"n=";cin>>n; for(i=1;i<=n;i++) cin>>a[i]; cout<<"cmmdc este: "<<cmmdc(a,1,n); } Sa se calculeze folosind metoda divide et impera suma elementelor unui vector

#include<iostream.h> int v[20],n; int suma(int li,int ls) {int m, d1 ,d2; if(li!=ls) {m=(li+ls)/2; d1=suma(li,m); d2=suma(m+1,ls); return d1+d2; } else return v[li]; } void main() { cout<<"n="; cin>>n; for(int i=1;i<=n;i++) {cout<<"v["<<i<<"]="; cin>>v[i];} cout<<"suma celor "<<n<<" elemente ale vectorului "<<suma(1,n); } QUICK SORT

#include<iostream.h> int cmmdc(int a[20], int li, int ls) { if(li==ls) return a[li]; else { int x,y; x=cmmdc(a,li,(li+ls)/2); y=cmmdc(a,(li+ls)/2+1,ls); while(x!=y) if(x>y) x=x-y; else y=y-x; return x; } } void main() { int a[20],n,i;

#include<iostream.h> int v[100],n,k; void poz(int li,int ls,int & k,int v[100]) { int i=li,j=ls,c,i1=0,j1=-1; while(i<j) { if(v[i]>v[j]) { c=v[j];v[j]=v[i];v[i]=c; c=i1;i1=-j1;j1=-c; } i=i+i1; j=j+j1;

} k=i; } void quick(int li,int ls) { if(li<ls) { poz(li,ls,k,v); quick(li,k-1); quick(k+1,ls); } } void main() { int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } quick(1,n); for(i=1;i<=n;i++) cout<<v[i]<<" "; } Se citeste un vector cu n componente numere intregi.Se cere sa se afiseze valoarea maxima #include<iostream.h> int v[100],n; int max(int i,int j) { int a,b; if(i==j) return v[i]; else { a=max(i,(i+j)/2); b=max((i+j)/2+1,j); if(a>b) return a; else return b; } } void main() { cout<<"n=";cin>>n; for(int i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } cout<<"maximul este:"<<max(0,n-1); }

Se citeste un vector cu n componente numere intregi,ordonate crescator si o valoare intreaga x.Sa se decida daca x se gaseste sau nu printre componentele vectorului

#include<iostream.h> int v[100],n,x; void caut(int i,int j) { if(x==v[(i+j)/2]) cout<<"gasit"<<" "<<"indice "<<(i+j)/2; else if(i<j) if(x<v[(i+j)/2]) caut(i,(i+j)/2 -1); else caut((i+j)/2+1,j); else cout<<"nu s-a gasit"; } void main() { cout<<"n=";cin>>n; for(int i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } cout<<"numarul cautat:";cin>>x; caut(0,n-1); } turnurile din Hanoi #include<iostream.h> char x,y,z; int n; void h(int n,char x,char y, char z) { if(n==1) cout<<x<<y<<" "; else { h(n-1,x,z,y); cout<<x<<y<<" "; h(n-1,z,y,x); } } void main() { cout<<"n=";cin>>n; h(n,'x','y','z'); } Metoda Backtracking Sa se genereze toate sirurile de lungime n, formate numai din literele A si M, siruri care sa nu aiba doua litere A alaturate.Valoarea numarului natural n se citeste de la tastatura. Pentru n=3, se vor afisa sirurile: MMM, AMM, MAM, MMA,AMA.

#include<iostream.h> int n,k,i; char a[3],st[20]; int valid(int k) { for(i=1;i<k;i++) if(k>1&&a[st[k]]=='A'&&a[st[k-1]]=='A') return 0; return 1;} int sol(int k) { return (k==n);} void tipar(int k) {for(i=1;i<=k;i++) cout<<st[i]<< " "; cout<<endl;} void bkt(int k) {int val; for(val=1;val<=2;val++) {st[k]=a[val]; if(valid(k)) if(sol(k)) tipar(k); else bkt(k+1); }} void main() { cin>>n; a[1]='A'; a[2]='M'; bkt(1);} Backtracking cifre pare crescatoare Folosind metoda backtracking, sa se scrie un program care genereaza toate nr din 3 cifre pare,cifrele strict in ordine crescatoare

{ st[p]=v[val]; if(valid(p)) if (sol(p)) tipar(p); else bkt(p+1); }} void main() { bkt(1); } Problema labirintului backtracking Se d un labirint sub form de matrice de m linii i n coloane. Fiecare element al matricii reprezint o camer. ntruna din camerele labirintului se gsete un om. Se cere s se afle toate soluiile ca acel om s ias din labirint, fr s treac de dou ori prin aceeai camer.Se utilizeaza metoda backtracking. #include<iostream.h> #include<fstream.h> int st[20][20],i,m,n,v[20][20],a[20][20]; void tipar(int k) {for(i=1;i<=k;i++) cout<<st[i][1]<<" "<<st[i][2]<<" " ; cout<<endl;} int valid(int k) {if(v[st[k][1]][st[k][2]]==0) return 0; for(i=1;i<k;i++) if((st[k][1]==st[i][1])&&(st[k][2]==st[i ][2])) return 0; return 1; } int solutie(int k) {return((st[k][1]==1)||(st[k][1]==m)||(s t[k][2]==1)||(st[k][2]==n));} void bk(int k) {int val; for(val=1;val<=4;val++) {st[k][1]=st[k-1][1]+a[val][1]; st[k][2]=st[k-1][2]+a[val][2]; if(valid(k)) if(solutie(k)) tipar(k); else bk(k+1);}} void main() {int j,k,r; fstream f("labirint.in",ios::in); f>>m>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) f>>v[i][j];

#include<iostream.h> #include<math.h> int st[20],i,p,v[]={0,2,4,6,8}; int valid(int p) { for(i=1;i<p;i++) if(st[p]<=st[i])return 0; if(p==1 && st[p]==0)return 0; return 1; } int sol(int p) {return (p==3);} void tipar(int p) { int i; for(i=1;i<=p;i++) cout<<st[i]<<" "; cout<<endl; } void bkt(int p) {int val; for(val=0;val<=4;val++)

for(i=1;i<=4;i++) for(j=1;j<=2;j++) f>>a[i][j]; cin>>k;cin>>r; st[1][1]=k; st[1][2]=r; bk(2);} Problema calului backtracking Fiind dat o tabl de ah de dimensiunea nxn i un cal n colul stnga sus al acesteia, se cere s se afieze toate posibilitile de mutare a calului astfel nct s treac o singur dat prin fiecare ptrat al tablei. #include<iostream.h> #include<fstream.h> long st[100][100],vec[20][20],i,n; int valid(int k) {if((st[k][1]<1)||(st[k][1]>n)||(st[k][2 ]<1)||(st[k][2]>n)) return 0; for(i=1;i<k;i++) if((st[i][1]==st[k][1])&&(st[i][2]==st[k ][2])) return 0; return 1;} int solutie(int k) {return (k==n*n);} void tipar(int k) {for(i=1;i<=k;i++) cout<<st[i][1]<<" "<<st[i][2]<<" cout<<endl<<endl;} void bkt(int k) {int val; for(val=1;val<=8;val++) {st[k][1]=st[k-1][1]+vec[val][1]; st[k][2]=st[k-1][2]+vec[val][2]; if(valid(k)) {if(solutie(k)) tipar(k); else bkt(k+1); }}} void main() {int j; fstream f("datee.in",ios::in); for(i=1;i<=8;i++) for(j=1;j<=2;j++) f>>vec[i][j]; cin>>n; st[1][1]=1; st[1][2]=1; bkt(2);} Masa rotunda backtracking

La o petrecere sunt invitate un numar de perechi, sot si sotie.Ei trebuie asezati in jurul unei mese rotunde astfel incat membrii aceleasi perechi sa nu fie unul langa altul,dar in acelasi timp fiecare femeie sa aiba vecini doi barbati si fiecare barbat sa aiba vecini doua femei. Femeile vor avea numere impare iar barbatii numere pare.Perechile vor fi de forma (1,2),(3,4),(5,6) etc #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n; void init() { int j; st[1]=1; cout<<"n=";cin>>n; for(j=2;j<=n;j++) st[j]=0; } int valid(int p) { int i; for(i=1;i<p;i++) if(st[i]==st[p]) return 0; if ((st[p]-st[p-1])%2==0) return 0; if(st[p]%2==0 && st[p]-st[p-1]==1) return 0; if(st[p]%2==1 && st[p]-st[p-1]==-1) return 0; if (p==n && st[p]==2) return 0; return 1; } int sol(int p) {return (p==n);} void tipar(int p) { int j; for(j=1;j<=p;j++) cout<<st[j]<<" "; cout<<endl; } void bkt(int p) {int val; for(val=2;val<=n;val++) { st[p]=val; if(valid(p)) if (sol(p)) tipar(p); else bkt(p+1); }} void main()

";

{ init(); bkt(2); } Suma cifrelor s backtracking Sa se afiseze toat numerele formate din cifre distincte cu proprietatea ca suma cifrelor este s, unde s se citeste de la tastatura. Sa se folosesca metoda backtracking. #include<iostream.h> #include<conio.h> int st[20],n,k,s,c; void init(int k) {st[k]=-1;} int succesor(int k) {if((st[k]<9)&&(st[k]<s)) {st[k]++; return 1; } else return 0;} int valid(int k) {int suma=0; for(int i=1;i<k;i++) if(st[k]==st[i]) return 0; for(i=1;i<=k;i++) suma=suma+st[i]; if(suma>s) return 0; if((k==1)&&(st[k]==0)) return 0; return 1;} int sol(int k) {int suma=0; for(int i=1;i<=k;i++)suma=suma+st[i]; return(suma==s);} void tipar(int k) { //c++;cout<<"solutia"<<c<<": "; for(int i=1;i<=k;i++) cout<<st[i]; cout<<endl; //if(c%20==0) {cout<<"enter";getch();} } void bkt() {int as,k=1; init(k); while(k>0) { do{} while((as=succesor(k)) && !valid(k)); if (as) { if(sol(k)) tipar(k); if(st[k]!=0) {k++;init(k);} else {k++;init(k);} } else k--; } }

void main() {cout<<"s=";cin>>s; //c=0; bkt(); getch(); } PERMUTARI ITERATIV metoda backtarcking PERMUTRI. Se citete un numr natural n. S se genereze permutrile mulimi {1, 2, , n}

#include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k,p; void init() {st[k]=0;} int succesor() {if (st[k]<n) {st[k]++; return 1; } else return 0;} int valid() {for(int i=1;i<k;i++) if(st[i]==st[k]) return 0; return 1;} int sol() {return (k==n);} void tipar() {for(int i=1;i<=n;i++) cout<<st[i]; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } void main() { cout<<"n=";cin>>n; bkt(); }

problema comis voiajorului #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k,a[10][10]; void init() {st[k]=1;} int succesor() {if (st[k]<n) {st[k]++; return 1; } else return 0;} int valid() {if( a[st[k-1]][st[k]]==0) return 0; for(int i=1;i<k;i++) if(st[i]==st[k] ) return 0; if((k==n) && (a[1][st[k]]==0)) return 0; return 1;} int sol() {return (k==n);} void tipar() {for(int i=1;i<=n;i++) cout<<st[i]<<" "; cout<<endl; } void bkt() {int as;k=2; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } void main() {cout<<"numarul de orase=";cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; st[1]=1; bkt(); } problema colorarii hartilor #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k;

void init() {st[k]=0;} int succesor() {if (st[k]<4) {st[k]++; return 1; } else return 0;} int valid() {for(int i=1;i<k;i++) if(st[i]==st[k] && a[i][k]==1) return 0; return 1;} int sol() {return (k==n);} void tipar() {for(int i=1;i<=n;i++) cout<<"tara numarul"<<i<<" culoarea"<<st[i]<<endl; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } main() {cout<<"numarul de tari=";cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; bkt(); } problema damelor //problema damelor #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k; void init() {st[k]=0;} int succesor() {if (st[k]<n) {st[k]++; return 1; } else return 0;} int valid() {for(int i=1;i<k;i++)

if(st[i]==st[k] || abs(st[k]st[i])==abs(k-i)) return 0; return 1;} int sol() {return (k==n);} void tipar() {for(int i=1;i<=n;i++) cout<<st[i]; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } main() {cout<<"n=";cin>>n; bkt(); getch(); } Scrieti un program care afiseaza pe ecran toate secventele de n litere (n numar natural par citit de la tastatura) din multimea {A,R,G,V), secvente care se pot construi respectand urmatoarele reguli: nu plasam doua litere identice una langa alta;trebuie sa utilizam exact n/2 litere R #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k;char a[5]; void init() {st[k]=0;} int succesor() {if (st[k]<4) {st[k]++; return 1; } else return 0;} int valid() {int i,nr; if(k>1) if(st[k]==st[k-1]) return 0; if(k==n) {nr=0; for(i=1;i<=n;i++) if(a[st[i]]==R) return 0;}

return 1;} int sol() {return (k==n);} void tipar() {for(int i=1;i<=n;i++) cout<<a[st[i]]; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } void main() {cout<<"n=";cin>>n; a[1]=A;a[2]=R;a[3]=G;a[4]=V; bkt(); } Se citesc de la tastatura doua nr naturale n si v.Scrieti un program care afiseaza toate nr de la 1 la n in toate modurile posibile, astfel incat intre oricare doua numere afisate in pozitii invecinate, diferenta in modul sa fie mai mare decat valoarea data v. Exemplu: n=4,v=1 solutiile vor fi 3 1 4 2 si 2 4 1 3 #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k,v; void init() {st[k]=0;} int succesor() {if (st[k]<n) {st[k]++; return 1; } else return 0;} int valid() {for(int i=1;i<k;i++) if(st[i]==st[k]) return 0; if((k>1) &&(abs(st[k]-st[k-1]<=v)) return 0; return 1;}

int sol() {return (k==n);} void tipar() {for(int i=1;i<=n;i++) cout<<st[i]; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } void main() {cout<<"n=";cin>>n; cout<<"v=";cin>>v; bkt(); getch(); } Copiii asteapta jucarii de la Mos Craciun. Scrieti un program care determina toate modurile diferite in care ei pot sa fie asezati in lista, astfel incat sa fie vizitati toti copiii si vizitele sa se faca in orinea descrescatoare a numarului de jucarii dorite de fiecare.Se citesc de la tastatura: n, numarul de copii, apoi numele si numarul de jucarii cerut de fiecare dintre cei n copii.Sa se scrie numele copiilor, in ordinea in care vor fi vizitati de Mos Craciun. Exemplu: pentru datele de intrare: n=4 Dan 2 Cristina 4 Corina 6 Iulia 4 se scriu urmatoarele solutii: Corina Iulia Cristina Dan Corina Cristina Iulia Dan #include<iostream.h> struct copil{char nume[10]; int jucarii; }; struct copil v[10]; int st[20],n,k; void init() { st[k]=0; } int succesor() {if(st[k]<n) {st[k]++;return 1;}

return 0;} int valid() {int i; for(i=1;1<k;i++) if(st[k]==st[i]) return 0; for(i=1;i<k;i++) if(v[st[k]].jucarii>v[st[i]].jucarii) return 0; return 1;} int solutie() {int i; for(i=1;i<=n;i++) cout<<v[st[i]].nume<<" "; cout<<endl;} void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor() && (!valid())); if (as) if (solutie()) tipar(); else {k++; init();} else k--; } } void main() {cout<<"n=";cin>>n; for(int i=1;i<=n;i++) {

cout<<"nume"<<i;cin>>v[i].nume; cout<<"nr de jucarii pentru copilul "<<i;cin>>v[i].jucarii; } bkt(); } COMBINARI ITERATIV #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k,p; void init() { if(k>1) st[k]=st[k-1]; else st[k]=0; } int succesor() {if (st[k]<n-p+k) {st[k]++; return 1; } else return 0;} int valid() { return 1;} int sol() {return (k==p);} void tipar() {for(int i=1;i<=p;i++) cout<<st[i]; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } void main() {cout<<"n=";cin>>n; cout<<"p=";cin>>p; bkt(); getch(); }

ARANJAMENTE ITERATIV #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k,p; void init() {st[k]=0;} int succesor() {if (st[k]<n) {st[k]++; return 1; } else return 0;} int valid() {for(int i=1;i<k;i++) if(st[i]==st[k]) return 0; return 1;} int sol() {return (k==p);} void tipar() {for(int i=1;i<=p;i++) cout<<st[i]; cout<<endl; } void bkt() {int as;k=1; init(); while(k>0) { do {} while ((as=succesor()) && !valid()); if (as) if (sol()) tipar(); else {k++;init();} else k--; } } void main() {cout<<"n=";cin>>n; cout<<"p=";cin>>p; bkt(); getch(); }

fotbal //un patron are o suma s;ce jucatori poate lua #include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,p,s,a[20];

int valid(int p)

{int suma=0; for(int i=1;i<p;i++) if(st[i]>=st[p]) return 0; for(i=1;i<=p;i++) suma=suma+a[st[i]]; if(suma>s) return 0; return 1;} int sol(int p) {int suma=0; for(int i=1;i<=p;i++) suma=suma+a[st[i]]; return (suma==s);} void tipar(int p) {for(int i=1;i<=p;i++) cout<<st[i]; cout<<endl; } void bkt(int p) { int val; for(val=1;val<=n;val++) { st[p]=val; if(valid(p)) if(sol(p)) tipar(p); else bkt(p+1); } } void main() {cout<<"n=";cin>>n; cout<<"s=";cin>>s; for(int i=1;i<=n;i++) {cout<<"a["<<i<<"]=";cin>>a[i];} bkt(1);} Backtracking cifre distincte pare alaturate Folosind metoda backtracking, sa se afiseze toate nr din n cifre distincte a.i. sa nu fie 2 cifre pare alaturate

cout<<endl; } void bkt(int p) { int val; for(val=0;val<=n;val++) { st[p]=val; if(valid(p)) if(sol(p)) tipar(p); else bkt(p+1); } } void main() {cout<<"n=";cin>>n; bkt(1); getch(); } Se citesc n cifre.Sa se afiseze toate nr formate cu acestea astfel incat sa nu existe doua cifre pare alaturate. #include<iostream.h> #include<conio.h> int n,st[10],k,p; int v[10]; int valid(int p) { if((p==1) && v[st[p]]==0) return 0; if((p>1) && (v[st[p]]%2==0 && v[st[p1]]%2==0)) return 0; return 1; } int sol(int p) { return (n==p); } void tipar(int p) { for(int i=1;i<=p;i++) cout<<v[st[i]]; cout<<endl; } void bkt(int p) { for(int val=1;val<=n;val++) {st[p]=val; if (valid(p)) if (sol(p)) tipar(p); else bkt(p+1); }} void main() {

#include<iostream.h> #include<conio.h> #include<math.h> int st[20],n,k,p; int valid(int p) {if(p==1 && st[p]==0) return 0; for(int i=1;i<p;i++) if(st[i]==st[p]) return 0; if(p>1 && st[p]%2==0 && st[p-1]%2==0) return 0; return 1;} int sol(int p) {return (p==n);} void tipar(int p) {for(int i=1;i<=p;i++) cout<<st[i];

int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} bkt(1); getch(); } Se citesc n litere.Sa se formeze toate cuvintele de cate p litere formate din cele n litere astfel incat aceeasi litera sa nu se afle pe 2 pozitii alaturate. #include<iostream.h> #include<conio.h> int n,st[10],k,p; char v[10]; int valid(int k) { if((k>1) && (st[k]==st[k-1])) return 0; return 1; } int sol(int k) { return (k==p); } void tipar(int p) { for(int i=1;i<=p;i++) cout<<v[st[i]]; cout<<endl; } void bkt(int k) { for(int val=1;val<=n;val++) {st[k]=val; if (valid(k)) if (sol(k)) tipar(p); else bkt(k+1); }} void main() { int i; cout<<"n=";cin>>n; cout<<"p=";cin>>p; for(i=1;i<=n;i++) {cout<<"v["<<i<<"]=";cin>>v[i];} bkt(1); getch(); }

se citesc n nr.sa se afle toate modalitatile de afisare a nr a.i. 2 nr alaturate sa nu fie negative #include<iostream.h> int st[20],n,k,v[20]; void init() {cout<<"n=";cin>>n;} int valid(int k) {for(int i=1;i<k;i++) if(st[i]==st[k]) return 0; if((v[st[k]]<0) && (v[st[k-1]]<0)) return 0; return 1;} int sol(int k) {return (k==n);} void tipar(int k) {for(int i=1;i<=k;i++) cout<<v[st[i]]; cout<<endl; } void bkt(int k) {int val; for(val=1;val<=n;val++) {st[k]=val; if(valid(k)) if (sol(k)) tipar(k); else bkt(k+1); } } void main() {cout<<"n=";cin>>n; for(int i=1;i<=n;i++)cin>>v[i]; bkt(1);} combinari //combinari #include<iostream.h> int st[20],n,k; void init() { int i; cout<<"n=";cin>>n; cout<<"k=";cin>>k; st[0]=0; } void tipar(int p) { int j; for(j=1;j<=p;j++) cout<<st[j]<<" "; cout<<endl; } int solutie(int p) {

return (p==k); } void bkt(int p) { int val; for (val=st[p-1]+1;val<=n;val++) { st[p]=val; if(solutie(p)) tipar(p); else bkt(p+1); } } void main() { init(); bkt(1); } aranjamente //aranjamente #include<iostream.h> int st[20],n,k; void init() { int i; cout<<"n=";cin>>n; cout<<"k=";cin>>k; for(i=1;i<=n;i++) st[i]=0; } void tipar(int p) { int j; for(j=1;j<=p;j++) cout<<st[j]<<" "; cout<<endl; } int valid(int p) { int i,ok; ok=1; for(i=1;i<p;i++) if(st[p]==st[i]) ok=0; return ok; } int solutie(int p) { return (p==k); } void bkt(int p) { int val; for (val=1;val<=n;val++) { st[p]=val;

if (valid(p)) if(solutie(p)) tipar(p); else bkt(p+1); } } void main() { init(); bkt(1); } permutari //permutari #include<iostream.h> int st[20],n; void init() { int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) st[i]=0; } void tipar(int p) { int j; for(j=1;j<=p;j++) cout<<st[j]<<" "; cout<<endl; } int valid(int p) { int i,ok; ok=1; for(i=1;i<p;i++) if(st[p]==st[i]) ok=0; return ok; } int solutie(int p) { return (p==n); } void bkt(int p) { int val; for (val=1;val<=n;val++) { st[p]=val; if (valid(p)) if(solutie(p)) tipar(p); else bkt(p+1); } } void main() {

init(); bkt(1); } grafuri Componente tare conexa graf orientat Fiind dat un graf orintat, sa se determine componente tare conexa careia ii apartine un varf x citit de la tastatura. Aspect teoretic Definitie: Un graf orientat G=(X,U) este tare conex daca pentru oricare x si y exista un drum de la x la y precum si un drum de la y la x. Definitie: Fiind dat un graf orintat G=(X,U), se numeste componenta tare conexa a lui G, un subgraf G1=(X1,U1), tare conex, si maximal in raport cu aceasta proprietate (pentru orice nod x apartinand lui X-X1, subgraful indus de X1 U {x} nu mai este tare conex)

fstream f; f.open("comptare.in",ios::in); if(f) cout<<"bine"<<endl; else cout<<"eroare !"; f>>n>>m; for(int i=1;i<=m;i++) {f>>x>>y; a[x][y]=1;} cout<<endl<<"matricea de adiacenta"<<endl; for(i=1;i<=n;i++) {for(j=1;j<=n;j++) cout<<a[i][j]<<" ";

#include<fstream.h> int a[20][20],n,m,suc[100],prec[100],x; void dfsuc(int nod) {suc[nod]=x; for(int k=1;k<=n;k++) if(a[nod][k]==1&&suc[k]==0) dfsuc(k); } void dfprec(int nod) { prec[nod]=x;

cout<<endl;} cout<<"x=";cin>>x; dfsuc(x); cout<<endl<<"succesorii lui "<<x<<endl; for(i=1;i<=n;i++) if(suc[i]!=0) cout<<i<<" "; dfprec(x); cout<<endl<<"Predecesorii lui "<<x<<endl ; for(i=1;i<=n;i++)

for(int k=1;k<=n;k++) if(prec[i]!=0) if(a[k][nod]==1&&prec[k]==0) cout<<i<<" "; dfprec(k); } void main() {int y,j; cout<<endl<<"componenta tare conexa in care se gaseste "<<x<<" este "<<endl; for(i=1;i<=n;i++) if(prec[i]==suc[i]&&suc[i]!=0)

cout<<i<<" ";} Algoritmul lui Lee

void main() {int x,y,j; fstream f;

Fiind dat un graf orientat, se cere determinarea lungimea lanturilor (minime) de la un varf la toate celelalte

f.open("lee.in",ios::in); if(f) cout<<"ok!"<<endl;

#include<fstream.h> int a[20][20],n,m,viz[100],c[100],ic,sc, prim; int t[20]; void drum(int i) {if(t[i]!=0) drum(t[i]); cout<<i<<" "; } void lanturi() { if(ic<=sc) {prim=c[ic]; for(int k=1;k<=n;k++) if(a[prim][k]==1&&viz[k]==0 ) {sc++; c[sc]=k; viz[k]=viz[prim]+1; t[k]=prim; } ic++; lanturi(); } }

else cout<<"eroare"; f>>n>>m; for(int i=1;i<=m;i++) {f>>x>>y; a[x][y]=1;} cout<<endl<<"matricea de adiacente"<<endl; for(i=1;i<=n;i++) {for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl;} cout<<endl<<"lungime lanturi incepand de la "<<endl; cin>>x; cout<<"pana la "; cin>>y; ic=sc=1; c[ic]=x; viz[x]=1; lanturi(); cout<<"lantul minim are lungimea "<<viz[y]<<" "; cout<<endl; cout<<"vectorul viz "<<endl; for(i=1;i<=n;i++)

cout<<viz[i]<<" "; cout<<endl<<"vectorul t "<<endl; for(i=1;i<=n;i++) cout<<t[i]<<" "; || cout<<endl<<"drumul este "<<endl; }

return 0;

for(int i=1;i<=k-2;i++) if((st[i]==x && st[i+1]==y) (st[i]==y && st[i+1]==x)) return 0;

drum(y); if(k==m) } if(a[st[m]][st[1]]==0) Graf eulerian return 0; Se da un graf neorintat fara noduri izolate. Sa se determine daca este eulerian. Daca da, sa se afiseze toate ciclurile euleriene care incep cu un nod nd citit de la tastatura. #include<fstream.h> int st[100]; int k,nd; int a[10][10],viz[10],n,m; void df_r(int nod) {int k; cout<<nod<<" "; viz[nod]=1; for(k=1;k<=n;k++) if(a[nod][k]&&!viz[k]) df_r(k); } int valid() {int x,y; if(k==1) if(st[k]!=nd) return 0; if(k>1) {x=st[k]; else k--;} } } } void back() { k=1; while(k>0) {if(st[k]<n) {st[k]++; if(valid()) if(k==m) tipar(); else{k++; st[k]=0; } return 1;} void tipar() {for(int i=1;i<=m;i++) cout<<st[i]<<" cout<<st[1]; cout<<endl; ";

y=st[k-1]; if(a[x][y]==0)

void main() { int x,y; fstream f; f.open("graf.txt",ios::in); if(f) cout<<"ok"; else cout<<"eroare";

for(i=1;i<=n;i++) {s=0; for (int j=1;j<=n;j++) s+=a[i][j]; if(s%2!=0) gasit=1;} if(gasit) cout<<"am noduri fara grade pare";

f>>n>>m; else for(int i=1;i<=m;i++) {f>>x>>y; a[x][y]=a[y][x]=1; } cout<<"matricea de adiac "<<endl; for( i=1;i<=n;i++) {for(int j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } cout<<"nd="; cin>>nd; df_r(nd); int s=0; for(i=1;i<=n;i++) s+=viz[i]; if(s!=n) cout<<"graful nu e conex "; else {int gasit=0; cout<<endl<<"graful e conex!"<<endl; } Sa se parcurga in adancime DF un graf orientat. Graful este dat prin matricea de adiacenta. #include<fstream.h> #include<iostream.h> int v[20],a[20][20],n; void citire() { int i,j; fstream f("matrice.txt",ios::in); f>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) f>>a[i][j]; } void df(int nod) { int k; cout<<nod<<" "; v[nod]=1; for(k=1;k<=n;k++) if((a[nod][k]==1) && (v[k]==0)) df(k); } void main() { citire(); df(1); } cout<<"toate nodurile au gradele pare deci graful e eulerian"; } back();

Descompunerea in componente tare conexe a unui graf orientat, dat prin matricea de adiacenta Matricea de adiacenta se citeste dintrun fisier text

#include<fstream.h> int s[20],a[20][20],n,i,j,k; void df(int nod) { int k; cout<<nod<<" "; s[nod]=1; for(k=1;k<=n;k++) if((a[nod][k]=1) && (s[k]==0)) df(k); } void main() { fstream f("graf.txt",ios::in); f>>n; while(f>>i>>j) a[i][j]=1; f.close(); k=1; for(i=1;i<=n;i++) if(s[i]==0) { cout<<"componenta "<<k<<endl; df(i); cout<<endl; k++; } } Graf orientat tare conex

#include <fstream.h> int s[20],p[20],a[20][20],n,nr,i,j; void df1(int nod) { int k; s[nod]=nr; for(k=1;k<=n;k++) if ((a[nod][k]==1) && (s[k]==0)) df1(k); } void df2(int nod) { int k; p[nod]=nr; for(k=1;k<=n;k++) if((a[k][nod]==1) && (p[k]==0)) df2(k); } void main() { fstream f("grafo.txt",ios::in); f>>n; while(f>>i>>j) a[i][j]=1; f.close(); nr=1; for (i=1;i<=n;i++) if (s[i]==0) { s[i]=nr; df1(i);df2(i); for(j=1;j<=n;j++) if (s[j]!=p[j]) s[j]=p[j]=0; nr++; } for(i=1;i<=n;i++) { cout<<"componenta "<<i<<endl; for(j=1;j<=nr;j++) if(s[j]==1) cout<<j<<" "; cout<<endl; } } Descompunerea in componente conexe a unui graf neorientat, dat prin matricea de adiacenta

#include<fstream.h> #include<conio.h> int s[50],a[50][50],n,suc[50],pred[50],i,j; void citire(char fis[20],int a[50][50],int&n) { fstream f(fis,ios::in); int i,j; f>>n; while(f>>i>>j) a[i][j]=1; f.close(); } void df1 (int nod) { int k; suc[nod]=i; for (k=1;k<=n;k++) if ((a[nod][k]==1) && (suc[k]==0)) df1(k); } void df2(int nod) { int k; pred[nod]=i; for (k=1;k<=n;k++) if((a[k][nod]==1)&&(pred[k]==0)) df2(k); } void main() {

citire("fis.txt",a,n); cout<<"nodul de pornire:";cin>>i; suc[i]=pred[i]=i; df1(i);df2(i); for(j=1;j<=n;j++) if((suc[j]==pred[j])&&(suc[j]==i)) cout<<j<<" "; getch(); } Sa se parcurga un graf graf in latime (BF)

i=1;sf=1;c[i]=1;s[1]=1; bf(); for(int i=1;i<=sf;i++) cout<<c[i]<<" "; cout<<endl; getch(); } Sa se verifice daca un graf este hamiltonian Fiind dat un graf neorientat memorat prin matricea de adiacenta sa se determine daca graful este Hamiltonian sau nu. #include<fstream.h>

#include<fstream.h> #include<conio.h> struct nod { int inf; nod* adr; }; nod* l[20]; int c[20],s[20],i,sf,n; void citire(char fisier[10],nod*l[20],int& n) {nod* p; int i,j; fstream f(fisier,ios::in); f>>n; for(i=1;i<=n;i++) l[i]=0; while(f>>i>>j) {p=new nod; p->adr=l[i]; p->inf=j; l[i]=p; } f.close(); } void bf() { nod* p; if(i<=sf) { p=l[c[i]]; while(p) { if(s[p->inf]==0) {sf++; c[sf]=p->inf; s[p->inf]=1; } p=p->adr; } i++; bf(); } } void main() { citire("graf.txt",l,n);

int st[100],n,m,k,a[20][20]; int ns; int e_valid() {if(k>1) if(!a[st[k-1]][st[k]]) return 0; else for(int i=1;i<=k-1;i++) if(st[i]==st[k]) return 0; if(k==n) if(!a[st[1]][st[k]]) return 0; return 1; } void afisare() {for(int i=1;i<=n;i++) cout<<st[i]<<" "; cout<<st[1]; k=0; ns++; }

void back() {k=1; while(k>0) if(st[k]<n) {st[k]++; if(e_valid()) if(k==n) afisare(); else {k++; st[k]=0;} } else k--; } void main() { fstream f; f.open("hamiltonian.in",ios::in); int u,v; if(f) cout<<"ok!"; else cout<<"eroare"; cout<<endl; f>>n>>m; for(int i=1;i<=m;i++) {f>>u>>v; a[u][v]=a[v][u]=1; }

cout<<"matricea de adiacenta "<<endl; for( i=1;i<=n;i++) {for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } back(); if(ns==0) cout<<nu exista solutii; } Subgraf Se citesc 2 grafuri neorientate, unul cu n noduri si m muchii, iar celalalt cu k varfuri si l muchii, ambele date prin vectorul muchiilor. Sa se determine daca al doilea graf este subgraf al primului. #include<fstream.h> fstream f("date.in",ios::in); fstream g("date2.in",ios::in); int a[100][100],b[100][100],n,m,k,l; void citire() {int x,y,i; f>>n>>m; for(i=1;i<=m;i++) {f>>x>>y; a[x][y]=1; a[y][z]=1; } g>>k>>l; for(i=1;i<=l;i++) {g>>x>>y; b[x][y]=1; b[y][x]=1; } } int subgraf() {for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) if(a[i][j]!=b[i][j]) return 0; return 1; } void main() {citire(); if(subgraf()) cout<<"da";

else cout<<"nu"; } Afisarea elementelor unei matrici Se citeste o matrice patratica.Sa se afiseze elementele de pe diagonala secundara,elementele de pe diagonala principala,elementele de sub/desupra diagonalei secundare/principala. #include<iostream.h> #include<stdio.h> void main() { int i,j,n,a[20][20]; cin>>n; for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>a[i][j]; cout<<"diagonala principala"<<endl; for(i=0;i<n;i++) cout<<a[i][i]<<" "; cout<<endl<<"diagonala secundara"<<endl; for(i=0;i<n;i++) cout<<a[i][n-1-i]<<" "; cout<<endl<<"elementele de deasupra diagonalei principale"<<endl; for(i=0;i<=n-2;i++) for(j=i+1;j<=n-1;j++) cout<<a[i][j]<<" "; cout<<endl<<"elementele de sub diagonala principala"<<endl; for(i=1;i<=n-1;i++) for(j=0;j<=i-1;j++) cout<<a[i][j]<<" "; cout<<endl<<"elementele de deasupra diagonalei secundare"<<endl; for(i=0;i<=n-2;i++) for(j=0;j<=n-i-2;j++) cout<<a[i][j]<<" "; cout<<endl<<"elementele de sub diagonala secundara"<<endl; for(i=1;i<=n-1;i++) for(j=n-i;j<=n-1;j++) cout<<a[i][j]<<" "; } Se citeste n. Sa se afiseze urmatoarele forme. In exemplu n=4: 1) 1 2 3 4 1 2 3 1 2 1

#include<iostream.h> void main() { int i,j,n; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=n-i+1;j++) cout<<j<<" "; cout<<endl; } } 2) 1 1 1 1 2 2 2 3 3 4 #include<iostream.h> void main() { int i,j,n; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=n-i+1;j++) cout<<i<<" "; cout<<endl; } } 4) 4 3 2 1 4 3 2 4 3 4 #include<iostream.h> void main() { int i,j,n; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=n-i+1;j++) cout<<n-j+1<<" "; cout<<endl; } } Scriei un program C/C++ care citete de la tastatur un numr natural n (1n100)i apoi elementele unui tablou bidimensional cu n linii i n coloane, care memoreaz numere naturale cu cel mult 9 cifre fiecare; programul afieaz pe ecran acele valori din tablou care sunt strict mai mici dect toate elementele cu care se nvecineaz direct (aflate pe aceeai linie dar pe o coloan alturat sau pe aceeai coloan dar pe o linie

alturat).Numerele afiate vor fi separate prin cte un spaiu. #include<fstream.h> #include<string.h> #include<stdlib.h> ifstream f("matrice.txt"); long a[101][101]; int n,i,j; int verifica(int i,int j) { long x=a[i][j]; if((i+1<=n)&& (x>=a[i+1][j]))return 0; if((i-1>=1)&& (x>=a[i-1][j]))return 0; if((j-1>=1)&& (x>=a[i][j-1]))return 0; if((j+1<=n)&&(x>=a[i][j+1]))return 0; return 1; } void main() { do{cin>>n;}while(n<=1 ||n>=100); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if (verifica(i,j)==1) cout<<a[i][j]<<" "; }

Se considera o matrice An*m cu elemente numere intregi. Sa se determine linia (liniile) din matrice care contine cele mai multe elemente nenule. #include<iostream.h> void main(void) { int a[30][30],n,m,i,j,max,nr; cout<<"Dati numarul de linii n = ";cin>>n; cout<<"Dati numarul de coloane m = ";cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cout<<"a["<<i<<","<<j<<"]= "; cin>>a[i][j]; } cout<<endl<<"Matricea A are elementele:"<<endl; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } max=0; for(i=1;i<=n;i++) { nr=0; for(j=1;j<=m;j++) if(a[i][j]!=0) nr++; if(max<nr) max=nr; } for(i=1;i<=n;i++) { nr=0; for(j=1;j<=m;j++) if(a[i][j]!=0) nr++; if(max==nr) cout<<"Linia "<<i<<" are "<<max<<" elemente nenule"<<endl; } } Sa se scrie un program care calculeaza transpusa unei matrici An*m #include <iostream.h> void main(void) { int n,m,i,j,a[30][30],b[30][30]; cout<<"Dati dimensiunile matricei "<<endl; cout<<"Dati numarul de linii n = ";cin>>n; cout<<"Dati numarul de coloane m = ";cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cout<<"a["<<i<<","<<j<<"]= "; cin>>a[i][j]; } cout<<"Elementele matricei A sunt: "<<endl;

for(i=1;i<=n;i++) { for(j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } for(i=1;i<=n;i++) for(j=1;i<=m;i++) b[j][i]=a[i][j]; cout<<"Matricea transpusa este "<<endl; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) cout<<b[i][j]<<" "; cout<<endl; } } Sa se scrie un program care calculeaza produsul a doua matrici bidimensionale A si B. #include <iostream.h> void main() { int n,m,p,i,j,k,a[10][10],b[10][10],c[10][10 ]; cout<<"Dati numarul de linii n = ";cin>>n; cout<<"Dati numarul de coloane m = ";cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cout<<"a["<<i<<","<<j<<"]= "; cin>>a[i][j]; } cout<<"Elementele matricei A sunt: "<<endl; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } cout<<"Dati numarul de linii m = ";cin>>m; cout<<"Dati numarul de coloane p = ";cin>>p; for(i=1;i<=m;i++) for(j=1;j<=p;j++) { cout<<"b["<<i<<","<<j<<"]= "; cin>>b[i][j]; } cout<<"Elementele matricei B sunt: "<<endl; for(i=1;i<=m;i++) { for(j=1;j<=p;j++) cout<<b[i][j]<<" "; cout<<endl; } for(i=1;i<=n;i++) for(j=1;j<=p;j++) for(k=1;k<=m;k++)

c[i][j]+=a[i][k]*b[k][j]; cout<<"Elementele matricei produs "<<endl; for(i=1;i<=n;i++) { for(j=1;j<=p;j++) cout<<c[i][j]<<" "; cout<<endl; } } Scrieti un program care construieste in memorie un tablou t cu n linii si n coloane, cu elemente numere intregi, astfel incat pe diagonala principala sa existe numai elemente egale cu 1, elementele de pe cele doua semidiagonale paralele cu diagonala principala si alaturate diagonalei principale sa fie tot egale cu 2, elementele de pe urmatoarele doua semidiagonale sa fie egale cu 3 etc.Valoarea lui n se citeste de la tastatura. #include<iostream.h> int a[20][20],nr[30],i,j,n,k,m,max=0; void main() { cout<<"n=";cin>>n; for(i=0;i<=n-1;i++) for(j=0;j<=n-1;j++) if(i==j) a[i][j]=1; for(i=0;i<=n-2;i++) {k=2; for(j=i+1;j<=n-1;j++) {a[i][j]=k;k=k+1;} } for(i=0;i<=n-1;i++) for(j=0;j<=n-1;j++) a[j][i]=a[i][j]; for(i=0;i<=n-1;i++) { for(j=0;j<=n-1;j++) cout<<a[i][j]<<" "; cout<<endl; } } Se da o matrice cu m lini * n coloane, ale carei elemente sunt cifre de 0 si 1. Sa se afiseze indicii liniei (liniilor) pe care se afla cele mai multe valori de 1. #include<iostream.h> int a[20][20],nr[30],i,j,n,m,max=0; void main() { cout<<"n=";cin>>n; cout<<"m=";cin>>m; for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) { cout<<"a["<<i<<"]["<<j<<"]=";

cin>>a[i][j]; } for(i=0;i<=m-1;i++) nr[i]=0; for(i=0;i<=m-1;i++) { for(j=0;j<=n-1;j++) nr[i]=nr[i]+a[i][j]; if(max<nr[i]) max=nr[i]; } for(i=0;i<=m-1;i++) if(nr[i]==max) cout<<i<<" "; } Se da o matrice cu m lini * n coloane.Sa se memoreze intr-un vector b sumele elementelor de pe fiecare lini a matricii ( b[i] va reprezenta suma elementelor de pe linia i in matrice) #include<iostream.h> int a[20][20],b[30],i,j,n,m; void main() { cout<<"n=";cin>>n; cout<<"m=";cin>>m; for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) { cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j]; } for(i=0;i<=m-1;i++) b[i]=0; for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) b[i]=b[i]+a[i][j]; for(i=0;i<=m-1;i++) cout<<b[i]<<" "; } O matrice patratica cu n linii * n coloane se numeste triunghiulara superior daca toate elementele aflate sub diagonala principala sunt nule. Realizati un program care verifica daca matricea este triunghiulara superior. #include<iostream.h> int a[20][20],i,j,n,g; void main() { cout<<"n=";cin>>n; for(i=0;i<=n-1;i++) for(j=0;j<=n-1;j++) { cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j]; } g=1; for(i=1;i<=n-1;i++) for(j=0;j<=i-1;j++) if(a[i][j]) g=0; if(g==0) cout<<"nu este triunghiulara superior";

else cout<<"este triunghiulara"; } Probleme cu instructiunea for in C++ Se citeste n. Sa se afiseze urmatoarele forme. In exemplu n=4:

1) * * * * * * * * * * #include<iostream.h> void main() { int n,i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { for(j=(n-i)+1;j>=1;j--) cout<<'*'<<" "; cout<<endl; } } 2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<iostream.h> void main() { int n,i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { for(j=n*(i-1)+1;j<=n*i;j++) cout<<j<<" "; cout<<endl; } } 3) 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4

#include<iostream.h> void main() { int n,i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<j<<" "; cout<<endl; } } 4) 4 1 4 1 3 2 3 2 2 3 2 3 1 4 1 4

{ float a,p; int b,i; cout<<"a=";cin>>a; cout<<"b=";cin>>b; p=1; for(i=1;i<=b;i++) p=p*a; cout<<p; } Sa se afiseze primele n numere naturale pare #include<iostream.h> void main() { int n,i=0; cout<<"n=";cin>>n; while(i<=2*n) { cout<<i<<" "; i=i+2; } } Sa se afiseze primele n numere naturale impare #include<iostream.h> void main() { int n,i=1; cout<<"n=";cin>>n; while(i<=2*n) { cout<<i<<" "; i=i+2; } } Se se a) b) c) d) citeste un numar natural nenul n. Sa se calculeze urmatoarele sume: s = 1+2+..+n s = 1^2 + 2^2 + ... + n^2 s = 1^3 + 2^3 + ... + n^3 s = 1*2 + 2*3 + .. + n*(n+1)

#include<iostream.h> void main() { int n,i,j; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { if(i%2==0) { j=1; while(j<=n) { cout<<j<<" "; j++;} cout<<endl; } else { j=n; while(j>=1) { cout<<j<<" "; j--; } cout<<endl;} } } Sa se calculeze n!, unde n este numar natural. #include<iostream.h> void main() { int n,p=1,i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) p=p*i; cout<<"n!="<<p; } Sa se calculeze a ^b (a la puterea b), unde a este real, iar b intreg. #include<iostream.h> void main()

#include<iostream.h> void main() { int n,s1=0,s2=0,s3=0,s4=0,i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) s1=s1+i; cout<<s1<<endl; for(i=1;i<=n;i++) s2=s2+i*i; cout<<s2<<endl; for(i=1;i<=n;i++) s3=s3+i*i*i; cout<<s3<<endl; for(i=1;i<=n;i++) s4=s4+i*(i+1); cout<<s4; }

Rezolvarea unui sistem de doua ecuatii liniare cu doua necunoscute in C++ S se rezolve un sistem de dou ecuaii liniare cu dou necunoscute: a1*x+b1*y=c1 a2*x+b2*y=c2 Soluiile sistemului de ecuaii sunt: x=dx/d=(b2*c1-b1*c2)/(a1*b2-b1*a2) y=dy/d=(a1*c2-a2*c1)/(a1*b2-b1*a2) #include<iostream> void main(){ int a1, b1, c1, a2, b2, c2, d, dx, dy; float x, y; cout<<"a1="; cin>>a1; cout<<"b1="; cin>>b1; cout<<"c1="; cin>>c1; cout<<"a2="; cin>>a2; cout<<"b2="; cin>>b2; cout<<"c2="; cin>>c2; d=(a1*b2-b1*a2); dx=(b2*c1-b1*c2); dy=(a1*c2-a2*c1); if (d==0) if (dx==0) cout<<Sistem nedeterminat.; else cout<<Sistem incompatibil.; else{ x=dx/d; y=dy/d; cout<<x=<<x<<endl; cout<<y=<<y; } } Se citeste un numr natural n. S se verifice dac n este ptrat perfect. #include<iostream> #include<cmath> void main(){ int n; // n - numrul citit de la tastatur care se verific dac este ptrat perfect cout<<"n="; cin>>n; if (sqrt(n)==(int)(sqrt(n))) cout<<n<<" este patrat perfect "<<endl; else cout<<n<<" nu este patrat perfect "<<endl; } Fie a1,a2,a3....an un si de numere si x un nr real dat. Sa se verifice daca x se afla printre numerele date #include<iostream.h> void main() { int i,n,gasit=0;; float a,x; cout<<"n=";cin>>n;

cout<<"x=";cin>>x; for(i=1;i<=n;i++) { cout<<"a=";cin>>a; if(a==x) gasit=1; } if (gasit==1) cout<<"numarul "<<x<<" se gaseste in sir"; else cout<<"numarul "<<x<<" nu se gaseste in sir"; } Se citesc de la tastatura `n` numere naturale. Sa se afiseze la monitor toti divizorii fiecarui numar x in parte . Daca x este prim afiseaza "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; } } Se introduc 2 numere, a si b si un numar k. Sa se verifice daca fractia a/b poate fi simplificata prin k. #include<iostream.h> void main(){ int a,b,k; cout<<"Introduceti primul numar: ";cin>>a; cout<<"Introduceti al doilea numar: ";cin>>b; cout<<"Introduceti numarul k : ";cin>>k; if(a% k == 0 && b% k==0) cout<<"Fractia se poate simplifica prin numarul "<<k; else cout<<"Fractia nu se poate simplifica prin numarul "<<k; } Sa se scrie un program care sa rezolve ecuatia de grad II: ax2+bx+c=0, unde a, b, c apartin lui R. #include<iostream.h> #include<math.h> void main(void) { int a,b,c; float x1,x2,delta,preal,pimag; cout<<"Dati valoarea lui a = "; cin>>a;

cout<<"Dati valoarea lui b = "; cin>>b; cout<<"Dati valoarea lui c = "; cin>>c; if(a==0) cout<<"Ecuatie de gradul I"<<"\n"; else { delta=b*b-4*a*c; if(delta >= 0) { cout<<"Radacini reale: "; x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); cout<<"x1 = "<<x1<<" x2 = "<<x2; } else { cout<<"Radacini complexe :"; delta=-delta; preal=-b/(2*a); pimag=sqrt(delta)/(2*a); cout<<"x1 = "<<preal<<" + i*"<<pimag<<"\n"; cout<<"x2 = "<<preal<<" - i*"<<pimag; } } } Sa se scrie un program care sa rezolve ecuatia de grad I: ax+b=0, valorile lui a si b se citesc de la tastatura si sunt valori reale. #include<iostream.h> void main(void) { float a,b,x; cout<<"Dati valoarea lui a = "; cin>>a; cout<<"Dati valoarea lui b = "; cin>>b; if(a==0) if(b==0) cout<<"infinitate de solutii"; else cout<<"ecuatie imposibila"; else { x=-b/a; cout<<"solutia este x= "<<x; } } Sa se calculeze si sa se afiseze valoarea distantei intre doua puncte, dandu-se coordonatele acestora: A(x1, y1) si B(x2, y2). #include<iostream.h> #include<math.h> void main(void) { int x1,y1,x2,y2; float d; cout<<"dati x1= ";cin>>x1; cout<<"dati y1= ";cin>>y1;

cout<<"dati x2= ";cin>>x2; cout<<"dati y2= ";cin>>y2; d=sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1y2) ); cout<<"Distanta intre "<<x1<<","<<y1<<" si "<<x2<<","<<y2<<" este = "<<d; } Se citeste un numar de la tastatura.Sa se verifice daca el numar perfect Un numar se numeste perfect daca este egal cu suma divizorilor sai (inclusiv 1, mai putin el insusi) #include<iostream.h> void main() { int n,s=1,d; cout<<"n=";cin>>n; for(d=2;d<=n/2;d++) if(n%d==0) s=s+d; cout<<s<<endl; if(s==n) cout<<"nr perfect"; else cout<<"nu este nr perfect"; } Se citeste un numar de la tastatura.Sa se verifice daca el este palindrom Un numar este palindrom daca citit de la dreapta la stanga este egal cu numarul citit de la stanga la dreapta ex:121 #include<iostream.h> void main() { int copie,oglindit,c,n; oglindit=0; cout<<"n=";cin>>n; copie=n; while(n!=0) { c=n%10; oglindit=oglindit*10+c; n=n/10; } if(copie==oglindit) cout<<"palindrom"; else cout<<"nu este palindrom"; } CEL MAI MARE DIVIZOR COMUN - ALGORITMUL LUI EUCLID (metoda impartirilor succesive) #include<iostream.h> void main() { int a,b,r; cout<<"a=";cin>>a; cout<<"b=";cin>>b; r=a%b; while(r) { a=b;

b=r; r=a%b; } cout<<"cmmdc: "<<b; } CEL MAI MARE DIVIZOR COMUN - ALGORITMUL LUI NICOMAHUS (metoda scaderilor repetate) #include<iostream.h> void main() { int a,b,r; cout<<"a=";cin>>a; cout<<"b=";cin>>b; while(a!=b) if(a>b) a=a-b; else b=b-a; cout<<"cmmdc: "<<b; } Realizati un program care descompune in factori primi un numar n citit 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; } } Scrieti un program care afiseaza numarul de aparitii a unei cifre x intr-un numar n;de ex daca citim n=2232 si x=2 se afiseaza numarul 3. #include<iostream.h> void main() { int n,n1,nr,x; cout<<"n=";cin>>n; cout<<"x=";cin>>x; nr=0; n1=n; do { if(n1%10==x) nr++; n1=n1/10; }while(n1); cout<<"cifra "<<x<<" apare de "<<nr<<" ori"; }

Sa se scrie un program tcare realizeaza trecerea unui numar din baza 10 in baza b, unde b se citeste de la tastatura #include<iostream.h> void main() { long n,n1,b,aux,nr; aux=nr=0; cout<<"n=";cin>>n; cout<<"b=";cin>>b; n1=n; do { aux=aux*10+n1%b; n1=n1/b; } while(n1!=0); cout<<aux<<endl;; do { nr=nr*10+aux%10; aux=aux/10; } while(aux); cout<<"numarul "<<n<<" in baza "<<b<<" este: "<<nr; } Calculati suma cifrelor unui numar x citit de la tastatura #include<iostream.h> void main() { int s; long d,x; cout<<"x=";cin>>x; d=x; s=0; while(d) { s=s+d%10; d=d/10; } cout<<"s="<<s; } Calculati produsul numerelor naturale impare mai mici sau egale cu o valoare data n ex:pt n=8 p=1*3*5*7=105 #include<iostream.h> void main() { int p,i,n; cout<<"n=";cin>>n; p=1;i=1; while(i<=n) { p=p*i; i=i+2; }

cout<<"p="<<p; } Sa se afiseze oglinditul unui numar #include<iostream.h> void main() { int n,o,n1; cout<<"n=";cin>>n; o=0;n1=n; do { o=o*10+n1%10; n1=n1/10; }while(n1); cout<<"oglinditul lui "<<n<<" este: "<<o; } Verificati daca un numar natural x diferit de 0 si 1, este prim sau nu #include<iostream.h> void main() { int x,d,ok; cout<<"x=";cin>>x; ok=1;d=2; while(d<=x/2 && ok) { if(x%d==0) ok=0; d++; } if(ok) cout<<"nr prim"; else cout<<"nr nu este prim"; } Sa se afiseze primii n termeni ai sirului lui Fibonacci;sirul are primii doi termeni egali cu 1 si fiecare din urmatorii termeni este egal cu suma dintre precedentul si ante-precedentul #include<iostream.h> void main() { int i,n; long f,p,a; cout<<"n=";cin>>n; p=a=1; cout<<a<<" "<<p<<endl; for(i=3;i<=n;i++) { f=p+a; cout<<f<<endl; a=p; p=f; } } Sortare prin metoda insertiei

#include<iostream.h> void { int cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } for(i=1;i<n;i++) { aux=v[i]; k=i; while(k &&

main() i,k,n,aux,v[20];

v[k-1]>aux) { v[k]=v[k-1]; k--; }

v[k]=aux; } for(i=0;i<n;i++) cout<<v[i]<<" } Sortare prin metoda interschimbarii

";

#include<iostream.h> void main() { int i,j,n,aux,v[20]; cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(v[i]>v[j]) {aux=v[i];v[i]=v[j];v[j]=aux;} for(i=0;i<=n-1;i++) cout<<v[i]<<" "; } Sortare prin metoda bulelor

#include<iostream.h> void main() { int i,m,n,o,aux,v[20]; cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } m=n; do { o=1; for(i=0;i<m-1;i++) if(v[i]>v[i+1])

{ o=0; aux=v[i];v[i]=v[i+1];v[i+1]=aux; } m--; }while(!o); for(i=0;i<=n-1;i++) cout<<v[i]<<" "; } Comparatie doua siruri de caractere citite de la tastatura Se citesc de la tastatura 2 siruri de caractere. Sa se compare cele doua siruri. #include<iostream.h> #include<string.h> char s1[100],s2[100]; void main() { int x; x=stricmp(s1,s2); if(x>0) cout<<"Primul sir este mai mare "; else if(x==0) cout<<"Siruri sunt egale"; else cout<<"Al doilea sir este mai mare decat primul "; } Sa se afiseze toate pozitiile unui caracter intr-un sir

p=strchr(a,c); while (p) {cout<<"Pozitia "<<p-a<<endl; p++; p=strchr(p,c);}} Se citeste un sir de caractere ce nu contine caractere albe.Sa se afiseze toate cuvintele obtinute prin eliminarea unui singur caracter ex:citim asde;se va afisa:sde,ade,ase,asd #include<iostream.h> #include<string.h> void main() { char s[20]; int i,j; cin>>s; for(i=0;i<strlen(s);i++ ) { for(j= 0;j<strlen(s);j++) if(i!=j) cout<<s[j]; cout<<endl; } } Se citeste un sir de caractere ce nu contine caractere albe.Sa se elimine toate consoanele si sa se afiseze sirul. #include<iostream.h> #include<string.h> void main() { char s[20],vocale[]="aeiouAEIOU"; int gasit=1;; cin>>s; int i; while(gasit==1) for(i=0;i<strlen(s);i++) { gasit=0; if (strchr(vocale,s[i])==0) { strcpy(s+i,s+i+1); gasit=1; } } cout<<s; } Se citeste opropozitie.Sa se transforme toate literele mici in litere mari. #include<iostream.h> #include<string.h>

#include <iostream.h> #include <string.h> void main() {char a[100],*p,c; cin.get(a,100); cin>>c;

void main() { char s[20]; cin.get(s,20); strupr(s); cout<<s; } Se citeste un sir de caracterece nu contine caractere albe. Sa se elimine vocalele din sir. #include<iostream.h> #include<string.h> void main() { char s[20],vocale[]="aeiouAEIOU"; int gasit=1; cin>>s; int i; while(gasit) for(i=0;i<strlen(s);i++) { gasit=0; if (strchr(vocale,s[i])!=0) {strcpy(s+i,s+i+1); gasit=1;} } cout<<s; } Se citeste un cuvant fara caractere albe. Sa se inlocuiasca fiecare vocala mica din cuvant cu vocala mare corespunzatoare. #include<iostream.h> #include<string.h> void main() { char vocale[]="aeiou"; char s[20]; int i; cin>>s; for(i=0;i<strlen(s);i++) if(strchr(vocale,s[i])!=0) s[i]=s[i]+'A'-'a';//sau s[i]=s[i]-32; cout<<s; } Se citeste un sir de caractere care nu contine caractere albe.Sa se verifice daca sirul e alcatuit exclusiv din caractere nenumerice

Se citeste un sir de caractere care nu contine caractere albe.Sa se verifice daca sirul este alcatuit exclusiv din caractere numerice. #include<iostream.h> #include<string.h> void main() { char cuvant[100],cifre[]="0123456789"; cout<<"cuvant:";cin>>cuvant; if(strspn(cuvant,cifre)==strlen(cuvant)) cout<<"numeric"; else cout<<"nenumeric"; } Se citesc alfabetic n cuvinte.Sa se sorteze

#include<iostream.h> #include<string.h> void main() { char cuvinte[10][25],aux[25]; int n,i,gasit; cout<<"n=";cin>>n; for(i=0;i<n;i++) {cout<<"cuvant:";cin>>cuvinte[i];} do { gasit=0; for(i=0;i<n-1;i++) if(strcmp(cuvinte[i],cuvinte[i+1])>0) { strcpy(aux,cuvinte[i]); strcpy(cuvinte[i],cuvinte[i+1]); strcpy(cuvinte[i+1],aux); gasit=1; } }while(gasit); for(i=0;i<n;i++) cout<<cuvinte[i]<<" "; } Etapele rezolvarii unei probleme cu ajut orul calculatorului Folosim calculatorul pentru a efectua calcule complexe. Daca calculele elementare pot fi efectuate cu ajutorul unui calculator de buzunar, rezolvarea unuor probleme nu se poate realiza decat de catre un calculator programabil. Dar pentru a obtine niste rezultate corecte, calculatorul trebuie sa cunoasca algoritmul de rezolvare. Algoritmul este transpus intr-un limbaj de programare, fiind codificat prin intermediul unui program. Programul este alcatuit din comenzi (instructiuni) pe care calculatorul le interpreteaza.

#include<iostream.h> #include<string.h> void main() { char cuvant[100],cifre[]="0123456789"; cout<<"cuvant:";cin>>cuvant; if(strcspn(cifre,cuvant)==10) cout<<"caractere nenumerice"; else cout<<"caractere numerice"; }

Etapele obtinerii unui program. 1.Identificarea datelor de intrare si a celor de iesire Algoritmul foloseste date de intrare (ceea ce cunoastem )si in urma prelucarii obtine date de iesire(ceea ce vrem sa obtinem) OBSERVATIE Algoritmii opereaza cu date de intrare si de iesire, chiar si atunci cand acest fapt nu este atat de evident. Sa presupunem ca jucam un joc pe calculator. Acest joc este de fapt un program complex care a fost obtinut in urma codificarii unui algoritm. O data de intrare poate fi apasarea unei taste,un click al mouse-ului etc.O data de iesire poate fi o anumita imagine sau o succesiune de imagini care creeaza impresia ca un obiect se deplaseaza, un anumit sunet etc. Chiar si imaginile, sunetele etc sunt codificate numeric 2.Elaborarea algoritmului de rezolvare a problemei Rezolvarea matematica a unei probleme trebuie transpusa intr-un algoritm folosind instructiuni specifice.De obicei este mai greu sa gasim o rezolvare matematica decat sa realizam un algoritm.Algoritmul specifica operatiile pe care le are de facutcalculatorul pentru ca, pornind de la datele de intrare, sa obtina datele de iesire dorite. 3.Transpunerea algoritmului intr-un limbaj de programare Algoritmul poate fi codificat direct in limbajul de programare dorit, respectand sintaxa corespunzatoare. Sintaxa C++ Fiecare fiier surs conine declaraii de variabile i definiii de funcii. Funciile, la rndul lor, conin alte declaraii de variabile i comenzi. Declaraiile de variabile fie definesc noi tipuri sau atribuind un tip de date predefinite, prin scrierea tipului de dat i urmat de numele variabilei. Seciuni de cod sunt incluse ntre acolade { i }. Comenzile execut aciuni cum ar fi cele de modificare ale valorii unei variabile sau afiarea unui text la consol.

Structurile de control sunt variabile pentru execuii condiionale sau iteraii, realizate cu ajutorul cuvintelor rezervate if, else, switch, do, while i for. Cu ajutorul unei varieti de operatori implementai n C, se pot realiza operaii aritmetice, logice, comparative, pe bii, indexarea tablourilor i atribuiri. Comenzile pot de asemenea apela funcii. 4.Compilarea si testarea programului Programul trebuie verificat din punct de vedere al corectitudinii sintactice prin operatia de compilare.Testarea programului se realizeaza prin verificarea datelor de iesire inclusiv pentru cazuri particulare ale datelor de intrare. Daca sunt erori, atat datorita unei scrieri gresite sau unei erori de rationament, vor fi remediate in aceasta faza. Se citeste un arbore cu n varfuri dat prin vectorul muchiilor si apoi se citeste varful radacina. Sa se construiasca si sa se afiseze vectorul TATA.

Vectorul de tati de declara astfel: T[i]=parintele(tata) nodului i. Pentru arborele din figura vectorul TATA este 0,1,2,1 si radacina este 1.Muchiile care se citesc sunt 1-2,2-1,1-4

#include<iostream.h> int n, r, T[20], a[20][20], p[20];void citire() { int i,x,y; cout<<"nr de noduri: ";cin>>n; cout<<"cititi muchiile de forma x-y : "<<endl; for(i=1;i<=n-1;i++) { cin>>x>>y; a[x][y]=a[y][x]=1;; } cout<<"dati radacina : "<<endl; cin>>r; }void BF(int r) { int s,d,i,x[100]; d=s=1; x[1]=r; p[r]=1; while (s<=d) { for(i=1;i<=n;i++) if(a[x[s]][i] &&!p[i]) { d++; x[d]=i; p[i]=1; T[i]=x[s]; } s++; } }void main() { int i; citire(); BF(r); cout<<"vectorul TATA este :"<<endl; for(i=1;i<=n;i++) cout<<T[i]<<" "; } Se citeste un arbore cu n varfuri dat prin vectorul TATA. 1) Sa se afiseze muchiile arborelui 2) Sa se construiasca si sa se afiseze matricea de adiacenta a arborelui.

Observatie: vectorul TATA precizeaza pentru fiecare varf i, nodul TATA[i] care reprezinta parintele sau Pentru arborele din imagine vectorul TATA este: 0,1,2,1. #include<iostream.h> int n, t[20], a[20][20];void afis() { int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } }void main() { int i; cout<<"nr de noduri: ";cin>>n; cout<<"dati vectorul tata "<<endl; for(i=1;i<=n;i++) { cout<<"t["<<i<<"]="; cin>>t[i]; } cout<<"muchiile sunt: "<<endl; for(i=1;i<=n;i++) if(t[i]!=0) { cout<<"["<<t[i]<<","<<i<<"] "; a[i][t[i]]=a[t[i]][i]=1; } cout<<endl; cout<<"matricea de adiacenta este: "<<endl; afis(); } Sa se determine un arbore partial de cost minim folosind algoritmul Kruskal Pentru memorarea muchiilor grafului si a costurilor acestora se defineste o structura de date cu trei campuri (nodurile muchiei si costul ei) pe care o numim muchie #include<iostream.h> #include<fstream.h> typedef struct{int u,v,c;} muchie; int l[30],n,m; muchie e[30]; void citire() {int i; fstream f("apm.txt", ios::in); f>>n; f>>m; for(i=1;i<=m;i++) f>>e[i].u>>e[i].v>>e[i].c; f.close();} void main() {int k,ultim,i,u,v,ct,ind,ms,lu,lv; muchie aux; citire(); for(i=1;i<=n;i++) l[i]=i; ultim=m;

while(ultim>1) {k=0; for(i=1;i<=ultim-1;i++) if(e[i].c>e[i+1].c) {aux=e[i]; e[i]=e[i+1]; e[i+1]=aux; k=1; } ultim=k;} cout<<"APM contine muchiile:"<<endl; ct=0;ms=0;ind=0; while(ms<n-1) { do ind++; while(l[e[ind].u]==l[e[ind].v]); u=e[ind].u; lu=l[u]; v=e[ind].v; lv=l[v]; cout<<u<<" "<<v<<endl; ct=ct+e[ind].c; ms++; for(i=1;i<=n;i++) if(l[i]==lu) l[i]=lv;} cout<<"costul APM este:"<<ct;} Numarul de nivele ale unui arbore

else return 1+max(h(r->st),h(r->dr)); } int h1(nod *r) {if(r==0) return 0; else return 1+h1(r->st); } int h2(nod *r) {if(r==0) return 0; else return 1+h2(r->dr); } void main() {int a,b; //clrscr(); c=arb(); cout<<h(c)<<endl; cout<<h1(c)<<endl; cout<<h2(c)<<endl; getch(); } Codul pruffer

#include<iostream.h> #include<conio.h> int t[50],pt[50],i,j,k,n,gasit; void main() { cout<<"n=";cin>>n; for(i=1;i<=n-2;i++) {cout<<"pt["<<i<<"]="; cin>>pt[i]; } pt[n-1]=n; for(i=1;i<=n-1;i++) {k=1; do {gasit=0; for(j=1;j<=i-1;j++) if(t[j]==k) gasit=1; if(!gasit) for(j=i;j<=n-1;j++) if(pt[j]==k) gasit=1; if(gasit) k++; } while(gasit); t[i]=k; } for(i=1;i<=n-1;i++) cout<<t[i]<<" "; cout<<endl; getch(); } Arborescenta #include<fstream.h> #include<conio.h> int a[20][20],b[20][20],s[20],gasit,ok,radac ina,n,i,j,suma,r; void citire(char nume[10],int a[20][20],int& n)

#include<iostream.h> #include<conio.h> #include<stdio.h> struct nod {int nr; nod* st,*dr; }; nod *c; int coada[20],s[20],i,sf; nod *r[20]; nod *arb() {int n; nod *c; cout<<"n=";cin>>n; if(n) { c=new nod; c->nr=n; c->st=arb(); c->dr=arb(); return c; } else return 0; } int max(int x,int y) {if (x>y) return x; else return y; } int h(nod *r) { if (r==0) return 0;

{ fstream f(nume,ios::in); int i,j; f>>n; while (f>>i>>j) a[i][j]=1; f.close(); } void df(int nod) { int k;s[nod]=1; for(k=1;k<=n;k++) if(a[nod][k]==1 || a[k][nod]==1) {a[k][nod]=a[nod][k]=0; if (s[k]==0) df(k); else gasit=1; } } void df1(int nod) { int k;s[nod]=1; for(k=1;k<=n;k++) if (a[nod][k]==1 && s[k]==0) df1(k); } void main() { citire("graf.txt",a,n);cout<<"n>"<<n<<endl; for(i=1;i<=n;i++) for(j=1;j<=n;j++) b[i][j]=a[i][j]; df(1); for(i=1;i<=n;i++) suma+=s[i]; if(suma!=n) cout<<"nu este conex"<<endl; else cout<<"este conex"<<endl; if(gasit) cout<<"are cel putin un ciclu"<<endl; else cout<<"nu are cicluri"; if (suma==n && !gasit) {cout<<"este arbore"<<endl; ok=1; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=b[i][j]; if (ok) {r=1; do {suma=0;for(i=1;i<=n;i++)s[i]=0; df1(r); for(i=1;i<=n;i++) suma+=s[i]; if (suma==n) {cout<<"radacina este "<<r<<endl<<"este arborescenta"<<endl; radacina=1; } else r++; }while (!radacina && r<=n); if(!radacina) cout<<"nu are radacina";

} getch(); } Arbore partial de cost minim #include<fstream.h> #include<iostream.h> float a[20][20],min,cost; int s[20],t[20],n,i,j,k,v; void citire(char nume[20],float a[20][20],int &n) { int i,j; float c; fstream f(nume,ios::in); f>>n; for(i=1;i<=n;i++) a[i][i]=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=100; while(f>>i>>j>>c) a[i][j]=a[j][i]=c; f.close(); } void main() { cost=0; citire("graf2",a,n); cout<<n<<endl; cout<<"nodul de pornire:";cin>>v; for(i=1;i<=n;i++) if(i==v) s[i]=0; else s[i]=v; for(k=1;k<=n-1;k++) { min=100; for(i=1;i<=n;i++) if(s[i]) if(a[s[i]][i]<min) {min=a[s[i]][i]; j=i; } t[j]=s[j]; cost+=a[s[j]][j];s[j]=0; for(i=1;i<=n;i++) if(s[i] && a[i][s[i]]>a[j][i]) s[i]=j; } cout<<"cost="<<cost<<endl; for(i=1;i<=n;i++) cout<<t[i]<<" "<<endl; } Arbori de cautare #include<iostream.h> #include<conio.h> struct nod {int nr;

nod *as,*ad; }; nod *v,*man; int k; void inserare(nod*& c,int k) { if(c) if(c->nr==k) cout<<"nr inserat"<<endl; else if(c->nr<k) inserare(c->ad,k); else inserare(c->as,k); else {c=new nod;c->as=c->ad=0; c->nr=k;} } void parcurg(nod* c) {if(c) {parcurg(c->as); cout<<c->nr<<endl; parcurg(c->ad); } } void main() {v=0; do{ cout<<"k=";cin>>k; inserare(v,k);} while(k!=0); parcurg(v); getch(); } Sa se parcurga un arbore binar

void sdv(nod *c) { if(c) { sdv(c->st); sdv(c->dr); cout<<c->nr; } } nod *arb() {int n; nod *c; cout<<"n=";cin>>n; if(n) { c=new nod; c->nr=n; c->st=arb(); c->dr=arb(); return c; } else return 0; } void main() { clrscr(); c=arb(); svd(c); cout<<endl; vsd(c); cout<<endl; sdv(c); cout<<endl; getch(); } PROBLEME REZOLVATE IN PSEUDOCOD

#include<iostream.h> #include<conio.h> struct nod {int nr; nod* st,*dr; }; nod *c; int nrst,nrdr; void svd(nod *c) { if(c) {svd(c->st); cout<<c->nr; svd(c->dr); } } void vsd(nod *c) { if(c) {cout<<c->nr; vsd(c->st); vsd(c->dr); }}

1) Factorialul n n!=1*2*3*...*n folosind structura conditionata anterior start citeste produs=1 i=1 cat {p=p*i

unui

numar

repetitiva

n timp i<=n

i=i+1} scrie sfarsit folosind structura conditionata posterior start citeste produs=1 i=1 repeta {p=p*i i=i+1} cat scrie sfarsit

produs

3)Sa se verifice daca un numar n diferit de 0 sau 1 este prim sau nu. Un numar este prim daca nu are divizori decat pe 1 si pe el insusi.Un numar d este divizor pentru n daca restul impartirii lui n la d este 0.Pentru a afla restul impartirii vom folosi operatorul mod(%) start citeste n prim=1 pentru d=2,n/2 executa daca n mod d =0 atunci prim=0 daca prim=1 atunci scrie "este prim" altfel scrie"nu este prim" sfarsit varianta optimizata start citeste n prim=1 d=2 cat timp d<=n/2 si prim=1 daca n mod d = 0 atunci prim=0 altfel d=d+1 daca prim=1 atunci scrie "este prim: altfel scrie"nu este prim" sfarsit 4)Sa se calculeze cmmdc pentru doua numere prin impartiri repetate (algoritmul lui Euclid): ultimul rest diferit de 0 reprezinta cmmdc start citeste a,b deimp=a imp=b cat timp imp != 0 executa { r=deimp mod imp deimp=imp imp=r } scrie "cmmdc este",deimp stop

repetitiva

timp

i<=n produs

folosind structura cunoscut de pasi start citeste produs=1 pentru p=p*i scrie sfarsit

repetitiva

cu

numar

n i=1,n executa produs

folosind recursivitatea fact(n) { daca n=0 atunci returneaza 1 altfel returneaza n*fact(n-1) } functia este apelata intr-un program principal start citeste n scrie fact(n) stop 2)Media aritmetica a n numere ma=(n1+n2+...nn)/n start citeste n ma=0 pentru i=1,n { citeste x ma=ma+x } ma=ma/n scrie ma stop

prin scaderi repetate (algoritmul lui Nicomachus): din numarul mai mare se scade numarul mai mic cat timp cele doua numere sunt diferite start citeste a,b cat timp a != b executa daca a>b atunci a=a-b altfel b=b-a scrie "cmmdc este",a stop 5)Sa se afiseze suma cifrelor unui numar n Ultima cifra este data de restul impartirii numarului la 10 (n mod 10).Catul impartirii il aflam folosid operatorul div start citeste n s=0 cat timp n>0 { c=n mod 10 s=s+c n=n div 10 } scrie s sfarsit 6)Sa se afle daca un numar este perfect Un numar este perfect daca este egal cu suma divizorilor sai, inclusiv 1, dar fara el insusi.Exemplu: 6=1+2+3 este numar perfect start citeste n s=0 pentru d=1,n/2 daca n mod d = 0 atunci s=s+d daca s=n atunci scrie "este numar perfect" sfarsit 7)Sa se afle cifra maxima a unui numar (cea mai mare cifra a unui numar) start citeste n max=-1 cat timp n>0 { c=n mod 10 daca max<c atunci max=c n=n div 10

} scrie max sfarsit

Das könnte Ihnen auch gefallen