Stampare la colonna di una matrice

di il
6 risposte

Stampare la colonna di una matrice

Sto svolgendo un esercizio ,che mi chiede di stampare una colonna della matrice . Io ho iniziato con lo scrivere i metodi che creano una matrice e la stampano, ma poi ho riscontrato problemi con il metodo che mi cerca e stampa il vettore ...
import java.util.Scanner;
public class Matrice {

	public static void main(String[] args) {
		int m[][]= leggiMatrice();
		stampaMatrice(m);
		int[] colk =colonnak(m);
		stampaVettore(colk);
		

	}
	private static int[][] leggiMatrice(){
		Scanner sc = new Scanner(System.in);
		System.out.println("Inserire il numero di righe:");
		int righe = sc.nextInt();
		System.out.println("Inserire il numero di colonne:");
		int colonne= sc.nextInt();
		int m[][]= new int[righe][colonne];
		for(int i=0; i<= righe-1 ;i++) {
			for(int j=0; j<=colonne-1 ; j++) {
			   System.out.println("inserisci l'elemento m["+i+"]["+j+"]");
			   m[i][j]= sc.nextInt();
			}
		}
		sc.close();
		return m;
	}

	private static void stampaMatrice(int [][]m) {
		for(int i=0; i<m.length; i++) {
			System.out.println(" ");
			System.out.println("-------------");
			System.out.print("|");
			for(int j=0; j<m[0].length; j++) {
				System.out.print(m[i][j]+"|");
				
			}
		}
	}
	private static int []colonnak(int[][]m){
		Scanner sc = new Scanner(System.in);
		System.out.println("quale vettore colonna vuoi? ");
		int []risultato= new int[m.length];
		int k = sc.nextInt();
		
		for(int i=0; i<=m.length; i++) {
			risultato[i]=m[i][k];
		}
		sc.close();
		return risultato;
		}
	private static void stampaVettore(int[]colk) {
		System.out.print("[");
		for(int i=0; i<=colk.length; i++) {
			System.out.print(colk[i]+ ",");
		}
		System.out.print("]");
		
	}

}
quando lo eseguo , dopo che mi chiede quale colonna voglio mi appare questo:
Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at java.util.Scanner.nextInt(Unknown Source)
	at java.util.Scanner.nextInt(Unknown Source)
	at esercMatrice.Matrice.colonnak(Matrice.java:45)
	at esercMatrice.Matrice.main(Matrice.java:8)
Cosa significa e come posso rimediare? qualcuno potrebbe darmi un consiglio?

6 Risposte

  • Re: Stampare la colonna di una matrice

    mari.98 ha scritto:


    
    		sc.close();
    
    quando lo eseguo , dopo che mi chiede quale colonna voglio mi appare questo:
    Exception in thread "main" java.util.NoSuchElementException
    	at java.util.Scanner.throwFor(Unknown Source)
    Succede perché hai chiuso lo Scanner!

    Allora: lo standard-input (System.in) in generale non è mai da "chiudere". Quindi nemmeno lo Scanner agganciato a System.in .

    E anzi, è bene dire che di oggetti Scanner connesso a System.in ne dovresti avere UNO solo. Mentre invece ora fai 2 volte new Scanner(System.in).
  • Re: Stampare la colonna di una matrice

    Se non creo un nuovo oggetto Scanner come faccio ad inserire il numero della colonna che voglio stampare?
    e poi se non chiudo (System.in) mi da comunque errore
  • Re: Stampare la colonna di una matrice

    mari.98 ha scritto:


    Se non creo un nuovo oggetto Scanner come faccio ad inserire il numero della colonna che voglio stampare?
    Certo che devi creare un oggetto Scanner. Ma per tutta la durata della tua applicazione a runtime, dovresti crearne UNO solo. Non due (come invece fai in leggiMatrice e poi colonnak).

    La cosa più semplice (ci sarebbero altri design migliori comunque) per non dover ripetere il new Scanner(System.in) perlomeno è tenerlo come campo static:
    public class Matrice {
        private static Scanner sc = new Scanner(System.in);
    E usi solo quel sc ... e senza chiuderlo.

    mari.98 ha scritto:


    e poi se non chiudo (System.in) mi da comunque errore
    Ci sono comunque anche altri errori.

    In colonnak hai scritto
    for(int i=0; i<=m.length; i++) {

    e in stampaVettore idem:
    for(int i=0; i<=colk.length; i++) {

    che sono ovviamente sbagliati perché sfori sull'array.
  • Re: Stampare la colonna di una matrice

    Grazie, ho apportato le modifiche che mi hai proposto e ho risolto alcuni problemi, ma comunque continua a darmi errore nel main dove creo un vettore e chiamo il metodo colonna :
    int[]colk=colonnak(m;)
    e anche quando assegno i valori al vettore risultato.
    for(int i=0; i<m.length; i++) {
    			risultato[i]=m[i][k];
    		}
  • Re: Stampare la colonna di una matrice

    Int[]colk=colonnak(m;)

    punto e virgola inappropriato lì.

    mari.98 ha scritto:


    for(int i=0; i<m.length; i++) {
    			risultato[i]=m[i][k];
    		}
    Qui non c'è nulla di sbagliato. Chiaramente la colonna (k) deve essere un indice valido.
  • Re: Stampare la colonna di una matrice

    Grazie mille per l'aiuto, ora funziona.
Devi accedere o registrarti per scrivere nel forum
6 risposte