Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di francesco.ricca
    Registrato dal
    Feb 2018
    residenza
    Napoli
    Messaggi
    13

    [C++]Programma che ricerchi il massimo sopra la diagonale principale

    Salve a tutti,
    mi presento, sono Francesco e sono uno studente d'ingegneria che si avvicina all'esame di programmazione in C++.
    Seguo da un po' il forum e siccome mi sto appassionando alla materia ho deciso di iscrivermi per confrontarmi con voi

    Vado dritto al punto: sto provando a sviluppare un programma che mi dia il massimo dei valori sopra la diagonale principale di una matrice quadrata.
    Il codice da me sviluppato è il seguente:
    codice:
    using namespace std;
    #include <iostream>
    #include <stdlib.h>
    
    
    
    
    int max(int mat[50][50],int N){
        
        int i,j;
        int max=0;
        
        while(i!=j || j>i) {
            
            for (i=0;i<N-1;i++){
                    max=mat[i][1];
                    for(j=2;j<N;j++){
                
                    if(max<mat[i][j]){
                        max=mat[i][j];
                    }
                }
            }
            
        
    }
        return max;
    }
    
    
    
    
    int main(){
        
        int mat[50][50];
        int i,j,N;
        
        cout<<"inserire il numero di righe e colonne della matrice:";
        cin>>N;
        
        for (i=0;i<N;i++){
            for(j=0;j<N;j++){
                cout<<"inserire i valori:";
                cin>>mat[i][j];
            }
        }
        
        cout<<"il massimo e'"<<max(mat,N);
        
        
        return 0;
    }
    Penso ci sia un errore di tipo logico nella mia funzione, ho ragionato disegnando su foglio una matrice 3x3 ed ho notato che affinché gli elementi siano sopra la diagonale principale è necessario che i sia diverso da j e che j sia maggiore di i.
    A questo punto (supponendo sia valida la mia impostazione del while), credo di aver sbagliato qualcosa nel ciclo for, ma ahimè non riesco proprio a trovare il mio errore.
    Qualcuno potrebbe aiutarmi?
    Vi ringrazio in anticipo

  2. #2
    Non è chiara la logica di quel codice. Innanzitutto i e j vengono inizializzate a valori random così com'è scritto. Per cui quel while può andare in tutti i modi possibili e in maniera casuale.

    Poi il while come ciclo di controllo non controlla un granchè, visto che i due for comunque completano i rispettivi cicli, al termine dei quali i e j avranno sempre gli stessi valori. Cioè i sarà pari a N-1 e j a N.

    Inoltre, trattandosi di una matrice quadrata, la soluzione è semplicissima. Ovvero devi considerare tutti e soli gli elementi che hanno gli stessi valori della riga e della colonna.

    Cioè

    codice:
    for (i=0; i<N; i++)
        if (max < mat[i][i]) max = mat[i][i];
    Tutto qui.

    Se la matrice fosse stata rettangolare ( MxN ), quel i<N sarebbe diventato i < minimo tra N e M.

  3. #3
    Utente di HTML.it L'avatar di francesco.ricca
    Registrato dal
    Feb 2018
    residenza
    Napoli
    Messaggi
    13
    forse non mi sono espresso bene, l'esercizio non richiede il massimo sulla diagonale principale, ma il massimo degli elementi posti SOPRA ad essa (per questo le condizioni del while).

    Il while andrebbe posto nel ciclo a questo punto?

    ipotizzando la matrice 3x3, gli elementi di cui vuole il massimo sarebbero:

    - x x
    - - x
    - - -
    supponendo la matrice sia
    1 2 3
    4 5 6
    7 8 9
    dovrebbe restituirmi 6 per intenderci da qui la logica dell' i diverso da j e j>i.
    Ultima modifica di francesco.ricca; 08-02-2018 a 13:23
    "Chi dice che è impossibile non dovrebbe disturbare chi c'è la sta facendo."
    -Albert Einstein

  4. #4
    Utente di HTML.it L'avatar di francesco.ricca
    Registrato dal
    Feb 2018
    residenza
    Napoli
    Messaggi
    13
    chiedo scusa per il doppio messaggio, sto prendendo "la mano" col forum.

    Quote Originariamente inviata da paolino_delta_t Visualizza il messaggio
    Inoltre, trattandosi di una matrice quadrata, la soluzione è semplicissima. Ovvero devi considerare tutti e soli gli elementi che hanno gli stessi valori della riga e della colonna.

    Cioè

    codice:
    for (i=0; i<N; i++)
        if (max < mat[i][i]) max = mat[i][i];
    Tutto qui.

    Se la matrice fosse stata rettangolare ( MxN ), quel i<N sarebbe diventato i < minimo tra N e M.
    "Chi dice che è impossibile non dovrebbe disturbare chi c'è la sta facendo."
    -Albert Einstein

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Alcuni consigli:
    1) Come ti ha già suggerito anche paolino_delta_t: ricorda di inizializzare sempre le variabili (è una buona regola da tenere a mente)

    codice:
    int i,j;
    i = j = 0;

    2) max non va inizializzata a 0: se per sfortuna hai una matrice composta solo di valori negativi (o, comunque, se la diagonale superiore fosse composta solo di numeri negativi) il tuo "max" sarebbe sempre maggiore di qualunque valore, inficiando il risultato della funzione. La variabile max andrebbe inizializzata al primo valore che vai a "leggere" dalla matrice

    codice:
    max = mat[0][0];

    3) Il while è perfettamente inutile: si può fare tutto il lavoro usando semplicemente i due for annidati: pensaci.

    4) La prima istruzione del ciclo for sulle righe è sbagliata: non ci va proprio, perchè così facendo, ad ogni cambio di riga vai a perdere il max accumulato nella riga precedente... ovviamente non va bene.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di francesco.ricca
    Registrato dal
    Feb 2018
    residenza
    Napoli
    Messaggi
    13
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Alcuni consigli:
    1) Come ti ha gi� suggerito anche paolino_delta_t: ricorda di inizializzare sempre le variabili (� una buona regola da tenere a mente)

    [code]

    3) Il while � perfettamente inutile: si pu� fare tutto il lavoro usando semplicemente i due for annidati: pensaci.

    4) La prima istruzione del ciclo for sulle righe � sbagliata: non ci va proprio, perch� cos� facendo, ad ogni cambio di riga vai a perdere il max accumulato nella riga precedente... ovviamente non va bene.

    Questi due punti mi stanno mandando in confusione, basandomi sul secondo, dici che mi basta un solo ciclo for?
    "Chi dice che è impossibile non dovrebbe disturbare chi c'è la sta facendo."
    -Albert Einstein

  7. #7
    Utente di HTML.it L'avatar di francesco.ricca
    Registrato dal
    Feb 2018
    residenza
    Napoli
    Messaggi
    13
    sto uscendo pazzo! ahahah Altri indizi??
    "Chi dice che è impossibile non dovrebbe disturbare chi c'è la sta facendo."
    -Albert Einstein

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Ti servono 2 for, uno annidato nell'altro: il primo scorre le righe e l'altro, per ciascuna riga, scorre le colonne "giuste".

    codice:
    // Scorro tutte le righe dalla prima alla penultima
    for(int i=0; i<N-1; i++) {
    
       // Scorro tutte le colonne dalla (i+1) esima all'ultima
       for(int j=i+1; j<N; j++) {
    
          // confronto con max ed eventuale sua sostituzione
    
       }
    
    }

    Non è necessario che "i" arrivi fino all'ultima riga, poichè l'ultimo elemento dell'ultima riga fa parte della diagonale e a te è richiesto di non considerare gli elementi sulla diagonale.

    A te servono tutti gli elementi "a destra" dell'i-esimo elemento della diagonale, quindi partirai a considerare le colonne solo da "i+1".

    Ciao.
    Ultima modifica di LeleFT; 08-02-2018 a 15:41
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di francesco.ricca
    Registrato dal
    Feb 2018
    residenza
    Napoli
    Messaggi
    13
    Quote Originariamente inviata da LeleFT Visualizza il messaggio

    codice:
    // Scorro tutte le righe dalla prima alla penultima
    for(int i=0; i<N-1; i++) {
    
       // Scorro tutte le colonne dalla (i+1) esima all'ultima
       for(int j=i+1; j<N; j++) {
    
          // confronto con max ed eventuale sua sostituzione
    
       }
    
    }
    mi hai salvato! Ti ringrazio davvero
    "Chi dice che è impossibile non dovrebbe disturbare chi c'è la sta facendo."
    -Albert Einstein

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Siccome sei agli inizi, un buon modo per impratichirsi con questi costrutti è quello di farsi stampare a video i valori di "i" e "j" (magari in maniera un po' furba), così da capire come si muovono:

    codice:
    for(int i=0; i<N-1; i++) {
    
       cout << "Eseguo un ciclo su i: " << i << endl;
    
       for(int j=i+1; j<N; j++) {
    
          cout << "Eseguo un ciclo su j (i,j): " << i << ", " << j << endl;
    
       }
    
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.