PDA

View Full Version : Problema da principiante C++


Gwynbleidd19
24-03-2019, 18:01
Salve a tutti, premetto che sono nuovo su questo forum.
Sto riscontrando dei problemi di codice con un programma in c++ che riceve 3 numeri dall'utente (che sono gli angoli di un triangolo), se la somma di essi è uguale a 180 poi il programma va a definire se il triangolo è isoscele, scaleno ed equilatero. Il problema è che quando inserisco apposta dei numeri la cui somma non è 180, invece di ritornare alla sezione di input, il programma è come se saltasse per andare sull'if. Spero in un vostro aiuto, grazie in anticipo.

Questo è il codice:
#include <iostream>
using namespace std;
int main ()
{
int a, b, c, d;
do
{
cout<<"Digita il primo numero:"<<endl;
cin>>a;
cout<<"Digita il secondo numero:"<<endl;
cin>>b;
cout<<"Digita il terzo numero:"<<endl;
cin>>c;
d = a + b +c;
}
while (d==180);
if (a==b==c)
{
cout<<"Il triangolo e' equilatero."<<endl;
}
else
{
if (a!=b!=c)
{
cout<<"Il triangolo e' scaleno."<<endl;
}
else
{
cout<<"Il triangolo e' equilatero."<<endl;
}
}
system ("pause");
return 0;
}

DelusoDaTiscali
24-03-2019, 18:41
Non conosco il C++, anche se riesco a leggere questi pochi statement. Il predicato WHILE innesca un loop delle successive istruzioni finché (while) la condizione indicata è vera

cfr https://www.tutorialspoint.com/cplusplus/cpp_while_loop.htm

Una possibile soluzione in pseudo-code:


finché (a+b+c) <> 180
.....acquisisci a, b, c
....fine-finché

Se a=b E b=c
...segnala "il triangolo è equilatero"
altrimenti
....se a<>c E b<>c E a<>c
........segnala "il triangolo è scaleno"
....altrimenti
........segnala "il triangolo è isoscele"
....fine-se
fine-se



Non conoscendo c++ ignoro se vi siano altri errori di codifica.

Kaya
25-03-2019, 08:30
Salve a tutti, premetto che sono nuovo su questo forum.
Sto riscontrando dei problemi di codice con un programma in c++ che riceve 3 numeri dall'utente (che sono gli angoli di un triangolo), se la somma di essi è uguale a 180 poi il programma va a definire se il triangolo è isoscele, scaleno ed equilatero. Il problema è che quando inserisco apposta dei numeri la cui somma non è 180, invece di ritornare alla sezione di input, il programma è come se saltasse per andare sull'if. Spero in un vostro aiuto, grazie in anticipo.

Questo è il codice:
#include <iostream>
using namespace std;
int main ()
{
int a, b, c, d;
do
{
cout<<"Digita il primo numero:"<<endl;
cin>>a;
cout<<"Digita il secondo numero:"<<endl;
cin>>b;
cout<<"Digita il terzo numero:"<<endl;
cin>>c;
d = a + b +c;
}
while (d==180);
if (a==b==c)
{
cout<<"Il triangolo e' equilatero."<<endl;
}
else
{
if (a!=b!=c)
{
cout<<"Il triangolo e' scaleno."<<endl;
}
else
{
cout<<"Il triangolo e' equilatero."<<endl;
}
}
system ("pause");
return 0;
}

Sono mezzo addormentato ma credo che il problema sia in un errore di logica.
tu devi eseguire il loop (while) finchè d è DIVERSO da 180.
Deve uscire dal loop quando la somma dei 3 valori è 180, e non restare dentro finchè lo è.

-MiStO-
25-03-2019, 09:55
piccolo consiglio: installati un ide che abbia un buon debugger in tempo reale (io raccomanderò sempre e comunque Visual Studio community ed. che è quanto di più completo puoi trovare ma a te la scelta), e metti un paio di break point per vedere cosa succede durante l'esecuzione...bug come questi, di pura "logica / algoritmica" li becchi in un attimo ;)

