[C++] Esercizio matrici

Messaggioda Quasar3.14 » 01/11/2021, 16:15

Salve ho un problema con il seguente esercizio. Devo calcolare la somma di tutti i valori delle diagonali parallele alla diagonale secondaria di una matrice. Dopodichè devo stampare il valore della diagonale maggiore.
Esempio:

1 2 3 4
5 6 7 8
10 11 12 13

In questo caso la diagonale con i valori più alti è quella con 11+7+4 =22

Il codice che ho scritto penso sia errato in quanto mi restituisce valori errati. Cosa mi sfugge?
Grazie


Codice:
//Scansione Matrice. Massimo diagonale.

#include<iostream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
const int num = 3;
int main()
{
   int somma;
   int matrice[num][num];
   int i, j;
   int somma, massimo;

   cout << "Inserisci valori della matrice: " << endl;
   for (i = 0; i < num; i++)
   {
      for (j = 0; j < num; j++)
      {
         cout << "Inserisci valore: " << "[" << i << "]" << "[" << j << "]" << "  ";
         cin >> matrice[i][j];
      }
   }

   cout << endl << endl;

   for (i = 0; i < num; i++)
   {
      for (j = 0; j < num; j++)
      {
         cout << setw(4) << matrice[i][j];
      }
      cout << endl;
   }
   massimo = 0;
   somma = 0;
   for (int d = 0; d < num; d++)
   {
      for (i = d, j = 0; i >= 0, j < num; i--, j++)
      {
         somma += matrice[i][j];
      }
      if (somma > massimo)
      {
         massimo = somma;
      }
   }
   
   for (int d = 1; d < num; d++)
   {
      for (j = d, i = num - 1; j < num, i > 1; j++, i--)
      {
         somma += matrice[i][j];
      }
      if (somma > massimo)
      {
         massimo = somma;
      }
   }

   cout << massimo;
}
Quasar3.14
Junior Member
Junior Member
 
Messaggio: 45 di 159
Iscritto il: 13/11/2016, 23:00

Re: [C++] Esercizio matrici

Messaggioda apatriarca » 02/11/2021, 08:33

Le condizioni dei cicli sono sbagliate. Quando due espressioni sono separate da una virgola solo la seconda espressione contribuisce al valore restituito. Quindi i >= 0, j < num è del tutto equivalente a j < num. La condizione andava scritta i >= 0 && j < num. Lo stesso vale per j < num, i > 1 che andava scritta come j < num && i > 1. Non ho controllato la logica del programma ma questo è sicuramente un errore.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5612 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C++] Esercizio matrici

Messaggioda vict85 » 02/11/2021, 12:47

I problemi erano molti. In particolare l'idea di usare due cicli non avrebbe mai funzionato. Inoltre dovresti riazzerare somma quando cambi diagonale oppure finirai per calcolare la somma di tutta la matrice. Ci sono altre cose che ho corretto:

Codice:
#include <iostream>
#include <iomanip>
#include <cstdlib>  // questa e' lo stile del c++ per le librerie c, togliere .h e mettere c prima

using namespace std;

int
main( )
{
    // non ha bisogno di essere definito al di fuori del main.
    // sostituito const con constexpr perche' e' quello che davvero intendevi
    constexpr int num = 3;
    // scrivere tutto all'inizio non e' lo stile del c++
    int matrice[ num ][ num ];

    // lo spazio dopo i : e' inutile se poi vai a capo
    cout << "Inserisci valori della matrice:" << endl;
    // definisco i direttamente nel ciclo for
    for ( int i = 0; i < num; i++ )
    {
        // definisco j direttamente nel ciclo for
        for ( int j = 0; j < num; j++ )
        {
            // aggiunto un = perche' ritengo ci sia bene
            cout << "Inserisci valore: [" << i << "][" << j << "] = ";
            cin >> matrice[ i ][ j ];
        }
    }

    cout << endl << endl;
    // definisco i direttamente nel ciclo for
    for ( int i = 0; i < num; i++ )
    {
        // definisco i direttamente nel ciclo for
        for ( int j = 0; j < num; j++ )
        {
            cout << setw( 4 ) << matrice[ i ][ j ];
        }
        cout << endl;
    }

    // ora e' il momento di definire massimo e somma
    int massimo = 0;
    for ( int d = 0; d < num; d++ )
    {
        // definisco i e j fuori per maggiore chiarezza
        int i = num - 1;
        int j = d;
        // somma va sempre riazzerata
        int somma = 0;
        for ( ; i >= 0; i--, j++ )
        {
            if ( j == num )
            {
                j = 0;
            }

            somma += matrice[ i ][ j ];
        }
        if ( somma > massimo )
        {
            massimo = somma;
        }
    }

    cout << massimo;
}


