Untitled

 avatar
unknown
c_cpp
2 months ago
2.7 kB
4
Indexable
/*
Scrivere un programma che riceve come argomento da riga di comando il nome di un file di testo contenente una
sequenza di lunghezza indefinita di numeri. Il programma individua nel file la sequenza più lunga di elementi
consecutivi tutti uguali e ne visualizza la lunghezza ed il valore che vi si ripete. Nel caso ci siano più di una sequenza a
pari lunghezza massima, il programma visualizza i dati (valore ripetuto e dimensione) dell'ultima sequenza
individuata. Gestire opportunamente gli eventuali casi di errore mediante la visualizzazione di messaggi a video.
Esempio 1:
Se il file contiene i valori: 1 1 4 4 4 4 4 5 5 1 1 1 1 1 2 3
Il programma stamperà a video "valore: 1, lunghezza: 5" poiché la sequenza più lunga di valori tutti uguali è "1 1 1 1 1".
Esempio 2:
Se il file contiene i valori: 5 5 5 5 1 2 3 3 3 3 2
Il programma stamperà a video "valore: 3, lunghezza: 4" poiché la sequenza più lunga di valori tutti uguali è "3 3 3 3".
Si noti che la sequenza "5 5 5 5" ha anch'essa 4 elementi ma si trova prima di quella visualizzata.



*/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   
   if(argc == 2)
   {

    FILE *file = fopen(argv[1], "r");
    if(file != NULL)
    {

        int valore_corrente, valore_precedente;
        int lunghezza_corrente = 1;
        int max_lunghezza = 0;
        int max_valore = 0;

        if(fscanf(file, "%d", &valore_precedente) != 1){
            fclose(file);
            return 1;
        }

        //1 1 4 4 4 5 5 1 1 1 1 1 2 3
        //valore_precedente vale il primo elemento del file 'inizio.txt'

        while(fscanf(file, "%d", &valore_corrente) == 1)
        {
            if(valore_corrente == valore_precedente)
            {
                lunghezza_corrente++;
            }else{
                // La sequenza si interrompe
                if(lunghezza_corrente >= max_lunghezza)
                {
                    //Aggiorno la sequenza massima (notare il >= per prendere l'ultima sequenza in caso di parità)
                    max_lunghezza = lunghezza_corrente;
                    max_valore = valore_precedente;
                }

                //Reset della sequenza attuale
                lunghezza_corrente = 1;
            }
            valore_precedente = valore_corrente; //Aggiorna il valore precedente
        }

        if(lunghezza_corrente >= max_lunghezza)
        {
            max_lunghezza = lunghezza_corrente;
            max_valore = valore_precedente;
        }

        fclose(file);
        printf("Valore: %d, Lunghezza: %d\n", max_valore, max_lunghezza);

    }else{
        printf("Errore apertura file");
    }

   }
   else{
    printf("Numero di argomenti sbagliato");
   }

    return 0;

}
Leave a Comment