Sotto sequenza crescente

di il
5 risposte

Sotto sequenza crescente

Buonasera a tutti, avrei nuovamente bisogno del vostro aiuto
..E scusate ancora se le domande sono banalissime, ma ancora il mio livello è 0.
Allora ho questo problema:
''Scrivere un programma Java che, letta da input una sequenza di interi terminata da 0, stampi in
output la dimensione della sotto-sequenza crescente più lunga.''

Io ho fatto così:

import java.util.Scanner;
public class esercizio{
public static void main(String[] args){
Scanner input= new Scanner(System.in);


int cor=input.nextInt();
int pre=cor-1;
int cont=0;
int max=0;

while(cor!=0){

if(pre<cor){
cont++;

}
else if (cont>max) {
max=cont;
cont=0;
}

pre=cor;
cor=input.nextInt();

}
System.out.print(max);

}
}


Ci sono 2 problemi:
-Se inserisco una sequenza del tipo: 1; 2; 3; 1; 0 => mi da 3 e va bene
-Se inserisco una sequenza del tipo: 1; -2; 1; 2; 1; 0 => mi da 2 e non va bene (perché ci sono -2 1 2)
-Se inserisco una sequenza del tipo: 1; 2; 3; 0 => mi da 0 !!!

Sottolineo il fatto che ancora come programma siamo all'inizio e non abbiamo utilizzato funzioni che vanno oltre ai cicli semplici (if while for).
Grazie a tutti in anticipo

5 Risposte

  • Re: Sotto sequenza crescente

    Scanner input = new Scanner(System.in);
    
            int cor = input.nextInt();
            int pre = cor - 1;
            int cont = 1;
            int max = 0;
    
            while (cor != 0) {
    
                if (pre < cor) {
                    cont++;
    
                } else {
                    if (cont > max) {
                        max = cont;
                    }
                    cont = 1;
                }
    
                pre = cor;
                cor = input.nextInt();
    
            }
            System.out.print(max);

    C'erano due errori logici nel tuo codice:
    1. il conteggio inizia da 1, altrimenti per due numeri consecutivi ti ritorna 1
    2. "l'azzeramento" della variabile cont avveniva all'interno dell"else-if, che l'azzerava però solo se si era trovato un'altro massimo (cont > max).
  • Re: Sotto sequenza crescente

    Grazie mille Fiordy!
    Molto comodo usare l'if dentro l'else invece dell'else if
  • Re: Sotto sequenza crescente

    Ciao Tuyo, quando posti il codice usa il tag, è un tastino con il simbolo </> posto sopra alla finestra di input.

    Il codice corretto è:
    package sottosequenzalunga;
    
    import java.util.Scanner; 
    
    public class SottoSequenzaLunga {
    
        public static void main(String[] args) {
           
        System.out.println("Inserisci una serie di numeri, zero = finito");
        Scanner input = new Scanner(System.in);
    
            int cor = input.nextInt();
            int pre = cor - 1;
            int cont = 0;
            int max = 0;
    
            while (cor != 0) {
    
                if (pre < cor) {
                    cont++;
                    if (cont > max) {
                        max = cont; // devi aggiornare max altrimenti la prima volta ti resta a 0
                    }
                } else {
                    if (cont > max) {
                        max = cont;
                    }
                    cont = 1;
                }
                pre = cor;
                cor = input.nextInt();
            }
            System.out.print(max);
        }
    }
    all'inizio, resta difficile immaginarsi il flusso del programma e l'andamento delle variabili, se usi NetBeans IDE, hai il debug step a step.
    Per attivarlo basta che clicchi sul numero di riga dove vuoi che il programma si fermi (breakPoint) ed usare l'icona debug, te li ho cerchiati di rosso.
    NetBeansIde.jpg
    NetBeansIde.jpg

    Quando il programma si blocca sulla riga con il BrakPoint, puoi far avanzare il programma alla riga successiva con F8, ed esplorare ad ogni step il valore delle variabili.
  • Re: Sotto sequenza crescente

    Giusto solo un appunto, la parte:
    if (cont > max) {
        max = cont;
    }
    va messa nel ramo dove c'è cont++ (e ha senso solo lì).
    Per un motivo molto semplice: se la sequenza più lunga fosse esattamente al fondo dell'array, non verrebbe considerata perché non c'è un valore successivo che dia un "else" dopo.

    Quando fate esercizi di questo tipo, dovete sì ragionare sull'algoritmo ma anche considerare TUTTI gli scenari ....
  • Re: Sotto sequenza crescente

    andbin ha scritto:


    Giusto solo un appunto, la parte:
    if (cont > max) {
        max = cont;
    }
    va messa nel ramo dove c'è cont++ (e ha senso solo lì).
    Per un motivo molto semplice: se la sequenza più lunga fosse esattamente al fondo dell'array, non verrebbe considerata perché non c'è un valore successivo che dia un "else" dopo.

    Quando fate esercizi di questo tipo, dovete sì ragionare sull'algoritmo ma anche considerare TUTTI gli scenari ....
    Giustissimo, una svista, volevo modificare il codice di Tuyo il meno possibile e mi è sfuggita la ridondanza inutile.
Devi accedere o registrarti per scrivere nel forum
5 risposte