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
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
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)
1
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
4 avril 2012 à 21:47
Normalement sqrt est dans <math.h> comme pow...
Pour le reste, il te manque encore la réciproque ;-)
0
Encore merci KX :D
0
18sharky81 Messages postés 23 Date d'inscription mardi 3 janvier 2012 Statut Membre Dernière intervention 9 août 2012
5 avril 2012 à 19:35
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 avril 2012 à 19:50
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 dimanche 13 février 2005 Statut Membre Dernière intervention 22 novembre 2014 4
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
1
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
Merci beaucoup à Mousekey ainsi qu'à KX
0
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
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
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 :

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 mardi 3 janvier 2012 Statut Membre Dernière intervention 9 août 2012
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
0
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
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 mardi 3 janvier 2012 Statut Membre Dernière intervention 9 août 2012
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.
0
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
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