probleme c++

64
Instalarea Borland C++ 3.1 pe Windows XP şi Windows Vista sau 7 Câţiva paşi pentru instalarea corectă a Borland C ++ pe sistemele de operare mai noi. Pentru început este nevoie de chitul de instalare pe care-l puteţi descărca de aici. 1. Extrageţi arhiva în partiţia cu Windows-ul (de obicei este vorba de partiţia C) 2. Din folderul de instalare (extras mai devreme) porniţi fişierul install.exe 3. La prima afişare apăsaţi tasta enter. instalare BC++ 4. La a doua afişare selectaţi partiţia chitului de instalare. În cazul de faţă este vorba de partiţia C 5. La a treia afişare lăsaţi denumirea implicita a directoriului de instalare 6. La a 4-a afişare mutaţi selecţia pe ultima opţiune a meniului: Start installation şi apăsaţi tasta enter. Programul se va instala în partiţia C folderul BorlandC. Programul va rula din fişierulBC.EXE . Aceste instrucţiuni de instalare au fost testate pe Windows XP şiWindows 7.

Upload: luminitaciocia7062

Post on 24-Jul-2015

4.018 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Probleme C++

Instalarea Borland C++ 3.1 pe Windows XP şi

Windows Vista sau 7

Câţiva paşi pentru instalarea corectă

a Borland C ++ pe sistemele de operare

mai noi. Pentru început este nevoie de

chitul de instalare pe care-l puteţi

descărca de aici.

1. Extrageţi arhiva în partiţia

cu Windows-ul (de obicei este vorba de

partiţia C)

2. Din folderul de instalare (extras mai

devreme) porniţi fişierul install.exe

3. La prima afişare apăsaţi tasta enter.

instalare BC++

4. La a doua afişare selectaţi partiţia

chitului de instalare. În cazul de faţă

este vorba de partiţia C

5. La a treia afişare lăsaţi denumirea

implicita a directoriului de instalare

6. La a 4-a afişare mutaţi selecţia pe

ultima opţiune a meniului: Start

installation şi apăsaţi tasta enter.

Programul se va instala în partiţia

C folderul BorlandC. Programul va rula

din fişierulBC.EXE . Aceste instrucţiuni

de instalare au fost testate pe Windows

XP şiWindows 7.

Page 2: Probleme C++

Programare în C++: Suma a n numere naturale

O problemă relativ simplă:

- se citeşte variabila n

- se citeşte câte un element folosind

“for” de la 1 la n şi se adaugă la

variabila s

- se afişează 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 număr

- se citeşte numărul nr

- se împarte la 10 folosind operatorul %

şi se obţine restul

- de fiecare dată, se adună restul la o

variabilă s

- numărul se iniţializează cu (valoarea

sa)/10

- se foloseşte setul de instrucţiuni

până când nr este egal cu zero

- se afişează s.

#include <iostream.h>

void main()

{ int nr, s=0;

while (nr!=0)

{s+=nr%10; nr=nr/10;}

cout<<s;

}

Programare în C++: Calcularea lui n factorial

(n!)

- se citeşte n de la tastatură

- se declara o variabilă p egală cu 1

- se declară un contor i cu valoarea

iniţială 1

- folosind structura “for”, se

incrementează i până ajunge la valoarea

lui n

- înainte de fiecare incrementare, se

înmulţeşte p cu valoarea respectivă a

lui i

- se citeşte 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 ecuaţiei de

gradul 2 în Z

- se consideră ecuaţia 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 decât zero,

programul va afişa: “Nu are soluţie în

Z”

- dacă delta este mai mare decât zero,

programul va calcula x1 şi x2

- se afişează x1 şi x2

#include <iostream.h>

#include <math.h>

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=(-

Page 3: Probleme C++

b-sqrt(delta))/(2*a); cout<<x1;

cout<<x2;}

}

Programare în C++ : Câte cifre distincte are

un număr de 3 cifre? Varianta cu „if”

Problema reală sună cam așa: Se citește

un număr de trei cifre de la tastatură.

Scrieți un program care să determine și

să afișeze numărul de cifre distincte.

Rezolvarea:

se citește numărul

se desparte în cifre care se memorează

în trei variabile diferite

se compară variabilele

în funcție de rezultatul comparațiilor,

programul va afișa câte cifre distincte

