Sunteți pe pagina 1din 16

Probleme

1)Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale din intervalul [2,20], n și
k, şi construieşte în memorie un tablou bidimensional cu n linii şi n∙k coloane, numerotate începând
cu
1, astfel încât fiecare linie i (i∈[1,n]) memorează un şir crescător de termeni cu proprietatea că
primul termen este i, fiecare valoare apare în şir de exact k ori și oricare doi termeni alăturați au valori
egale sau consecutive.
#include <iostream>

using namespace std;

int a[20][40];

int main()

{
int n,k,i,j;

cin>>n>>k;

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

a[1][i]=(i-1)/k+1;

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

for(j=1; j<=n*k; j++)

a[i][j]=a[i-1][j]+1;

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

for(j=1; j<=n*k; j++)

cout<<a[i][j]<<" ";

cout<<endl;

return 0;

2)Scrieţi un program C/C++ care citeşte de la tastatură un număr natural, n (n ∈[2,20]), şi construieşte
în memorie un tablou bidimensional cu n linii şi n coloane, având proprietăţile:
• toate elementele situate pe diagonala secundară sunt nule;
• fiecare linie conţine, începând cu diagonala secundară, de la dreapta la stânga, un şir strict crescător
de numere consecutive, iar începând cu diagonala secundară, de la stânga la dreapta, tot un şir strict
crescător de numere consecutive.
#include<iostream>
using namespace std;
int a[21][21];
int main()
{
int n,i,j;
cin>>n;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
a[i][j]=abs(i-j); //modulul dintre scaderea indicilor.
for(i=1; i<=n; i++)
{
for(j-1; j<=n; j++)
cout<<a[i][j]<<" ";
cout<<'\n';
}
return 0;
}

3)Scrieţi un program C/C++ care citeşte de la tastatură un număr natural nenul n (n≤100)
şi 2*n numere naturale de maximum 3 cifre; primele n reprezintă elementele tabloului
unidimensional a, iar următoarele n elementele tabloului unidimensional b; fiecare tablou are
elementele numerotate începând de la 1. Programul construieşte în memorie şi afişează pe ecran,
separate prin câte un spaţiu, cele n elemente ale unui tablou unidimensional c, în care orice element
ci (1≤i≤n) se obţine conform definiţiei următoare:

#include <iostream>
using namespace std;
int n, j=0, a[100], b[100], c[100];
int concatenare_ab(int x, int y) // a[i] < b[i]
{

int copie=y, ok=1, f=1, cifre=0;

while(copie!=0)
{
cifre++;
copie=copie/10;
}

f=f*x;

while(ok<=cifre)
{
final=final*10;
ok++;
}

f=f+y;

return f;

int concatenare_ba(int a, int b) // a[i] > b[i]


{
int copie2=a, ok2=1, f2=1, cifre2=0;

while(copie2!=0)
{

cifre2++;
copie2=copie2/10;
}

fl2=f2*b;

while(ok2<=cifre2)
{

f2=f2*10;
ok2++;

f2=f2+a;

return f2;

}
int main()
{
cin>>n;

for(int i=1; i<=2*n; i++)


{
if(i<=n)
cin>>a[i];

else if(i>n)
{
j=j+1;
cin>>b[j];
}
}

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


{
if(a[i]<b[i])
c[i]=concatenare_ab(a[i],b[i]);

else

if(a[i]>b[i])
c[i]=concatenare_ba(a[i],b[i]);
}

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


cout<<c[i]<<" ";
}

4)Într-un tablou bidimensional, cu elemente având valori numai în mulțimea {0,1}, numim
linii „complementare” două linii cu proprietatea că oricare două elemente ale acestora,
aflate pe aceeași coloană, sunt diferite.
Scrieți un program C/C++ care citește de la tastatură trei numere naturale m, n și k
(m,n[2,20], k[1,m]) și elementele unui tablou bidimensional cu m linii și n coloane,
numere naturale din mulțimea {0,1}. Programul afișează pe ecran mesajul DA dacă există
cel puțin o linie „complementară" cu linia a k-a a acestuia, sau mesajul NU în caz contrar.

#include <iostream>

using namespace std;

int main()

unsigned int a[20][20],i,j,m,n,ok=1,s=0;

cin>>m>>n;

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


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

cin>>a[i][j];

for(j=2; j<=n; j++)

{
ok=1;

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

if(a[i][1]==a[i][j])

ok=0;

if(ok) s++;

cout<<s;

return 0;

5)Variabilele i şi j sunt de tip întreg, iar variabila a memorează un


tablou bidimensional cu 9 linii şi 9 coloane, numerotate de la 0 la
8, având iniţial toate elementele egale cu -1.
Fără a utiliza alte variabile, scrieţi secvenţa de instrucţiuni de mai
jos, înlocuind punctele de suspensie astfel încât, în urma
executării secvenţei obţinute, variabila a să memoreze tabloul
alăturat.

#include <iostream>
using namespace std;
int v[10][10];
int main()
{
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
if(i==j || i==9-j-1)
{
v[i][j]=0;
}
else
{
if(i<j && j<9-i-1)
v[i][j]=j+i;
if(i<j && j>9-i-1)
v[i][j]=i+j-8;

if(i>j && j>9-i-1)


v[i][j]=i+j-8;
if(i>j && j<9-i-1)
v[i][j]=i+j;
}
}
}
for(int i=0; i<9; i++)