Lampo89
17-04-2019, 22:09
Salve a tutti, premetto che sono nuovo su questo forum.
Sto riscontrando dei problemi di codice con un programma in c++ che riceve 3 numeri dall'utente (che sono gli angoli di un triangolo), se la somma di essi è uguale a 180 poi il programma va a definire se il triangolo è isoscele, scaleno ed equilatero. Il problema è che quando inserisco apposta dei numeri la cui somma non è 180, invece di ritornare alla sezione di input, il programma è come se saltasse per andare sull'if. Spero in un vostro aiuto, grazie in anticipo.

Questo è il codice:
#include <iostream>
using namespace std;
int main ()
{
int a, b, c, d;
do
{
cout<<"Digita il primo numero:"<<endl;
cin>>a;
cout<<"Digita il secondo numero:"<<endl;
cin>>b;
cout<<"Digita il terzo numero:"<<endl;
cin>>c;
d = a + b +c;
}
while (d==180);
if (a==b==c)
{
cout<<"Il triangolo e' equilatero."<<endl;
}
else
{
if (a!=b!=c)
{
cout<<"Il triangolo e' scaleno."<<endl;
}
else
{
cout<<"Il triangolo e' equilatero."<<endl;
}
}
system ("pause");
return 0;
}

a == b == c

occhio a conversioni implicite ad int in agguato nel caso di un triangolo davvero equilatero!
a == b valuta a true, ma true viene convertito implicitamente a 1 nel confronto successivo. Il codice non riesce a rilevare triangoli equilateri con lato diverso da 1.

Kaya
18-04-2019, 08:38
a == b == c

occhio a conversioni implicite ad int in agguato nel caso di un triangolo davvero equilatero!
a == b valuta a true, ma true viene convertito implicitamente a 1 nel confronto successivo. Il codice non riesce a rilevare triangoli equilateri con lato diverso da 1.

Come giustamente fatto notare, sarebbe meglio modificare così:
if (a == b && b == c )

xsandrox
21-04-2019, 21:44
Salve a tutti, premetto che sono nuovo su questo forum.
Sto riscontrando dei problemi di codice con un programma in c++ che riceve 3 numeri dall'utente (che sono gli angoli di un triangolo), se la somma di essi è uguale a 180 poi il programma va a definire se il triangolo è isoscele, scaleno ed equilatero. Il problema è che quando inserisco apposta dei numeri la cui somma non è 180, invece di ritornare alla sezione di input, il programma è come se saltasse per andare sull'if. Spero in un vostro aiuto, grazie in anticipo.

Questo è il codice:
#include <iostream>
using namespace std;
int main ()
{
int a, b, c, d;
do
{
cout<<"Digita il primo numero:"<<endl;
cin>>a;
cout<<"Digita il secondo numero:"<<endl;
cin>>b;
cout<<"Digita il terzo numero:"<<endl;
cin>>c;
d = a + b +c;
}
while (d==180);
if (a==b==c)
{
cout<<"Il triangolo e' equilatero."<<endl;
}
else
{
if (a!=b!=c)
{
cout<<"Il triangolo e' scaleno."<<endl;
}
else
{
cout<<"Il triangolo e' equilatero."<<endl;
}
}
system ("pause");
return 0;
}

Il ciclo WHILE viene eseguito fino a quando la condizione è vera, stessa cosa per il DO...WHILE.
Quindi il tuo ciclo iniziando con il DO non verifica subito la condizione e ti fa inserire i dati. Quando arriva a WHILE(d==180) se d vale 180, ripete il ciclo altrimenti esce.
Per fare quello che scrivi, ripetere l'inserimento se la somma non è 180, la condizione di verifica deve essere WHILE(d!=180).
Inoltre c'è anche un errore sull'ultimo controllo IF perche, nel caso che a==b!=c viene la scritta "triangolo equilatero"... che inv ece non è.

poi, per i confronti io userei queste forme a==b && a==c.