are numărul

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++ : Câte cifre distincte are

un număr de 3 cifre? Varianta fără „if”

Față de problema inițială, voi aduce o

completare în enunț și anume: Se citește

un număr de trei cifre nenule. Scrieți

un program care să determine și să

afișeze numărul de cifre distincte.

Un amic mi-a atras atenția că dacă nu

sunt cifrele nenule va trebui să

folosesc funcții precum „ceil” și „abs”.

Rezolvarea mea, deci:

se citește numărul

se desparte numărul in cifre si fiecare

cifră se memorează în câte o variabilă

se fac rapoarte între toate cifrele și

fiecare rezultat se memorează în câte o

variabilă

acolo unde sunt valori identice ale

cifrelor, rapoartele vor da 1, altfel

vor da 0 și un număr mai mare decât 1

pentru asta vom elimina numerele

distincte de 1 prin efectuarea unei sume

de îmnulțiri

suma se memorează într-o variabilă

se afișeaza rezultatul diferenței dintre

numărul 3 (numărul 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 “<<3-

u<<”cifre distincte “;

getch();

}

Programare în C++: Toate numerele palindrome

de 8 cifre

Problema sună cam aşa: Să se scrie un

algoritm în C++ care să afişeze în

ordine crescătoare toate numerele

palindrome de 8 cifre.

Rezolvarea este destul de simplă. Vom

lucra cu o singură variabilă de tip long

Page 4: Probleme C++

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ă

când programul va întâlni un număr în

care cifra 1=cifra 8, cifra 2=cifra 7,

cifra 3=cifra 6 şi cifra 4= cifra 5

înseamnă că acela este un număr

palindrom (numărul este egal cu

oglinditul său) şi îl va afişa. Apoi va

face incrementare şi tot aşa până 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;

}

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);

}

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;

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

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);

}

Sa se scrie o functie recursiva pentru a

calcula suma cifrelor unui numar

Page 5: Probleme C++

#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();

}

Page 6: Probleme C++

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 încât 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

utilizând 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, mutând-o la

sfârsitul numarului continut de

parametrul b;

· returneaza prin intermediul

Page 7: Probleme C++

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 câte 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

încât 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, câte o linie a matricei pe

câte 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++)

Page 8: Probleme C++

