Studente del liceo alle prime armi if else

di Gaia07 il
15 risposte

Scusate, avrei bisogno di aiuto. L'esercizio è dati i lati stabilire che tipo di triangolo. Ho fatti altri esrcizi e funzionano ma questo, non mi da errore nel compilarlo ma mi stampa solo il triangolo è equilatero in tutti i casi, non capisco dove sbaglio. grazie in anticipo

#include <iostream>
using namespace std;
main () {
float a;
cout<<"inserisci a:";
cin>>a;
float b;
cout<<"inserisci b:";
cin>>b;
float c;
cout<<"inserisci c:";
cin>>c;
if ((a==b) && (b==c) && (c==a))
 cout<<"il triangolo e equilatero ";
else
if ((a!=b) && (b!=c) && (a!=c))
 cout<<"il triangolo e scaleno";
else
 if ((a==b) ^ (b==c)^ (a==c))
 cout<<"il triangolo e isoscele ";

system ("PAUSE");
}

15 Risposte

  • Leggiti BENE quali sono gli operato booleani. 

    Attento che sono simili ma NON SONO la stessa cosa degli operato binari. 

    A esempio lo XOR’ binario NON E' la stessa cosa dell' OR booleano o quello binario. 

    (in tempo zero dovresti aver capito ;-)) 

  • Questa è una versione con le graffe. Se non ho capito male l'operatore && dovrebbe rendere vera l'espressione se tutte e tre le condizioni sono vere, ed è quello che mi serve  nel caso del triangolo equilatero e dello scaleno, mentre lo xor (or esclusivo) ^ rende vera l'espressione se solo una delle condizioni è vera, ed è quello che mi serve per il triangolo isoscele. L'operatore || or inclusivo non mi va bene perchè mi darebbe vera anche nel caso di un equilatero, che è si isoscele, ma rientra nel primo caso. Qualunque valore metto ai lati mi stampa sempre  “il triangolo è equilatero e non capisco dove sbaglio. Dovrebbe essere se a=b è vera allora passa a valutare b=c se è vera passa a valutare c=a se è vera pure quella stampa ”il triangolo è equilatero" e questo vale anche per lo scaleno. Mentre per l'ultima dovrebbe dare vero solo se solo una delle tre è vera.

    #include <iostream>
    using namespace std;
    main () {
    float a;
    cout<<"inserisci a:";
    cin>>a;
    float b;
    cout<<"inserisci b:";
    cin>>b;
    float c;
    cout<<"inserisci c:";
    cin>>c;
    if ((a==b) && (b==c) && (c==a)){
    cout<<"il triangolo e equilatero ";
    }else if ((a!=b) && (b!=c) && (a!=c)){
    cout<<"il triangolo e scaleno";
    } else if ((a==b) ^ (b==c) ^ (a==c)){
    cout<<"il triangolo e isoscele ";
    }
    system ("PAUSE");
    }

    Ho fatto anche questo esercizio e questo funziona 

    #include <iostream>
    using namespace std;
    main () {
    int voto;
    cout <<"inserire voto:";
    cin >> voto;

    if ((voto<1) || (voto>10)){
     cout <<"valore errato:";
    }
    else if (voto>6){
     cout<<"sufficiente:";
    }
    else if ((voto>4) && (voto<6)){
     cout <<"insufficiente:";
    }
    else if (voto<=4){
     cout <<"gravemente insufficiente:";
    }
    system ("pause");
    }

  • Il secondo FUNZIONA PERCHE' hai scritto GIUSTO gli operatori booleani

    Il primo NON FUNZIONA PERCHE' hai scritto SBAGLIATO l'operatore booleano OR

    LEGGI BENE la mia precedente risposta e QUESTA!!

    Ho anche scirtto COSA guardare ;-)

    Ci arrivi anche da solo, e' BANALE.

  • Avevo già provato a scriverlo così ma non funziona uguale, non l'avevo utilizzato il || perchè solo una delle tre le condizioni deve essere vera.

    #include <iostream>
    using namespace std;
    main () {
    float a;
    cout<<"inserisci a:";
    cin>>a;
    float b;
    cout<<"inserisci b:";
    cin>>b;
    float c;
    cout<<"inserisci c:";
    cin>>c;
    if ((a==b) && (b==c) && (c==a))
    cout<<"il triangolo e equilatero ";
    else
    if ((a!=b) && (b!=c) && (a!=c))
    cout<<"il triangolo e scaleno";
    else
    if ((a==b) || (b==c) || (a==c))
    cout<<"il triangolo e isoscele ";

    system ("PAUSE");
    }

  • Ok, allora scrivi un'espressione BOOLEANA piu' complicata.

    di sicuro mescolare operatori booleani e binari, se non fatto con ‘cognizione di causa’ , non dara' il risultato richiesto in modo ‘miracoloso’.

    sara' una cosa del tipo:

    a==b && … || …

    Gli operatori booleani si possono combinare,, ovviamente.

    Bisogna stare attenti all'ORDINE DI VALUTAZIONE: prima l'AND oppure l'OR?

    Oppure ci si mettono le parentesi.

    queste cose sono scritte nel manuale del linguaggio, che va consultato SEMPRE quando non si e' sicuri di qualcosa 

    Non ti ho scritto tutto perche', come dicevo, e' BANALE.

    Ci arrivi con uno sforzo minuscolo ;-)

  • Ho provato anche a scriverlo così, come suggeritomi da un'altro utente del forum, ma non va pure questo, mi da sempre e solo una risposta.

    #include <iostream>
    using namespace std;
    main () {
    float a;
    cout<<"inserisci a:";
    cin>>a;
    float b;
    cout<<"inserisci b:";
    cin>>b;
    float c;
    cout<<"inserisci c:";
    cin>>c;
    if (a!=b && b!=c && c!=a){
    cout <<"il triangolo e scaleno";
    }
    else if (a==b && b==c) {
    cout <<"il triangolo e equilatero";
    }
    else {
    cout << "il triangolo è isoscele";
    }

    }

  • Adesso e' pure peggio di prima!

  • @weierstrass, attento: un triangolo e' equilatero quando TUTTI E TRE i lati sono uguali, NON solo 2, come implementatio nell'ultima versione del codice.
    Osserva bene il codice: e' il classico “funziona per sbaglio” ;-)

    D'altra parte,

    1. se sono TUTTI diversi, e' scaleno

    2. se sono TUTTI uguali e' equilatero

    3. cosa succede se ci sono DUE uguali e UNO diverso?

    4. cosa succede se c'e' UNO uguale e DUE diversi?

    (a buon intenditor poche parole ;-))

  • 21/02/2023 - migliorabile ha scritto:


    @weierstrass, attento: un triangolo e' equilatero quando TUTTI E TRE i lati sono uguali, NON solo 2, come implementatio nell'ultima versione del codice.
    Osserva bene il codice: e' il classico “funziona per sbaglio” ;-)

    Nelle relazioni di equivalenza vale la proprietà transitiva, quindi se a è uguale a b e b è uguale a c, allora a è uguale a c

  • 21/02/2023 - Weierstrass ha scritto:


    Come fa a darti una risposta sbagliata?

    https://onlinegdb.com/m-PprRpx4

    dà tre risposte diverse e corrette

    Non so, io uso dev+ , l'ho scritto come l'ho postato faccio compila e poi esegui, ma in tutti i casi con tutti questi questi codici  mi restituisce sempre “triangolo equilatero” anche se i lati non sono uguali o  se sono due uguali. Il mio codice, dal punto di vista concettuale mi sembrava corretto al di la del || o ^ . Forse c'è qualcosa nella sintassi che non va bene.

  • Puzzola, sono “andato”!
    Meno ML e piu' “cervello”!

    L'ho letto n-mila volte come ‘a==b && a==c’ !

  • Ho provato di corsa e direi che funzione, al posto dell'operatore or ho messo la somma. Ho modificato solo quello.

    Per rendere l'esercizio migliore, troverei se è rettangolo, poi calcolare perimetro ed area. Magari la coerenza della lunghezza dei lati.

    #include <iostream>
    
    main ()
    {
     float a,b,c; /* sono allergico alle dichiarazioni in mezzo al codice */
    
     cout<<"inserisci a:";
     cin>>a;
     cout<<"inserisci b:";
     cin>>b;
     cout<<"inserisci c:";
     cin>>c;
    
     if ((a==b) && (b==c) && (c==a)) cout<<"il triangolo e equilatero ";
     else if ((a!=b) && (b!=c) && (a!=c)) cout<<"il triangolo e scaleno";
     else if ((a==b) + (b==c) + (a==c)) cout<<"il triangolo e isoscele ";
    
     cin>>c; /* attesa finale */
     
     return 0; 
    }
Devi accedere o registrarti per scrivere nel forum
15 risposte