Jevilik ha scritto:
Sono sicuro di aver sbagliato le parti commentate, non mi è ancora chiara la gestione degli array e l'invocazione di metodi.
Potreste dirmi dove sta l'errore? Magari con breve spiegazione!!
Partiamo dal metodo main. La prima istruzione tecnicamente non è sbagliata, stai dichiarando un array di interi, ma senza inizializzarlo, cosa che fai subito dopo.
In genere ti conviene farlo subito, ad esempio una normale inizializzazione si fa con :
int [] maxmin = new int [5]; // o qualsiasi altra lunghezza naturalmente
Con questa istruzione l'array è stato creato, ma all'interno non sono ancora stati assegnati i valori, che sono messi a 0 in automatico (questo dipende dal contenuto dell' array, per una classe standard avrai tutti gli elementi null, ma un tipo primitivo come int non può essere null, controlla la tabella "Default Values" a
questo indirizzo per maggiori dettagli, subito dopo la lista dei tipi primitivi).
L'istruzione successiva in cui richiami il metodo maxmin, invece, è sprecata, in quanto il metodo verrà sì eseguito, ma il valore di ritorno del metodo (quel int [] scritto subito prima del nome del metodo, da non confondere con quell' int [] a, che è un argomento passato al metodo) non viene salvato in nessuna maniera, è perso.
Questo non vuol dire che ogni volta che esegui un metodo tu debba salvarti il valore di ritorno in una variabile (se il metodo ritorna void non lo farai mai, e anche in altri casi), ma in questo caso è necessario (senza cambiare il metodo max_min almeno, ma qui non serve).
Quindi nel main potresti fare qualcosa di questo tipo :
// crei l'array di cui vuoi trovare il massimo e il minimo
int [] a = new int [5];
/*
ora l'array a contiene solo zeri, puoi settare manualmente i valori o anche settare i valori direttamente nella inizializzazione, scrivendo ad es. :
int [] a = {2, 3, 1, 6, -2};
*/
// chiami il metodo per trovare massimo e minimo, e salvi il risultato nel vettore maxmin
int [] maxmin = max_min (a);
// stampi il contenuto di maxmin ...
Ora il valore di ritorno (quello che ad ora stai salvando nel vettore r in max_min, e viene restituito dal return) viene memorizzato nell'array maxmin, per usarlo come meglio credi in seguito.
______________________________________________________________________________
Per quanto riguarda il metodo max_min, devi stare attento a come esegui il ciclo.
Va benissimo inizializzare massimo e minimo al primo valore dell'array, sempre che l'array non sia vuoto o null (per ora puoi risparmiarti il controllo).
Poi però il ciclo dovrebbe partire dalla posizione 1, tanto alla posizione 0 hai già controllato il valore.
Tu devi valutare il resto degli elementi presenti nell'array, e memorizzare il nuovo massimo e il nuovo minimo man mano che lo trovi.
E' più facile di come stai facendo tu in questo momento, basta la seconda condizione dell'if.
La prima condizione dei due if, oltre a essere superflua, ti causerà un errore in esecuzione, perché l'indice [i+1] non esisterà quando controlli l'ultimo elemento (ArrayIndexOutOfBoundsException).
La restituzione di r invece va bene, ma r va creato all'esterno del ciclo, quando hai controllato tutti gli elementi, farlo all'interno non ha senso.
Quindi puoi fare qualcosa tipo :
for (/* ....*/) {
// corpo del ciclo ...
}
int [] r = {max, min};
return r;
Il modo in cui restituisci massimo e minimo può variare, in questo caso li metti in un array di int, ma devi scegliere tu (se non hai indicazioni) la posizione del massimo e del minimo, e potrebbe non essere chiaro nel resto del codice.
Potresti anche resituire un oggetto che contenga solo i campi massimo e minimo, con i soli metodi get per leggerli in seguito, ma questa è un'altra storia ...