在C中,尝试使用将华氏温度转换为开尔文的程序

时间:2016-08-28 17:57:20

标签: c

但是当我运行它并插入任何随机数时,计算不起作用或改变......需要一些指导。我是C和一般编程的新手所以请包括易于理解的帮助。

 #include <stdio.h>
double const change_celcius = 32.0;
double const change_kelvin = 273.15;

void temperatures(double n);

int main(void)
{
    int q = 'q';
    double user_number;

    printf("Enter the fahrenheit: \n");
    scanf("%f", &user_number);

    while (user_number != q)
    {
        temperatures(user_number);
        printf("\n");
        printf("Enter the fahrenheit: \n");
        scanf("%f", &user_number);
    }
}

void temperatures(double n)
{
    double celsius, kelvin;

    celsius = 5.0 / 9.0 * (n - change_celcius);
    kelvin = 5.0 / 9.0 * (n - change_celcius) + change_kelvin;

    printf("fahrenheit: %.2f - celsius is: %.2f - kelvin is: %.2f", 
            n, celsius, kelvin);

}

5 个答案:

答案 0 :(得分:3)

我不相信所有use %lf instead of %f评论本身都会修复您的计划。处理q(对于&#34;退出&#34;)也存在问题,所以我们也要解决这个问题。首先,我们将使用POSIX函数getline()将其读入字符串并测试它是否&#34; q&#34;。如果没有,我们将sscanf变为双精度并将其用作温度:

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

double const change_celsius = 32.0;
double const change_kelvin = 273.15;

void temperatures(double n)
{
    double celsius = 5.0 / 9.0 * (n - change_celsius);
    double kelvin = 5.0 / 9.0 * (n - change_celsius) + change_kelvin;

    printf("fahrenheit: %.2f - celsius is: %.2f - kelvin is: %.2f\n", n, celsius, kelvin);
}

int main(void)
{
    char *user_string = NULL;
    ssize_t user_string_length;
    size_t user_string_capacity = 0;

    while (1)
    {
        printf("Enter the fahrenheit: ");

        if ((user_string_length = getline(&user_string, &user_string_capacity, stdin)) < 1)
            break;

        if (strncmp(user_string, "q\n", (size_t) user_string_length) == 0)
            break;

        double user_number;

        if (sscanf(user_string, "%lf", &user_number) == 1)
            temperatures(user_number);
    }

    if (user_string != NULL)
        free(user_string); // free memory allocated by getline()

    if (user_string_length == -1)
        putchar('\n'); // output courtesy newline if user used ^D to exit

    return(0);
}

我们检查sscanf的返回值,以便错误输入不会导致程序使用上一个良好输入重新计算。相反,它只会再次提示输入。

答案 1 :(得分:1)

您需要在"%lf"scanf()中使用print()来读取和写入double类型的值。

请注意,printf()也适用于"%f"

有关详细信息,请参阅:Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

答案 2 :(得分:1)

您的代码中可以解决几个问题。首先,始终( 始终 ,如果不清楚)检查scanf的返回。这是您了解预期转化次数是否发生的唯一方式 - 以及您是否在代码中使用了实际值。

当用户输入'q'(或导致转换为double失败的任何内容)时,返回也保留退出循环的键。只需检查

即可
if (scanf(" %lf", &user_number) == 1)

您可以确定是将该值作为温度处理,还是告知用户已指示退出。

另一个提示,从不( 从不 )写:

printf ("\n");

为什么要简单地调用可变参数函数来输出单个char?这就是putchar(或fputc)的用途,例如:

putchar ('\n');

将这些部分放在一起,并注意到%lf被用作double的格式说明符,您可以重写代码,并将输出格式化为更少的行,例如

#include <stdio.h>

double const change_celcius = 32.0;
double const change_kelvin = 273.15;

void temperatures (double n);

int main(void)
{
    double user_number;

    while (printf ("\nEnter temp in degrees fahrenheit: ") && 
            scanf(" %lf", &user_number) == 1)
        temperatures(user_number);

    return 0;  /* main() is type 'int' and returns a value to the shell */
}

void temperatures (double n)
{
    double celsius, kelvin;

    celsius = 5.0 / 9.0 * (n - change_celcius);
    kelvin = 5.0 / 9.0 * (n - change_celcius) + change_kelvin;

    printf("  fahrenheit: % 7.2lf\n  celsius is: % 7.2lf\n  kelvin is : % 7.2lf\n", 
            n, celsius, kelvin);

}

示例使用/输出

$ ./bin/temps

Enter temp in degrees fahrenheit: 212
  fahrenheit:  212.00
  celsius is:  100.00
  kelvin is :  373.15

Enter temp in degrees fahrenheit: 0
  fahrenheit:    0.00
  celsius is:  -17.78
  kelvin is :  255.37

Enter temp in degrees fahrenheit: 68
  fahrenheit:   68.00
  celsius is:   20.00
  kelvin is :  293.15

Enter temp in degrees fahrenheit: q

始终在启用至少-Wall -Wextra警告的情况下编译代码(如果您真的想要向下钻取,请添加-pedantic)。阅读警告并修复它们。在您在游戏的这个阶段考虑代码可靠之前,所有代码都应该在没有警告的情况下进行编译。

查看所有答案,如果您有任何疑问,请与我们联系。

答案 3 :(得分:0)

要阅读双重使用%lf而不是%f。 for double printf()也适用于%f

答案 4 :(得分:0)

计算似乎没问题;但是你没有正确地阅读

scanf("%f", &user_number);

您正在说明您正在阅读浮点数,但您将user_name声明为double。如果要使用浮点数,则需要将user_name声明从double更改为float。如果你想使用双重使用&#34;%f&#34;。