probleme c++
TRANSCRIPT
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.
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=(-
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
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
#include <iostream.h>
int n;
int s(int n)
{
if(n==0) return 0;
else return n%10 + s(n/10);
}
void main()
{
cout<<"n=";cin>>n;
cout<<"suma cifrelor: "<<s(n);
}
cautare in vector
//suma elementelor pare
#include<iostream.h>
#include<conio.h>
typedef int vector[20];
int n;vector v;
int e(int n,int x)
{
if (n==0) return 0;
else
if (v[n]==x) return 1;
else return e(n-1,x);
}
void main()
{
int x,i;
cout<<"n=";cin>>n;
cout<<"x=";cin>>x;
for(i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];}
if (e(n,x)) cout<<"este"<<endl;
else cout<<"nu este";
getch();
}
suma elementelor pare
//suma elementelor pare
#include<iostream.h>
#include<conio.h>
typedef int vector[20];
int n;vector v;
int suma(int n)
{ if (n==0) return 0;
else return suma(n-1) +
(v[n]%2==0)*v[n];
}
void main()
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];}
cout<<suma(n)<<endl;
getch();
}
Maximul unui vector
#include<iostream.h>
#include<conio.h>
typedef int vector[20];
int n;vector v;
int maxim(int n)
{int max;
if (n==1) return v[1];
else
{
max=maxim(n-1);
if (max<v[n]) return v[n];
else return max;
}
}
void main()
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];}
cout<<maxim(n)<<endl;
getch();
}
suma n/((n+1)(n+2)
//1/(2*3)+2/(3*4)+...(n/((n+1)(n+2))
#include<iostream.h>
#include<conio.h>
float e(int k)
{
return (float)k/((k+1)*(k+2));
}
float s(int k)
{
if
(k==1) return (float)1/(2*3);
else return e(k)+s(k-1);
}
suma 1/n
//1+1/2+...1/n
#include<iostream.h>
#include<conio.h>
float e(int k)
{
if (k==1) return 1;
else return (float)1/k+e(k-1);
}
void main()
{
int n;
cout<<"n=";cin>>n;
cout<<e(n)<<endl;
getch();
}
suma n*(n+1)
//1*2+2*3+..+n*(n+1)
#include<iostream.h>
#include<conio.h>
int p(int k)
{
return k*(k+1);
}
int s(int k)
{
if (k==0) return 0;
else return p(k)+s(k-1);
}
void main()
{
int n;
cout<<"n=";cin>>n;
cout<<s(n)<<endl;
getch();
}
combinari
//combinari
#include<iostream.h>
#include<conio.h>
long comb(int n,int k)
{
if (k==0) return 1;
else if (k>n) return 0;
else return (comb(n-1,k)+comb(n-1,k-1));
}
void main()
{
int k,n;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
cout<<//"combinari de"<<n<<"elemente
luate cate"<<k<<":"<<
comb(n,k)<<endl;
getch();
}
suma a n componente
//sa se calculeze suma componentelor
unui vector cu n elemente
#include<iostream.h>
#include<conio.h>
typedef int vector[20];
int n;vector v;
int suma(vector v,int n)
{
if (n==0) return 0;
else return (v[n]+suma(v,n-1));
}
void main()
{
int i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];}
cout<<"suma este"<<suma(v,n)<<endl;
getch();
}
PROBLEME REZOLVATE BACALAUREAT
INFORMATICA C++
-)Scrieti programul C sau C++ care
construiete în memorie o matrice p
cu n linii si n coloane formata numai
din valori 1 si2 astfel î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
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++)
{
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
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)
{
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;
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
#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";
}
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
(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]);
}
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)
{
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
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
#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.
#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;
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--;
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;
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>
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;
}
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.
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;
}
Se citesc doi vectori cu componente
numere naturale.Fiecare vector are
elementele sortate crescator. Se cere sa
se construiasca un al treilea vector
care contine elementele celor doua in
ordine crescatoare.
#include<iostream.h>
void main(void)
{
int i,n,j,m,k;
float x[50],y[50],z[100];
cout<<"Dati numarul de elemente ale
vectorului x ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"x[“<<i<<”]= ";
cin>>x[i];
}
cout<<"Dati numarul de elemente
alevectoruluii y ";cin>>m;
for(j=1;j<=m;j++)
{
cout<<"y[“<<j<<”]= ";
cin>>y[j];
}
i=1;j=1;k=0;
while( (i<=n) && (j<=m) )
if(x[i]<y[j]){k++;z[k]=x[i];i++;}
else {k++;z[k]=y[j];j++;}
if(i<=n) for(j=i;j<=n;j++)
{k++;z[k]=x[j];}
else for(i=j;i<=m;i++) {k++;z[k]=y[i];}
cout<<endl<<"Vectorul z cu elementele
interclasate este ";
for(i=1;i<=k;i++) cout<<z[i]<<” ”;
}
Se da un vector x cu n numere reale si
se cere sa se modifice astfel incat sa
se intercaleze intre oricare doua
elemente consecutive, media lor
aritmetica.
#include<iostream.h>
void main( )
{
int i,n,j;
float x[50],y[50];
cout<<"Dati numarul de elemente ale
tabloului ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"x[“<<i<<”]= ";
cin>>x[i];
}
i=1;j=1;
while(i<=n)
{
y[j]=x[i];
y[j+1]=(x[i]+x[i+1])/2;
i=i+1;
j=j+2;
}
cout<<"Elementele sunt: "<<endl;
for(i=1;i<=j-2;i++) cout<<y[i]<<” ”;
}
Se da un vector cu n componente numere
intregi si un numar intreg a. Sa se
numere cate elemente sunt mai mari decat
a si sa se construiasca un vector cu
aceste elemente.
#include<iostream.h>
void main(void)
{
int i,n,j,a;
float x[50],y[50];
cout<<"Dati numarul de elemente ale
tabloului ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"x[“<<i<<”]= ";
cin>>x[i];
}
cout<<"Dati numarul a = ";cin>>a;
j=0;
for(i=1;i<=n;i++)
if (a<=x[i]) { j++;y[j]=x[i]; }
cout<<"Sunt “<<j<<” numere mai mari
decat "<<a<<endl;
cout<<"Elementele sunt: "<<endl;
for(i=1;i<=j;i++) cout<<y[i]<<” ”;
}
Fie un vector x cu n elemente numere
reale si numerele intregi a si b. Sa se
calculeze media aritmetica a elementelor
din vector cuprinse intre valorile a si
b.
#include<iostream.h>
void main(void)
{
int a,b,i,n,suma=0;
float x[50],media;
cout<<"Dati numarul de elemente ale
vectorului ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"x[“<<i<<”]= ";
cin>>x[i];
}
cout<<"Dati numarul a = ";cin>>a;
cout<<"Dati numarul b = ";cin>>b;
for(i=1;i<=n;i++)
if( (a<=x[i]) && (x[i]<=b) ) suma+=x[i];
media=suma/n;
cout<<"Media aritmetica a elementelor
din tablou, aflate intre “<<a<<” si
“<<b<<”
este “<<media;
}
Se citeste un vector cu n componente
numere intregi.Sa se verifice daca
elementele sunt distincte.
#include<iostream.h>
int v[10],n,i,j,gasit;
void main()
{
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
gasit=0;
for(i=0;i<n && !gasit;i++)
for(j=i+1;j<n && !gasit;j++)
if(v[i]==v[j]) gasit=1;
if(gasit) cout<<"elementele nu sunt
distincte";
else cout<<"elementele sunt distincte";
}
Se citeste un vector cu componente
numere intregi.Se cere sa se afiseze cel
mai mare numar intreg gasit.
#include<iostream.h>
int v[10],n,i,max;
void main()
{
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
max=v[0];
for(i=1;i<n;i++)
if(v[i]>max) max=v[i];
cout<<"max="<<max;
}
numar ce se repeta in vector
//de cate ori apare un nr ce se repeta
#include<iostream.h>
void main()
{
int aux,n,i,j,nr,a[20];
cout<<"n=";cin>>n;
for (i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";cin>>a[i];}
aux=-1;
for(i=1;i<=n;i++)
{nr=1;
if(a[i]!=aux)
{for(j=i+1;j<=n;j++)
if(a[i]==a[j]) {nr++;a[j]=aux;}
cout<<"nr"<<a[i]<<"apare de "<<nr<<"
ori";
cout<<endl;}
}
}
Probleme rezolvate in C++ Divide et
impera
Divide et impera se bazează pe
principiul descompunerii problemei în
două sau mai multe subprobleme (mai
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;
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;
}
k=i;
}
void quick(int li,int ls)
{
if(li<ls)
{
poz(li,ls,k,v);
quick(li,k-1);
quick(k+1,ls);
}
}
void main()
{
int i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
quick(1,n);
for(i=1;i<=n;i++) cout<<v[i]<<" ";
}
Se citeste un vector cu n componente
numere intregi.Se cere sa se afiseze
valoarea maxima
#include<iostream.h>
int v[100],n;
int max(int i,int j)
{
int a,b;
if(i==j) return v[i];
else
{
a=max(i,(i+j)/2);
b=max((i+j)/2+1,j);
if(a>b) return a;
else return b;
}
}
void main()
{
cout<<"n=";cin>>n;
for(int i=0;i<n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
cout<<"maximul este:"<<max(0,n-1);
}
Se citeste un vector cu n componente
numere intregi,ordonate crescator si o
valoare intreaga x.Sa se decida daca x
se gaseste sau nu printre componentele
vectorului
#include<iostream.h>
int v[100],n,x;
void caut(int i,int j)
{
if(x==v[(i+j)/2])
cout<<"gasit"<<" "<<"indice "<<(i+j)/2;
else
if(i<j)
if(x<v[(i+j)/2])
caut(i,(i+j)/2 -1);
else caut((i+j)/2+1,j);
else cout<<"nu s-a gasit";
}
void main()
{
cout<<"n=";cin>>n;
for(int i=0;i<n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
cout<<"numarul cautat:";cin>>x;
caut(0,n-1);
}
turnurile din Hanoi
#include<iostream.h>
char x,y,z;
int n;
void h(int n,char x,char y, char z)
{
if(n==1) cout<<x<<y<<" ";
else
{
h(n-1,x,z,y);
cout<<x<<y<<" ";
h(n-1,z,y,x);
}
}
void main()
{
cout<<"n=";cin>>n;
h(n,'x','y','z');
}
Metoda Backtracking
Sa se genereze toate sirurile de lungime
n, formate numai din literele A si M,
siruri care sa nu aiba doua litere A
alaturate.Valoarea numarului natural n
se citeste de la tastatura. Pentru n=3,
se vor afisa sirurile: MMM, AMM, MAM,
MMA,AMA.
#include<iostream.h>
int n,k,i;
char a[3],st[20];
int valid(int k)
{
for(i=1;i<k;i++)
if(k>1&&a[st[k]]=='A'&&a[st[k-1]]=='A')
return 0;
return 1;}
int sol(int k)
{ return (k==n);}
void tipar(int k)
{for(i=1;i<=k;i++)
cout<<st[i]<< " ";
cout<<endl;}
void bkt(int k)
{int val;
for(val=1;val<=2;val++)
{st[k]=a[val];
if(valid(k))
if(sol(k))
tipar(k);
else
bkt(k+1);
}}
void main()
{
cin>>n;
a[1]='A';
a[2]='M';
bkt(1);}
Backtracking cifre pare crescatoare
Folosind metoda backtracking, sa se
scrie un program care genereaza toate nr
din 3 cifre pare,cifrele strict in
ordine crescatoare
#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];
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()
{
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();
}
problema comis voiajorului
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k,a[10][10];
void init()
{st[k]=1;}
int succesor()
{if (st[k]<n)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{if( a[st[k-1]][st[k]]==0) return 0;
for(int i=1;i<k;i++)
if(st[i]==st[k] ) return 0;
if((k==n) && (a[1][st[k]]==0)) return 0;
return 1;}
int sol()
{return (k==n);}
void tipar()
{for(int i=1;i<=n;i++) cout<<st[i]<<" ";
cout<<endl;
}
void bkt()
{int as;k=2;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
void main()
{cout<<"numarul de orase=";cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>a[i][j];
st[1]=1;
bkt();
}
problema colorarii hartilor
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k;
void init()
{st[k]=0;}
int succesor()
{if (st[k]<4)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{for(int i=1;i<k;i++)
if(st[i]==st[k] && a[i][k]==1) return 0;
return 1;}
int sol()
{return (k==n);}
void tipar()
{for(int i=1;i<=n;i++) cout<<"tara
numarul"<<i<<" culoarea"<<st[i]<<endl;
cout<<endl;
}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
main()
{cout<<"numarul de tari=";cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>a[i][j];
bkt();
}
problema damelor
//problema damelor
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k;
void init()
{st[k]=0;}
int succesor()
{if (st[k]<n)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{for(int i=1;i<k;i++)
if(st[i]==st[k] || abs(st[k]-
st[i])==abs(k-i)) return 0;
return 1;}
int sol()
{return (k==n);}
void tipar()
{for(int i=1;i<=n;i++) cout<<st[i];
cout<<endl;
}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
main()
{cout<<"n=";cin>>n;
bkt();
getch();
}
Scrieti un program care afiseaza pe
ecran toate secventele de n litere (n
numar natural par citit de la tastatura)
din multimea {A,R,G,V), secvente care se
pot construi respectand urmatoarele
reguli: nu plasam doua litere identice
una langa alta;trebuie sa utilizam exact
n/2 litere R
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k;char a[5];
void init()
{st[k]=0;}
int succesor()
{if (st[k]<4)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{int i,nr;
if(k>1) if(st[k]==st[k-1]) return 0;
if(k==n)
{nr=0; for(i=1;i<=n;i++)
if(a[st[i]]==‟R‟) return 0;}
return 1;}
int sol()
{return (k==n);}
void tipar()
{for(int i=1;i<=n;i++) cout<<a[st[i]];
cout<<endl;
}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
void main()
{cout<<"n=";cin>>n;
a[1]=‟A‟;a[2]=‟R‟;a[3]=‟G‟;a[4]=‟V‟;
bkt();
}
Se citesc de la tastatura doua nr
naturale n si v.Scrieti un program care
afiseaza toate nr de la 1 la n in toate
modurile posibile, astfel incat intre
oricare doua numere afisate in pozitii
invecinate, diferenta in modul sa fie
mai mare decat valoarea data v.
Exemplu: n=4,v=1 solutiile vor fi 3 1 4
2 si 2 4 1 3
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k,v;
void init()
{st[k]=0;}
int succesor()
{if (st[k]<n)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{for(int i=1;i<k;i++)
if(st[i]==st[k]) return 0;
if((k>1) &&(abs(st[k]-st[k-1]<=v))
return 0;
return 1;}
int sol()
{return (k==n);}
void tipar()
{for(int i=1;i<=n;i++) cout<<st[i];
cout<<endl;
}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
void main()
{cout<<"n=";cin>>n;
cout<<"v=";cin>>v;
bkt();
getch();
}
Copiii asteapta jucarii de la Mos
Craciun. Scrieti un program care
determina toate modurile diferite in
care ei pot sa fie asezati in lista,
astfel incat sa fie vizitati toti copiii
si vizitele sa se faca in orinea
descrescatoare a numarului de jucarii
dorite de fiecare.Se citesc de la
tastatura: n, numarul de copii, apoi
numele si numarul de jucarii cerut de
fiecare dintre cei n copii.Sa se scrie
numele copiilor, in ordinea in care vor
fi vizitati de Mos Craciun.
Exemplu: pentru datele de intrare: n=4
Dan 2
Cristina 4
Corina 6
Iulia 4
se scriu urmatoarele solutii:
Corina Iulia Cristina Dan
Corina Cristina Iulia Dan
#include<iostream.h>
struct copil{char nume[10]; int jucarii;
};
struct copil v[10];
int st[20],n,k;
void init()
{
st[k]=0;
}
int succesor()
{if(st[k]<n)
{st[k]++;return 1;}
return 0;}
int valid()
{int i;
for(i=1;1<k;i++)
if(st[k]==st[i]) return 0;
for(i=1;i<k;i++)
if(v[st[k]].jucarii>v[st[i]].jucarii)
return 0;
return 1;}
int solutie()
{int i;
for(i=1;i<=n;i++)
cout<<v[st[i]].nume<<" ";
cout<<endl;}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor() &&
(!valid()));
if (as)
if (solutie()) tipar();
else
{k++; init();}
else k--;
}
}
void main()
{cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{
cout<<"nume"<<i;cin>>v[i].nume;
cout<<"nr de jucarii pentru copilul
"<<i;cin>>v[i].jucarii;
}
bkt();
}
COMBINARI ITERATIV
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k,p;
void init()
{ if(k>1) st[k]=st[k-1];
else st[k]=0;
}
int succesor()
{if (st[k]<n-p+k)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{
return 1;}
int sol()
{return (k==p);}
void tipar()
{for(int i=1;i<=p;i++) cout<<st[i];
cout<<endl;
}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
void main()
{cout<<"n=";cin>>n;
cout<<"p=";cin>>p;
bkt();
getch();
}
ARANJAMENTE ITERATIV
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,k,p;
void init()
{st[k]=0;}
int succesor()
{if (st[k]<n)
{st[k]++;
return 1;
}
else return 0;}
int valid()
{for(int i=1;i<k;i++)
if(st[i]==st[k]) return 0;
return 1;}
int sol()
{return (k==p);}
void tipar()
{for(int i=1;i<=p;i++) cout<<st[i];
cout<<endl;
}
void bkt()
{int as;k=1;
init();
while(k>0)
{
do {} while ((as=succesor()) &&
!valid());
if (as)
if (sol()) tipar();
else {k++;init();}
else k--;
}
}
void main()
{cout<<"n=";cin>>n;
cout<<"p=";cin>>p;
bkt();
getch();
}
fotbal
//un patron are o suma s;ce jucatori
poate lua
#include<iostream.h>
#include<conio.h>
#include<math.h>
int st[20],n,p,s,a[20];
int valid(int p)
{int suma=0;
for(int i=1;i<p;i++)
if(st[i]>=st[p]) return 0;
for(i=1;i<=p;i++) suma=suma+a[st[i]];
if(suma>s) return 0;
return 1;}
int sol(int p)
{int suma=0;
for(int i=1;i<=p;i++)
suma=suma+a[st[i]];
return (suma==s);}
void tipar(int p)
{for(int i=1;i<=p;i++) cout<<st[i];
cout<<endl;
}
void bkt(int p)
{
int val;
for(val=1;val<=n;val++)
{
st[p]=val;
if(valid(p)) if(sol(p))
tipar(p);
else bkt(p+1);
}
}
void main()
{cout<<"n=";cin>>n;
cout<<"s=";cin>>s;
for(int i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";cin>>a[i];}
bkt(1);}
Backtracking cifre distincte pare
alaturate
Folosind metoda backtracking, sa se
afiseze toate nr din n cifre distincte
a.i. sa nu fie 2 cifre pare alaturate
#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()
{
int i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];}
bkt(1);
getch();
}
Se citesc n litere.Sa se formeze toate
cuvintele de cate p litere formate din
cele n litere astfel incat aceeasi
litera sa nu se afle pe 2 pozitii
alaturate.
#include<iostream.h>
#include<conio.h>
int n,st[10],k,p;
char v[10];
int valid(int k)
{
if((k>1) && (st[k]==st[k-1])) return 0;
return 1;
}
int sol(int k)
{
return (k==p);
}
void tipar(int p)
{
for(int i=1;i<=p;i++)
cout<<v[st[i]];
cout<<endl;
}
void bkt(int k)
{
for(int val=1;val<=n;val++)
{st[k]=val;
if (valid(k))
if (sol(k)) tipar(p);
else bkt(k+1);
}}
void main()
{
int i;
cout<<"n=";cin>>n;
cout<<"p=";cin>>p;
for(i=1;i<=n;i++)
{cout<<"v["<<i<<"]=";cin>>v[i];}
bkt(1);
getch();
}
se citesc n nr.sa se afle toate
modalitatile de afisare a nr a.i. 2 nr
alaturate sa nu fie negative
#include<iostream.h>
int st[20],n,k,v[20];
void init()
{cout<<"n=";cin>>n;}
int valid(int k)
{for(int i=1;i<k;i++)
if(st[i]==st[k]) return 0;
if((v[st[k]]<0) && (v[st[k-1]]<0))
return 0;
return 1;}
int sol(int k)
{return (k==n);}
void tipar(int k)
{for(int i=1;i<=k;i++) cout<<v[st[i]];
cout<<endl;
}
void bkt(int k)
{int val;
for(val=1;val<=n;val++)
{st[k]=val;
if(valid(k))
if (sol(k)) tipar(k);
else bkt(k+1);
}
}
void main()
{cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)cin>>v[i];
bkt(1);}
combinari
//combinari
#include<iostream.h>
int st[20],n,k;
void init()
{
int i;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
st[0]=0;
}
void tipar(int p)
{
int j;
for(j=1;j<=p;j++)
cout<<st[j]<<" ";
cout<<endl;
}
int solutie(int p)
{
return (p==k);
}
void bkt(int p)
{
int val;
for (val=st[p-1]+1;val<=n;val++)
{
st[p]=val;
if(solutie(p))
tipar(p);
else
bkt(p+1);
}
}
void main()
{
init();
bkt(1);
}
aranjamente
//aranjamente
#include<iostream.h>
int st[20],n,k;
void init()
{
int i;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++) st[i]=0;
}
void tipar(int p)
{
int j;
for(j=1;j<=p;j++)
cout<<st[j]<<" ";
cout<<endl;
}
int valid(int p)
{
int i,ok;
ok=1;
for(i=1;i<p;i++)
if(st[p]==st[i]) ok=0;
return ok;
}
int solutie(int p)
{
return (p==k);
}
void bkt(int p)
{
int val;
for (val=1;val<=n;val++)
{
st[p]=val;
if (valid(p))
if(solutie(p))
tipar(p);
else
bkt(p+1);
}
}
void main()
{
init();
bkt(1);
}
permutari
//permutari
#include<iostream.h>
int st[20],n;
void init()
{
int i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++) st[i]=0;
}
void tipar(int p)
{
int j;
for(j=1;j<=p;j++)
cout<<st[j]<<" ";
cout<<endl;
}
int valid(int p)
{
int i,ok;
ok=1;
for(i=1;i<p;i++)
if(st[p]==st[i]) ok=0;
return ok;
}
int solutie(int p)
{
return (p==n);
}
void bkt(int p)
{
int val;
for (val=1;val<=n;val++)
{
st[p]=val;
if (valid(p))
if(solutie(p))
tipar(p);
else
bkt(p+1);
}
}
void main()
{
init();
bkt(1);
}
grafuri
Componente tare conexa graf orientat
Fiind dat un graf orintat, sa se
determine componente tare conexa careia
ii apartine un varf x citit de la
tastatura.
Aspect teoretic
Definitie: Un graf orientat G=(X,U)
este tare conex daca pentru oricare x si
y exista un drum de la x la y precum si
un drum de la y la x.
Definitie: Fiind dat un graf orintat
G=(X,U), se numeste componenta tare
conexa a lui G, un subgraf G1=(X1,U1),
tare conex, si maximal in raport cu
aceasta proprietate (pentru orice nod x
apartinand lui X-X1, subgraful indus de
X1 U {x} nu mai este tare conex)
#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)
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++)
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--;}
}
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);
}
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()
{
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++;
}
void back()
{k=1;
while(k>0)
if(st[k]<n)
{st[k]++;
if(e_valid())
if(k==n)
afisare();
else
{k++;
st[k]=0;}
}
else
k--;
}
void main()
{
fstream f;
f.open("hamiltonian.in",ios::in);
int u,v;
if(f)
cout<<"ok!";
else
cout<<"eroare";
cout<<endl;
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>u>>v;
a[u][v]=a[v][u]=1;
}
cout<<"matricea de adiacenta "<<endl;
for( i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
back();
if(ns==0)
cout<<”nu exista solutii”;
}
Subgraf
Se citesc 2 grafuri neorientate, unul cu
n noduri si m muchii, iar celalalt cu k
varfuri si l muchii, ambele date prin
vectorul muchiilor. Sa se determine daca
al doilea graf este subgraf al primului.
#include<fstream.h>
fstream f("date.in",ios::in);
fstream g("date2.in",ios::in);
int a[100][100],b[100][100],n,m,k,l;
void citire()
{int x,y,i;
f>>n>>m;
for(i=1;i<=m;i++)
{f>>x>>y;
a[x][y]=1;
a[y][z]=1;
}
g>>k>>l;
for(i=1;i<=l;i++)
{g>>x>>y;
b[x][y]=1;
b[y][x]=1;
}
}
int subgraf()
{for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
if(a[i][j]!=b[i][j]) return 0;
return 1;
}
void main()
{citire();
if(subgraf()) cout<<"da";
else cout<<"nu";
}
Afisarea elementelor unei matrici
Se citeste o matrice patratica.Sa se
afiseze elementele de pe diagonala
secundara,elementele de pe diagonala
principala,elementele de sub/desupra
diagonalei secundare/principala.
#include<iostream.h>
#include<stdio.h>
void main()
{
int i,j,n,a[20][20];
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
cout<<"diagonala principala"<<endl;
for(i=0;i<n;i++)
cout<<a[i][i]<<" ";
cout<<endl<<"diagonala secundara"<<endl;
for(i=0;i<n;i++)
cout<<a[i][n-1-i]<<" ";
cout<<endl<<"elementele de deasupra
diagonalei principale"<<endl;
for(i=0;i<=n-2;i++)
for(j=i+1;j<=n-1;j++)
cout<<a[i][j]<<" ";
cout<<endl<<"elementele de sub diagonala
principala"<<endl;
for(i=1;i<=n-1;i++)
for(j=0;j<=i-1;j++)
cout<<a[i][j]<<" ";
cout<<endl<<"elementele de deasupra
diagonalei secundare"<<endl;
for(i=0;i<=n-2;i++)
for(j=0;j<=n-i-2;j++)
cout<<a[i][j]<<" ";
cout<<endl<<"elementele de sub diagonala
secundara"<<endl;
for(i=1;i<=n-1;i++)
for(j=n-i;j<=n-1;j++)
cout<<a[i][j]<<" ";
}
Se citeste n. Sa se afiseze urmatoarele
forme. In exemplu n=4:
1)
1 2 3 4
1 2 3
1 2
1
#include<iostream.h>
void main()
{
int i,j,n;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i+1;j++)
cout<<j<<" ";
cout<<endl;
}
}
2)
1 1 1 1
2 2 2
3 3
4
#include<iostream.h>
void main()
{
int i,j,n;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i+1;j++)
cout<<i<<" ";
cout<<endl;
}
}
4)
4 3 2 1
4 3 2
4 3
4
#include<iostream.h>
void main()
{
int i,j,n;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i+1;j++)
cout<<n-j+1<<" ";
cout<<endl;
}
}
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
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;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
for(i=1;i<=n;i++)
for(j=1;i<=m;i++)
b[j][i]=a[i][j];
cout<<"Matricea transpusa este "<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}
Sa se scrie un program care calculeaza
produsul a doua matrici bidimensionale A
si B.
#include <iostream.h>
void main()
{
int
n,m,p,i,j,k,a[10][10],b[10][10],c[10][10
];
cout<<"Dati numarul de linii n =
";cin>>n;
cout<<"Dati numarul de coloane m =
";cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Elementele matricei A sunt:
"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"Dati numarul de linii m =
";cin>>m;
cout<<"Dati numarul de coloane p =
";cin>>p;
for(i=1;i<=m;i++)
for(j=1;j<=p;j++)
{
cout<<"b["<<i<<","<<j<<"]= ";
cin>>b[i][j];
}
cout<<"Elementele matricei B sunt:
"<<endl;
for(i=1;i<=m;i++)
{
for(j=1;j<=p;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
for(i=1;i<=n;i++)
for(j=1;j<=p;j++)
for(k=1;k<=m;k++)
c[i][j]+=a[i][k]*b[k][j];
cout<<"Elementele matricei produs
"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=p;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
}
Scrieti un program care construieste in
memorie un tablou t cu n linii si n
coloane, cu elemente numere intregi,
astfel incat pe diagonala principala sa
existe numai elemente egale cu 1,
elementele de pe cele doua semidiagonale
paralele cu diagonala principala si
alaturate diagonalei principale sa fie
tot egale cu 2, elementele de pe
urmatoarele doua semidiagonale sa fie
egale cu 3 etc.Valoarea lui n se citeste
de la tastatura.
#include<iostream.h>
int a[20][20],nr[30],i,j,n,k,m,max=0;
void main()
{
cout<<"n=";cin>>n;
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
if(i==j) a[i][j]=1;
for(i=0;i<=n-2;i++)
{k=2;
for(j=i+1;j<=n-1;j++)
{a[i][j]=k;k=k+1;}
}
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
a[j][i]=a[i][j];
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
Se da o matrice cu m lini * n coloane,
ale carei elemente sunt cifre de 0 si 1.
Sa se afiseze indicii liniei (liniilor)
pe care se afla cele mai multe valori de
1.
#include<iostream.h>
int a[20][20],nr[30],i,j,n,m,max=0;
void main()
{
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
for(i=0;i<=m-1;i++)
for(j=0;j<=n-1;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(i=0;i<=m-1;i++)
nr[i]=0;
for(i=0;i<=m-1;i++)
{
for(j=0;j<=n-1;j++)
nr[i]=nr[i]+a[i][j];
if(max<nr[i]) max=nr[i];
}
for(i=0;i<=m-1;i++)
if(nr[i]==max) cout<<i<<" ";
}
Se da o matrice cu m lini * n coloane.Sa
se memoreze intr-un vector b sumele
elementelor de pe fiecare lini a
matricii ( b[i] va reprezenta suma
elementelor de pe linia i in matrice)
#include<iostream.h>
int a[20][20],b[30],i,j,n,m;
void main()
{
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
for(i=0;i<=m-1;i++)
for(j=0;j<=n-1;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(i=0;i<=m-1;i++)
b[i]=0;
for(i=0;i<=m-1;i++)
for(j=0;j<=n-1;j++)
b[i]=b[i]+a[i][j];
for(i=0;i<=m-1;i++)
cout<<b[i]<<" ";
}
O matrice patratica cu n linii * n
coloane se numeste triunghiulara
superior daca toate elementele aflate
sub diagonala principala sunt nule.
Realizati un program care verifica daca
matricea este triunghiulara superior.
#include<iostream.h>
int a[20][20],i,j,n,g;
void main()
{
cout<<"n=";cin>>n;
for(i=0;i<=n-1;i++)
for(j=0;j<=n-1;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
g=1;
for(i=1;i<=n-1;i++)
for(j=0;j<=i-1;j++)
if(a[i][j]) g=0;
if(g==0)
cout<<"nu este triunghiulara superior";
else cout<<"este triunghiulara";
}
Probleme cu instructiunea for in C++
Se citeste n. Sa se afiseze urmatoarele
forme. In exemplu n=4:
1)
* * * *
* * *
* *
*
#include<iostream.h>
void main()
{
int n,i,j;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
for(j=(n-i)+1;j>=1;j--)
cout<<'*'<<" ";
cout<<endl;
}
}
2)
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
#include<iostream.h>
void main()
{
int n,i,j;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
for(j=n*(i-1)+1;j<=n*i;j++)
cout<<j<<" ";
cout<<endl;
}
}
3)
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
#include<iostream.h>
void main()
{
int n,i,j;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<j<<" ";
cout<<endl;
}
}
4)
4 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;
}
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;
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;
b=r;
r=a%b;
}
cout<<"cmmdc: "<<b;
}
CEL MAI MARE DIVIZOR COMUN - ALGORITMUL
LUI NICOMAHUS (metoda scaderilor
repetate)
#include<iostream.h>
void main()
{
int a,b,r;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
while(a!=b)
if(a>b) a=a-b;
else b=b-a;
cout<<"cmmdc: "<<b;
}
Realizati un program care descompune in
factori primi un numar n citit de la
tastatura
#include<iostream.h>
void main()
{
int n,d=2,p;
cout<<"n=";cin>>n;
while(n>1)
{
p=0;
while(n%d==0)
{
p=p+1;
n=n/d;
}
if(p) cout<<d<<" la puterea "<<p<<endl;
d=d+1;
}
}
Scrieti un program care afiseaza numarul
de aparitii a unei cifre x intr-un numar
n;de ex daca citim n=2232 si x=2 se
afiseaza numarul 3.
#include<iostream.h>
void main()
{
int n,n1,nr,x;
cout<<"n=";cin>>n;
cout<<"x=";cin>>x;
nr=0;
n1=n;
do
{
if(n1%10==x) nr++;
n1=n1/10;
}while(n1);
cout<<"cifra "<<x<<" apare de "<<nr<<"
ori";
}
Sa se scrie un program tcare realizeaza
trecerea unui numar din baza 10 in baza
b, unde b se citeste de la tastatura
#include<iostream.h>
void main()
{
long n,n1,b,aux,nr;
aux=nr=0;
cout<<"n=";cin>>n;
cout<<"b=";cin>>b;
n1=n;
do
{
aux=aux*10+n1%b;
n1=n1/b;
}
while(n1!=0);
cout<<aux<<endl;;
do
{
nr=nr*10+aux%10;
aux=aux/10;
}
while(aux);
cout<<"numarul "<<n<<" in baza "<<b<<"
este: "<<nr;
}
Calculati suma cifrelor unui numar x
citit de la tastatura
#include<iostream.h>
void main()
{
int s;
long d,x;
cout<<"x=";cin>>x;
d=x;
s=0;
while(d)
{
s=s+d%10;
d=d/10;
}
cout<<"s="<<s;
}
Calculati produsul numerelor naturale
impare mai mici sau egale cu o valoare
data n
ex:pt n=8 p=1*3*5*7=105
#include<iostream.h>
void main()
{
int p,i,n;
cout<<"n=";cin>>n;
p=1;i=1;
while(i<=n)
{
p=p*i;
i=i+2;
}
cout<<"p="<<p;
}
Sa se afiseze oglinditul unui numar
#include<iostream.h>
void main()
{
int n,o,n1;
cout<<"n=";cin>>n;
o=0;n1=n;
do
{
o=o*10+n1%10;
n1=n1/10;
}while(n1);
cout<<"oglinditul lui "<<n<<" este:
"<<o;
}
Verificati daca un numar natural x
diferit de 0 si 1, este prim sau nu
#include<iostream.h>
void main()
{
int x,d,ok;
cout<<"x=";cin>>x;
ok=1;d=2;
while(d<=x/2 && ok)
{
if(x%d==0)
ok=0;
d++;
}
if(ok) cout<<"nr prim";
else cout<<"nr nu este prim";
}
Sa se afiseze primii n termeni ai
sirului lui Fibonacci;sirul are primii
doi termeni egali cu 1 si fiecare din
urmatorii termeni este egal cu suma
dintre precedentul si ante-precedentul
#include<iostream.h>
void main()
{
int i,n;
long f,p,a;
cout<<"n=";cin>>n;
p=a=1;
cout<<a<<" "<<p<<endl;
for(i=3;i<=n;i++)
{
f=p+a;
cout<<f<<endl;
a=p;
p=f;
}
}
Sortare prin metoda insertiei
#include<iostream.h>
void 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])
{
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>
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.
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
#include<iostream.h>
int n, r, T[20], a[20][20], p[20];void
citire()
{ int i,x,y;
cout<<"nr de noduri: ";cin>>n;
cout<<"cititi muchiile de forma x-y :
"<<endl;
for(i=1;i<=n-1;i++)
{ cin>>x>>y;
a[x][y]=a[y][x]=1;;
}
cout<<"dati radacina : "<<endl;
cin>>r;
}void BF(int r)
{ int s,d,i,x[100];
d=s=1;
x[1]=r; p[r]=1;
while (s<=d)
{ for(i=1;i<=n;i++)
if(a[x[s]][i] &&!p[i])
{ d++; x[d]=i;
p[i]=1; T[i]=x[s];
}
s++;
}
}void main()
{ int i;
citire();
BF(r);
cout<<"vectorul TATA este :"<<endl;
for(i=1;i<=n;i++) cout<<T[i]<<" ";
}
Se citeste un arbore cu n varfuri dat
prin vectorul TATA.
1) Sa se afiseze muchiile arborelui
2) Sa se construiasca si sa se afiseze
matricea de adiacenta a arborelui.
Observatie: vectorul TATA precizeaza
pentru fiecare varf i, nodul TATA[i]
care reprezinta parintele sau
Pentru arborele din imagine vectorul
TATA este: 0,1,2,1.
#include<iostream.h>
int n, t[20], a[20][20];void afis()
{ int i,j;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}void main()
{ int i;
cout<<"nr de noduri: ";cin>>n;
cout<<"dati vectorul tata "<<endl;
for(i=1;i<=n;i++)
{
cout<<"t["<<i<<"]=";
cin>>t[i];
}
cout<<"muchiile sunt: "<<endl;
for(i=1;i<=n;i++)
if(t[i]!=0)
{ cout<<"["<<t[i]<<","<<i<<"] ";
a[i][t[i]]=a[t[i]][i]=1;
}
cout<<endl;
cout<<"matricea de adiacenta este:
"<<endl;
afis();
}
Sa se determine un arbore partial de
cost minim folosind algoritmul Kruskal
Pentru memorarea muchiilor grafului si a
costurilor acestora se defineste o
structura de date cu trei campuri
(nodurile muchiei si costul ei) pe care
o numim muchie
#include<iostream.h>
#include<fstream.h>
typedef struct{int u,v,c;} muchie;
int l[30],n,m;
muchie e[30];
void citire()
{int i;
fstream f("apm.txt", ios::in);
f>>n;
f>>m;
for(i=1;i<=m;i++)
f>>e[i].u>>e[i].v>>e[i].c;
f.close();}
void main()
{int k,ultim,i,u,v,ct,ind,ms,lu,lv;
muchie aux;
citire();
for(i=1;i<=n;i++)
l[i]=i;
ultim=m;
while(ultim>1)
{k=0;
for(i=1;i<=ultim-1;i++)
if(e[i].c>e[i+1].c)
{aux=e[i];
e[i]=e[i+1];
e[i+1]=aux;
k=1;
}
ultim=k;}
cout<<"APM contine muchiile:"<<endl;
ct=0;ms=0;ind=0;
while(ms<n-1)
{
do
ind++;
while(l[e[ind].u]==l[e[ind].v]);
u=e[ind].u;
lu=l[u];
v=e[ind].v;
lv=l[v];
cout<<u<<" "<<v<<endl;
ct=ct+e[ind].c;
ms++;
for(i=1;i<=n;i++)
if(l[i]==lu)
l[i]=lv;}
cout<<"costul APM este:"<<ct;}
Numarul de nivele ale unui arbore
#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)
{
fstream f(nume,ios::in);
int i,j;
f>>n;
while (f>>i>>j) a[i][j]=1;
f.close();
}
void df(int nod)
{
int k;s[nod]=1;
for(k=1;k<=n;k++)
if(a[nod][k]==1 || a[k][nod]==1)
{a[k][nod]=a[nod][k]=0;
if (s[k]==0) df(k);
else gasit=1;
}
}
void df1(int nod)
{
int k;s[nod]=1;
for(k=1;k<=n;k++)
if (a[nod][k]==1 && s[k]==0) df1(k);
}
void main()
{
citire("graf.txt",a,n);cout<<"n-
>"<<n<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) b[i][j]=a[i][j];
df(1);
for(i=1;i<=n;i++) suma+=s[i];
if(suma!=n) cout<<"nu este conex"<<endl;
else cout<<"este conex"<<endl;
if(gasit) cout<<"are cel putin un
ciclu"<<endl;
else cout<<"nu are cicluri";
if (suma==n && !gasit)
{cout<<"este arbore"<<endl;
ok=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) a[i][j]=b[i][j];
if (ok)
{r=1;
do
{suma=0;for(i=1;i<=n;i++)s[i]=0;
df1(r);
for(i=1;i<=n;i++) suma+=s[i];
if (suma==n)
{cout<<"radacina este "<<r<<endl<<"este
arborescenta"<<endl;
radacina=1;
}
else r++;
}while (!radacina && r<=n);
if(!radacina) cout<<"nu are radacina";
}
getch();
}
Arbore partial de cost minim
#include<fstream.h>
#include<iostream.h>
float a[20][20],min,cost;
int s[20],t[20],n,i,j,k,v;
void citire(char nume[20],float
a[20][20],int &n)
{
int i,j;
float c;
fstream f(nume,ios::in);
f>>n;
for(i=1;i<=n;i++) a[i][i]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) a[i][j]=100;
while(f>>i>>j>>c) a[i][j]=a[j][i]=c;
f.close();
}
void main()
{
cost=0;
citire("graf2",a,n);
cout<<n<<endl;
cout<<"nodul de pornire:";cin>>v;
for(i=1;i<=n;i++)
if(i==v) s[i]=0;
else s[i]=v;
for(k=1;k<=n-1;k++)
{
min=100;
for(i=1;i<=n;i++)
if(s[i])
if(a[s[i]][i]<min)
{min=a[s[i]][i];
j=i;
}
t[j]=s[j];
cost+=a[s[j]][j];s[j]=0;
for(i=1;i<=n;i++)
if(s[i] && a[i][s[i]]>a[j][i]) s[i]=j;
}
cout<<"cost="<<cost<<endl;
for(i=1;i<=n;i++) cout<<t[i]<<" "<<endl;
}
Arbori de cautare
#include<iostream.h>
#include<conio.h>
struct nod
{int nr;
nod *as,*ad;
};
nod *v,*man;
int k;
void inserare(nod*& c,int k)
{
if(c)
if(c->nr==k)
cout<<"nr inserat"<<endl;
else
if(c->nr<k) inserare(c->ad,k);
else inserare(c->as,k);
else
{c=new nod;c->as=c->ad=0;
c->nr=k;}
}
void parcurg(nod* c)
{if(c)
{parcurg(c->as);
cout<<c->nr<<endl;
parcurg(c->ad);
}
}
void main()
{v=0;
do{
cout<<"k=";cin>>k;
inserare(v,k);}
while(k!=0);
parcurg(v);
getch();
}
Sa se parcurga un arbore binar
#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
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
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