Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Daréios89 on 27-04-2009, 19:52:56



Title: Difficoltà esercizio prova sui metodi aprile
Post by: Daréios89 on 27-04-2009, 19:52:56
L'esercizio è questo:

Quote
/*Scrivere un metodo che prenda in input una matrice A di float, e restituisca un boolean che indichi se la somma degli elementi del perimetro di A è maggiore del massimo
elemento in A*/

Però a parte il massimo della matrice che so calcolare, non riesco a pensare come organizzare i cicli per calcolare il perimetro......


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: LtWorf on 27-04-2009, 21:25:26
Fai 4 cicli... uno scorre A[0][j], l'altro scorre A
  • , poi A[max_r][j] e A[max_c]


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: LtWorf on 27-04-2009, 21:26:38
Formattazioni strane del forum... Ci siamo capiti spero :-S


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: Daréios89 on 27-04-2009, 21:41:57
Mah....a dire la verità...no.....potresti risfidare la sorte dell'impaginazione?  :pray


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 27-04-2009, 22:53:23
Fai 4 cicli... uno scorre A[0][j], l'altro scorre A
  • , poi A[max_r][j] e A[max_c]
La formattazione è corretta: tu hai scritto [i] che è il tag d'apertura di un testo in corsivo  :boh.
Come a dire: usa il tag CODE  :-OK la prossima volta!

Studia questo codice, guitarplaying:
Code:
public static boolean metodo (float A [][])
{
float max = A [0][0];
float somma_perimetro = 0;

//calcola il max
for (int i = 0; i < A.length; i++)
for (int j = 0; j < A [i].length; j++)
if (A [i][j] > max) max = A [i][j];

//calcola la somma degli elementi del perimetro:
//prima calcola la somma delle righe superiore e inferiore (lati orizzontali) del perimetro
for (int i = 0; i < A [0].length; i++)
somma_perimetro += A [0][i] + A [A.length - 1][i];

//poi calcola la somma delle colonne sinistra e destra (lati verticali) del perimetro
for (int i = 0; i < A.length; i++)
somma_perimetro += A [i][0] + A [i][A [i].length - 1];

//infine restituisce il valore booleano dato dal confronto tra somma del perimetro e massimo
return somma_perimetro > max;
}
Ciao ciao .ciaociao.


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: Daréios89 on 27-04-2009, 23:13:37
Si mi quadra, non avevo pensato alla cosa di fare la somma dei lati insieme, che ###@@, ma una cosa sola non mi quadra, sentivo dire a suo tempo che alcune persone in questo esercizio lamentavano l'errore di aver dimenticato nel calcolo del perimetro che, se come in questo caso si è prima trovata la somma dei lati orizzontali, in quelli verticali ci si deve ricordare di togliere i quattro quadratini ai vari spigoli, quindi come mai scrivi:

Quote
//poi calcola la somma delle colonne sinistra e destra (lati verticali) del perimetro
   for (int i = 0; i < A.length; i++)
      somma_perimetro += A
  • + A [A .length - 1];

la riga non dovrebbe partire dall'indice 1 e poi arrestarsi a length -1???

Grazie come sempre.


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 27-04-2009, 23:27:58
Si mi quadra, non avevo pensat oalla cosa di fare la somma dei lati insieme, che ###@@, ma una cosa sola non mi quadra, sentivo dire a suo tempo che alcune persone in questo esercizio lamentavano l'errore di aver dimenticato nel calcolo del perimetro che, se come in questo caso si è prima trovata la somma dei lati orizzontali, in quelli verticali ci si deve ricordare di togliere i quattro quadratini ai vari spigoli, quindi come mai scrivi:

Quote
//poi calcola la somma delle colonne sinistra e destra (lati verticali) del perimetro
   for (int i = 0; i < A.length; i++)
      somma_perimetro += A
  • + A [A .length - 1];

la riga non dovrebbe partire dall'indice 1 e poi arrestarsi a length -1???

Grazie come sempre.
Troppa raggione hai, troppissima! Anzi mi è venuta pure a me una pensata ancora più subdola .penso: gestire il caso in cui la matrice sia formata da una sola colonna oppure ("o" inclusivo) da una sola riga.

Ora va bene (con l'ipotesi al primo rigo):
Code:
//ipotesi: A contenga almeno 1 elemento e tutte le righe di A abbiano la stessa lunghezza (array bidimensionale NON frastagliato, cioè)
public static boolean metodo (float A [][])
{
float max = A [0][0]; //assegnazione possibile per via della ipotesi 3 righe sopra
float somma_perimetro  = 0;

//calcola il max, esattamente come nella versione precedente
for (int i = 0; i < A.length; i++)
for (int j = 0; j < A [i].length; j++)
if (A [i][j] > max) max = A [i][j];

if (A.length == 1)
for (int i = 0; i < A [0].length; i++)
somma_perimetro += A [0][i];
else if (A [0].length == 1)
for (int i = 0; i < A.length; i++)
somma_perimetro += A [i][0];
else
{
//prima calcola la somma delle righe superiore e inferiore (lati orizzontali) del perimetro (angoli INCLUSI)
for (int i = 0; i < A [0].length; i++)
somma_perimetro += A [0][i] + A [A.length - 1][i]; //qui "-1" serve perché è l'indice max in un array

//poi calcola la somma delle colonne sinistra e destra (lati verticali) del perimetro (angolo ESCLUSI)
for (int i = 1; i < A.length - 1; i++) //qui "-1" nella condizione serve (come anche l'inizializzazione i=1) per non contare gli angoli
somma_perimetro += A [i][0] + A [i][A [i].length - 1]; //qui "-1" serve perché è l'indice max in un array
}

//infine restituisce il valore booleano dato dal confronto tra somma del perimetro e massimo
return somma_perimetro > max;
}


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: Daréios89 on 27-04-2009, 23:39:23
Bene, sono contento, domani ci darò un'occhiata, allora grazie mille di nuovo!!!


Title: Re:Difficoltà esercizio prova sui metodi aprile
Post by: LtWorf on 29-04-2009, 08:11:07
A meno male che c'è reversengineer :-)