online: 9; azi: 702; total: 52708 Manual clasa a ix a - Implementarea structurilor de date - Structuri de date

Probleme Rezolvate



Manual clasa a IX a

Implementarea structurilor de date

Structuri de date

Se consideră o matrice pătrată cu elemente numere întregi cu dimensiunea nxn . Numărul n şi elementele matricei se citesc de la tastatură . Să se afişeze :
a) suma elementelor situate deasupra diagonalei principale ;
b) suma elementelor situate sub diagonala secundară ;
c) simetrica matricei faţă de axa verticală care trece prin centrul matricei ,
d) simetrica matricei faţă de axa orizontală care trece prin centrul matricei ,
e) simetrica matricei față de diagonala principală ,
f) simetrica matricei față de diagonala secundară .
a) suma elementelor situate deasupra diagonalei principale ;
Pentru a rezolva această problemă, putem folosi următorii algoritmi:
Pentru a afișa suma elementelor situate deasupra diagonalei principale, putem parcurge matricea de la prima linie până la penultima linie și pentru fiecare linie să parcurgem elementele de la coloana următoare după elementul de pe diagonala principală până la ultima coloană. Adunăm toate elementele găsite și afișăm rezultatul.
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti dimensiunea matricei patrate : " ;
cin >> n;
// declarare matrice si citire elemente
int a[n][n];
cout << " Introduceti elementele matricei:\n" ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cin >> a[i][j];
}
}
// calculare si afisare suma elementelor deasupra diagonalei principale
int sum = 0 ;
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = i + 1 ; j < n; j++) {
sum += a[i][j];
}
}
cout << "Suma elementelor deasupra diagonalei principale este: " << sum << endl ;
return 0 ;
}
Exemplu de intrare:
Introduceti dimensiunea matricei patrate : 4
Introduceti elementele matricei:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Exemplu de ieșire:
Suma elementelor deasupra diagonalei principale este: 27
b) suma elementelor situate sub diagonala secundară ;
Pentru a calcula suma elementelor sub diagonala secundară putem folosi următorul algoritm:
# include < iostream >
using namespace std ;
int main ()
{
int n, sum = 0 ;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int a[n][n];
cout << " Introduceti elementele matricei: " << endl ;
for ( int i = 0 ; i < n; i++)
{
for ( int j = 0 ; j < n; j++)
{
cin >> a[i][j];
}
}
// calculam suma elementelor sub diagonala secundara
for ( int i = 0 ; i < n; i++)
{
for ( int j = 0 ; j < n; j++)
{
if (i + j >= n + 1 )
{
sum += a[i][j];
}
}
}
cout << "Suma elementelor sub diagonala secundara este: " << sum << endl ;
return 0 ;
}
Exemplu de input/output:
Introduceti dimensiunea matricei: 3
Introduceti elementele matricei:
1 2 3
4 5 6
7 8 9
Suma elementelor sub diagonala secundara este: 9
Pentru a obține simetrica matricei față de axa verticală care trece prin centrul matricei, trebuie să interschimbăm elementele aflate pe aceleași coloane, dar situate la distanță egală față de centrul matricei.
Pentru a afla centrul matricei, putem folosi formula (n-1)/2 , unde n este dimensiunea matricei pătrate.
Pentru a interschimba elementele de pe aceleași coloane, dar situate la distanță egală față de centrul matricei, putem utiliza două variabile de iterație, i și j , care vor parcurge matricea doar pentru a doua jumătate a coloanelor (de la centrul matricei până la marginea dreaptă).
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int matrice[n][n];
cout << " Introduceti elementele matricei: " << endl ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cin >> matrice[i][j];
}
}
// Calculam centrul matricei
int centru = (n -1 ) / 2 ;
// Interchimbam elementele de pe aceleasi coloane, situate la distanta egala fata de centrul matricei
for ( int i = 0 ; i < n; i++) {
for ( int j = centru+ 1 ; j < n; j++) {
int temp = matrice[i][j];
matrice[i][j] = matrice[i][centru - (j - centru)];
matrice[i][centru - (j - centru)] = temp ;
}
}
// Afisam matricea simetrica
cout << "Matricea simetrica fata de axa verticala care trece prin centrul matricei este: " << endl ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cout << matrice[i][j] << " " ;
}
cout << endl ;
}
return 0 ;
}
Pentru a verifica dacă o matrice este simetrică față de axa orizontală care trece prin centrul matricei, trebuie să comparăm elementele matricei aflate de o parte și de alta a acestei axe. De exemplu, dacă matricea are dimensiunea 3x3, trebuie să comparăm elementele a[0][0] și a[2][0], a[0][1] și a[2][1], a[0][2] și a[2][2], a[1][0] și a[1][2], și a[1][1] cu el însuși (deoarece se află pe axa de simetrie).
Pentru a implementa acest lucru în cod, putem utiliza o buclă pentru a parcurge doar jumătatea de sus a matricei (adică liniile 0 până la n/2) și o altă buclă imbricată care parcurge jumătatea de jos a matricei (liniile n/2 până la n). Vom compara elementele simetrice folosind indicii corespunzători (de exemplu, a[i][j] și a[n-i-1][j]) și vom folosi o variabilă booleană pentru a verifica dacă matricea este simetrică față de axa orizontală.
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int a[n][n];
cout << " Introduceti elementele matricei: " << endl ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cin >> a[i][j];
}
}
bool simetrica = true ;
for ( int i = 0 ; i < n/ 2 ; i++) {
for ( int j = 0 ; j < n; j++) {
if (a[i][j] != a[n-i -1 ][j]) {
simetrica = false ;
break ;
}
}
}
if (simetrica) {
cout << "Matricea este simetrica fata de axa orizontala care trece prin centrul matricei." << endl ;
} else {
cout << "Matricea nu este simetrica fata de axa orizontala care trece prin centrul matricei." << endl ;
}
return 0 ;
}
Pentru a verifica dacă o matrice este simetrică față de diagonala principală, putem parcurge doar jumătatea matricei (partea de deasupra diagonalei principale sau partea de sub diagonala principală) și verifica dacă elementele de pe pozițiile [i][j] și [j][i] sunt egale, pentru orice i și j.
# include < iostream >
using namespace std ;
const int MAX = 100 ;
int main () {
int n, a[MAX][MAX];
// Citire matrice
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
cout << " Introduceti elementele matricei:\n" ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cin >> a[i][j];
}
}
// Verificare simetrie față de diagonala principală
bool simetrica = true ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < i; j++) {
if (a[i][j] != a[j][i]) {
simetrica = false ;
break ;
}
}
if (!simetrica) {
break ;
}
}
// Afisare rezultat
if (simetrica) {
cout << "Matricea este simetrica fata de diagonala principala.\n" ;
} else {
cout << "Matricea nu este simetrica fata de diagonala principala.\n" ;
}
return 0 ;
}
Exemplu de rulare:
Introduceti dimensiunea matricei: 4
Introduceti elementele matricei:
1 2 3 4
2 5 6 7
3 6 8 9
4 7 9 0
Matricea nu este simetrica fata de diagonala principala.
Pentru a verifica dacă matricea este simetrică față de diagonala secundară, trebuie să verificăm dacă elementele matricei în afara diagonalei secundare ( adica elementele a[i][j] pentru i + j != n + 1) sunt egale cu elementele corespunzătoare simetrice lor fata de diagonala secundară ( adica a[j][i]).
Astfel, putem folosi două bucle for pentru a parcurge matricea, iar în fiecare iterație verificăm dacă a[i][j] este egal cu a[n-j+1][n-i+1]. Dacă toate perechile de elemente corespunzătoare sunt egale, atunci matricea este simetrică față de diagonala secundară.
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int a[n+ 1 ][n+ 1 ];
cout << " Introduceti elementele matricei: " << endl ;
for ( int i = 1 ; i <= n; i++) {
for ( int j = 1 ; j <= n; j++) {
cin >> a[i][j];
}
}
// verificare simetrie fata de diagonala secundara
bool simetrica_ds = true ;
for ( int i = 1 ; i <= n; i++) {
for ( int j = 1 ; j <= n; j++) {
if (i + j != n + 1 && a[i][j] != a[n-j+ 1 ][n-i+ 1 ]) {
simetrica_ds = false ;
break ;
}
}
if (! simetrica_ds ) {
break ;
}
}
if ( simetrica_ds ) {
cout << "Matricea este simetrica fata de diagonala secundara." << endl ;
} else {
cout << "Matricea nu este simetrica fata de diagonala secundara." << endl ;
}
return 0 ;
}