Problema con annullaDuplicati

di il
1 risposte

Problema con annullaDuplicati

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.

1 Risposte

  • Re: Problema con annullaDuplicati

    
        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;
    
    1) studia bene come si chiamano le funzioni e, in generale, la sintassi di un linguaggio prima di affrontare gli esercizi
    2) è importante testare tutti i rami di un if (è già la seconda volta che non lo fai), altrimenti dai per buone funzioni che magari non lo sono
    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
    La risposte ti era già stata data nell'altro thread - la traduzione in codice è questa ma avresti dovuto farlo tu
    
    int** annullaDuplicati(int** A, int n, int m)
    {
        int i, ** M = new int*[n];
        for (i=0; i<n; i++)
            M[i] = new int[m]{0};
    
        for (int j=0;j<n;j++)
            for (int k=0;k<m;k++){
                i = 0;
                for (int l=0;l<n;l++)
                    if(A[j][k] == A[l][k])
                        i++;
                if(i < 2)
                    M[j][k] = A[j][k];
        }
        return M;
    }
    
    La matrice che ti aspetti di ottenere non è quella che richiede l'esercizio
Devi accedere o registrarti per scrivere nel forum
1 risposte