Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [JAVA]Matrice-somma dei contenuti delle righe

    Salve a tutti!
    Ho un problemino da risolvere:
    Calcolare la somma dei contenuti delle righe di una matrice tranne le ultime celle, stampando proprio nelle ultim i risultati delle somme delle celle precedenti.

    Vi metto il mio codice e vi indico dove sta l'errore:
    codice:
    public class SommaRighe {
        int matrice[][];
        int colonne=5, righe=5;
    
        SommaRighe(){
            matrice=new int[righe][colonne];
        }
    
        public void Carica(){
            for(int r=0;r<righe;r++){
                for(int c=0;c<colonne-1;c++){
                    matrice[r][c]=(int)(Math.random()*10);
                }
            }
            //stampo la matrice originale
            for(int r = 0; r<righe; r++){
    			for(int c = 0; c<colonne; c++){
    				System.out.print(matrice[r][c]+" ");
    			}
                            System.out.println();
    		}
        }
    
        public void SommaRighe(){
            int somma=0, r = 0, c = 0;
                for(r=0;r<righe;r++){
                    for(c=0;c<colonne-1;c++){
                        somma+=matrice[r][c];
                        matrice[r][4]=somma;
                    }
                }
                //errore
                
                for(r=4;r<righe;r--){
                    for(c=4;c<colonne;c--){
                        somma=matrice[r][4]-matrice[r-1][4];
                        matrice[r][4]=somma;
                     }
                }
            System.out.println("<<<Righe sommate>>>");
    		for(r = 0; r<righe; r++){
    			for(c = 0; c<colonne; c++){
    				System.out.print(matrice[r][c]+" ");
    			}
                            System.out.println();
    		}
        }
    }
    
    public class Main {
    
        public static void main(String[] args) {
            SommaRighe sr = new SommaRighe();
            sr.Carica();
            sr.SommaRighe();
        }
    
    }
    Da quello che potete notare, cioè:
    codice:
    for(r=4;r<righe;r--){
                    for(c=4;c<colonne;c--){
                        somma=matrice[r][4]-matrice[r-1][4];
                        matrice[r][4]=somma;
                }
    Cerco di fare la differenza per ottenere il risultato giusto negli elementi della 4 colonna, poichè prima del ciclo vengono in questo modo:
    codice:
    <<<Righe sommate>>>
    5 3 2 0 10 
    4 5 2 1 22 
    2 8 1 4 37 
    3 9 4 6 59 
    8 6 3 8 84
    Cercando di fare 84-59, 59-37 e 37-22 per ottenere la somma giusta.

    In output mi viene questo se compilo il programma:
    codice:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    	at sommarighe.SommaRighe.SommaRighe(SommaRighe.java:38)
    	at sommarighe.Main.main(Main.java:9)
    Java Result: 1
    Grazie in anticipo a quelli che mi potranno aiutare.
    Jan
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non sono stato molto a guardare quello che il codice combina, perché l'errore è evidente: hai un indice pari a -1 in quel ciclo for... e la cosa è banale: tu parti dalla condizione r = 4, righe = 5 e il confronto lo fai su r < righe... problema: quella è vera, ed è sempre vera in quanto r diminuisce ad ogni giro (r--). Ad un certo momento, con r = 0, cerchi di andare a recuperare un'ipotetica riga "-1". Dovresti rivedere un attimo il funzionamento, magari mettendo un lower bound nel ciclo for, per esempio:
    codice:
    for (r = righe -1; r > 0; r--) {
    o simile. vedi tu.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    codice:
    for (r = righe -1; r > 0; r--)
    Cosa sia "lower bound", non saprei. E non capisco perchè la condizione del ciclo deve essere "r>0", se io vado a decrementare l'indice (delle righe). Il mio problema è questo, cioè che non so come fare quelle 3-4 differenze.
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ok, ma l'hai scritto tu quel codice oppure te l'hanno dato e ci stai giochicchiando?

    Perché se non sai perché stai decrementando una variabile in un ciclo for eppure la stai decrementando, mi chiamo subito fuori dalla discussione (e mi pento di aver ancora una volta partecipato a chiacchere su esercizi scolastici).

    Cito il tuo codice:
    codice:
    //errore
                
                for(r=4;r<righe;r--){
                    for(c=4;c<colonne;c--){
                        somma=matrice[r][4]-matrice[r-1][4];
                        matrice[r][4]=somma;
                     }
                }
    e torno a farti notare come:
    codice:
    r = 4
    righe = 5
    r < righe è sempre true
    r-- decrementa la tua variabile (la condizione di cui al rigo sopra resta sempre vera
    con queste premesse, dopo 4 giri ti trovi nella seguente situazione:
    codice:
    r = 0
    righe = 5
    r < righe (ovvero 0 < 5) true
    quindi sei dentro al ciclo for... consideriamo
    codice:
    somma=matrice[r][4]-matrice[r-1][4];
    con r = 0 ed hai il motivo del tuo errore. Se non te ne sei fatto ancora convinto che DEVI gestire un limite inferiore (lower bound) per r, prendilo per dogma e gestiscilo.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Originariamente inviato da Andrea1979
    ok, ma l'hai scritto tu quel codice oppure te l'hanno dato e ci stai giochicchiando?

    Perché se non sai perché stai decrementando una variabile in un ciclo for eppure la stai decrementando, mi chiamo subito fuori dalla discussione (e mi pento di aver ancora una volta partecipato a chiacchere su esercizi scolastici).
    Scusa. Il codice l'ho scritto io. Ho chiesto aiuto, perchè non sapevo come risolvere, poichè avevo fatto il massimo di quello che sapevo. Ho i miei motivi per non capire niente di quello che sto facendo. A punto, l'esercizio è per la scuola.

    Originariamente inviato da Andrea1979
    con r = 0 ed hai il motivo del tuo errore. Se non te ne sei fatto ancora convinto che DEVI gestire un limite inferiore (lower bound) per r, prendilo per dogma e gestiscilo.
    Sì, "r" deve essere "0" ... perchè devo arrivare fino all'inizio(cioè posizione [1][4] e non [0][4], perchè la somma nel [0][4] c'è già).

    Se qualcuno mi può aiutare, mi aiuti.
    Grazie!
    Jan
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    te l'ho scritto come risolvi.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    codice:
    //errore
                for(r=righe-1;r>0;r--){
                    for(c=4;c<colonne;c--){
                        somma=matrice[r][4]-matrice[r-1][4];
                        matrice[r][4]=somma;
                    }
                 }
    Facendo questa correzione mi viene:
    1 9 9 6 0
    5 2 9 5 0
    3 2 6 9 0
    7 3 4 9 0
    0 6 2 1 0
    <<<Righe sommate>>>
    1 9 9 6 25
    5 2 9 5 2147483569
    3 2 6 9 -164
    7 3 4 9 -241
    0 6 2 1 2147483301
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    mmm evidentemente c'è qualche problema più profondo. Comunque, prendendo una delle matrici che hai postato:
    codice:
    public class Esercizio {
        
        int[][] matrice;
        int[][] consomma;
        
        // metodo accessorio per stampare una matrice
        private String stampaMatrice(int[][] a) {
            String ret = "";
            for (int i = 0; i < a.length; i++) {
                ret += "[ ";
                for (int j = 0; j < a[i].length; j++) {
                    ret += a[i][j]+" ";
                }
                ret += "]\n";
            }
            return ret;
        }
        
        public String toString() {
            String ret = "";
            ret += "Matrice Originale\n";
            ret += stampaMatrice(matrice);
            ret += "\n\n**********************\n\nMatrice Taroccata\n";
            ret += stampaMatrice(consomma);
            return ret;
        }
        
        public void sommaRighe() {
            int sommaParziale;
            for (int i = 0; i < matrice.length;i++) { //cursore righe - scorro tutte le righe
                // resetto la somma parziale ad ogni nuova riga scandita.
                sommaParziale = 0;
                for (int j = 0; j < matrice[i].length-1; j++) { //cursore colonne 
                    // - mi fermo al penultimo elemento
                    // nella nuova matrice gli elementi sono uguali agli elementi della
                    // matrice originale, tranne per quelli che occupano l'ultima colonna
                    consomma[i][j] = matrice[i][j];
                    // sommo gli elementi della riga per calcolare il nuovo valore
                    // dell'elemento all'ultima colonna
                    sommaParziale += matrice[i][j];
                }
                // setto l'elemento dell'ultima colonna
                consomma[i][matrice[i].length-1] = sommaParziale;
            }
        }
        
        public Esercizio() {
            matrice = new int[][] {
                {1, 9, 9, 6, 0},
                {5, 2, 9, 5, 0},
                {3, 2, 6, 9, 0},
                {7, 3, 4, 9, 0},
                {0, 6, 2, 1, 0}
            };
            consomma = new int[matrice.length][matrice[0].length];
        }    
        
        public static void main (String[] args) {
            Esercizio es = new Esercizio();
            es.sommaRighe();
            System.out.println(es);
        }
    }
    Ho commentato il metodo che forse più ti interessa.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Grazie mille!
    Jan
    Storie, Pensieri & Riflessioni:
    http://storieriflessioni.blogspot.it/

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 © 2025 vBulletin Solutions, Inc. All rights reserved.