2015-09-20 5 views
-4
#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    int userAgeYears = 0; 
    int userAgeDays = 0; 
    int userWeight = 0; 
    int userHeight = 0; 
    int BMI; 
    printf("Enter your age in years: \n"); 
    scanf("%d", &userAgeYears); 
    userAgeDays = userAgeYears * 365; 
    printf("Enter your weight in pounds: \n"); 
    scanf("%d", &userWeight); 
    printf("Enter your height in inches: \n"); 
    scanf("%d", &userHeight); 
    BMI = ((userWeight/(userHeight * userHeight)) * 703); 
    printf("You are %d days old.\n", userAgeDays); 
    printf("Your BMI is: %d\n", BMI); 
    return 0; 
} 

// Мой результат для BMI продолжает вычисления 0.Расчет ИМТ в C

Я делаю что-нибудь неправильное.

+4

Отформатируйте свой код. – ameyCU

+3

Добро пожаловать в StackOverflow. Под вашим вопросом есть поле «Изменить». Используйте его, чтобы удалить все неправильные вещи в своем вопросе. Это совершенно неразборчиво. Почему у вас, по крайней мере, нет * одного взгляда на предварительный просмотр? –

+0

Руководство по форматированию кода в методе уценки находится здесь: http://stackoverflow.com/editing-help –

ответ

5

стараются делать это так:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int userAgeYears = 0; 
    long userAgeDays = 0; 
    int userWeight = 0; 
    int userHeight = 0; 
    double BMI; 

    printf("Enter your age in years: \n"); 
    scanf("%d", &userAgeYears); 
    userAgeDays = userAgeYears * 365; 
    printf("Enter your weight in pounds: \n"); 
    scanf("%d", &userWeight); 
    printf("Enter your height in inches: \n"); 
    scanf("%d", &userHeight); 

    BMI = (userWeight/(double)(userHeight * userHeight)) * 703; 

    printf("You are %ld days old.\n", userAgeDays); 
    printf("Your BMI is: %02f\n", BMI); 

    return 0; 
} 

это произошло потому, что вы определили все переменные как целые числа, и он округлил ответ userWeight/(UserHeight*UserHeight) до 0

+2

В отсутствие ** сильной ** причины в противном случае предпочитайте 'double'' 'float' – pmg

+0

Я изменю его, но можете ли вы вкратце объяснить, что является ** сильной ** причиной? –

+1

Я могу думать только об этом: ваш учитель сказал, что даст вам плохой класс за использование «двойника», и никакое обсуждение не заставило ее передумать. * 'double' быстрее, чем' float', внутренние вычисления с 'float' требуют преобразования в' double', а затем обратно в 'float', неподдерживаемые константы с плавающей запятой (например,' 3.14159') имеют тип 'double', Значения 'float', соответствующие' ... 'в параметрах функции, преобразуются в' double', многие функции с использованием значений с плавающей запятой требуют sufix 'f' при работе с' float' (например, 'sinf()'), ... * – pmg

2

Это очень распространенная ошибка в C/C++. Результатом деления двух целых чисел является целое число, если вы не навязываете его другому типу, поэтому значение разделения будет усечено на каждом шаге.

Поскольку разделение веса по квадрату высоты выполняется до умножения на коэффициент преобразования 703, оно усекается до нуля. (Есть значения веса и высоты, где он не будет равен нулю, но расчеты будут по-прежнему неточными из-за потери точности.)

Лучшее, что нужно сделать, это сделать двойным или прочитать в оригинале значения удваиваются. Пока один оператор является поплавком или двойным, то усечение не произойдет.

0

эта линия:

BMI = ((userWeight/(userHeight * userHeight)) * 703); 

использует целочисленную арифметику. в целочисленной математике, если делитель больше, чем дивиденды, результат всегда равен 0. Предлагайте:

BMI = (((float)(userWeight) /(userHeight * userHeight)) * 703); 

Тогда все значения будут преобразованы в «поплавок» результат вычисляется и «этаж) (» значение присвоенный «BMI»

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