Théorème de Pythagore

Résolu
81sharky18 -  
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

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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)
1
81sharky18
 
Merci beaucoup. Par rapport à la fonction sqrt(), je ne sais pas dans quelle bibliothèque il faut l'inclure, et je ne savais pas comment la noter.
Encore merci, je l'essaierais demain.
Et une dernière question: Le reste convient-il?
Merci d'avance :D
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Normalement sqrt est dans <math.h> comme pow...
Pour le reste, il te manque encore la réciproque ;-)
0
81sharky18
 
Encore merci KX :D
0
18sharky81 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
Maintenant, je prends des longueurs au hasard, ça marche...le problème, c'est que ça me donne "7.55432e-312"...Y a t'il un moyen d'y remédier?
Merci d'avance.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu peux utiliser des double à la place des float, les résultats seront plus précis.
0
mousekey Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   4
 
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
1
18sharky81 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup à Mousekey ainsi qu'à KX
0
18sharky81 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 :

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 !
0
18sharky81 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
if (abs(B-L)<1e-9)
PS. en anglais le triangle rectangle se dit "right triangle" ou "right-angled triangle"
0
18sharky81 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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)
0