{

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

utilizând 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

determincâte numere naturale de câte 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 câte o linie, în ordinea

crescatoare a lungimii sufixelor,

aliniate la stânga. 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

încât elementele de pe diagonala

secundara si cea principala sa

fie egale cu 1, elementele situate între

Page 9: Probleme C++

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, câte o linie a matricei

pe câte 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 1 1 1 1

2 1 1 1 2

2 2 1 2 2

2 1 1 1 2

1 1 1 1 1

#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.Scrieţi programul C sau C++ care

citeşte din fişierul BAC.TXT un şir s de

cel mult un milion de numere naturale,

fiecare num r având 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 încât şirul

rezultat să înceapă şi să se termine cu

câte un număr par. Fişierul BAC.TXT

cortine cel puţin 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.

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 afişa pe ecran numărul: 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.1Scrieţi programul C sau C++ care

citeşte de la tastatura un număr natural

impar n (2<n<23) şi construieşte în

memorie o matrice pătratică cu n linii

şi n coloane formată numai din valori 1,

2 şi 3 astfel încât 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, câte o linie a

matricei pe câte o linie a ecranului, cu

spa ii între elementele fiec rei linii

(ca în exemplu).

De exemplu, pentru n=5 se construieşte

în memorie şi se afişează 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[23][23],i,j,n;

void matrice(int n)

Page 10: Probleme C++

{

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.Scrieţi programul C sau C++ care

citeşte de la tastatura un număr natural

n (2<n<30) şi construieşte în memorie o

matrice patratica cu n linii si n

coloane format numai din valori ce

apartin multimii {1,2,3,...,n} astfel

încât elementele din matrice situate pe

diagonala secundara sa fie egale cu n,

elementele situate pe celelalte două

"semidiagonale" paralele cu diagonala

secundara şi alăturate diagonalei

secundare să fie egale cu n-1,

elementele situate pe următoarele 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, câte o

linie a matricei pe câte 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

apariţii a cifrei k în numărul n şi

returnează numărul obţinut 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)Scrieţi î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 afişa pe ecran numărul

de cifre distincte ce intra atât în

scrierea lui a cât 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

afişarea pe ecran a valorii 5 deoarece

sunt cinci cifre distincte (1,2,3,4 si

8) ce apar atât în scrierea lui a cât 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;

Page 11: Probleme C++

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.Scrieţi programul C sau C++ care

citeşte 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.Scrieţi un program C/C++ care

citeşte de la tastatură două numere

naturale nenule n şi m(2≤m≤10,2≤n≤10) şi

care construieşte în memorie şi apoi

afişează 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 (1≤i≤n, 1≤j≤m).Matricea

se va afişa pe ecran, câte o linie a

matricei pe câte o linie a ecranului,

elementele fiecărei linii fiind separate

prin câte un spaţiu.

Exemplu: pentru n=4 şi m=5 se va afişa

matricea alăturată.

1 1 1 1 1

1 2 2 2 2

1 2 3 3 3

1 2 3 4 4

Page 12: Probleme C++

#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.Fişierul text bac.txt conţine, pe

o singură linie, cel mult 1000 de numere

naturale nenule cu cel mult4 cifre

fiecare, numerele fiind separate prin

câte un spaţiu. Scrieţi un

program C/C++ care citeşte de la

tastatură un număr natural

nenul n (n≤999) şi numerele din

fişierul bac.txt şi care afişează pe

ecran, separate prin câte un spaţiu,

toate numerele din fişier care sunt

divizibile cu n. Dacă fişierul nu

conţine niciun astfel de număr, atunci

se va afişa pe ecran mesajul NU EXISTA.

Exemplu: dacă fişierul bac.txt conţine

numerele: 3 100 40 70 25 5 80 6

3798,pentru n=10 atunci pe ecran se va

afişa: 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, primeşte prin intermediul

parametrului:– v un tablou

unidimensional cu cel mult 100 de

componente ce memorează numere întregi

cu cel mult 4 cifre;– n un număr natural

nenul mai mic sau egal cu 100 ce

reprezintă numărul efectiv de componente

ale tabloului primit prin intermediul

parametrului v;– a un număr întreg cu

cel

mult 4 cifre.Subprogramul subreturnează

numărul componentelor tabloului primit

prin intermediul parametrului v ale

căror 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) Scrieţi definiţia completă a

subprogramului sub.b) Scrieţi un

program C/C++ care să citească de la

tastatură un număr natural

nenul n (n≤100) şi n numere întregi,

fiecare având cel mult 4 cifre, şi care,

folosind apeluri utile ale

subprogramului sub, să afişeze pe ecran

mesajul DA dacă oricare două dintre

cele n numere citite sunt distincte două

câte 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 afişa 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";

}

Page 13: Probleme C++

Varianta 002

II.5.Scrieţi un program C/C++ care

citeşte de la tastatură un cuvânt format

din cel mult 20 de caractere, doar

litere ale alfabetului englez. Programul

determină transformarea cuvântului citit

prin înlocuirea fiecărei litere mici a

cuvântului cu litera mare

corespunzătoare, restul literelor

nemodificându-se, ca în exemplu.

Programul afişează pe ecran cuvântul

obţinut.

Exemplu: pentru cuvântul: bACAlaUrEaT se

va afişa 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.Fişierul text NR.TXT conţine pe o

singură linie, separate prin câte un

singur spaţiu, cel mult 100 de

numere întregi, fiecare număr având cel

mult 4 cifre. Scrieţi un

program C/C++ care citeşte numerele din

fişierul NR.TXT şi afişează pe ecran,

separate prin câte un spaţiu, în ordine

crescătoare, toate numerelenaturale

nenule din fişier. Dacă nu există astfel

de numere se va afişa pe ecran

mesajul NU EXISTA.

Exemplu: dacă fişierul NR.TXT conţine

numerele: -3 -10 0 7 -5 7 51 -800 6 798,

atunci pe ecran se va afişa: 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 număr n se

numeşte extraprim dacă atât el, cât şi

orice număr obţinut prin permutarea

cifrelor lui n, sunt numere prime. De

exemplu, numărul 113 este un

număr extraprim deoarece 113, 311,

131sunt numere prime.

a) Scrieţi definiţia completă a unui

subprogram f, cu un parametru,

subprogram care:- primeşte prin

intermediul parametrului a un număr

natural cu cel mult 2 cifre (a>1)-

