Aiuto per un esercizio

di il
37 risposte

Aiuto per un esercizio

Salve a tutti, un nuovo utente, sto imparando da autodidatta i fondamentali del c++ in quanto nell'ultimo periodo, mi sono appssionato di programmazione.
Attualmente sto imparando il ciclo while( solo while senza il Do), e per gli esercizi semplici me la cavo benino, anche se ovviamente devo ancora imparare a padroneggiare per bene il ciclo.
Studiando mi sono imbattuto in un esercio sulla carta piuttosto banale, ma mi sta creando un rompicapo che non riesco a risolvere da un ieri.
Il testo dell'esercizio è: "Leggere da input un insieme di numeri reali >= 0 e determinare il valore minimo. Non si conosce in anticipo la quantità di valori da leggere; la lettura di un valore < 0 indica che l’insieme da leggere è terminato."
Questo è il mio esercizio:

int main{
float x, min;
    min=0;
    while(x>=0){
        cout<<"Inserie un valore: \n";
        cin>>x;
        if(x<min){
            min=x;
        }
       
    }
    
    cout<<"Il valore minore e': "<<min<<endl;
    return 0;
}
Il problema sta nel fatto che il valore minore di 0 che uso per uscire dal ciclo, viene stampato come valore minore dell'esercizio.
Come posso fare per escludere il valore negativo dalla stampa del numero minore?
Ringrazio anticipatamete chi mi aiuta a risolvere la questione

37 Risposte

  • Re: Aiuto per un esercizio

    If(x<min && x>=0){

    ma attento... min non può partire da 0
  • Re: Aiuto per un esercizio

    oregon ha scritto:


    If(x<min && x>=0){

    ma attento... min non può partire da 0
    Potresti essere più chiaro perfavore? Perchè min non può parite da 0? e da quale valore deve partire?
  • Re: Aiuto per un esercizio

    Da INT_MAX o FLT_MAX
  • Re: Aiuto per un esercizio

    Non ci sto capendo nulla. Probabilmente per voi esperti è semplice, ma per me neofita, non lo è per nulla
    MI potete scrivere direttamente la soluzione dell'esercizo in modo da studiarla comprendere il ragionamento che fate ed elaborarla?
    Più che altro il problema mi chiede solo la stampa del minore, anche del maggiore a dire la verità ma solo successivamente aver trovato il minore.
    Io avevo pensato anche di introdurre un contatore e porlo >=0 con cont=0, in modo da avere in partenza un ciclo infinito, poi all'interno del ciclo un if (x<0 break) per uscire dal ciclo appena viene inserito il valore negativo. A quel punto quando mi trovo la stampa del valore negativo, per evitarlo, volevo cacellare un solo ciclo in modo da trovarmi con l'ultimo valore minore scirtto, prima del valore di chiusura. Ma non ci sono riuscito :/
  • Re: Aiuto per un esercizio

    Scusa ma devi modificare la if e ti ho detto come fare e inizializzare min=FLT_MAX

    Cosa non comprendi?
  • Re: Aiuto per un esercizio

    oregon ha scritto:


    Scusa ma devi modificare la if e ti ho detto come fare e inizializzare min=FLT_MAX

    Cosa non comprendi?
    min=FLT_MAX.
    Alla fine mi dice che il minore è 0... Forse sbaglio lo qualcosa di cui non riesco a rendermi conto...
  • Re: Aiuto per un esercizio

    
    int main(void){
    float x = 0.0;
    float min = FLT_MAX;
        while(x >= 0.0){
            cout<<"Inserire un valore: \n";
            cin>>x;
            if(x<min && x>=0.0)
                min=x;
        }
        
        cout<<"Il valore minore e': "<<min<<endl;
        return 0;
    }
    
    Mi raccomando non inserire lo zero
  • Re: Aiuto per un esercizio

    Avevo suggerito una if modificata ma sembra che non leggiate quello che vi scrivo ....
  • Re: Aiuto per un esercizio

    Adesso ho capito perchè non mi trovavo. Per utilizzare FLT_MAX, era necessario attivare le librerie climits e float.h, librerie a me totalmente sconosciute in quanto utilizzo solo cmath e iostream (almeno fin dove sono arrivato a studiare io). IL pregramma da voi scritto funziona bene, e ne ho capito il ragionamento. Grazie a voi che mi avete aiutato
  • Re: Aiuto per un esercizio

    Hai aggiustato la if? Non ho capito...
  • Re: Aiuto per un esercizio

    oregon ha scritto:


    Hai aggiustato la if? Non ho capito...
    si certo
  • Re: Aiuto per un esercizio

    cslash89 ha scritto:



    Io avevo pensato anche di introdurre un contatore e porlo >=0 con cont=0, in modo da avere in partenza un ciclo infinito, poi all'interno del ciclo un if (x<0 break) per uscire dal ciclo appena viene inserito il valore negativo. A quel punto quando mi trovo la stampa del valore negativo, per evitarlo, volevo cacellare un solo ciclo in modo da trovarmi con l'ultimo valore minore scirtto, prima del valore di chiusura. Ma non ci sono riuscito :/
    Se volessi risolvere il medesimo problema con questa soluzione, come dovrei dovrei fare? Si può eliminare in singolo "giro" di ciclo?
  • Re: Aiuto per un esercizio

    Non ho capito molto cosa vorresti cancellare, ma se fai l'if come ti hanno suggerito, non devi cancellare niente. Se metti una variabile "di controllo", devi fare più o meno così:
    int main(void){
        float x = 0.0;
        float min = FLT_MAX;
        while(1){
            cout<<"Inserire un valore: \n";
            cin>>x;
            if (x < 0.0)
                break;
            if(x<min && x>=0.0)
                min=x;
        }
        
        cout<<"Il valore minore e': "<<min<<endl;
        return 0;
    }
    
    Ma è poco elegante...
  • Re: Aiuto per un esercizio

    Andrea Quaglia ha scritto:


    Non ho capito molto cosa vorresti cancellare, ma se fai l'if come ti hanno suggerito, non devi cancellare niente. Se metti una variabile "di controllo", devi fare più o meno così:
    int main(void){
        float x = 0.0;
        float min = FLT_MAX;
        while(1){
            cout<<"Inserire un valore: \n";
            cin>>x;
            if (x < 0.0)
                break;
            if(x<min && x>=0.0)
                min=x;
        }
        
        cout<<"Il valore minore e': "<<min<<endl;
        return 0;
    }
    
    Ma è poco elegante...
    No intendo dire, lasciando stare per un attimo il metodo da voi suggerito che già si è rivelato efficace, volevo provare a svolgere il medesimo esercizio in questa maniera:
    
    int main(int argc, char** argv) {
        int i;
        float x, min;
        
        i=0;
        while(i>=0 && x>=0){
            cout<<"Inserire un valore: \n";
            cin>>x;
            
            if(x<min){
                min=x;
            }
            i++;
        }
        cout<<"Il valore minore e': "<<min<<endl;
       
        return 0;
    }
    
    In questo esempio stampa anche il valore negativo che uso per uscire dal ciclo.
    Approfittando che ho inserito un contatore di cicli "i", nel momento in cui inserisco il valore negativo, è possibile annullare l'ultimo giro e quindi stampare l'ultimo valore minore inserito immediatamente prima del valore negativo?
    Spero di aver spiegato bene quello che intendo dire, me è un pò difficile a parole XD
Devi accedere o registrarti per scrivere nel forum
37 risposte