Tra l'altro il tuo esempio è una 3x4 mentre il codice accetta solo 3x3...

Volendo potevi anche sommare le diagonali in un array e poi trovare il massimo nell'array.
vict85
Moderatore
Moderatore
 
Messaggio: 10532 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Esercizio matrici

Messaggioda Quasar3.14 » 02/11/2021, 18:53

Grazie ragazzi, adesso studio le vostre spiegazioni.
Quasar3.14
Junior Member
Junior Member
 
Messaggio: 46 di 159
Iscritto il: 13/11/2016, 23:00

Re: [C++] Esercizio matrici

Messaggioda Quasar3.14 » 05/11/2021, 16:02

vict85 ha scritto:I problemi erano molti. In particolare l'idea di usare due cicli non avrebbe mai funzionato. Inoltre dovresti riazzerare somma quando cambi diagonale oppure finirai per calcolare la somma di tutta la matrice.


Vict85 stavo rileggendo il tuo codice, è chiarissimo grazie anche ai commenti che hai scritto. Ho solo un dubbio, il ciclo for che hai scritto come fa a leggere tutte le diagonali? Mi spiego, ho provato a disegnare la matrice su un foglio e studiare la diminuzione e aumento degli indici per vedere in che modo lavora.
Il ciclo parte dall'ultima colonna della prima riga per poi poi spostarsi nelle celle successive della diagonale. Dopodichè passa alla diagonale parallela e così via...ma in questo modo non dovrebbe controllare solo le diagonali del triangolo inferiore della matrice? Quando inizia a controllare le diagonali del triangolo superiore?

Cerco di spiagarmi con un esempio di una matrice generica 4x4


0 1 2 3
4 5 6 7
8 9 2 1
0 2 4 6

Da quel che ho capito il codice inizia leggendo la matrice formata dai numeri 3-6-9-0, dopichè passa alla diagonale 7-2-2 e così via. Ma quando controlla, ad esempio, la diagonale 2-5-8?
Grazie ancora per l'aiuto.
Quasar3.14
Junior Member
Junior Member
 
Messaggio: 47 di 159
Iscritto il: 13/11/2016, 23:00

Re: [C++] Esercizio matrici

Messaggioda vict85 » 05/11/2021, 16:08

Quando \(j\) arriva a \(4\) ritorna a \(0\) (prima di leggere il valore). Quindi la seconda diagonale è 2-2-7-(0) dove l'ultimo 0 è lo zero in alto a sinistra. La terza fa 4-1-(4)-(1) e la quarta è 6-(8)-(5)-(2) dove ho messo tra parentesi le cose lette sopra la prima diagonale.
vict85
Moderatore
Moderatore
 
Messaggio: 10536 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Esercizio matrici

Messaggioda vict85 » 05/11/2021, 16:09

Puoi anche togliere l'if e dividere in due cicli se ti è più chiaro (ma i due cicli devono stare dentro il ciclo per d e prima di controllare la somma).
vict85
Moderatore
Moderatore
 
Messaggio: 10537 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Esercizio matrici

Messaggioda Quasar3.14 » 05/11/2021, 16:32

vict85 ha scritto:Quando \(j\) arriva a \(4\) ritorna a \(0\) (prima di leggere il valore). Quindi la seconda diagonale è 2-2-7-(0) dove l'ultimo 0 è lo zero in alto a sinistra. La terza fa 4-1-(4)-(1) e la quarta è 6-(8)-(5)-(2) dove ho messo tra parentesi le cose lette sopra la prima diagonale.



Ok, però in questo modo non somma valori di diagonali differenti?


Inserisci valori della matrice:
Inserisci valore: [0][0] = 1
Inserisci valore: [0][1] = 12
Inserisci valore: [0][2] = 9
Inserisci valore: [1][0] = 10
Inserisci valore: [1][1] = 8
Inserisci valore: [1][2] = 14
Inserisci valore: [2][0] = 6
Inserisci valore: [2][1] = 11
Inserisci valore: [2][2] = 0


1 12 9
10 8 14
6 11 0
26 (il valore massimo dovrebbe essere 25) Esce 26 in quanto ha sommato a 11 + 14 il numero 1 in alto a sinistra.
Quasar3.14
Junior Member
Junior Member
 
Messaggio: 48 di 159
Iscritto il: 13/11/2016, 23:00

Re: [C++] Esercizio matrici

Messaggioda vict85 » 06/11/2021, 01:34

Suppongo dipenda da come hai definito la diagonale di una matrice. Insomma, se la hai definita come dici tu allora andava bene con il doppio ciclo. Però il resto dei commenti è ancora valido.
vict85
Moderatore
Moderatore
 
Messaggio: 10538 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite