2015-04-01 3 views
1
#include <stdio.h> 
#include <math.h> 

double hypotenuse(double side1, double side2); 

int main(void) 
{ 
    double a, b; 

    printf("Enter the values of the two sides: "); 
    scanf("%f %f", &a, &b); 
    printf("\nThe length of hypotenuse is: %f", hypotenuse(a, b)); 

    getchar(); 
    getchar(); 
    return 0; 
} 

double hypotenuse(double side1, double side2) 
{ 
     double c; 

     c = (side1 * side1) + (side2 * side2); 
     return sqrt(c); 
} 

Данная программа работает, когда я использую float a, b; вместо double a,b;. Зачем?Почему `sqrt()` печатает желаемый результат, когда я использую `float` вместо` double `?

+0

Любые вопросы, остающиеся для этой записи? – chux

ответ

4

В коде используется

scanf("%f %f", &a, &b); 

Но %f используется для float, а не double. Попробуйте %lf для double.

1

Для scanf() спецификатор "%f" ожидает аргумент float *, а не double *.

double a; 
//   v--- &a is type double *, scanf("%f" expects float * 
scanf("%f", &a); 

Для сканирования в double, используйте спецификатор "%lf", который ожидает в double * аргумент.

double a; 
//   v--- &a is type double * 
scanf("%lf", &a); 

Деталь: Аргументы scanf() являются адреса где scanf() может хранить результаты. A float * - это не то же самое, что и у double *.

С printf() цифровыми аргументами являются значение для печати. Поскольку printf() принимает переменное количество аргументов, они проходят через обычных рекламных акций, таких как float, до double. Таким образом, printf("%f", some_float) и printf("%f", some_double) могут использовать один и тот же спецификатор формата. Обычные акции не распространяются на &a, &b с scanf(), поскольку эти аргументы являются указателями (адресами), а не арифметическими значениями.


Примечание: всегда полезно проверить scanf(). Пробел между "%lf" и "%lf" не требуется, так как "%lf" сам потребляет ведущее белое пространство, но его часто визуально легче понять.

if (2 != scanf("%lf%lf", &a, &b)) Handle_Error(); 

 Смежные вопросы

  • Нет связанных вопросов^_^