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 şi m(2≤m≤102≤n≤10) şi care construieşte în memorie şi apoi afişează o matrice cu linii (numerotate de la la n) şi coloane (numerotate de la la m) cu proprietatea că fiecare element Aij memorează cea mai mică dintre valorile indicilor şi (1≤i≤n1≤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 mult 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 (n999) ş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:– un tablou unidimensional cu cel mult 100 de componente ce memorează numere întregi cu cel mult cifre;– 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;– un număr întreg cu cel mult cifre.Subprogramul sub returnează numărul componentelor tabloului primit prin intermediul parametrului ale căror valori sunt egale cu valoarea parametrului a.

Exemplu: pentru valorile n=5v=(1,21,9,21,403)a=21 ale parametrilor, în urma apelului, subprogramului sub 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≤100) şi numere întregi, fiecare având cel mult cifre, şi care, folosind apeluri utile ale subprogramului sub, să afişeze pe ecran mesajul DA dacă oricare două dintre cele numere citite sunt distincte două câte două, sau mesajul NU în caz contrar.

Exemplu: pentru n=6 şi cele 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 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 numerele naturale 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 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, 131 sunt numere prime.

a) Scrieţi definiţia completă a unui subprogram f, cu un parametru, subprogram care:- primeşte prin intermediul parametrului un număr natural cu cel mult cifre (a>1)- returnează suma exponenţilor divizorilor primi din descompunerea în factori primi a valorii parametrului a.Exemplu: pentru a=90 subprogramul 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 n2≤n≤99, şi care determină şi afişează pe ecran, folosind apeluri utile ale subprogramului f, mesajul DA dacă este un număr extraprim, 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 (2≤n≤24) şi construieşte în memorie o matrice cu linii şi 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 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 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 un număr natural cu cel mult cifre şi prin intermediul parametrului o cifră; subprogramul returnează numărul de apariţii ale cifrei î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 cifb) Scrieţi un program C/C++ care citeşte de la tastatură un număr natural cu cel mult 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 (2≤n≤24) şi construieşte în memorie o matrice cu linii şi 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;
}
}