Théorème de Pythagore
Résolu/Fermé
81sharky18
-
4 avril 2012 à 20:17
18sharky81 Messages postés 23 Date d'inscription mardi 3 janvier 2012 Statut Membre Dernière intervention 9 août 2012 - 14 avril 2012 à 20:13
18sharky81 Messages postés 23 Date d'inscription mardi 3 janvier 2012 Statut Membre Dernière intervention 9 août 2012 - 14 avril 2012 à 20:13
4 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
4 avril 2012 à 21:01
4 avril 2012 à 21:01
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)
mousekey
Messages postés
68
Date d'inscription
dimanche 13 février 2005
Statut
Membre
Dernière intervention
22 novembre 2014
4
Modifié par baladur13 le 13/04/2012 à 22:40
Modifié par baladur13 le 13/04/2012 à 22:40
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
18sharky81
Messages postés
23
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
9 août 2012
5 avril 2012 à 20:22
5 avril 2012 à 20:22
Merci beaucoup à Mousekey ainsi qu'à KX
18sharky81
Messages postés
23
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
9 août 2012
14 avril 2012 à 18:24
14 avril 2012 à 18:24
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
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
14 avril 2012 à 18:35
14 avril 2012 à 18:35
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 !
18sharky81
Messages postés
23
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
9 août 2012
14 avril 2012 à 19:18
14 avril 2012 à 19:18
Tout d'abord, merci pour ta réponse.
Le case'2' se situe après le default car le default est pour le switch(h). De même pour l'accolade. Est ce faux?
Et je dois remplacer le L= pow(a,2)+pow(c,2);
B= pow(b,2);
par le calcul que tu m'as mis? Ou alors tu as développé mon calcul?
Encore merci :D
Le case'2' se situe après le default car le default est pour le switch(h). De même pour l'accolade. Est ce faux?
Et je dois remplacer le L= pow(a,2)+pow(c,2);
B= pow(b,2);
par le calcul que tu m'as mis? Ou alors tu as développé mon calcul?
Encore merci :D
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
14 avril 2012 à 19:42
14 avril 2012 à 19:42
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"
18sharky81
Messages postés
23
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
9 août 2012
14 avril 2012 à 20:01
14 avril 2012 à 20:01
Merci beaucoup...et c'est vrai je suis moyen en anglais^^...
Mais est ce que ca te derangerais de m'expliquer cette notation stp? Car je ne l'avais jamais vu, et donc c'est toujours bon a prendre.
Mais est ce que ca te derangerais de m'expliquer cette notation stp? Car je ne l'avais jamais vu, et donc c'est toujours bon a prendre.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
14 avril 2012 à 20:09
14 avril 2012 à 20:09
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)
4 avril 2012 à 21:38
Encore merci, je l'essaierais demain.
Et une dernière question: Le reste convient-il?
Merci d'avance :D
4 avril 2012 à 21:47
Pour le reste, il te manque encore la réciproque ;-)
5 avril 2012 à 19:18
5 avril 2012 à 19:35
Merci d'avance.
5 avril 2012 à 19:50