但是当我运行它并插入任何随机数时,计算不起作用或改变......需要一些指导。我是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);
}
答案 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;。