{
for(int j=0; j<9; j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
return 0;
}
6)Scrieți un program C/C++ care citește de la tastatură numere naturale: n (n[2,20]), k (k[1,n]) și
n∙n numere din intervalul [0,109], elemente ale unui tablou bidimensional cu n linii și n coloane,
numerotate începând de la 1. Programul transformă tabloul în memorie, deplasând circular spre
stânga,
cu câte o poziție, toate elementele situate pe linia k, în stânga diagonalei principale, ca în exemplu.
Elementele tabloului obținut sunt afișate pe ecran, fiecare linie pe câte o linie a ecranului, cu
elementele
fiecărei linii separate prin câte un spațiu.

#include <iostream>

using namespace std;

int main()

{
int i,j,a[21][21],n,k,aux;
cin>>n>>k;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
cin>>a[i][j];
cout<<endl;
for(j=1; j<=n/2; j++)
if(i>j)
{
aux=a[k][j];
a[k][j]=a[k][n/2-1];
a[k][n/2-1]=aux;
};

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


{
for(j=1; j<=n; j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
return 0;
}

7)Un text are cel mult 100 de caractere și este format din cuvinte şi numere, separate prin câte un
spațiu.
Cuvintele sunt formate numai din litere ale alfabetului englez. Toate numerele sunt reale şi sunt
formate
numai din parte întreagă sau din parte întreagă şi parte fracţionară, separate prin virgulă (,), numerele
negative fiind precedate de semnul minus (-).
Scrieţi un program C/C++ care citeşte de la tastatură textul, pe care îl transformă, eliminând din
componenţa sa toate numerele negative. Programul afişează apoi pe ecran textul obţinut.

#include <iostream>

#include <cstring>

using namespace std;

char s[100], cifre[]="1234567890";

int n, i, prima, prmax, prec, num, cautat, exista, cif;


int main()

{
cin.getline(s,100);
n=strlen(s);
for (i=0; i<n; ++i)
{
if (strchr(cifre,s[i]))
{
cif=s[i]-'0';
if (prec==0)
{
prima=cif;
prec=1;
num=cif;
exista=1;
}
else
{
num=num*10+cif;
}
}
else
{
prec=0;
if (prima>prmax)
{
prmax=prima;
cautat=num;
}
}
}

if (exista) cout << cautat;


else cout <<"nu contine numere";

8)Într-un text cu cel mult 102 caractere cuvintele sunt formate din litere mici ale alfabetului englez și
sunt
separate prin câte un spațiu. Scrieți un program C/C++ care citește de la tastatură un text de tipul
menționat, pe care îl modifică în memorie, duplicând fiecare cuvânt format numai din vocale.
Cuvântul
duplicat este separat prin câte un spațiu de cuvintele vecine. Textul transformat este afișat pe ecran,
iar
dacă nu există astfel de cuvinte, se afișează pe ecran mesajul nu exista.
Exemplu: dacă textul citit este oaia aia alba e a ei
se obține textul oaia oaia aia aia alba e e a a ei ei

#include <iostream>
#include <cstring>
using namespace std;
int vocale(char sir[103])
{
int nr_vocale=0;
for(int i=0;i<strlen(sir);i++)
{
if(strchr("aeiou",sir[i])!=NULL)
nr_vocale++;
}
if(nr_vocale==strlen(sir))
return 1;
else
return 0;
}
int main()
{
int i=1,nr_cuvinte,nr=0;
char sir[103],*cuvant,matrice_de_caractere[103][103];
cin.get(sir,103);
cuvant=strtok(sir," ");
while(cuvant!=0)
{
strcpy(matrice_de_caractere[i],cuvant);
i++;
cuvant=strtok(NULL," ");
}
nr_cuvinte=i;
for(i=1;i<nr_cuvinte;i++)
{
if(vocale(matrice_de_caractere[i])==1)
{
nr++;
break;
}
}
if(nr>=1)
{
for(i=1;i<=nr_cuvinte;i++)
{
if(vocale(matrice_de_caractere[i])==1)
cout<<matrice_de_caractere[i]<<" "<<matrice_de_caractere[i]<<" ";
else
cout<<matrice_de_caractere[i]<<" ";
}
}
else
if(nr==0)
cout<<"nu exista";
return 0;
}

9)Fișierul bac.txt conține un șir de cel mult 106 numere întregi din intervalul [-103,103], separate prin
câte un spațiu. Se cere să se afișeze pe ecran suma minimă obținută adunând numere de pe poziții
consecutive în șirul aflat în fișier. Proiectați un algoritm eficient din punctul de vedere al memoriei
utilizate și al timpului de executare.
Exemplu: dacă fișierul bac.txt conține valorile -4 6 -7 -2 1 -4 10 3 -9 -2 2
se afișează pe ecran numărul -12

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("bac.txt");
int main()
{

int x,sc,scmin;
sc=scmin=0;
f>>x;
sc=x;
while(f>>x)
{
if(sc<0) sc+=x;
else sc=x;
if(sc<scmin)
scmin=sc;
}
cout<<scmin;
}
9)Fişierul bac.in conţine un şir de numere naturale distinctedin intervalul [1,109].
Numerele din şir sunt separate prin câte un spaţiu şi cel puţin trei dintre ele au penultima cifră 2 și
ultima cifră 0.
Se cere să se afișeze pe ecran cele mai mari trei numere din şir cu proprietatea că au penultima cifră 2
și ultima cifră 0
Numerele determinate sunt afişate în ordine crescătoare, separate prin câte un spaţiu.
Proiectați un algoritm eficient din punctul de vedere al memoriei utilizate şi al timpului de executare.
Exemplu: dacă fişierul conţine numerele 9731 50 112 20 8 16 8520 3 2520 1520 pe ecran se vor afişa,
în această ordine, numerele: 1520 2520 8520 a. Scrieți programul C/C++ corespunzător algoritmului
proiectat. (8p.) b.
Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.