returnează suma exponenţilor 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) Scrieţi un program C/C++ care citeşte

de la tastatură un număr

natural n, 2≤n≤99, şi care determină şi

afişează pe ecran, folosind apeluri

utile ale subprogramului f,

mesajul DA dacă n este un

numărextraprim, iar altfel afişează

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

Page 14: Probleme C++

(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.Scrieţi un program C/C++ care

citeşte de la tastatură un număr

natural n (2≤n≤24) şi construieşte în

memorie o matrice cu n linii

şi n coloane ale cărei elemente vor

primi valori după cum urmează:-

elementele aflate pe diagonala

principală a matricei vor primi

valoarea 0- elementele de pe prima

coloană, cu excepţia celui aflat pe

diagonala principală vor primi

valoarea n- elementele de pe a doua

coloană, cu excepţia celui aflat pe

diagonala principală vor primi

valoarea n-1...-lementele de pe ultima

coloană, cu excepţia celui aflat pe

diagonala principală vor primi

valoarea 1.Programul va afişa matricea

astfel construită pe ecran, câte o linie

a matricei pe câte o linie a ecranului,

cu câte un spaţiu între elementele

fiecărei linii (ca în exemplu).

Exemplu: pentru n=4 se va afişa matricea

alăturată.

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.Fişierului text NR.TXT conţine pe

o singură linie, separate prin câte un

singur spaţiu, cel mult 100 de numere

naturale, fiecare număr având cel

mult 4 cifre. Să se scrie un

program C/C++ care citeşte toate

numerele din fişier şi scrie pe ecran,

pe o singură linie, separate prin câte

un spaţiu, în ordine crescătoare, toate

numerele din fişier care au cel

puţin 3 cifre.Dacă fişierul nu conţine

astfel de numere se va afişa 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]);

}

Page 15: Probleme C++

III.4.Subprogramul cif, cu doi

parametri, primeşte prin intermediul

parametrului a un număr natural cu cel

mult 8 cifre şi prin intermediul

parametrului b o cifră; subprogramul

returnează numărul de apariţii ale

cifrei b în scrierea

numărului a.Exemplu:

pentru a=125854 şi b=5, subprogramul va

returna valoarea 2.a)Scrieţi definiţia

completă a

subprogramului cif. b) Scrieţi un

program C/C++ care citeşte de la

tastatură un număr natural n cu cel

mult 8 cifre, dintre care cel puţin una

impară, şi care determină şi afişează pe

ecran, folosind apeluri utile ale

subprogramului cif, cel mai mare număr

natural care poate fi obţinut utilizând

toate cifrele impare ale

numărului n.Exemplu:

dacă n=2152331 atunci se va afişa pe

ecran numărul 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.Scrieţi un program C/C++ care

citeşte de la tastatură un număr

natural n (2≤n≤24) şi construieşte în

memorie o matrice cu n linii

şi n coloane ale cărei elemente vor

primi valori după cum urmează:-

elementele aflate pe diagonala secundară

a matricei vor primi valoarea 0-

elementele de pe prima linie, cu

excepţia celui aflat pe diagonala

secundară vor primi valoarea n-

elementele de pe a doua linie, cu

excepţia celui aflat pe diagonala

secundară vor primi valoarea n-1...-

elementele de pe ultima linie, cu

excepţia celui aflat pe diagonala

secundară vor primi valoarea 1.Programul

va afişa matricea astfel construită pe

ecran, câte o linie a matricei pe câte o

linie a ecranului, cu câte un spaţiu

între elementele fiecărei linii (ca în

exemplu).Exemplu: pentru n=4 se va afişa

matricea alăturată.

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 căruia primeşte un

număr natural de cel puţin 3 cifre şi

cel mult 9 cifre, cu toate cifrele

nenule. Subprogramul furnizează tot prin

intermediul parametrului k, valoarea

obţinută prin eliminarea primei cifre

a numărului transmis la apel.

Exemplu: dacă subprogramul primeşte prin

intermediul parametrului k valoarea

12438, atunci în urma apelului

subprogramului Nr, k va primi valoarea

2438.

#include<iostream.h>

void nr(int &k)

