Il numero più alto tra A, B e C

di il
16 risposte

Il numero più alto tra A, B e C

Buongiorno, ho cominciato da un paio di settimane a studiare il linguaggio C++ per interesse personale.

Il problema da risolvere è: dato l'inserimento di tre numeri interi, trovare il numero maggiore dei tre e stampare a video il risultato in ordine decrescente utilizzando solo condizioni IF/ELSE.

Ho scritto questo codice in un paio di giorni (sbattendoci la testa un pò):


#include <iostream>

int main(int argc, const char * argv[])
{
    int a = 0, b = 0, c =0;
    
    std::cout << "inserisci A: " << std::endl;
    std::cin >> a;
    std::cout << "inserisci B: " << std::endl;
    std::cin >> b;
    std::cout << "inserisci C: " << std::endl;
    std::cin >> c;

  if(a > b && b > c) //ABC
      std::cout << "a: " << a << "\tb: " << b << "\tc: " << c <<std::endl;
  if(a > b && c > b) //ACB
      std::cout << "a: " << a << "\tc: " << c << "\tb: " << b <<std::endl;
    
  if(b > a && a > c)//BAC
       std::cout << "b: " << b << "\ta: " << a << "\tc: " << c <<std::endl;
  if(b > c && c > a)//BCA
        std::cout << "b: " << b << "\tc: " << c << "\ta: " << a <<std::endl;
    
  if(c > b && b > a)//CBA
      std::cout << "c: " << c << "\tb: " << b << "\ta: " << a <<std::endl;
  if(c > a && a > b)//CAB
      std::cout << "c: " << c << "\ta: " << a << "\tb: " << b <<std::endl;
      
return 0;
}

Ho provato a scrivere del codice con IF-ELSE ma mi sembra un codice difficile da capire ad una prima occhiata.

La soluzione con solo IF mi sembra più facile da capire.

Ho aperto questa discussione per chiedere se è possibile scrivere codice più corto (linee di codice) rispetto a quello che ho scritto rispettando le linee guida del problema.

Se è possibile chiedo suggerimenti, ma non linee di codice; cosi da permettermi di ragionare e trovare la soluzione in "autonomia".

Grazie anticipatamente per le risposte

