Вопрос по программированию C Primer Plus - PullRequest
0 голосов
/ 10 июня 2011

Я работаю в «C Primer Plus», просто выполняю упражнения по программированию, и я наткнулся на кирпичную стену последней в пятой главе («Операторы, выражения и выражения»).

Упражнение:

Напишите программу, которая просит пользователя ввести температуру по Фаренгейту.Программа должна прочитать температуру как двойное число типа и передать ее в качестве аргумента предоставляемой пользователем функции с именем Temperatures ().Эта функция должна вычислять эквивалент в градусах Цельсия и эквивалент в градусах Кельвина и отображать все три температуры с точностью до двух знаков справа от десятичного знака.Он должен идентифицировать каждое значение с температурной шкалой, которую он представляет.Вот формула для преобразования Фаренгейта в Цельсий:

Цельсия = 1,8 * Фаренгейта + 32,0

Шкала Кельвина, обычно используемая в науке, - это шкала, в которой 0 представляет абсолютный ноль, нижняяограничить возможные температуры.Вот формула для преобразования Цельсия в Кельвины:

Кельвин = Цельсия + 273.16

Функция Temperatures () должна использовать const для создания символических представлений трех констант, которые появляются в преобразованиях.Функция main () должна использовать цикл, чтобы позволить пользователю повторно вводить температуру, останавливаясь при вводе aq или другого нечислового значения.

Мой код:

#include <stdio.h>
void Temperatures(double);
int main(void)
{
    double farh;
    printf("Enter a fahrenheit temperature: ");
    scanf("%f", &farh);
    printf("\n");
    Temperatures(farh);
return 0;

}

void Temperatures(double f)
{

    float c;
    float k;
    c = 1.8 * f + 32;
    k = c + 273.16;
    printf("Fahrenheit    Celcius    Kelvin\n");
    printf("%.2f    %.2f    %.2f\n", f, c, k);

}

Где япошло не так?: o Просто получи ерунду.

Ответы [ 5 ]

3 голосов
/ 10 июня 2011

Вы запрашиваете число с плавающей запятой% f в качестве ввода через scanf, но сохраняете его в двойном формате. float и double часто имеют разные размеры, и если это так, вы получите мусор при попытке сохранить float внутри double. Попробуйте вместо этого использовать% lf или замените «farh» на float.

2 голосов
/ 10 июня 2011

Вы используете scanf, чтобы взять ввод и привести его к определенному типу, в этом случае, чтобы получить float по Фаренгейту.

scanf("%f", &farh);

Однако, вы инициализируете farh как двойной ...

...
int main(void)
{
double farh;
...

Измените это на float farh; и посмотрите, поможет ли это.

Обновлено для ответа на вопрос в комментариях ниже

Если вы хотите взять двойное число вместо числа с плавающей запятой, то вместо вышеуказанного измените строку scanf следующим образом:

scanf("%lf", &farh);
1 голос
/ 28 мая 2014

полностью отработанная функция

void exc8(void){
    double Celtemp = 0;
    double Fartemp = 0;
    double Keltemp = 0;
    printf("enter the temperature in Fahrenheit: ___\b\b\b");

    while (scanf_s("%lf",&Fartemp)==1)
    {
        Celtemp = (1.8 * Fartemp) + 32.0;
        Keltemp = Celtemp + 273.16;
        printf("\nThe temp %4.3lf in Far is equal are %4.3lf in Celc and %4.3lf in Kelv\n", Fartemp, Celtemp, Keltemp);
        printf("Enter another one to convert or non number char for exit:___\b\b\b");

    }

}
0 голосов
/ 12 марта 2017

Альтернативная версия, выходящая за рамки упражнения. Здесь я хочу, чтобы значения возвращались функциями. Однако функция не может возвращать два значения, не вдаваясь в более сложные темы, указатели и тому подобное. Поэтому вместо этого мы разделим кальки по Цельсию и Кельвину на две отдельные функции и вернем их в main ().

Я попытался изложить этот пример очень четко, обратите внимание на использование i и j в этом примере, так как оно демонстрирует, как эти переменные используются только в самих функциях, а не в основной части программы. «fah» (для фаренгейта) - это переменная, отправляемая функциям, и мы сообщаем функциям, какие переменные возвращать. Обратите внимание, как эти функции работают так же, как функции алгебры, они основаны на одной и той же идее. f (x) = (y) (z). Только часть (y) (z) выходит за пределы основной программы. В этой аналогии x в f (x) - это значение, которое «передается» в функцию. И «f» может быть любым, что мы хотим ... поэтому, конечно, я выбрал наиболее очевидные имена, celcius и kelvin, и затем они могут вызываться снова и снова в основной части программы. Думайте о функциях как о подпрограммах.

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

double celcius (double i);
double kelvin (double j);

int main()
{
    double fah = 0.0;

    printf("Enter a Fahrenheit temperature (or 'q' to quit): ");

        while (scanf("%lf", &fah) == 1)
        {
            printf("Fahrenheit: \t%8.2lf", fah);
            printf("\n");
            printf("Celcius: \t%8.2lf", celcius(fah)); // 1st function call
            printf("\n");
            printf("Kelvin: \t%8.2lf", kelvin(fah)); // 2nd function call
            printf("\n");

            printf("Enter another Fahrenheit temperature: ");
        }

    printf("goodbye");

    return 0;

} 

double celcius (double i) // the value fah is "passed" to i.  weird, right?
{

    const double FRAC = (5.0 / 9.0);
    const double FREEZE = 32.0;
    double cel; // notice I have to define cel HERE, not in main.

    cel = FRAC * (i - FREEZE); // the only place we see i

    return cel; // here we tell the function which value to send back

}

double kelvin (double j)
{
    const double ADD = 273.16;
    double kel; // again, I must define the variable IN the function.

    kel = ADD + ((5.0 / 9.0) * (j - 32.0));

    return kel;
}
0 голосов
/ 20 сентября 2013

формула для расчета Фаренгейта в Цельсия неверна .. вместо

(°F  -  32)  x  5/9 = °C

и также упражнение просит преобразовать f в кельвин так: По Фаренгейту Кельвину:

(5/9 * (Fahrenheit - 32) + 273 ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...