#include <iostream>

using namespace std;

int main()

{
int n,i,x=1,sortat,aux;
cout<<"n=";
cin>>n;
int a[n],b[n];
for(i=1; i<=n; i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
for(i=1; i<=n; i++)
if(a[i]%100==20)
{
b[x]=a[i];
x+;
}
do
{
sortat=0;
for(i=1; i<=x; i++)
if(b[i]>b[i+1])
{
aux=b[i];
b[i]=b[i+1];
b[i+1]=aux;
sortat=1;
i=1;
}
}
while(!sortat);
for(i=x-3; i<=x-1; i++)
cout<<b[i]<<" ";
return 0;
}
10)Șirul de mai jos este definit astfel: f1=1, f2=2, fn=3∙fn-1-2∙fn-2 (unde n este un număr natural n≥3).
1, 2, 4, 8, 16, 32....
Se citește de la tastatură un număr natural x (x≤109), valoare a unui termen al șirului dat, şi se cere să
se scrie în fişierul text bac.txt, în ordine descrescătoare, separați prin câte un spațiu, toţi termenii
şirului care sunt mai mici sau egali cu x. Proiectați un algoritm eficient din punctul de vedere al
memoriei utilizate şi al timpului de executare.

#include <iostream>
#include <fstream>
using namespace std;
ofstream g("bac.txt");
int main()
{
int n,x;
cin>>n;
x=2;
if(n<2)
g<<n;
else
{
while(x<=n/2)
x=x*2;
while(x)
{
g<<x<<" ";
x/=2;
}
}
return 0;
}

