PDA

Visualizza versione completa : [Java]Programmino livello universitario


Lorenzo3
03-05-2006, 16.14.13
Roba di un corso del primo anno, nulla di che: bisogna fare una function (mulVett) che dato un vettore e un paramentro intero (d), restituisca un altro vettore contenente gli elementi di quello iniziale che sono in posizioni multiple di d.

int[] mulVett(int vettore[], int d){
int[] vett2 = new int[vettore.length/d];
int j = 0;
for (int i = 0; i < vettore.length - d; i+=d){
vett2[j] = vettore[i];
j++;
}

main:

int l = 10, n = 3;
int vet[] = new int[l];

for (int i = 0; i < vet.length; i++){
vet[i] = 1 + (int)(Math.random()*100);
System.out.print(vet[i] + " ");
}

System.out.print("\n");

int res[] = mulVett(vet, n);

for (int i = 0; i < res.length; i++){
System.out.print(res[i] + " ");
}

Ecco io vorrei sapere perchè, se lo lascio così, del vettore risultato non mi stampa l'ultimo elemento, mentre se levo quel "- d" nella condizione d'arresto del ciclo for all'interno di mulVett mi da una ArrayIndexOutOfBoundsException...

Grazie a chi ha qualche suggerimento.

Dav82
03-05-2006, 19.32.30
L'errore sta nella dimensione del vettore da restituire (btw: manca il return nel metodo, eh ;)): in questo caso, con le conversioni del caso, risulta 10/3 = 3, mentre a te servono quattro posti (0, 3, 6, 10).

La cosa è gestibile, senza ricorrere a funzioni ulteriori, così:

lunghezza = vettore.length/d;
if ((vettore.length % d) != 0)
lunghezza += 1;

int[] vett2 = new int[lunghezza]

poichè la divisione di un int per un int ti dà in sostanza il floor del rapporto fra i due operandi.
Si può anche far così:

int[] vett2 = new int[(int)Math.ceil((double)7/(double)3))]

o in mille altri modi :)


In sostanza, non avendo correttamente dimensionato l'array, se ti fermavi un ciclo prima tutto ok (ma ti mancava l'ultimo elemento), se invece analizzavi tutto l'array di partenza andavi in ArrayIndeXOutOfBound per l'array destinazione, in quanto cercavi di scrivere in una posizione non allocata.

Per il resto è ok :)

Lorenzo3
03-05-2006, 20.34.56
Già, la posizione zero!! Eroore scemo. Grazie per il consiglio ;)

Dav82
03-05-2006, 20.41.04
Poi dipende tutto dalla specifica eh :o

Dipende se il primo elemento dell'array lo consideri (a livello logico) come in posizione zero o in posizione uno... tutto lì :)

Lorenzo3
03-05-2006, 21.10.12
No bisognava partire da 0, sennò in effetti l'avrei dimensionato bene.