web-dev-qa-db-fra.com

Programme C pour calculer l'hypoténuse

Je suis assez nouveau dans le domaine de la programmation et je suis actuellement en apprentissage en C. En classe, on m'a demandé d'écrire un programme qui calcule l'hypoténuse du triangle à l'aide de nos propres fonctions. Cependant, il semble y avoir quelque chose qui cloche dans le code que j'ai écrit.

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y, double z);

int main(void) {
    double side1, side2, side3, counter;

    side3 = 1;

    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf_s("%d %d", &side1, &side2);

        printf("%.2f\n", hypotenuse(side1, side2, side3));
    }

    return 0;
}

double hypotenuse(double x, double y, double z) {
    x *= x;
    y *= y;
    z = sqrt(x + y);

    return z;
}

Mon instructeur a dit que nous pouvions utiliser la fonction racine carrée sqrt de la bibliothèque mathématique. Les principales erreurs auxquelles je suis confronté sont:

1) side3 n’est pas défini (c’est pourquoi j’ai simplement choisi arbitrairement 1, mais existe-t-il un autre moyen de prévenir cette erreur?)
2) Si, par exemple, j'ai entré 3 et 4 en tant que side1 et side2, alors side3 devrait être 5. Toutefois, le résultat imprimé est un nombre absurdement long.

Merci pour l'aide! Tous les conseils sont appréciés.

4
Seankala

Vous n'avez pas besoin de la variable side3 - elle n'est pas utilisée dans les calculs. Et votre fonction hypotenuse renvoie le résultat, vous pouvez donc sortir directement le résultat de sqrt.

3
ghostprgmr

J'utilise Ubuntu Linux et l'écris de cette façon. S'il vous plaît regardez si vous l'aimez. 

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y) {
    double z = sqrt(x * x + y * y);
    return z;
}

int main(void) {
    double b1, b2, counter;
    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf("%lf %lf", &b1, &b2);
        printf("%.2f\n", hypotenuse(b1, b2));
    }
    return 0;
}

Tester

$ ./a.out 
Enter values for two sides: 1 1.73
2.00
3

Le code de l'OP a quelques problèmes:

Problème clé: le code aurait dû générer un avertissement du compilateur, car scanf() est destiné à traiter &side1 en tant que int *. Activez tous les avertissements du compilateur pour gagner du temps. Code utilisé "%d" plutôt que le "%lf" correspondant pour lire un double. La valeur de retour doit également être vérifiée pour valider la saisie.

double side1, side2, side3, counter;
...
// scanf_s("%d %d", &side1, &side2);
if (scanf_s("%lf %lf", &side1, &side2) != 2) puts("Input error");

size3 n'est pas nécessaire. Appelez hypotenuse() avec 2 arguments. @ghostprgmr

// printf("%.2f\n", hypotenuse(side1, side2, side3));
printf("%.2f\n", hypotenuse(side1, side2));

// double hypotenuse(double x, double y, double z) {
double hypotenuse(double x, double y) {
   double z = ...

Minor: Code utilisé "%.2f" pour afficher la valeur de l'hypoténuse. Cela peut être OK avec certaines valeurs d'entrée dans le code de l'OP, mais c'est un mauvais choix en général. Si les valeurs d'entrée varient peu, comme 0,001 et 0,002, la sortie affichera une valeur arrondie de 0,00. Avec de très grandes valeurs, le résultat affichera de nombreux chiffres non importants comme OP trouvé avec 130899030500194208680850288727868915862901750748094271410143‌​232.00.

Pour le développement et le débogage, envisagez d'utiliser "%e", "%g" ou "%a" pour afficher un double pertinent.


Notez que x * x + y * y est sujet aux débordements minimum/élevé, même lorsque mathématiquementsqrt(x * x + y * y) est dans la plage double. C'est l'un des avantages de la fonction standard hypot(x,y), car elle gère généralement bien ces cas Edge.

2
chux

Utilisez les spécificateurs de format appropriés! Le spécificateur de format pour double n'est pas% d! Le repos est bien. 

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y, double z);

int main(void) {
    double side1, side2, side3, counter;

    side3 = 1;

    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf("%lf %lf", &side1, &side2);

        printf("%.2f\n", hypotenuse(side1, side2, side3));
    }

    return 0;
}

double hypotenuse(double x, double y, double z) {
    x *= x;
    y *= y;
    z = sqrt(x + y);

    return z;
}

Aussi, vous pouvez le modifier en ceci:

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y);

int main(void) {
    double side1, side2, counter;



    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf("%lf %lf", &side1, &side2);

        printf("%.2f\n", hypotenuse(side1, side2));
    }

    return 0;
}

double hypotenuse(double x, double y) {
    x *= x;
    y *= y;
    return sqrt(x + y);


}
1
Vidor Vistrom

À titre de référence pour tous ceux qui consultent cette question:

Vous n'avez pas besoin écrire votre propre fonction. La norme C fournit des fonctions pour calculer l'hypotnuse :

7.12.7.3 Les fonctions hypot

Synopsis

#include <math.h>
double hypot(double x, double y);
float hypotf(float x, float y);
long double hypotl(long double x, long double y);

Notez que vous aurez probablement besoin de créer un lien avec -lm, bien que cela ne soit pas explicitement répertorié dans la documentation de la fonction dans le standard C ni la dernière documentation POSIX . Cela pourrait être documenté ailleurs dans les normes.

( Lien vers la norme C11 [projet de] norme - susceptible de durer beaucoup plus longtemps.)

1
Andrew Henle