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

    Manipolazione indici matrici (urgente per esame)

    Salve a tutti.
    Allora, essendo imminente l'esame orale di Informatica ho deciso di svolgere i metodi sulle matrici che credo di aver in parte sbagliato nel corso dell'esame. Allora, come al solito posterò l'esercizio e la mia (pseudo )soluzione.

    1) realizzare un metodo verificaMatrice che riceve una matrice di interi M, un intero x ed un intero y e restituisce true se il rapporto tra la somma dei primi x elementi ed il prodotto degli ultimi x elementi di ciascuna riga è minore di y;

    Soluzione:

    [I]import corejava.*;
    public class esercizio{
    public static boolean verificaMatrice(int [][]M,int x, int y, int n, int m){
    int somma=0;
    int prodotto=0;
    for (int i=0;i<x;i++){
    somma+=M[i][0];
    }
    for (int i=M[0].length-x;i<M[0].length-1;i++){
    prodotto*=M[i][m];
    }
    if (somma/prodotto<y)
    return true;
    return false;
    }
    public static void main (String args[]){
    int n=Console.readInt("Inserisci il numero delle righe");
    int m=Console.readInt("Inserisci il numero delle colonne");
    int[][]M=new int[n][m];
    for (int i=0;i<n;i++){
    for (int j=0;j<m;j++)
    M[j]=Console.readInt("Inserisci il valore della cella");
    }
    int x=Console.readInt("Inserisci il valore di x");
    int y=Console.readInt("Inserisci il valore di y");
    System.out.println(verificaMatrice(M,x,y,n,m));
    }
    }


    L'errore che mi restituisce è che sono andato fuori dall'array e non capisco come. Inoltre, nel caso la x superi il numero di elementi che sta su una riga (e dunque sarà necessario passare sull'altra), qual è il giusto for che mi permette di andare su un'altra riga e fermarmi all'opportuno valore (dettato dalla x)?

    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Manipolazione indici matrici (urgente per esame)

    Originariamente inviato da KaranSjet
    L'errore che mi restituisce è che sono andato fuori dall'array e non capisco come. Inoltre, nel caso la x superi il numero di elementi che sta su una riga (e dunque sarà necessario passare sull'altra), qual è il giusto for che mi permette di andare su un'altra riga e fermarmi all'opportuno valore (dettato dalla x)?
    Innanzitutto una cosa: visto che la matrice è bidimensionale, con quale criterio è da fare la "somma dei primi x elementi"??? Cioè se ti dò una matrice di 10x10 e 'x' vale 15, è sbagliato? è giusto (e prende 10 valori da una riga e 5 dall'altra)??

    Poi, il fatto di andare fuori dagli array o meno, dipende ovviamente dal valore di x. Se la matrice è di 10x10 e x vale 12, allora il codice:
    for (int i=0;i<x;i++){
    somma+=M[i][0];
    }
    va sicuramente fuori dall'array!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Il fatto che tu abbia un esame imminente non decreta alcuna urgenza alla tua domanda (nel forum tutte le discussioni sono della stessa urgenza).


    Poi mi pare di capire che nel metodo da implementare tu non abbia controllato che il valore passato nella variabile x non sia troppo grande... tu ti limiti a fare un for che va fino a (x-1) senza preoccuparti che la matrice abbia effettivamente sufficienti elementi.


    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

  4. #4
    Innanzitutto una cosa: visto che la matrice è bidimensionale, con quale criterio è da fare la "somma dei primi x elementi"??? Cioè se ti dò una matrice di 10x10 e 'x' vale 15, è sbagliato? è giusto (e prende 10 valori da una riga e 5 dall'altra)??
    Dunque, sicuramente se do un valore della x superiore al numero delle colonne mi da errore, è giusto che sia così. Inoltre credo che la somma e il prodotto debba essere fatto per ogni riga. Dunque dovrà essere fatto per un numero di volte pari al numero delle righe. Almeno credo che sia così poichè nella traccia dice "ciascuna riga". VVoVe:
    Venendo al programma, l'ho modificato pesantemente poichè c'era un errore madornale: non è il numero di righe che devo scorrere per fare la somma, ma le colonne. Mi spiego: l'indice i scorrerà colonna per colonna, ma come era prima il programma non stavano affatto così le cose. Non è finita: tale operazione andrebbe fatta per ciascuna riga, ma al momento mi limito a una soltanto: la prima! Ecco il codice:

    [I]public static boolean verificaMatrice(int [][]M,int x, int y, int n, int m){
    int somma=0;
    int prodotto=0;
    for (int i=0;i<x;i++){
    somma+=M[0][i];
    }
    for (int i=m-x;i<m-1;i++){
    prodotto*=M[0];
    }
    if (somma/prodotto<y)
    return true;
    return false;
    }


    Quando faccio girare il programma compare un errore (diverso da quello di prima): Exception in thread "main" java.lang.ArithmeticException: / by zero. Mi sapreste dire perchè?

    x LeleFT: Non sapevo che su HTML.it tutti i topic hanno egual importanza (vengo da forum dove non è esattamente così). Tuttavia mi sembra pacifico che chi ha un esame imminente o, per fare un esempio, stia subendo un attacco da alcuni hacker abbia una certa <<urgenza>>. Urgenza che fa si che dopo un po' (2 o 3 giorni) l'utente non romperà più l'anima. Ma, se le regole sono così, le seguo .

  5. #5
    Perdonate il doppio post, ma ho scovato l'errore: semplicemente, int prodotto non deve essere all'inizio uguale a zero, altrimenti la moltiplicazione successivamente è impossibile!

    Allora, ho fatto progressi. Dunque ho pensato (poiché sono riuscito ad applicare l'algoritmo ad una sola riga) ad estendere il processo a tutte le righe. Tuttavia l'errore out of array si è ripresentato con le modifiche che ho effettuato al codice. Posto subito il programma:

    [I]public static boolean verificaMatrice(int [][]M,int x, int y, int n, int m){
    int somma=0;
    int prodotto=1;
    int cont=0;
    for (int z=0;z<n;z++){
    cont++;
    for (int i=0;i<x;i++){
    somma+=M[cont];
    for (int j=m-x;j<m;j++)
    prodotto*=M[cont][j];
    }
    }
    if ((somma/prodotto)<y)
    return true;
    return false;
    }

  6. #6
    Ho fatto notevoli progressi. Allora, sono riuscito ad effettuare i processi per tutte le righe. Il problema (unico) adesso è che quando il programma passa alla riga successiva, memorizza il numero prodotto e somma che aveva calcolato nella riga precedente.
    Esempio; abbiamo la matrice:
    12345
    67891
    La somma e il prodotto relativa alla prima riga sarà rispettivamente 3* e 20*. Fin qui ci siamo. Ma dopo, quando andrà alla seconda riga, avendo memorizzato 3 e 20, la somma e il prodotto della secondo riga sarà rispettivamente 16 (13 più il vecchio 3*) e 180 (9 per il vecchio 20*).
    Forse avrei bisogno di un contatore al posto del ciclo di z. Aiuto!

    [I]public static boolean verificaMatrice(int [][]M,int x, int y, int n, int m){
    int somma=0;
    int prodotto=1;
    for (int z=0;z<n;z++){
    for (int i=0;i<x;i++){
    somma+=M[z];}
    for (int j=m-x;j<m;j++){
    prodotto*=M[z][j];}
    System.out.println(somma);
    System.out.println(prodotto);}
    if ((somma/prodotto)<y)
    return true;
    return false;
    }

  7. #7
    Spero che qualcuno prima o poi mi risponda...raga vi prego, l'esame è vicinissimo! VVoVe:
    Intanto posto due dubbi relativi ad altri due metodi. Posto l'esercizio e la mia soluzione:

    Realizzare un metodo calcolaVettore che riceve una matrice di interi M e restituisce un vettore costruito mettendo in riga tutte le righe della matrice M in ordine inverso se l’indice di riga è pari, in ordine diretto se l’indice è dispari.

    [I]public static int[] calcolaVettore (int[][]M,int n, int m){
    int []V=new int[n*m];
    int cont=0;
    for (int i=0;i<n;i++){
    if (i%2==0)
    for (int j=m-1;j>=0;j--){
    cont++;
    V[cont]=M[i][j];}
    else
    for (int f=0;f<m;f++){
    cont++;
    V[cont]=M[f];
    }
    }
    return V;
    }


    Il mio problema è la sovrapposizione dei valori, poiché evidentemente non so usare i contatori: in questo caso non ho capito come caspita evitare che mi prenda solo il primo valore della matrice e inserisca solo questo valore nel futuro vettore. Perchè a me questo accade; output:
    [1,0,0,0,0 ecc.]. Dagli zeri capisco che non prende i valori. Allora ho messo il contatore "cont, ma va fuori dall'array. Davvero non capisco.

    Secondo esercizio: realizzare un metodo calcola che riceve una matrice di interi M di dimensione mxn ed un vettore V di dimensione 2 e restituisce la sottomatrice di M individuata nel vertice superiore destro dalla posizione (0,n-1), e nel vertice inferiore sinistro dagli elementi (V[0], V[1]).

    Qui il dubbio è relativo a ciò che la traccia vuole... Non capisco n-1 cosa sia, perché poi la riga sia zero e poi dove i due valori dei due vettori andranno collocati. Queste domande mi sorgono anche "per colpa" dell'esempio che fa la traccia (nel risultato non v'è traccia del vettore):

    Matrice
    00132
    01611
    14311
    22012

    Vettore: [2,3]

    Risultato:
    32
    11
    11

  8. #8
    Ho risolto con successo così il secondo metodo:

    [I]public static int[] calcolaVettore (int[][]M,int n, int m){
    int []V=new int[n*m];
    int cont=0;
    for (int i=0;i<n;i++){
    if (i%2==0)
    for (int j=m-1;j>=0;j--){
    V[cont]=M[i][j];
    cont++;}
    else
    for (int f=0;f<m;f++){
    V[cont]=M[f];
    cont++;
    }
    }
    return V;
    }


    Resta il problema della sovrapposizione dei dati del primo metodo e la domanda misteriosa del terzo metodo. Ragazzi, HELP !

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.