{

Page 16: Probleme C++

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

Scrieţi definiţia completă a

subprogramului numar, cu trei parametri,

care primeşte prin intermediul

parametrului n un număr natural format

din cel mult 9 cifre, iar prin

intermediul parametrilor c1 şi c2 câte o

cifră nenulă. Subprogramul caută fiecare

apariţie a cifrei c1 în n, şi dacă

aceasta apare, o înlocuieşte cu c2.

Subprogramul furnizează tot prin n

numărul astfel obţinut. Dacă cifra c1 nu

apare în n, atunci valoarea lui n rămâne

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.Scrieţi un program C/C++ care citeşte

de la tastatura un număr natural n

(2<n<21) si apoi n linii cu cate n

Page 17: Probleme C++

numere întregi de cel mult 7 cifre ce

formează un tablou bidimensional a. Sa

se afişeze pe ecran diferenţa 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.Scrieţi programul C/C++ care citeşte

de la tastatura un număr

natural n (n<100) si un sir cu n numere

întregi din intervalul [100 ;999] ;

programul construieşte un sir de numere

rezultat prin înlocuirea fiecărui număr

din şirul citit cu numărul obţinut prin

interschimbarea cifrei unitatilor cu

cifra sutelor. Numerele din noul sir se

vor afişa pe ecran separate printr-un

singur spaţiu. De exemplu , pentru n=3

si şirul 123 , 904 , 500 , se afişează

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

relaţia a<=b daca : a1<=b1 , a2<=b2 , …

, an<=bn. Scrieţi program in limbajul

C/C++ care citeşte doua tablouri

unidimensionale a si b cu acelaşi număr

de elemente de tip întreg si verifica

daca a<=b saub<=a afişând 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.Scrieţi un program in limbajul C/C++

care afişează toate numerele naturale

formate din cifre identice , mai mari

decât 10 si mai mici decât o valoare

data n, n<=2.000.000. De exemplu pentru

n=195 , se afişează : 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.Scrieţi un program C/C++ care citeşte

de la tastatura trei numere naturale x,

y si k, (1<x<y<2000000, k<1000) si

afişează pe ecran k numere prime din

intervalul [x, y]. Daca nu

exista k numere prime în

intervalul [x,y] se vor afişa toate

numerele prime găsite iar pe linia

următoare se va afişa mesajul “s-au

găsit mai puţine numere prime: ” urmat

de numărul acestora. De exemplu, pentru

x=3, y=12 si k=5 se vor afişa pe ecran:

3 5 7 11

s-au găsit mai puţine numere prime:4

Page 18: Probleme C++

#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.Scrieţi un program C/C++ care citeşte

din fişierul 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 afişează pe ecran doar pe

acelea care au proprietatea de a fi

palindrom. Daca nu se găsesc numere

palindrom, se va afişa pe ecran

valoarea –1. Un număr are proprietatea

de a fi palindrom daca citit de la

dreapta la stânga sau de la stânga la

dreapta are aceeaşi valoare. De exemplu

1221 este palindrom, in timp ce 1210 nu

este palindrom.

Exemplu : daca din fişierul BAC.TXT se

citesc numerele : 7341 , 8228 , 660 , 2

, 80 , 131 , atunci pe ecran se vor

afişa : 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 număr 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 . Scrieţi un

program C/C++ care determina numărul de

cifre nule aflate pe ultimele poziţii

consecutive ale valorii obţinute in urma

evaluării lui n!, n fiind un număr

natural de cel mult 4 cifre. De exemplu

daca n=10, n!=3628800 rezultatul va fi 2

deoarece 3628800 are două zerouri la

sfârşit.

#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.Scrieţi un program C/C++ care citeşte

din fişierul 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 fişierulDATE.OUT numerele, in

ordinea inversa fata de cea in care au

fost citite, pe o singura linie separate

prin spatii. De exemplu daca din

fişierul DATE.IN se citesc numerele 93

207 15 1982 3762, atunci conţinutul

fişierului 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.Scrieţi un program C/C++ care citeşte

de pe prima linie a fişierului

text BAC.TXT trei numere naturalea, b,

c formate din cel mult patru cifre

fiecare, separate prin cate un spaţiu si

afişează pe ecran cel mai mare divizor

comun al acestora. De exemplu, daca din

fişier se citesc numerele : 9 27 15,

atunci se afişează 3.

Page 19: Probleme C++

#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.Scrieţi un program care verifica daca

un număr natural k(1<k<100000) citit de

la tastatura este prim. Programul va

afişa 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 fişierul

text date.in care conţine exact 19

numere distincte formate fiecare din

maxim 2 cifre. Sa se afişeze in fişierul

text date.out numărul care lipseşte din

fişierul 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 citeşte de la tastatura un număr

natural nenul n (n<1000). Scrieţi un

program C/C++ care construieşte fişierul

text bac.txt care sa contina, pe prima

linie, toţi divizorii lui n in ordine

strict descrescătoare. Divizorii vor fi

separaţi prin spaţiu. De exemplu,

daca n=10 , atunci fişierul bac.txt va

conţine : 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 citeşte de la tastatura un număr

natural nenul n care are cel mult 9

cifre. Sa se afişeze in fişierul

Date.out numărul k, natural, astfel

încât produsul 1*2*…*(k-1)*k sa aibă o

valoare cat mai apropiata de numărul n.

De exemplu, daca se citeşte numărul n=25

fişierul Date.out are următorul

conţinut: 4. iar daca se citeşte numărul

n=119 fişierul Date.out are următorul

conţinut: 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;

Page 20: Probleme C++

g.close();

}

