2015-07-02 2 views
0

Я написал простую программу для преобразования градусов по Фаренгейту в градусы Цельсия с помощью функции (работали ж/Python в течение 2 недель, хотел обновить сам):INT производит около правильный ответ, но поплавок просто дает -18,000

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

int temp_change(fahrenheit); 

int main() 
{ 
    while(1) 
    { 
     int fahrenheit; 
     printf("Please input a temperature in Fahrenheit.\n"); 
     scanf("%d", &fahrenheit); //Obtains degrees F value 
     printf("%d\n", temp_change(fahrenheit)); 

    } 
} 
//Function to change temperature 
int temp_change(fahrenheit) 
{ 
    int centigrade; 
    centigrade = 5*(fahrenheit - 32)/9; //Changing the temperature 
    return centigrade; 
} 

, и он дал мне правильные ответы (в ближайшей степени). Тем не менее, я хотел получить точные ответы, поэтому я изменил все int s на float s (кроме int main(). Теперь единственное, что мне даст программа: -18.000000, вне зависимости от того, какой ввод я им даю. Лучший способ подвести итог тому, что я Пробовал: Я пробовал разные комбинации int s и float s, но не повезло. Я подозреваю, что это как-то связано с printf("%d\n", temp_change(fahrenheit));, но это дало мне правильные ответы, когда все было int, поэтому я не знаю. Заранее благодарим за любую помощь!

+0

Скорее всего вы пренебрегли изменением форматов 'scanf()' и 'printf()' при преобразовании всех типов данных. Для аргументов 'float' вы хотите'% f' вместо '% d'. –

+0

Понял, что это необходимо для инициализации переменных внутри определений функций как 'float' –

+0

@JohnBollinger спасибо, но нет, это дало бы мне ошибку. –

ответ

1

Целочисленная версия не дает вам ближайшую преобразованную температуру, она округляет температуру к 0.

В коде есть еще одна проблема: прототип для temp_change является неполным, вы забыли указать тип аргумента.

Вот исправленный вариант с использованием поплавков:

#include <stdio.h> 

float temp_change(float fahrenheit); 

int main(void) { 
    for (;;) { 
     float fahrenheit; 
     printf("Please input a temperature in Fahrenheit.\n"); 
     if (scanf("%f", &fahrenheit) == 1) {//Obtains degrees F value 
      printf("%f\n", temp_change(fahrenheit)); 
     } 
    } 
} 
//Function to change temperature 
float temp_change(float fahrenheit) { 
    float centigrade; 
    centigrade = 5 * (fahrenheit - 32)/9; //Changing the temperature 
    return centigrade; 
} 

Обратите внимание, что вы действительно должны использовать число с плавающей точкой double точности. Кстати, возвращаемое значение temp_change() преобразуется в double при передаче printf. Спецификатор формата %f принимает float* за scanf, но принимает double за printf.

+0

Большое спасибо! Я выбрал ваш ответ как правильный. –

1

Вам необходимо изменить функцию преобразования. Нравится

float temp_change(fahrenheit) 
{ 
    float centigrade; 
    centigrade = 5*(fahrenheit - 32)/9.0; //Changing the temperature 
    return centigrade; 
} 

И если вы хотите, вы также можете взять вход в поплавок. А вот

printf("%d\n", temp_change(fahrenheit)); 

использование% е не% d

+1

Это все еще неверно: поскольку 'fahrenheit' не имеет типа, он считается' int'. Выражение '5 * (fahrenheit - 32)/9' вычисляется как' int' и преобразуется в 'float' при сохранении в' sStigrade' ... вы получаете тот же результат, что и версия 'int'. – chqrlie

+0

Ох, извините @chqrlie –

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