Visualizzazione dei risultati da 1 a 10 su 10

Discussione: esercizio con matrici

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185

    esercizio con matrici

    L'esercizio richiede di creare una matrice con numeri casuali e di trovare l'elemento massimo e la sua posizione. Inoltre si richiede di scambiare la riga che contiene il massimo con la prima riga (se non coincidono) e di scambiare la colonna che contiene il massimo con la prima colonna (sempre se non coincidono).

    Quello che sono riuscito a fare fino ad adesso è questo
    codice:
    int r=Input.getInt("Numero di righe della matrice");
    int c=Input.getInt("Numero di colonne della matrice");
    int[][] matrice=new int[r][c];
    int massimoElemento=matrice[0][0];
    int posizioneI=0, posizioneJ=0;
    
    for(int i=0; i<r; i++){
    	for(int j=0; j<c; j++){
    		matrice[i][j]=1+(int)(Math.random()*100);
    		System.out.print(matrice[i][j]+"\t");
    	}
    	System.out.println();
    }
    
    for(int i=0; i<matrice.length; i++){
    	for(int j=0; j<matrice.length; j++){
    		if(matrice[i][j]>massimoElemento){
    			massimoElemento=matrice[i][j];
    			posizioneI=i;
    			posizioneJ=j;
    		}
    	}
    }
    System.out.println("\nL'elemento massimo e': "+massimoElemento);
    System.out.println("e si trova in posizione "+posizioneI+" "+posizioneJ);
    ma non riesco a capire come svolgere i punti in cui mi chiede di scambiare la riga e la colonna contenente l'elemento massimo.
    Grazie a tutti per l'aiuto.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Scambi ogni elemento della colonna che contine il max con ogni elemento della 1ma colonna.La stessa cosa con la riga.Ovviamente quando trovi il max memorizzerai in due variabili max_index_row,max_index_col e in base a questi fai lo scambio.Saluti.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    ma gli indici della riga e della colonna dove è presente il massimo gia li memorizzo se hai visto...ma lo scambio non capisco come farlo

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    Riesco a mettere l'elemento massimo nella prima posizione, ma poi tutti gli altri elementi sono a zero...come mai?
    Ecco il codice aggiornato:
    codice:
    import java.util.Scanner;
    public class occorrenzeNumero {
    	public static void main(String[] args) {
    		Scanner Input=new Scanner(System.in);
    		System.out.print("Numero di righe della matrice: ");
    		int row=Input.nextInt();
    		System.out.print("Numero di colonne della matrice: ");
    		int col=Input.nextInt();
    		int[][] matrice=new int[row][col];
    		int[][] newMatrix=new int[row][col];
    		int massimoElemento=matrice[0][0];
    		int maxIndexRow=0, maxIndexCol=0;
    
    		for(int i=0; i<row; i++){
    			for(int j=0; j<col; j++){
    				matrice[i][j]=1+(int)(Math.random()*100);
    				System.out.print(matrice[i][j]+"\t");
    			}
    			System.out.println();
    		}
    
    		for(int i=0; i<row; i++){
    			for(int j=0; j<col; j++){
    				if(matrice[i][j]>massimoElemento){
    					massimoElemento=matrice[i][j];
    					maxIndexRow=i;
    					maxIndexCol=j;
    				}
    			}
    		}
    		System.out.println("\nL'elemento massimo e': "+massimoElemento);
    		System.out.println("e si trova in posizione "+(maxIndexRow+1)+" "+(maxIndexCol+1));
    		
    		for(int i=0; i<row; i++){
    			for(int j=0; j<col; j++){
    				newMatrix[0][0]=matrice[maxIndexRow][maxIndexCol];
    				System.out.print(newMatrix[i][j]+"\t");
    			}
    			System.out.println();
    		}
    	}
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Basta ragionarci un pò.Comincia a fare qualcosa,ci fai vedere il codice e noi ti diciamo se va bene o meno.Quando fai lo scambio devi stare attento perchè se scambi la riga con la prima il vaolre max scompare.Di questo devi tenerne conto quando cambi la colonna con la prima.Questo succede se fai anche il viceversa.La funzione può essere fatta così

    swap(i,j,max) dove i e j sono gli indici del massimo e max è il valore massimo.


    Facci sapere.Saluti.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    Ho fatto cosi, vedete se puo andare bene o meno
    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package esercizio7;
    
    import java.util.Scanner;
    
    public class Esercizio7 {
    
        public static void main(String[] args) {
            Scanner Input = new Scanner(System.in);
            System.out.print("Numero di righe della matrice: ");
            int row = Input.nextInt();
            System.out.print("Numero di colonne della matrice: ");
            int col = Input.nextInt();
            int[][] matrice = new int[row][col];
            int[][] newMatrice = new int[row][col];
            int[] riga = new int[row];
            int[] colonna = new int[col];
            int massimoElemento = matrice[0][0];
            int maxIndexRow = 0, maxIndexCol = 0;
    
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    matrice[i][j] = 1 + (int) (Math.random() * 100);
                    System.out.print(matrice[i][j] + "\t");
                }
                System.out.println();
            }
    
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    if (matrice[i][j] > massimoElemento) {
                        massimoElemento = matrice[i][j];
                        maxIndexRow = i;
                        maxIndexCol = j;
                    }
                }
            }
            System.out.println("\nL'elemento massimo e': " + massimoElemento);
            System.out.println("e si trova in posizione " + (maxIndexRow + 1) + " " + (maxIndexCol + 1));
    
            if (maxIndexRow != 0) {
                System.out.println("riga");
                for (int i = 0; i < col; i++) {
                    riga[i] = matrice[maxIndexRow][i];
                    //System.out.print("" + riga[i]);
                }
            }
    
    
    
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    newMatrice[i][j] = matrice[i][j];
    
                }
            }
    
            if (maxIndexRow != 0) {
                //System.out.println("riga");
                for (int i = 0; i < col; i++) {
                    newMatrice[maxIndexRow][i] = newMatrice[0][i];
                    newMatrice[0][i] = riga[i];
    
    
                }
            }
    
            if (maxIndexCol != 0) {
                //System.out.println("colonna");
                for (int i = 0; i < row; i++) {
                    colonna[i] = newMatrice[i][maxIndexCol];
                    //System.out.println("" + colonna[i]);
                }
            }
    
            if (maxIndexCol != 0) {
                //System.out.println("colonna");
                for (int i = 0; i < row; i++) {
                    newMatrice[i][maxIndexCol] = newMatrice[i][0];
                    newMatrice[i][0] = colonna[i];
                }
            }
    
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    System.out.print("" + newMatrice[i][j] + "\t");
                }
                System.out.println();
            }
        }
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    quando scambi due elementi devi avere una variabile di appoggio:


    codice:
    swap(i,j){
    tmp=i;
    i=j;
    j=tmp;
    }
    La matrice deve essere la stessa?Se si,devi applicare la regola sopra.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    ho verificato il codice sopra facendo dei test, e sembra funzionare per bene. Ma se inserisco matrici piu grandi di 3x6 (con le colonne sempre piu grandi delle righe), in output mi rende indexOutOfBound e non capisco come mai e come fare per correggerlo.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Perchè nel ciclo for vai oltre l'indice di riga o di colonna.Dovresti impostare la grandezza dinamicamente(chiedendola all'utente) e nel for rilevarla con qualche funzione per esempio length.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    ho risolto cambiando le dimensioni degli array riga e colonna
    codice:
    int[] colonna=new int[row];
    int[] riga=new int[col];
    anzichè
    codice:
    int[] colonna=new int[col];
    int[] riga=new int[row];
    Posto tutto il codice. Magari può essere di aiuto.
    codice:
    int row=Input.getInt("Numero di righe della matrice: ");
    int col=Input.getInt("Numero di colonne della matrice: ");
    int[][] matrice = new int[row][col];
    int[][] newMatrice = new int[row][col];
    int[] riga = new int[col];
    int[] colonna = new int[row];
    int massimoElemento = matrice[0][0];
    int maxIndexRow = 0, maxIndexCol = 0;
    
    //Assegno alla matrice numeri generati casualmente da 1 a 100 e la stampo.
    for (int i = 0; i < row; i++) {
    	for (int j = 0; j < col; j++) {
    		matrice[i][j] = 1 + (int) (Math.random() * 100);
    		System.out.print(matrice[i][j] + "\t");
    	}
    	System.out.println();
    }
    
    //Scorro tutti gli elementi alla ricerca dell'elemento massimo e me lo salvo in una variabile.
    //Mi salvo anche la sua posizione.
    for (int i = 0; i < row; i++) {
    	for (int j = 0; j < col; j++) {
    		if (matrice[i][j] > massimoElemento) {
    			massimoElemento = matrice[i][j];
    			maxIndexRow = i;
    			maxIndexCol = j;
    		}
    	}
    }
    System.out.println("\nL'elemento massimo e': " + massimoElemento);
    //Restituisco maxIndexRow+1 e maxIndexCol+1 perchè in questo modo il primo elemento della
    //matrice è [1,1] e non [0,0]. E' più per comodità.
    System.out.println("e si trova in posizione " + (maxIndexRow + 1) + " " + (maxIndexCol + 1));
    
    //Se l'elemento massimo non si trova nella riga 0 (la prima riga), mi salvo gli elementi
    //della riga dove è presente l'elemento massimo in un vettore di appoggio.
    if (maxIndexRow != 0) {
    	for (int i = 0; i < col; i++) {
    		riga[i] = matrice[maxIndexRow][i];
    	}
    }
    
    //Copio la matrice originale nella seconda matrice.
    for (int i = 0; i < row; i++) {
    	for (int j = 0; j < col; j++) {
    		newMatrice[i][j] = matrice[i][j];
    
    	}
    }
    
    //Se l'elemento massimo non si trova nella riga 0 (la prima riga), eseguo il ciclo for iterando la colonna i-esima
    //e copio nella riga [maxIndexRow] gli elementi presenti nella riga[0], poi copio nella prima riga della nuova matrice
    //i valori presenti nell'array riga
    if (maxIndexRow != 0) {
    	for (int i = 0; i < col; i++) {
    		newMatrice[maxIndexRow][i] = newMatrice[0][i];
    		newMatrice[0][i] = riga[i];
    	}
    }
    
    //Se l'elemento massimo non si trova nella colonna 0 (la prima colonna), mi salvo gli elementi
    //della colonna dove è presente l'elemento massimo in un vettore di appoggio.
    if (maxIndexCol != 0) {
    	for (int i = 0; i < row; i++) {
    		colonna[i] = newMatrice[i][maxIndexCol];
    
    	}
    }
    
    //Se l'elemento massimo non si trova nella colonna 0 (la prima colonna), eseguo il ciclo for iterando la riga i-esima
    //e copio nella colonna [maxIndexRow] gli elementi presenti nella colonna[0], poi copio nella prima colonna della nuova matrice
    //i valori presenti nell'array colonna 
    if (maxIndexCol != 0) {
    	for (int i = 0; i < row; i++) {
    		newMatrice[i][maxIndexCol] = newMatrice[i][0];
    		newMatrice[i][0] = colonna[i];
    	}
    }
    
    //Stampo la matrice che ottengo dopo gli scambi.
    for (int i = 0; i < row; i++) {
    	for (int j = 0; j < col; j++) {
    		System.out.print("" + newMatrice[i][j] + "\t");
    	}
    	System.out.println();
    }

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.