Proiect la informatica
Semestrul I
Matrice patratica, diagonala principala, diagonala secundara:
Matrice patratica:
O matrice care are numarul de linii egal cu numarul de coloane se numeste o matrice patratica.
Intrucat numarul de linii este egal cu numarul coloanelor in matiricile patratice apar 2 notiuni importante:
diagonala principala si diagonala secundara.
* Diagonala principala este formata din elementele unei matrici patratice aflate pe pozitiile in care indicele liniei
este egal cu cel al coloanei (i=j), adica a[i][i]. Spre exemplu in matricea patratica a[3][3], elementele aflate pe
diagonala principala sunt a[1][1]; a[2][2] si a[3][3].
* Diagonala secundara este formata din elementele unei matrici patratice aflate pe pozitiile in care i+j=n+1, mai
exact a[i][n-i+1]. Spre exemplu in matricea patratica a[3][3], elementele aflate pe diagonala principala sunt a[1][3];
a[2][3] si a[3][1].
Notiuni pentru diagonal principala:
1. Afisarea elementelor de pe diagonala principala (secventa):
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if (i==j) cout<<a[i] [j]<<" "; // afisare elemente de pe diagonala principala
cout<<endl;
2. Parcurgerea matricei sub diagonala principala (secventa) :
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
if ( i > j )cout<< a[i] [j]<<" ";
cout<<endl;
3. Parcurgerea unei matrice deasupra diagonalei principale :
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
if ( i < j )cout<< a[i] [j]<<" ";
cout<<endl;
Notiuni pentru diagonala secundara:
1. Afisarea elementelor de pe diagonala secundara (secventa) :
for ( i=1; i<=n; i++)
for ( j=1; j<=n; j++)
if ( j==n+1-i) cout<<a[i] [j]<<" ";
cout<<endl;
2. Parcurgerea matricei deasupra diagonalei secundare
(secventa) :
for( i=1; i<=n-1; i++)
for( j=1; j<=n-i; j++)
cout<<a[i] [j]<<" ";
cout<<endl;
3. Parcurgerea matricei sub diagonala secundara (secventa) :
for ( i=2 ; i<=n; i++)
for ( j=n-i+2 ; j<=n; j++)
cout<<a[i][j]<<" ";
cout<<endl;
Probleme de tip BAC:
1) Sesiune iulie 2017, II problema 5:
Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale din intervalul [3,50], n şi m, și elementele unui
tablou bidimensional cu n linii şi m coloane, numere naturale din intervalul [0,104]. Programul modifică în memorie tabloul dat,
atribuind valoarea elementului aflat pe ultima linie și pe ultima coloană a tabloului fiecărui element aflat pe conturul acestuia (pe
prima linie, ultima linie, prima coloană, ultima coloană), apoi afişează pe ecran tabloul modificat, câte o linie a tabloului pe câte o
linie a ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu.
Rezolvare:
int main(){
unsigned int n, m;
unsigned int matrice[50][50];
cin >> n >> m;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> matrice[i][j];
unsigned int ultimulElement = matrice[n - 1][m - 1];
for(int i = 0; i < n; i++) {
matrice[0][i] = ultimulElement;
matrice[n - 1][i] = ultimulElement;
for(int i = 0; i < n; i++){
matrice[i][0] = ultimulElement;
matrice[i][m - 1] = ultimulElement; }
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cout << matrice[i][j] << " "; }
cout << "n"; }
return 0; }
2) Sesiunea august 2017, II problema 5:
Scrieti un program C/C++ care citeste de la tastatura un numar natural par n care apartine intervalului [2 , 50] si elementele
unui tablou bidimensional cu n linii si n coloane, numere reale, apoi transforma tabloul in memorie, inserand o linie noua, la mijlocul
sau, valoarea fiecarui element al acesteia fiind egala cu media aritmetica a elementelor aflate pe coloana corespunzatoare lui in
tabloul citit.
Rezolvare:
#include <iostream>
using namespace std;
int main() {
int n,i,j;
float m[50][50];
cin>>n;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin>>m[i][j];
for (i = 0; i < n; i++) {
float suma = 0;
for (j = 0; j < n; j++)
suma += m[j][i];
for (j = n; j > n/2; j--)
m[j][i] = m[j - 1][i];
m[n/2][i] = suma/n; }
for (i = 0; i < n + 1; i++) {
for (j = 0; j < n; j++)
cout<<m[i][j]<<" ";
cout<<'n'; }
return 0; }
3) BAC 2017 Informatica iunie-iulie (SN) – Subiectul al III-lea problema 3
Rezolvare:
#include <iostream>
using namespace std;
int main(){
int n,v[51],i,j;
cin>>n;
for (i = 1; i <= n; i++)
cin>>v[i];
for (i = 1; i < n; i++)
for (j = i + 1; j <= n; j++)
if (v[i] < v[j] && v[i]*v[j] != 0){
int aux = v[i];
v[i] = v[j];
v[j] = aux; }
for (i = 1; i <= n; i++)
cout<<v[i]<<" ";
return 0; }
4) BAC 2017 Informatica august-septembrie (SN) – Subiectul al III-lea problema 3
Rezolvare:
#include <iostream>
using namespace std;
int main() {
int n,i;
float v[51];
cin>>n;
for (i = 0; i < n; i++)
cin>>v[i];
float suma = 0;
for (i = 0; i < n; i++)
suma += v[i];
for (i = n; i > n/2; i--)
v[i] = v[i - 1];
v[n/2] = suma/n;
for (i = 0; i < n + 1; i++)
cout<<v[i]<<" ";
return 0; }
5) BAC 2016, Real, II 5
Scrieţi un program C/C++ care citeşte de la tastatură un număr natural, n (n∈[2,102]), şi construieşte în memorie un
tablou bidimensional, cu n linii şi n coloane, astfel:
• prima coloană conţine, în ordine strict crescătoare, numerele naturale din intervalul [1,n];
• toate elementele ultimei linii au valoarea n;
• oricare alt element este obţinut prin însumarea celor două elemente vecine cu el, aflate pe coloana anterioară, unul pe aceeaşi
linie cu el, iar celălalt pe linia următoare.
Programul afişează pe ecran tabloul obţinut, fiecare linie a tabloului pe câte o linie a ecranului, elementele fiecărei linii fiind separate
prin câte un spaţiu.
REZOLVARE:
#include <iostream>
using namespace std;
int main() {
int n; // Initializare si citire numar n
cout << "n = ";
cin >> n;
int a[n][n]; // Initializare matrice de n*n
for(int i=0; i<n; i++) a[i][0] = i+1; // Prima coloana in ordine crescatoare
for(int i=1; i<n; i++) a[n-1][i] = n; // Ultima linie sa fie numai n
for(int j=1; j<n; j++) // Luam fiecare coloana ramasa
for(int i=0; i<n-1; i++) // Luam apoi fiecare rand ramas
a[i][j] = a[i][j-1] + a[i+1][j-1]; // elementul de pe pozitia i, j devine elementul din stanga elementul din stanga de pe randul urmator
// Afisare matrice rezultata
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cout << a[i][j] << " ";
if(j == n-1) cout << "n"; } }
return 0' }