int x[]={5, 38, 71, 4, 37, 70, 3, 36, 69, 2, 35, 68, 1, 34, 67, 0, 33, 66, 99, 32, 65};
Trovare l'elemento massimo è stato già fatto. Il problema è solo quello di trovare l'elemento che lo segue. È chiaro che dobbiamo analizzare uno per volta tutti gli elementi del vettore, ed è quindi necessario usare un ciclo. Per trovare effettivamente il massimo e il secondo elemento, usiamo la tecnica solita:
Il primo passo è quello di considerare solo i primi due elementi del vettore, e di trovare il massimo e il secondo su di essi. Chiaramente, quello maggiore dei due è il massimo, mentre l'altro è il secondo. Memorizziamo quindi nelle variabili max e sec il massimo corrente e il secondo corrente. Questo primo passo viene eseguito dal seguente codice:
if ( x[0]>x[1] ) {
max=x[0];
sec=x[1];
}
else {
max=x[1];
sec=x[0];
}
Ora si tratta di controllare se l'ipotesi è ancora valida ad ogni passo del ciclo. Quando si analizza un elemento x[i] del vettore, possono presentarsi tre situazioni:
Il codice che realizza un ciclo fatto in questo modo è il seguente:
for(i=2; i<=x.length-1; i=i+1) {
/* x[i] e' maggiore del massimo corrente */
if( x[i]>max ) {
sec=max;
max=x[i];
}
/* x[i] e' compreso fra il massimo corrente e il secondo */
if( x[i]<=max && x[i]>sec ) {
sec=x[i];
}
}
Alla fine della esecuzione del ciclo, le variabili max e sec contengono i due massimi elementi del vettore, in ordine. Questo è garantito dal fatto che, ad ogni passo, o l'ipotesi precedente è stata confermata, oppure una eccezione ha permesso di modificare l'ipotesi per tenere conto di un nuovo elemento del vettore.
Il codice completo del programma MassimoSecondo.java è qui sotto.
/*
Trova l'elemento massimo di un vettore, e poi quello
subito inferiore
*/
class MassimoSecondo {
public static void main(String[] args) {
int x[]={5, 38, 71, 4, 37, 70, 3, 36, 69, 2, 35, 68, 1, 34, 67, 0, 33, 66, 99, 32, 65};
int max, sec;
int i;
/* assumiamo che i due elementi massimi siano i primi due */
if ( x[0]>x[1] ) {
max=x[0];
sec=x[1];
}
else {
max=x[1];
sec=x[0];
}
/* scansione del vettore */
for(i=2; i<=x.length-1; i=i+1) {
/* se un elemento del vettore e' maggiore del massimo,
allora e' il nuovo massimo, e il vecchio massimo
diventa il secondo */
if( x[i]>max ) {
sec=max;
max=x[i];
}
/* se un elemento non e' il massimo, ma e' maggiore del
secondo, allora e' il nuovo secondo */
if( x[i]<=max && x[i]>sec ) {
sec=x[i];
}
}
System.out.println("Massimo= "+max);
System.out.println("Secondo= "+sec);
}
}