27.Scrieţi un program care citeşte un

număr natural n>1 cu maximum 9 cifre, si

afişează valoarea celui mai mic divizor

prim a lui n, precum si puterea la care

acest divizor apare in descompunerea in

factori primi a numărului 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ă afişeze pe ecran

produsul cifrelor pare şi suma cifrelor

impare a unui număr 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

având 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--;

Page 21: Probleme C++

y--;

}

if(ok)

cout<<"Nu sunt rime";

else

cout<<"Sunt rime";

}

30.Scrieţi un program care construieşte

o matrice pătrată de ordin n formată din

valorile 1 si 2 astfel încât elementele

de pe diagonala principala si secundară

sa fie egale cu 1 iar restul elementelor

cu 2. Valoarea lui n se citeşte de la

tastatură: n număr natural (2<23), iar

matricea se va afişa pe ecran, cate o

linie a matricei pe fiecare rând pe

ecran cu spatii intre elementele

fiecărei linii.

Exemplu: Fie n=5. Se va afişa:

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.Scrieţi un program care citeşte de la

tastatură un sir de cel mult 50 de

caractere si construieşte fişierul

atestat.txt ce conţine şirul si

prefixele acestuia de lungime cel puţin

1, fiecare pe cate o linie, in ordinea

descrescătoare a lungimii prefixelor.

Exemplu: Daca se citeşte şirul „proba‟

atunci atestat.txt va conţine:

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;

Page 22: Probleme C++

n--;

}

f.close();

}

32.Să se scrie un program care să numere

cuvintele dintr-un text citit din

fişierul ”cuvinte.txt”. Textul conţine

cuvintele separate numai printr-un

spaţiu, fără semne de punctuaţie,

singurul semn de punctuaţie este „.‟ de

la sfârşitul textului. Numărul de

cuvinte se va afişa pe ecran.

Exemplu: Fişierul ”cuvinte.txt” conţine

textul: Ana are mere. se afişează: 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.Scrieţi programul care citeşte de la

tastatură o valoare naturală n

(2≤n≤100), construieşte in memorie si

apoi afişează pe ecran o matrice a cu n

linii si n coloane, numerotate de la 1

la n, car conţine numerele naturale, in

ordine crescătoare, de la 1 la n2,

dispuse pe coloane, in ordine

crescătoare. Astfel coloana 1 va conţine

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 aşa mai departe, ca

in exemplu. Matricea se va afişa pe

ecran, cate o linie a matricei pe cate o

linie a ecranului, elementele fiecărei

linii fiind separate intre ele prin cate

un spaţiu.

Exemplu: pentru n = 4 se va afişa

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 număr natural. Să se afişeze

cel mai apropiat număr prim fată de n.

Programul va conţine cel puţin un

subprogram.

Exemplu: n=24 se va afişa 23, pentru

n=26 se va afişa 29

#include<iostream.h>

Page 23: Probleme C++

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 mulţi divizori. Se va folosi un

subprogram pentru citirea vectorului si

unul pentru calculul numărului de

divizori ai unui număr.

#include<iostream.h>

int n, a[100];

void citire ()

{ int i;

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

cin>>a[i];

}

int div(int x)

{ int i, nr=0;

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

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

return nr;

}

