Salve, potete aiutarmi con questo esercizio?
Si realizzino le seguenti funzioni:
1. sommeCrescenti che riceve una matrice A di dimensioni n*m, e due interi n ed m. e restituisce true se, per ogni riga, la somma degli elementi è minore della somma degli elementi della riga successiva, false altrimenti. Più formalmente, restituisce true se per ogni i appartenente all'intervallo [0, n-1], la somma degli elementi presenti sulla riga di indice i è minore della somma degli elementi presenti sulla riga di indice i+1, false altrimenti.
2. annullaDuplicati che riceve una matrice A di dimensioni n*m, e due interi n ed m, e restituisce una matrice M di uguali dimensioni. In particolare, l'elemento M[j] sarà uguale a A[j] se il valore di A[j] non è presente in nessun altro elemento sulla colonna j di A; in caso contrario, M[j] sarà uguale a 0.
3. Un metodo main nel quale:
a. si crea una matrice di interi M di dimensioni n*m, con n ed m scelti a piacere;
b. si invocano opportunamente le funzioni definite ai punti 1 e 2 passando come input la matrice M e gli interi n ed m;
c. si stampano gli output delle funzioni invocate.
#include <iostream>
using namespace std;
bool sommeCrescenti (int** A, int n, int m)
{
for (int i=0; i<n-1; i++)
{
int somma = 0;
int somma_successiva = 0;
for (int j=0; j<m; j++)
{
somma += A[i][j];
somma_successiva += A[i+1][j];
}
if (somma >= somma_successiva)
return false;
}
return true;
}
int** annullaDuplicati(int** A, int n, int m)
{
int** M = new int*[n];
for (int i=0; i<n; i++)
M[i] = new int[m];
for (int j=0;j<m;j++)
{
for (int k=0;k<n;k++)
{
for (int i=0;i<m;i++)
{
if (A[k][j]==A[i][j]&&k!=i)
{
M[i][j]=0;
}
if (A[k][j]!=A[i][j]&&k!=i)
M[i][j]=A[i][j];
}
}
}
return M;
}
int main()
{
int n, m;
cout << "inserire il numero di righe: ";
cin >> n;
cout << endl << "inserire il numero di colonne: ";
cin >> m;
int** A = new int*[n];
for (int i=0; i<n; i++)
A[i] = new int [m];
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
{
cout << "inserire elemento ["<<i<<"]["<<j<<"] :";
cin >> A[i][j];
}
if (sommeCrescenti)
cout << "tutte le righe hanno somma maggiore di quella precedente" << endl;
else
cout << "non tutte le righe hanno somma maggiore di quella precedente" << endl;
int** M = annullaDuplicati(A, n, m);
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
cout << M[i][j] << " ";
cout << endl;
}
}
questo è ciò che sono riuscita a scrivere, ma c'è un errore nella funzione annullaDuplicati, perché quando stampo su video il suo return le prime due righe sono corrette, quindi supponendo di avere una matrice A di partenza
A = 2 3 5 2 1
3 2 4 5 1
6 1 6 2 1
1 5 3 7 1
1 6 5 5 3
mi aspetto di ottenere
A = 2 3 5 0 0
3 2 4 0 0
6 1 6 0 0
0 5 3 7 0
0 6 0 0 3
ma invece ottengo
2 3 0 2 1
3 2 4 0 1
6 1 6 2 1
0 5 3 7 1
0 6 5 5 3.