11)O valoare k polarizează două șiruri dacă există doi termeni care au acea valoare, unul fiind în
primul
șir, iar celălalt în al doilea șir.
Scrieți un program C/C++ care citește de la tastatură numere naturale din intervalul [1,20]: m, n și
elementele unui tablou bidimensional cu m linii și n coloane, cu proprietatea că nu există două
elemente
egale situate pe aceeași linie sau pe aceeași coloană. Programul afișează pe ecran valorile care pot
polariza două șiruri, și anume șirul format din elementele de pe prima coloană, respectiv șirul format
din
elementele ultimei coloane a tabloului.
#include<iostream>

using namespace std;

int n, m, a[21][21], i, j,ok=1;

int main()

cin>>m>>n;

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

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

cin>>a[i][j];

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

for (j=1; j<=m; j++)

if (a[i][1]==a[j][n])

cout<<a[i][1]<<" ";

ok=1;

if (ok==0)

cout<<"nepolarizate";

return 0;

}
12)Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale din intervalul
[2,20], n și k, şi construieşte în memorie un tablou bidimensional cu n∙k linii şi n
coloane, numerotate începând cu 1, astfel încât fiecare coloană i (i ∈[1,n]) memorează
un şir crescător de termeni cu proprietatea că primul termen este i, fiecare valoare apare
în şir de exact k ori și oricare doi termeni alăturați au valori egale sau consecutive.
Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe câte o linie a
ecranului, cu valorile aflate pe aceeaşi linie separate prin câte un spaţiu.
Exemplu: dacă n=4 și k=3, se afişează pe ecran tabloul alăturat.

#include <iostream>

using namespace std;

int main()
{

int n,k,i,j,nk;
cout<<"n=";
cin>>n;

cout<<"k=";
cin>>k;

nk=n*k;

int v[nk];

i=0;
j=0;

while(i<nk)
{

v[i]=n;

j++;
i++;

if (j==k)
{

j=0;

n++;

for (i=0; i<nk; i++)

cout<<v[i]<<" ";

return 0;

Explicație:

Am pus codul in codeblocks. In exemplul tau pentru n=3 si k=4 ai 16 elemente si nu 12 cat ar trebui.

13)Se consideră un text cu cel mult 100 de caractere, în care cuvintele sunt formate numai din litere
mari și mici ale alfabetului englez și sunt separate prin câte un spațiu. Textul reprezintă numele unei
instituții sau al unei organizații.

Scrieți un program care citește de la tastatură un text de tipul precizat și construiește în memorie,
apoi afișează pe ecran, un șir de caractere ce reprezintă acronimul corespunzător numelui citit.
Acronimul este format din primul caracter al fiecărui cuvânt al numelui care începe cu majusculă.
Date de intrare
Programul citește de la tastatură șirul.
Date de ieșire
Programul va afișa pe ecran acronimul construit.
#include <iostream>

#include <string.h>

using namespace std;

char c[100], b[100];

int nr, i;

int main()

cin.getline(c, 100);

for (i = 0; i < strlen(c); i++)

if ((c[i] >= 'A' && c[i] <= 'Z') && ((c[i - 1] == ' ') || i == 0))

b[nr++] = c[i];

cout << b;

return 0;

}
14)Într-un tablou bidimensional, cu elemente având valori numai în mulțimea {0,1}, numim
linii „complementare” două linii cu proprietatea că oricare două elemente ale acestora,
aflate pe aceeași coloană, sunt diferite.
Scrieți un program C/C++ care citește de la tastatură trei numere naturale m, n și k
(m,n[2,20], k[1,m]) și elementele unui tablou bidimensional cu m linii și n coloane,
numere naturale din mulțimea {0,1}. Programul afișează pe ecran mesajul DA dacă există
cel puțin o linie „complementară" cu linia a k-a a acestuia, sau mesajul NU în caz contrar.
Exemplu: pentru m=7, n=3, k=2 și tabloul alăturat se afișează pe ecran mesajul DA.
#include <iostream>

using namespace std;

int a[21][21],m,n,k,ok=0;

int verif(int k,int l)

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

if(a[k][j]==a[l][j])

return 0;

return 1;