void main()

{ int i,max=0;

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 poziţie apare. În caz contrar se va

afişa 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;

}

Page 24: Probleme C++

if(p==0) cout<<"nu";

else

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 citeşte un vector cu n componente

numere întregi. Să se afişeze doar

numerele impare aflate pe poziţii 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.

Page 25: Probleme C++

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] , n;

cin >> n;

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

cin >> x[i];

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

{

Permutare ( x , n );

Afisare ( x , 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;

}

Page 26: Probleme C++

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.

Page 27: Probleme C++

#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

ușoare), care se rezolvă, iar soluția

pentru problema inițială se obține

combinând soluțiile subproblemelor. De

multe ori, subproblemele sunt de același

tip și pentru fiecare din ele se poate

aplica aceeași tactică a descompunerii

în (alte) subprobleme, până când (î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ă numărul celor

rezolvabile prin "divide et impera" este

relativ mic, tocmai datorită cerinței 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 întâmplă la un nivel, se întâmplă la

orice nivel" (având grijă să asigurăm

condițiile de terminare). Așadar, un

algoritm prin divide et impera se

elaborează astfel: la un anumit nivel

avem două posibilități:

1. s-a ajuns la o problemă care admite o rezolvare imediată

(condiția de terminare), caz în

care se rezolvă și se revine din

apel;

2. nu s-a ajuns în situația 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 funcției, 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;

Page 28: Probleme C++

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

#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;

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 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;

Page 29: Probleme C++

}

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.

Page 30: Probleme C++

#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

#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++)

{

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ă. Într-

una din camerele labirintului se găseşte

un om. Se cere să se afle toate

soluţiile ca acel om să iasă din

labirint, fără să treacă de două ori

prin aceeaşi 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];

Page 31: Probleme C++

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 colţul stânga sus al

acesteia, se cere să se afişeze toate

posibilităţile de mutare a calului

astfel încât să treacă o singură dată

prin fiecare pătrat 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()

Page 32: Probleme C++

{

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

PERMUTĂRI. Se citeşte un număr natural

n. Să se genereze permutările mulţimi

{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();

}

Page 33: Probleme C++

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++)

Page 34: Probleme C++

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;}

Page 35: Probleme C++

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++)

{

Page 36: Probleme C++

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)

Page 37: Probleme C++

{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

#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];

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[p-

1]]%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()

{

Page 38: Probleme C++

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)

{

Page 39: Probleme C++

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()

{

Page 40: Probleme C++

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)

#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;

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

if(a[k][nod]==1&&prec[k]==0)

dfprec(k);

}

void main()

{int y,j;

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]<<" ";

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++)

if(prec[i]!=0)

cout<<i<<" ";

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)

Page 41: Probleme C++

cout<<i<<" ";}

Algoritmul lui Lee

Fiind dat un graf orientat, se cere

determinarea lungimea lanturilor

(minime) de la un varf la toate

celelalte

#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();

}

}

void main()

{int x,y,j;

fstream f;

f.open("lee.in",ios::in);

if(f)

cout<<"ok!"<<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

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++)

Page 42: Probleme C++

cout<<viz[i]<<" ";

cout<<endl<<"vectorul t "<<endl;

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

cout<<t[i]<<" ";

cout<<endl<<"drumul este "<<endl;

drum(y);

}

Graf eulerian

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];

y=st[k-1];

if(a[x][y]==0)

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;

if(k==m)

if(a[st[m]][st[1]]==0)

return 0;

return 1;}

void tipar()

{for(int i=1;i<=m;i++)

cout<<st[i]<<" ";

cout<<st[1];

cout<<endl;

}

void back()

{ k=1;

while(k>0)

{if(st[k]<n)

{st[k]++;

if(valid())

if(k==m)

tipar();

else{k++;

st[k]=0;

}

}

else

k--;}

}

Page 43: Probleme C++

void main()

{ int x,y;

fstream f;

f.open("graf.txt",ios::in);

if(f)

cout<<"ok";

else

cout<<"eroare";

f>>n>>m;

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;

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";

else

cout<<"toate nodurile au

gradele pare deci graful e eulerian";

}

back();

}

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);

}

Page 44: Probleme C++

Descompunerea in componente tare conexe

a unui graf orientat, dat prin matricea

de adiacenta

Matricea de adiacenta se citeste dintr-