16 Risposte

  • Re: Il numero più alto tra A, B e C

    Ciao, non sempre codice più corto o più facile significa codice più performante, anzi...

    Ipotizzando di lanciare il codice su un vecchio catorcio che impiega un minuto per ogni operatore relazionale, il tuo programma richiederebbe minimo 12 minuti. Invece utilizzando gli IF/ELSE è possibile evitare operazioni ridondanti e abbassare i tempi a massimo 3 minuti!

    P.S.
    La traccia parla di ordine decrescente e non strettamente decrescente.

    EDIT:
    Aggiustato il valore da 5 a 3.
  • Re: Il numero più alto tra A, B e C

    Ciao Nippolo, piacere di conoscerti.

    Grazie per il suggerimento su IF/ELSE e l'occhiolino sulla traccia.

    E' estremamente interessante l'informazione da te fornita sulle ridondanze.

    Se posso chiedere: potresti suggerirmi dove reperire ulteriori informazioni sulle ridondanze?

    I motori di ricerca sono utili per reperire informazioni ma visto che ti sto rispondendo ho incorporato questa richiesta nel messaggio nella speranza che non sia in accordo con il tema da te suggerito.
  • Re: Il numero più alto tra A, B e C

    insalatina ha scritto:


    Se posso chiedere: potresti suggerirmi dove reperire ulteriori informazioni sulle ridondanze?
    In realtà mi riferivo ad un concetto molto semplice e intuitivo:
    - per esempio valutare sia a>b sia b>=a, equivale a chiedere a qualcuno sia se ha fratelli o sorelle sia se è figlio unico;
    - invece valutare più volte a>b equivale addirittura a fare la stessa domanda a qualcuno per due volte.
    In pratica con gli IF/ELSE puoi evitare di effettuare operazioni superflue (ridondanti), andando a sfruttare le conoscenze (basate su una logica binaria) già acquisite.

    Il tuo codice effettua sempre 12 operazioni relazionali (intendo i confronti con < e >), invece già modificando il codice in questo modo
    
    #include <iostream>
    
    int main(int argc, const char * argv[])
    {
        int a = 0, b = 0, c =0;
        
        std::cout << "inserisci A: " << std::endl;
        std::cin >> a;
        std::cout << "inserisci B: " << std::endl;
        std::cin >> b;
        std::cout << "inserisci C: " << std::endl;
        std::cin >> c;
    
      if(a > b && b > c) //ABC
          std::cout << "a: " << a << "\tb: " << b << "\tc: " << c <<std::endl;
      else if(a > b && c > b) //ACB
          std::cout << "a: " << a << "\tc: " << c << "\tb: " << b <<std::endl;
        
      else if(b > a && a > c)//BAC
           std::cout << "b: " << b << "\ta: " << a << "\tc: " << c <<std::endl;
      else if(b > c && c > a)//BCA
            std::cout << "b: " << b << "\tc: " << c << "\ta: " << a <<std::endl;
        
      else if(c > b && b > a)//CBA
          std::cout << "c: " << c << "\tb: " << b << "\ta: " << a <<std::endl;
      else
          std::cout << "c: " << c << "\ta: " << a << "\tb: " << b <<std::endl;
          
    return 0;
    }
    
    i confronti passano ad un minimo di 2 e un massimo di 10.
    Ma si può fare ancora di meglio, infatti dovrebbero essere necessari un numero di confronti pari ad un minimo di 2 e un massimo di 3.

    Prova a ragionarci, poi nel caso ne discutiamo!
  • Re: Il numero più alto tra A, B e C

    Un modo per ragionare su come trovare il massimo tra 3 numeri e' anche quello di ""astrarre" il problem\ al caso di n numeri, con n =0,1,2,3,4,10,100,1000, 1.000.000, ecc.

    Devi ragionare SFRUTTANDO le proprieta' del "massimo""
  • Re: Il numero più alto tra A, B e C

    Buongiorno Nippolo, ho seguito con attenzione cercando di capire il tuo messaggio.
    Il risultato dopo 6 ore di .. è questo:
    
    #include <iostream>
    
    int main(int argc, const char * argv[]) {
        
        int a = 0, b = 0, c =0;
            
            std::cout << "inserisci A: " << std::endl;
            std::cin >> a;
            std::cout << "inserisci B: " << std::endl;
            std::cin >> b;
            std::cout << "inserisci C: " << std::endl;
            std::cin >> c;
        
                
        if(a >= b)
        {
            if(a > c)
                std::cout << "a: " << a << "\tc: " << c << "\tb: " << b <<std::endl;//ACB
            else if(b==c && c==a)
                std::cout << "a: " << a << "\tb: " << b << "\tc: " << c <<std::endl;//ABC
            else
                std::cout << "c: " << c << "\ta: " << a << "\tb: " << b <<std::endl;//CAB
        }
        else if(a >= c)
            std::cout << "b: " << b << "\ta: " << a << "\tc: " << c <<std::endl;//BAC
        else if(c >= b)
            std::cout << "c: " << c << "\tb: " << b << "\ta: " << a <<std::endl;//CBA
        else
            std::cout << "b: " << b << "\tc: " << c << "\ta: " << a <<std::endl;//BCA
    
    return 0;
    }
    
    
    è stato divertente (quando il risultato è arrivato).
    Ti ringrazio dei consigli e ti invito a farne altrettanti!
  • Re: Il numero più alto tra A, B e C

    Ciao migliorabile, piacere di conoscerti.

    Ho incominciato da poco, quello che mi dici è chiaro, ho bisogno di imparare le fondamenta!

    Grazie per il suggerimento, provo (e riprovo) a fare un algoritmo con il consiglio che mi hai dato finché non mi riesce.
  • Re: Il numero più alto tra A, B e C

    PRIMA di studiare un linuaggio di programmazione, ed ancora di piu' uno COMPLICATO come il C (il C++ e' anni luce piu' complesso), e' meglio STUDIARE LE BASI.

    Se e' per interesse personale, lascia perdere il C e passa a Python: per certi aspetti e' piu' semplice e, sapendolo usare, puoi fare cose INFINITAMENTE piu' interessanti di quello che potresti fare con il C o il C++.

    In ogni casi, PRIMA bisogna saper risolvere il problema con CARTA E MATITA (LETTERALMENTE), solo POI puoi pensare di convertire l'idea in una forma adatta al computer
  • Re: Il numero più alto tra A, B e C

    Grazie per la tua opinione, migliorabile.

    Credo che continuerò a perseguire la mia scelta di imparare C++.

    Interessante la frase "CARTA E MATITA", ti riferisci allo pseudo codice?
  • Re: Il numero più alto tra A, B e C

    insalatina ha scritto:


    ...
    Il risultato dopo 6 ore di .. è questo:
    ...
    Prova ad inserire 3 2 1... mi sa che dovrai sbatterci la testa ancora un po'!
  • Re: Il numero più alto tra A, B e C

    Ciao Nippolo

    Nippolo ha scritto:


    insalatina ha scritto:


    ...
    Il risultato dopo 6 ore di .. è questo:
    ...
    Prova ad inserire 3 2 1... mi sa che dovrai sbatterci la testa ancora un po'!
    Bene!

    Con 3 2 1 intendi una cosa del tipo:

    - Chi è il più grande fra A, B e C?
    - Chi è il secondo più grande?
    - Il terzo in fondo alla fila paga da bere.

    Sono un pò bloccato su questo pensiero:

    Ho bisogno di stampare 6 risultati, le combinazioni possibili sono 6, se spezzo il problema in 2 rami A da una parte, B e C dall'altra ho 6/2 = 3(due rami - 6 stampe (il risultato ABC terzo incomodo)).

    Ho pensato anche al false di
    if(a>=b && b>=c && a>=c)
    e proseguire con i confronti da qui, ma la mia logica profana dice

    Può darsi che sia questo il 3 del tuo suggerimento 3 2 1? interessante..

    La sfida è entusiasmante, senza dubbio su questo!

    Ho pensato a quello che mi hai detto su if-else, e grazie al tuo commento ho scoperto else if..

    Ho pensato anche a questa sostituzione finale:
    
        if(a >= b)
        {
            if(a > c)
                std::cout << "a: " << a << "\tc: " << c << "\tb: " << b <<std::endl;//ACB
            else if(b==c && c==a)
                std::cout << "a: " << a << "\tb: " << b << "\tc: " << c <<std::endl;//ABC
            else
                std::cout << "c: " << c << "\ta: " << a << "\tb: " << b <<std::endl;//CAB
        }
        else
        {
            if(a >= c)
                std::cout << "b: " << b << "\ta: " << a << "\tc: " << c <<std::endl;//BAC
            else if(c >= b)
                std::cout << "c: " << c << "\tb: " << b << "\ta: " << a <<std::endl;//CBA
            else
                std::cout << "b: " << b << "\tc: " << c << "\ta: " << a <<std::endl;//BCA
        }
       
    return 0;
    }
    
    Cosi da sfruttare il false in modo più efficace.

    Probabilmente come da te suggerito c'è un sentiero che non ho ancora visitato.

    Da neofita ho pensato cosi: senza mappa quando si viaggia si ha più meraviglia nella scoperta, può darsi che con foglio e calamaio, e con la guida di mappe stradali si fa prima a trovare la strada, ma la mia motivazione mi spinge verso la prima visione delle cose.

    Tuoi consigli sono motivanti e amicali, Grazie.
  • Re: Il numero più alto tra A, B e C

    @insalatina, RAGIONA DI PIU' !!!

    TUTTE le possibili combinazioni sono n! (n fattoriale).
  • Re: Il numero più alto tra A, B e C

    insalatina ha scritto:


    Con 3 2 1 intendi una cosa del tipo:
    ...
    Intendevo semplicemente che il tuo penultimo codice restituisce
    inserisci A:
    3
    inserisci B:
    2
    inserisci C:
    1
    a: 3    c: 1    b: 2
    
    Process returned 0 (0x0)   execution time : 3.552 s
    Press any key to continue.
    
    che ovviamente risulta sbagliato.

    L'impostazione
    if(a >= b)
    {
        if ...
        else if ...
        else ...
    }
    else
    {
        if ...
        else if ...
        else ...
    }
    è corretta, ma occhio alla parte contenuta nell'if più esterno (quella nell'else sembra giusta).

    insalatina ha scritto:


    Da neofita ho pensato cosi: senza mappa quando si viaggia si ha più meraviglia nella scoperta, può darsi che con foglio e calamaio, e con la guida di mappe stradali si fa prima a trovare la strada, ma la mia motivazione mi spinge verso la prima visione delle cose.
    La premessa ci sta tutta, ma il paragone non mi sembra molto calzante... carta e penna non sono un aiuto esterno, ma uno strumento che ti permette di ragionare comodamente sul problema!

    Nel caso specifico per esempio abbiamo che se se a>=b risulta vero, significa che A dovrà precedere B e quindi le possibili sequenze saranno:
    - ABC
    - ACB
    - CAB
    Se invece a>=b risulta falso (e quindi sarà b>a), le possibili sequenze saranno:
    - BAC
    - BCA
    - CBA
    Consideriamo il codice da te scritto in riferimento al secondo ramo (quindi siamo nel caso b>a). Se a>=c sarà per la proprietà transitiva anche b>c e quindi ci troviamo nel caso BAC. Se invece c>a allora le sequenze possibili saranno BCA e CBA e bisognerà quindi confrontare, come giustamente fai, b con c per capire in quali dei due suddetti casi ci troviamo.
    Detto questo non ti resta che ragionare in modo simile anche per il primo ramo.
  • Re: Il numero più alto tra A, B e C

    Nippolo ha scritto:



    Con 3 2 1 intendi una cosa del tipo:
    ...
    Buongiorno Nippolo

    Ho seguito il tuo suggerimento e il risultato è questo:
    
    #include <iostream>
    
    int main(int argc, const char * argv[]) {
        
        int a = 0, b = 0, c =0;
            
            std::cout << "inserisci A: " << std::endl;
            std::cin >> a;
            std::cout << "inserisci B: " << std::endl;
            std::cin >> b;
            std::cout << "inserisci C: " << std::endl;
            std::cin >> c;
        
        if(a >= b)
        {
            if(a >= c && b >= c)
                std::cout << "a: " << a << "\tb: " << b << "\tc: " << c <<std::endl;//ABC
            else if(a > c && c > b)
                std::cout << "a: " << a << "\tc: " << c << "\tb: " << b <<std::endl;//ACB
            else
                std::cout << "c: " << c << "\ta: " << a << "\tb: " << b <<std::endl;//CAB
        }
        else
        {
            if(a >= c)
                std::cout << "b: " << b << "\ta: " << a << "\tc: " << c <<std::endl;//BAC
            else if(c >= b)
                std::cout << "c: " << c << "\tb: " << b << "\ta: " << a <<std::endl;//CBA
            else
                std::cout << "b: " << b << "\tc: " << c << "\ta: " << a <<std::endl;//BCA
        }
       
    return 0;
    }
    
    Stampe:

    ABC
    
    inserisci A: 
    1
    inserisci B: 
    1
    inserisci C: 
    1
    a: 1	b: 1	c: 1
    Program ended with exit code: 0
    
    321
    
    inserisci A: 
    3
    inserisci B: 
    2
    inserisci C: 
    1
    a: 3	b: 2	c: 1
    Program ended with exit code: 0
    
    ACB
    
    inserisci A: 
    3
    inserisci B: 
    1
    inserisci C: 
    2
    a: 3	c: 2	b: 1
    Program ended with exit code: 0
    
    CAB
    
    inserisci A: 
    2
    inserisci B: 
    1
    inserisci C: 
    3
    c: 3	a: 2	b: 1
    Program ended with exit code: 0
    
    BAC
    
    inserisci A: 
    2
    inserisci B: 
    3
    inserisci C: 
    1
    b: 3	a: 2	c: 1
    Program ended with exit code: 0
    
    BCA
    
    inserisci A: 
    1
    inserisci B: 
    3
    inserisci C: 
    2
    b: 3	c: 2	a: 1
    Program ended with exit code: 0
    
    CBA
    
    inserisci A: 
    1
    inserisci B: 
    2
    inserisci C: 
    3
    c: 3	b: 2	a: 1
    Program ended with exit code: 0
    
    Grazie per il tuo contributo

    Edit:
    Ho notato che inserendo valori non convertibili in int, il valore contenuto nella variabile restituisce 0..
    devo lavorarci ancora un pò sui controlli se l'utente inserisce caratteri non convertibili il programma esce in modo brutale e se l'utente inserisce il valore massimo di int (2147483647), i byte in più non vengono calcolati e il programma va avanti, no buono, dovrebbe avvertire e fermarsi o avvertire e ripartire con l'inserimento..
  • Re: Il numero più alto tra A, B e C

    Ciao, in realtà fai ancora qualche controllo di troppo, qualcosa del genere risulta sufficiente:
    #include <iostream>
    
    int main()
    {
        int a;
        int b;
        int c;
    
        std::cout << "A: ";
        std::cin >> a;
        std::cout << "B: ";
        std::cin >> b;
        std::cout << "C: ";
        std::cin >> c;
    
        if(a >= b)
        {
            if(b >= c)
            {
                std::cout << "\nABC\n";
            }
            else if(a >= c)
            {
                std::cout << "\nACB\n";
            }
            else
            {
                std::cout << "\nCAB\n";
            }
        }
        else
        {
            if(a >= c)
            {
                std::cout << "\nBAC\n";
            }
            else if(b >= c)
            {
                std::cout << "\nBCA\n";
            }
            else
            {
                std::cout << "\nCBA\n";
            }
        }
    }

    insalatina ha scritto:


    Edit:
    Ho notato che inserendo valori non convertibili in int, il valore contenuto nella variabile restituisce 0..
    devo lavorarci ancora un pò sui controlli se l'utente inserisce caratteri non convertibili il programma esce in modo brutale e se l'utente inserisce il valore massimo di int (2147483647), i byte in più non vengono calcolati e il programma va avanti, no buono, dovrebbe avvertire e fermarsi o avvertire e ripartire con l'inserimento..
    Se hai iniziato da poco lascia stare, non è una questione semplicissima da affrontare!
Devi accedere o registrarti per scrivere nel forum
16 risposte