void citire()
{

cin>>m>>n>>k;

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

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

cin>>a[i][j];

int main()

citire();

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

if(k!=i)

if(verif(k,i)==1)

ok=1;

if(ok==1) cout<<"DA";

else cout<<"NU";

return 0;

}
15)Subprogramul paritate are doi parametri:
• n, prin care primește un număr natural (n[1,109]);
• nr prin care furnizează numărul de divizori naturali ai lui n cu aceeași paritate ca n.
• Scrieți definiția completă a subprogramului.
Exemplu: dacă n=20, după apel nr=4 (divizorii lui 20 sunt 1, 2, 4, 5, 10, 20).

void paritate(int n, int &nr)

int d;

for(int d=1; d*d<n; d++)

if(n%d==0)

{
if(n%2==d%2)

nr++;

if((n/d)%2==n%2)
nr++;

if(d*d==n && d%2==n%2)

nr++;

16)Fișierul bac.txt conține, în ordine crescătoare, cel mult 106 numere naturale din intervalul [0,109],
separate prin câte un spațiu. Se cere să se afișeze pe ecran, în ordine strict crescătoare, separate prin
câte un spațiu, numerele pare distincte care apar în fișier. Dacă nu există niciun astfel de număr, se
afișează pe ecran mesajul nu exista. Proiectați un algoritm eficient din punctul de vedere al memoriei
utilizate și al timpului de executare.
Exemplu: dacă fișierul conține numerele 5 5 6 7 8 8 8 8 10 15 16 16 25 25 49
pe ecran se afișează, în această ordine, numerele 6 8 10 16
a. Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia. (2p.)
b. Scrieți programul C/C++ corespunzător algoritmului proiectat.

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("bac.txt");

int x,y=-1;

int main()

while(f>>x)

if(x%2==0)

if(x!=y)

cout<<x<<" ";

y=x;

if(y==-1) cout<<"nu exista";

return 0;
}
17)Scrieți un program C/C++ care citește de la tastatură numere naturale din intervalul [0,109], în
această ordine: numerele n și x, apoi cele n elemente ale unui tablou unidimensional. Programul
modifică ordinea valorilor din tablou, astfel încât primele poziții să fie ocupate de mulțimea formată
de
cele care sunt mai mari sau egale cu x, iar următoarele poziții, în continuarea acestora, să fie ocupate
de
mulțimea celorlalte numere. Valorile din aceeași mulțime sunt memorate într-o ordine oarecare.
Elementele tabloului obținut sunt afișate pe ecran, separate prin câte un spațiu, iar dacă una dintre
cele
două mulțimi este vidă, se afișează pe ecran doar mesajul nu exista.

#include<iostream>

using namespace std;

int main()

int n,x,v[1001];

cin>>n>>x;

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

cin>>v[i];

sort(v+1,v+n+1);

if(v[1]>x || v[n]<=x)

cout<<"Nu exista";

else

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

cout<<v[i]<<" ";

return 0;

}
18)Fișierul bac.in conține un șir de cel mult 106 numere naturale din intervalul [0,109], separate prin
câte un spațiu. Se cere să se afișeze pe ecran pozițiile din șir pe care se află termeni precedați de un
număr maxim de valori care au cifra unităților egală cu cifra unităților lor. Numerele afișate sunt
separate
prin câte un spațiu. Proiectați un algoritm eficient din punctul de vedere al timpului de executare.
Exemplu: dacă fișierul bac.in conține numerele 112 12 5 25 88 15 2 19 32 179 35 621
pe ecran se afișează numerele de mai jos (termenii 32, respectiv 35 respectă proprietatea cerută):
9 11
a. Scrieți programul C/C++ corespunzător algoritmului proiectat.
b. Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.

#include <iostream>
#include <fstream>
using namespace std;
int maxim,nr,frecventa1[11],frecventa[11];
int main()
{
ifstream fin("bac.in");
ofstream fout("bac.out");
int x,i;
while(fin>>x)
{
nr++;
frecventa1[x%10]++;
frecventa[x%10]=nr;
if(frecventa1[x%10]>maxim)
maxim=frecventa1[x%10];
}
for(i=0;i<=9;i++)
{
if(frecventa1[i]==maxim)
fout<<frecventa[i]<<" ";
}
fin.close();
fout.close();
return 0;
}

S-ar putea să vă placă și