Théorème de Pythagore
Résolu
81sharky18
-
18sharky81 Messages postés 23 Date d'inscription Statut Membre Dernière intervention -
18sharky81 Messages postés 23 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'en suis maintenant à mon troisième programme, et je pensais à un programme comprenant le théorème de Pythagore, ainsi que sa réciproque.
Par contre, lorsque je fais les calculs du théorème de Pythagore, le résultat est toujours soit 0, soit 1. Le voici:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
char program;
cout << "Quel programme souhaitez-vous executer?";
cout << endl << "\t" << "1: Theoreme de Pythagore.";
cout << endl << "\t" << "2: Reciproque du Theoreme de Pythagore.";
cout << endl;
cin >> program;
system("cls");
switch(program){
case'1':
char h;
cout << "Voulez-vous calculer l'hypothenuse? (o/n):\t";
cin >> h;
system("cls");
switch(h){
case'o':
/* AB= a ; AC= c ; BC= b */
float a, c, b, A, C;
cout << "Dans le triangle ABC rectangle en A, l'hypothenuse est [BC].";
cout << "\nSaisir la longueur AB:\t";
cin >> a;
cout << "\nSaisir la longueur AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
b= pow(A+C,1/2);
cout << "[BC] mesure " << b << endl;
system("pause");
break;
}
}
}
Quelqu'un pourrait-il me dire ce qui cloche svp?
Merci d'avance
j'en suis maintenant à mon troisième programme, et je pensais à un programme comprenant le théorème de Pythagore, ainsi que sa réciproque.
Par contre, lorsque je fais les calculs du théorème de Pythagore, le résultat est toujours soit 0, soit 1. Le voici:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
char program;
cout << "Quel programme souhaitez-vous executer?";
cout << endl << "\t" << "1: Theoreme de Pythagore.";
cout << endl << "\t" << "2: Reciproque du Theoreme de Pythagore.";
cout << endl;
cin >> program;
system("cls");
switch(program){
case'1':
char h;
cout << "Voulez-vous calculer l'hypothenuse? (o/n):\t";
cin >> h;
system("cls");
switch(h){
case'o':
/* AB= a ; AC= c ; BC= b */
float a, c, b, A, C;
cout << "Dans le triangle ABC rectangle en A, l'hypothenuse est [BC].";
cout << "\nSaisir la longueur AB:\t";
cin >> a;
cout << "\nSaisir la longueur AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
b= pow(A+C,1/2);
cout << "[BC] mesure " << b << endl;
system("pause");
break;
}
}
}
Quelqu'un pourrait-il me dire ce qui cloche svp?
Merci d'avance
4 réponses
1/2 est la division entière de l'entier 1 par l'entier 2, ce qui donne l'entier 0.
Pour faire la racine carré tu devrais plutôt faire pow(A+C,0.5), ou alors mieux, utiliser directement la fonction sqrt(A+C)
Pour faire la racine carré tu devrais plutôt faire pow(A+C,0.5), ou alors mieux, utiliser directement la fonction sqrt(A+C)
voici tes erreurs
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
##tu dois déclarer un double
char program;
cout << "Quel programme souhaitez-vous executer?";
cout << endl << "\t" << "1: Theoreme de Pythagore.";
cout << endl << "\t" << "2: Reciproque du Theoreme de Pythagore.";
cout << endl;
cin >> program;
system("cls");
switch(program){
case'1':
##ici tu déclares une variable local a ton switch mauvaise programmation
char h;
cout << "Voulez-vous calculer l'hypothenuse? (o/n):\t";
cin >> h;
system("cls");
switch(h){
case'o':
/* AB= a ; AC= c ; BC= b */
float a, c, b, A, C;
cout << "Dans le triangle ABC rectangle en A, l'hypothenuse est [BC].";
cout << "\nSaisir la longueur AB:\t";
cin >> a;
cout << "\nSaisir la longueur AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
b= pow(A+C,1/2);
cout << "[BC] mesure " << b << endl;
system("pause");
break;
}
}
}
Signature non conforme Modération CCM
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
##tu dois déclarer un double
char program;
cout << "Quel programme souhaitez-vous executer?";
cout << endl << "\t" << "1: Theoreme de Pythagore.";
cout << endl << "\t" << "2: Reciproque du Theoreme de Pythagore.";
cout << endl;
cin >> program;
system("cls");
switch(program){
case'1':
##ici tu déclares une variable local a ton switch mauvaise programmation
char h;
cout << "Voulez-vous calculer l'hypothenuse? (o/n):\t";
cin >> h;
system("cls");
switch(h){
case'o':
/* AB= a ; AC= c ; BC= b */
float a, c, b, A, C;
cout << "Dans le triangle ABC rectangle en A, l'hypothenuse est [BC].";
cout << "\nSaisir la longueur AB:\t";
cin >> a;
cout << "\nSaisir la longueur AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
b= pow(A+C,1/2);
cout << "[BC] mesure " << b << endl;
system("pause");
break;
}
}
}
Signature non conforme Modération CCM
Un autre problème..cette fois, c'est sa réciproque, le voici:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
char program;
double a, c, b, A, B, C, L;
cout << "Wich program do you want execute?";
cout << endl << "\t" << "1: Pythagorean theorem.";
cout << endl << "\t" << "2: Reciprocal of the Pythagorean theorem.";
cout << endl;
cin >> program;
system("cls");
switch(program){
case'1':
char h;
cout << "Do you want calculate the hypotenuse? (y/n):\t";
cin >> h;
system("cls");
switch(h){
case'o':
/* AB= a ; AC= c ; BC= b */
cout << "In the triangle ABC, the hypotenuse's [BC].\n\n";
cout << "\nEnter the length AB:\t";
cin >> a;
cout << "\nEnter the length AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
sqrt(A+C);
cout << "[BC] measure " << b << endl;
system("pause");
break;
case'O':
cout << "In the triangle ABC rectangle to A, the hypotenuse's [BC].\n\n";
cout << "\nEnter the length AB:\t";
cin >> a;
cout << "\nEnter the length AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
sqrt(A+C);
cout << "[BC] measure " << b << endl;
system("pause");
break;
case'n':
cout << "[BC] is the hypotenuse, and [AB] the known side.\n\n";
cout << "Enter the length BC:\t";
cin >> b;
cout << endl;
cout << "Enter the length AC:\t";
cin >> c;
A= pow(a,2);
B= pow(b,2);
c= sqrt(B-A);
cout << "[AC] measure " << c;
system("pause");
break;
case'N':
cout << "[BC] is the hypotenuse, and [AB] the known side.\n\n";
system("pause");
cout << "Enter the length BC:\t";
cin >> b;
cout << endl;
cout << "Enter the length AC:\t";
cin >> c;
A= pow(a,2);
B= pow(b,2);
c= sqrt(B-A);
cout << "[AC] measure " << c;
system("pause");
break;
default:
cout << "ERROR";
system("pause");
return 0;
break;
}
case'2':
cout << "ABC's a triangle, the longer side's BC.\n\n";
cout << "Enter the length AB:\t";
cin >> a;
cout << "Enter the length AC:\t";
cin >> c;
cout << "Enter the length BC:\t";
cin >> b;
L= pow(a,2)+pow(c,2);
B= pow(b,2);
system("cls");
if(B==L){
cout << "The triangle ABC is rectangle to A.\n\n\n";
system("pause");
}
else{
cout << "BC*BC is different from (AB*AB)+(AC*AC), so triangle ABC isn't rectangle.\n\n\n";
system("pause");
}
break;
}
}
La partie concernée est la case'2', mais j'ai mis tout le programme pour si les erreurs y sont.
En fait, avec n'importe quelle longueur, c'est le "else" qui est prit en compte.
Cependant, si je remplace le " if(B==L)" par "if(B=L)", alors c'est tout le temp le "if" qui est pris en compte. Cela fait maintenant 1 à 2 semaines que je suis sur ce programme (je suis débutant!!), et ca me ferais donc 1 ou 2 semaines de perdu :(.
Quelqu'un pourrait-il m'aider?
Merci d'avance
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
char program;
double a, c, b, A, B, C, L;
cout << "Wich program do you want execute?";
cout << endl << "\t" << "1: Pythagorean theorem.";
cout << endl << "\t" << "2: Reciprocal of the Pythagorean theorem.";
cout << endl;
cin >> program;
system("cls");
switch(program){
case'1':
char h;
cout << "Do you want calculate the hypotenuse? (y/n):\t";
cin >> h;
system("cls");
switch(h){
case'o':
/* AB= a ; AC= c ; BC= b */
cout << "In the triangle ABC, the hypotenuse's [BC].\n\n";
cout << "\nEnter the length AB:\t";
cin >> a;
cout << "\nEnter the length AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
sqrt(A+C);
cout << "[BC] measure " << b << endl;
system("pause");
break;
case'O':
cout << "In the triangle ABC rectangle to A, the hypotenuse's [BC].\n\n";
cout << "\nEnter the length AB:\t";
cin >> a;
cout << "\nEnter the length AC:\t";
cin >> c;
A= pow(a,2);
C= pow(c,2);
sqrt(A+C);
cout << "[BC] measure " << b << endl;
system("pause");
break;
case'n':
cout << "[BC] is the hypotenuse, and [AB] the known side.\n\n";
cout << "Enter the length BC:\t";
cin >> b;
cout << endl;
cout << "Enter the length AC:\t";
cin >> c;
A= pow(a,2);
B= pow(b,2);
c= sqrt(B-A);
cout << "[AC] measure " << c;
system("pause");
break;
case'N':
cout << "[BC] is the hypotenuse, and [AB] the known side.\n\n";
system("pause");
cout << "Enter the length BC:\t";
cin >> b;
cout << endl;
cout << "Enter the length AC:\t";
cin >> c;
A= pow(a,2);
B= pow(b,2);
c= sqrt(B-A);
cout << "[AC] measure " << c;
system("pause");
break;
default:
cout << "ERROR";
system("pause");
return 0;
break;
}
case'2':
cout << "ABC's a triangle, the longer side's BC.\n\n";
cout << "Enter the length AB:\t";
cin >> a;
cout << "Enter the length AC:\t";
cin >> c;
cout << "Enter the length BC:\t";
cin >> b;
L= pow(a,2)+pow(c,2);
B= pow(b,2);
system("cls");
if(B==L){
cout << "The triangle ABC is rectangle to A.\n\n\n";
system("pause");
}
else{
cout << "BC*BC is different from (AB*AB)+(AC*AC), so triangle ABC isn't rectangle.\n\n\n";
system("pause");
}
break;
}
}
La partie concernée est la case'2', mais j'ai mis tout le programme pour si les erreurs y sont.
En fait, avec n'importe quelle longueur, c'est le "else" qui est prit en compte.
Cependant, si je remplace le " if(B==L)" par "if(B=L)", alors c'est tout le temp le "if" qui est pris en compte. Cela fait maintenant 1 à 2 semaines que je suis sur ce programme (je suis débutant!!), et ca me ferais donc 1 ou 2 semaines de perdu :(.
Quelqu'un pourrait-il m'aider?
Merci d'avance
if(B=L) est faux, car tu remplaces la valeur de B par L, et si c'est toujours vrai c'est parce que L est un nombre positif alors qu'on ne rentre dans le else que si c'est faux, c'est à dire si la valeur vaut 0.
if(B==L) est donc ce qu'il te faut, cependant tu as une erreur dans ton calcul car on doit avoir :
Donc tu devrais théoriquement toujours avoir l'égalité, peu importe les valeurs que tu donnes à a, b, c.
Remarque : il est très étrange que ton case '2' se situe après le default, et encore pire ici, après l'accolade qui ferme le switch !
if(B==L) est donc ce qu'il te faut, cependant tu as une erreur dans ton calcul car on doit avoir :
L == a² + c² == a² + sqrt(B-A)² == a² + B - A == a² + B - a² == B
Donc tu devrais théoriquement toujours avoir l'égalité, peu importe les valeurs que tu donnes à a, b, c.
Remarque : il est très étrange que ton case '2' se situe après le default, et encore pire ici, après l'accolade qui ferme le switch !
Autant pour moi, je n'avais pas vu l'imbrication des deux switch, il faut dire que sans indentation c'est très compliqué, donc en soit ce n'est pas faux, mais il va donc te manquer un break à la fin du switch(h) et le case '2' du switch(program).
Et du coup je me suis un peu perdu dans tes calculs vu que j'ai regardé les calculs du case 'n'
Donc effectivement B==L fait bien ce que tu veux, mais aux erreurs de calculs près ! Les nombres flottants ne sont pas suffisamment précis pour faire des égalités, il faut les comparer à un epsilon près
Et du coup je me suis un peu perdu dans tes calculs vu que j'ai regardé les calculs du case 'n'
Donc effectivement B==L fait bien ce que tu veux, mais aux erreurs de calculs près ! Les nombres flottants ne sont pas suffisamment précis pour faire des égalités, il faut les comparer à un epsilon près
if (abs(B-L)<1e-9)PS. en anglais le triangle rectangle se dit "right triangle" ou "right-angled triangle"
abs(x) c'est la valeur absolue de x, 1e-9 c'est égal à 10^(-9) c'est à dire 0.000000001.
Ce que l'on calcule c'est la différence entre B et L, à cause des erreurs d'arrondi on n'est pas sûr que ce sera exactement égal à 0, mais si c'est inférieur à un nombre très petit, 1e-9 ici, on pourra dire que B et L sont à peu près égaux et donc que ton triangle est rectangle (à angle droit, d'où la traduction right-angled)
Ce que l'on calcule c'est la différence entre B et L, à cause des erreurs d'arrondi on n'est pas sûr que ce sera exactement égal à 0, mais si c'est inférieur à un nombre très petit, 1e-9 ici, on pourra dire que B et L sont à peu près égaux et donc que ton triangle est rectangle (à angle droit, d'où la traduction right-angled)
Encore merci, je l'essaierais demain.
Et une dernière question: Le reste convient-il?
Merci d'avance :D
Pour le reste, il te manque encore la réciproque ;-)
Merci d'avance.