un fisier text

#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>

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>

#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()

{

Page 45: Probleme C++

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)

#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);

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>

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++;

}

Page 46: Probleme C++

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";

Page 47: Probleme C++

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;

}

}

Scrieţi un program C/C++ care citeşte de

la tastatură un număr

natural n (1≤n≤100)şi apoi elementele

unui tablou bidimensional cu n linii

şi n coloane, care memorează numere

naturale cu cel mult 9 cifre fiecare;

programul afişează pe ecran acele valori

din tablou care sunt strict mai mici

decât toate elementele cu care se

învecinează direct (aflate pe aceeaşi

linie dar pe o coloană alăturată sau pe

aceeaşi coloană dar pe o linie

Page 48: Probleme C++

alăturată).Numerele afişate vor fi

separate prin câte un spaţiu.

#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;

Page 49: Probleme C++

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<<"]=";

Page 50: Probleme C++

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 2 3 4

1 2 3 4

1 2 3 4

1 2 3 4

Page 51: Probleme C++

#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 3 2 1

1 2 3 4

4 3 2 1

1 2 3 4

#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()

{

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 citeste un numar natural nenul n. Sa

se se calculeze urmatoarele sume:

a) s = 1+2+..+n

b) s = 1^2 + 2^2 + ... + n^2

c) s = 1^3 + 2^3 + ... + n^3

d) s = 1*2 + 2*3 + .. + n*(n+1)

#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;

}

Page 52: Probleme C++

Rezolvarea unui sistem de doua ecuatii

liniare cu doua necunoscute in C++

Să se rezolve un sistem de două ecuaţii

liniare cu două necunoscute:

a1*x+b1*y=c1

a2*x+b2*y=c2

Soluţiile sistemului de ecuaţii 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 număr natural n. Să se

verifice dacă n este pătrat perfect.

#include<iostream>

#include<cmath>

void main(){

int n; // n - numãrul citit de la

tastaturã care se verificã dacã este

pãtrat 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;

Page 53: Probleme C++

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)*(y1-

y2) );

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;

Page 54: Probleme C++

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;

}

Page 55: Probleme C++

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 main()

{

int i,k,n,aux,v[20];

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 && 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])

Page 56: Probleme C++

{

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

#include <iostream.h>

#include <string.h>

void main()

{char a[100],*p,c;

cin.get(a,100);

cin>>c;

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>

Page 57: Probleme 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

#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";

}

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 n cuvinte.Sa se sorteze

alfabetic

#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.

Page 58: Probleme C++

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

facut”calculatorul 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 fișier sursă conține declarații

de variabile și definiții de funcții.

Funcțiile, la rândul lor, conțin alte

declarații de variabile și comenzi.

Declarațiile de variabile fie definesc

noi tipuri sau atribuind un tip de date

predefinite, prin scrierea tipului de

dată și urmat de numele variabilei.

Secțiuni de cod sunt incluse între

acolade { și }.

Comenzile execută acțiuni cum ar fi cele

de modificare ale valorii unei variabile

sau afișarea unui text la consolă.

Structurile de control sunt variabile

pentru execuții condiționale sau

iterații, realizate cu ajutorul

cuvintelor rezervate if, else, switch,

do, while și for. Cu ajutorul unei

varietăți de operatori implementați în

C, se pot realiza operații aritmetice,

logice, comparative, pe biți, indexarea

tablourilor și atribuiri. Comenzile pot

de asemenea apela funcții.

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

Page 59: Probleme C++

#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;

Page 60: Probleme C++

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

#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;

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)

Page 61: Probleme C++

{

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;

Page 62: Probleme C++

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

#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);

}}

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

1) Factorialul unui numar

n n!=1*2*3*...*n

folosind structura repetitiva

conditionata anterior

start

citeste n

produs=1

i=1

cat timp i<=n

{p=p*i

Page 63: Probleme C++

i=i+1}

scrie produs

sfarsit

folosind structura repetitiva

conditionata posterior

start

citeste n

produs=1

i=1

repeta

{p=p*i

i=i+1}

cat timp i<=n

scrie produs

sfarsit

folosind structura repetitiva cu numar

cunoscut de pasi

start

citeste n

produs=1

pentru i=1,n executa

p=p*i

scrie produs

sfarsit

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

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

Page 64: Probleme C++

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