Aiuto matrici Java

di il
19 risposte

Aiuto matrici Java

Ragazzi buonasera, avrei dei problemi con la programmazione Java...il fatto è che quando ci sono problemi con le matrici non so come scansionare le matrici....ovviamente mi faccio il mio schemi no su foglio , ma poi su pc la cosa è ben diversa! So solo che bisogna destreggiarsi con i cicli for...

Ad esempio un quesito dice:

Data la seguente matrice quadrata:


scrivere un programma che verifichi se esistono almeno una riga ed una colonna che abbiano la medesima media dei valori dei loro elementi ..

Qualcuno potrebbe darmi delucidazioni in merito ? E in generale come si fa per scansionare righe tenendo ferme le colonne e viceversa?? Ho un po' di confusione in testa e non riesco a chiarirmi le idee, nemmeno con le slide del prof...help!


Ps. Gli esercizi in genere li facciamo SENZA usare i METODI

19 Risposte

  • Re: Aiuto matrici Java

    Programmare in Java senza usare i metodi e' come pretendere di vivere senze respirare l'ossigeno. Non e' possibile!

    Java ed i metodi sono un'accoppiata indissolubile!

    Quindi, di che acciderbolina stai ciancischiando?

    E poi, scandire una matrice e' una banalita:

    per ogni riga r
    per ogni colonna c
    ....... tratta l'elemento della matrice con coordinate (r,c)

    pofforbacco!
  • Re: Aiuto matrici Java

    Eh ma intanto noi non usiamo i metodi, ma solo i for, gli if, while, switch... È solo un accenno di programmazione Java (e meno male direi)...
  • Re: Aiuto matrici Java

    Daniele91 ha scritto:


    Qualcuno potrebbe darmi delucidazioni in merito ? E in generale come si fa per scansionare righe tenendo ferme le colonne e viceversa??
    Se hai un array bidimensionale, avrai 2 indici da gestire. Che poi l'array sia "quadrato" o "rettangolare" poco/nulla cambia in generale (in Java è anche possibile avere array "jagged" ovvero frastagliati, irregolari).
    Tieni però sempre presente che l'array bidimensionale è fisicamente strutturato per righe. In un int[][] c'è un array principale che contiene N reference ad array int[] ciascuno con i dati di una riga.

    Quindi scansionare i valori per ciascuna riga è intuitivo e banale:
    int[][] matrice = ........;
    
    for (int r = 0; r < matrice.length; r++) {
        for (int c = 0; c < matrice[r].length; c++) {
            // usa matrice[r][c]
        }
    }
    perché segue la strutturazione fisica dell'array. Questo funziona sia per array quadrati, rettangolari o jagged. E tecnicamente i for non ciclano (senza dare alcun problema) se addirittura il numero di righe è 0.

    Mentre l'inverso, ovvero scansionare i valori per ciascuna colonna è leggermente diverso. Innanzitutto devi dedurre il numero delle colonne e banalmente (se matrice quadrata/rettangolare) lo puoi presumere dal numero di colonne nella prima riga.
    for (int c = 0; c < matrice[0].length; c++) {
        for (int r = 0; r < matrice.length; r++) {
            // usa matrice[r][c]
        }
    }
    Qui però almeno una riga ci deve essere! E se l'array fosse jagged, non sarebbe molto appropriata la scansione come l'ho scritta.

    Ti è più chiaro ora?
  • Re: Aiuto matrici Java

    andbin ha scritto:


    Daniele91 ha scritto:


    Qualcuno potrebbe darmi delucidazioni in merito ? E in generale come si fa per scansionare righe tenendo ferme le colonne e viceversa??
    Se hai un array bidimensionale, avrai 2 indici da gestire. Che poi l'array sia "quadrato" o "rettangolare" poco/nulla cambia in generale (in Java è anche possibile avere array "jagged" ovvero frastagliati, irregolari).
    Tieni però sempre presente che l'array bidimensionale è fisicamente strutturato per righe. In un int[][] c'è un array principale che contiene N reference ad array int[] ciascuno con i dati di una riga.

    Quindi scansionare i valori per ciascuna riga è intuitivo e banale:
    int[][] matrice = ........;
    
    for (int r = 0; r < matrice.length; r++) {
        for (int c = 0; c < matrice[r].length; c++) {
            // usa matrice[r][c]
        }
    }
    perché segue la strutturazione fisica dell'array. Questo funziona sia per array quadrati, rettangolari o jagged. E tecnicamente i for non ciclano (senza dare alcun problema) se addirittura il numero di righe è 0.

    Mentre l'inverso, ovvero scansionare i valori per ciascuna colonna è leggermente diverso. Innanzitutto devi dedurre il numero delle colonne e banalmente (se matrice quadrata/rettangolare) lo puoi presumere dal numero di colonne nella prima riga.
    for (int c = 0; c < matrice[0].length; c++) {
        for (int r = 0; r < matrice.length; r++) {
            // usa matrice[r][c]
        }
    }
    Qui però almeno una riga ci deve essere! E se l'array fosse jagged, non sarebbe molto appropriata la scansione come l'ho scritta.

    Ti è più chiaro ora?
    Grazie mille andbin, solo che il prof ci fa fare gli esercizi in modo generico, ovvero con gli indici i per le righe e j per le colonne (così scansione righe e colonne -> for (....;i<mat.length;i++){for (... ;j<mat.length;j++) ... Sono di questi tipo...


    Quindi ad esempio nel esercizio sopra riportato non riesco a capire come scansionare solo le colonne e solo le righe in modo da ottenere le somme e poi le medie, mi aiuteresti a svolgerlo? Grazie mille
  • Re: Aiuto matrici Java

    Daniele91 ha scritto:


    solo che il prof ci fa fare gli esercizi in modo generico, ovvero con gli indici i per le righe e j per le colonne
    Quindi ad esempio nel esercizio sopra riportato non riesco a capire come scansionare solo le colonne e solo le righe
    Ma quale è il dubbio preciso? Io ti ho mostrato e spiegato come scansionare tutti i valori della matrice andando "per righe" (primo esempio) e "per colonne" (secondo esempio).
    Che poi io abbia usato 'r' e 'c' invece che 'i' e 'j' .... cambia poco/nulla. Anzi, r e c sono più espressivi che i e j.
  • Re: Aiuto matrici Java

    Il dubbio è che non riesco a capire come impostare i cicli for per fargli verificare che una riga e una colonna abbiano il medesimo valor medio!
  • Re: Aiuto matrici Java

    Daniele91 ha scritto:


    Il dubbio è che non riesco a capire come impostare i cicli for per fargli verificare che una riga e una colonna abbiano il medesimo valor medio!
    Data una matrice (array bidimensionale) di N righe x M colonne, innanzitutto crei 2 altri array: uno di lunghezza N (per media delle righe) e un altro di lunghezza M (per media delle colonne). Se come hai detto, è quadrata, ovviamente N = M.

    Quindi calcoli le medie "per righe" e "per colonne" proprio scansionando la matrice usando entrambi i modi che ho descritto prima.

    Alla fine hai 2 semplici array, uno con le medie sulle righe e l'altro con le medie sulle colonne. Devi cercare se uno stesso valore (media) si trova in entrambi gli array. Ovvero: ogni media nel primo array la devi cercare nel secondo array. In pratica: doppio ciclo for annidato.
  • Re: Aiuto matrici Java

    Quindi sarebbe:
    
    
    public static void main (String [] args){
    
    Int [] [] mat = {.....};
    
    int i=0;
    int j=0;
    
    \\ creo i due array
    
    int [] n= { cosa ci devo mettere se il prof dice che dobbiamo prendere il problema come se fosse generico ??};
    
    int [] m= { cosa ci devo mettere se il prof dice che dobbiamo prendere il problema come se fosse generico ??};
    
    int media_n=0;
    int media_m=0;
    
    
     
    
    for (i=0; i<mat.length;i++){
         for (j=0; j<mat[i].length;j++){
                 
               \\ cosa devo fare?? Non capisco, così mi scansiona tutti gli elementi di tutte le righe 
    }
    
    
    
    
    
  • Re: Aiuto matrici Java

    Daniele91 ha scritto:


     int [] n= { cosa ci devo mettere se il prof dice che dobbiamo prendere il problema come se fosse generico ??};
    Non ci devi mettere "valori" ... solo istanziare l'array con dimensione = numero di righe della matrice 'mat'.

    Daniele91 ha scritto:


    int [] m= { cosa ci devo mettere se il prof dice che dobbiamo prendere il problema come se fosse generico ??};
    Idem come sopra, ma con dimensione = numero di colonne della matrice 'mat'.

    Daniele91 ha scritto:


    int media_n=0;
    int media_m=0;
    Questi non sono strettamente necessari qui ma vanno anche bene.

    Daniele91 ha scritto:


    for (i=0; i<mat.length;i++){
         for (j=0; j<mat[i].length;j++){
                 
               \\ cosa devo fare?? Non capisco, così mi scansiona tutti gli elementi di tutte le righe 
    }
    Qui dovresti calcolare le medie per ciascuna riga. Quindi il ciclo for esterno è ok, cioè rappresenta "per ogni riga". Ma per ogni riga devi fare:
    - mettere media_n a 0
    - for sulle colonne della riga, sommatoria dei valori (in media_n).
    - calcolo della media e assegnamento nell'array delle medie per riga.

    Cosa similare nell'altro senso, "per colonne".
  • Re: Aiuto matrici Java

    andbin ha scritto:


    Daniele91 ha scritto:


     int [] n= { cosa ci devo mettere se il prof dice che dobbiamo prendere il problema come se fosse generico ??};
    Non ci devi mettere "valori" ... solo istanziare l'array con dimensione = numero di righe della matrice 'mat'.

    Daniele91 ha scritto:


    int [] m= { cosa ci devo mettere se il prof dice che dobbiamo prendere il problema come se fosse generico ??};
    Idem come sopra, ma con dimensione = numero di colonne della matrice 'mat'.

    Daniele91 ha scritto:


    int media_n=0;
    int media_m=0;
    Questi non sono strettamente necessari qui ma vanno anche bene.

    Daniele91 ha scritto:


    for (i=0; i<mat.length;i++){
         for (j=0; j<mat[i].length;j++){
                 
               \\ cosa devo fare?? Non capisco, così mi scansiona tutti gli elementi di tutte le righe 
    }
    Qui dovresti calcolare le medie per ciascuna riga. Quindi il ciclo for esterno è ok, cioè rappresenta "per ogni riga". Ma per ogni riga devi fare:
    - mettere media_n a 0
    - for sulle colonne della riga, sommatoria dei valori (in media_n).
    - calcolo della media e assegnamento nell'array delle medie per riga.

    Cosa similare nell'altro senso, "per colonne".

    Oddio, quindi dovrei fare:
    
    
    for (i=0;i<mat.length;i++){
          media_n=0;
          for (j=0; j<mat[i].length;j++){
                   media_n=media_n+mat[i][j]
                }
           media_n= media_n/2;
    
    \\ e poi? Mi sa che manca l'assegnamento che non so come fare... m=media_n/2 ??
    
    
    
  • Re: Aiuto matrici Java

    Daniele91 ha scritto:


    for (i=0;i<mat.length;i++){
          media_n=0;
          for (j=0; j<mat[i].length;j++){
                   media_n=media_n+mat[i][j]
                }
           media_n= media_n/2;
    
    \\ e poi? Mi sa che manca l'assegnamento che non so come fare... m=media_n/2 ??
    
    Scusa ma la media (perlomeno quella basilare "aritmetica") .... è la somma diviso il numero di elementi .... mica diviso 2!

    Poi se hai istanziato l'array 'n' con il numero di righe della matrice .... allora l'indice 'i' è anche appropriato lì, perché appunto ogni elemento è la media della riga i-esima.
  • Re: Aiuto matrici Java

    andbin ha scritto:


    Daniele91 ha scritto:


    for (i=0;i<mat.length;i++){
          media_n=0;
          for (j=0; j<mat[i].length;j++){
                   media_n=media_n+mat[i][j]
                }
           media_n= media_n/2;
    
    \\ e poi? Mi sa che manca l'assegnamento che non so come fare... m=media_n/2 ??
    
    Scusa ma la media (perlomeno quella basilare "aritmetica") .... è la somma diviso il numero di elementi .... mica diviso 2!

    Poi se hai istanziato l'array 'n' con il numero di righe della matrice .... allora l'indice 'i' è anche appropriato lì, perché appunto ogni elemento è la media della riga i-esima.

    Ahhh vero che scemo quindi media_n= media_n/mat.length.... Giusto? E poi cosa devo fare?
  • Re: Aiuto matrici Java

    Daniele91 ha scritto:


    quindi media_n= media_n/mat.length.... Giusto?
    Concettualmente stai dividendo per il numero di righe .... non di colonne. Poi se quadrata, ovviamente è lo stesso.
  • Re: Aiuto matrici Java

    andbin ha scritto:


    Daniele91 ha scritto:


    quindi media_n= media_n/mat.length.... Giusto?
    Concettualmente stai dividendo per il numero di righe .... non di colonne. Poi se quadrata, ovviamente è lo stesso.
    Sto imparando più ora che durante le lezioni! Grazie!

    Quindi come faccio l'assegnamento ?

    n= media_n; ?

    m=media_m; ?


    if (m=n)
    System.out.println ("condizione verificata");
Devi accedere o registrarti per scrivere nel forum
19 risposte