PROBLEMA esercizio con matrici c++

dialessluca

Nuovo Utente
6
0
Salve, potete aiutarmi con questo esercizio? Allego ciò che sono riuscita a fare, ma arrivata a un certo punto mi blocco e non so più come continuare

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.


C++:
#include <iostream>
using namespace std;

bool sommeCrescenti (int** A, int n, int m)
{
   
    for (int i=0; i<n; 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 = new int[m];

}
 
Ultima modifica da un moderatore:

Andretti60

Utente Èlite
6,440
5,091
La prima parte ha due errori. Primo, non devi fate il confronto dell’ultima riga, in quanto non c’è nessuna riga successiva ad essa (ti basta cambiare la condizione del ciclo). Secondo, la tua funzione ritorna False se la summa di una riga è più grande di quella della riga successiva. Cosa succede se fosse uguale? Leggi bene quello che è richiesto nel testo dell!esercizio.

Per la seconda parte, non ci siamo anche dal poco che hai scritto. La nuova matrice la devi dichiarare una volta, non certo all’interno di un ciclo. Visto il testo dell’esercizio, in questo caso è meglio avere il ciclo esterno sulle colonne anziché per righe.

Ti consiglio di scrivere il main e la funzione che stampa la matrice, almeno puoi accertarti che i risultati siano corretti.
 

dialessluca

Nuovo Utente
6
0
La prima parte ha due errori. Primo, non devi fate il confronto dell’ultima riga, in quanto non c’è nessuna riga successiva ad essa (ti basta cambiare la condizione del ciclo). Secondo, la tua funzione ritorna False se la summa di una riga è più grande di quella della riga successiva. Cosa succede se fosse uguale? Leggi bene quello che è richiesto nel testo dell!esercizio.

Per la seconda parte, non ci siamo anche dal poco che hai scritto. La nuova matrice la devi dichiarare una volta, non certo all’interno di un ciclo. Visto il testo dell’esercizio, in questo caso è meglio avere il ciclo esterno sulle colonne anziché per righe.

Ti consiglio di scrivere il main e la funzione che stampa la matrice, almeno puoi accertarti che i risultati siano corretti.
va bene, grazie mille
 

dialessluca

Nuovo Utente
6
0
La prima parte ha due errori. Primo, non devi fate il confronto dell’ultima riga, in quanto non c’è nessuna riga successiva ad essa (ti basta cambiare la condizione del ciclo). Secondo, la tua funzione ritorna False se la summa di una riga è più grande di quella della riga successiva. Cosa succede se fosse uguale? Leggi bene quello che è richiesto nel testo dell!esercizio.

Per la seconda parte, non ci siamo anche dal poco che hai scritto. La nuova matrice la devi dichiarare una volta, non certo all’interno di un ciclo. Visto il testo dell’esercizio, in questo caso è meglio avere il ciclo esterno sulle colonne anziché per righe.

Ti consiglio di scrivere il main e la funzione che stampa la matrice, almeno puoi accertarti che i risultati siano corretti.

C++:
#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 = 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.
 
Ultima modifica da un moderatore:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili