我正在通过'C Primer Plus',正在进行编程练习,我在第五章(操作员,表达式和语句)的最后一章上打了一堵砖。
练习是:
编写一个程序,要求用户输入华氏温度。程序应将温度读取为类型双精度数,并将其作为参数传递给用户提供的名为Temperatures()的函数。此函数应计算摄氏温度等效值和开尔文等效值,并以十进制右边两位的精度显示所有三个温度。它应该用它代表的温标来识别每个值。以下是将华氏温度转换为摄氏温度的公式:
摄氏度= 1.8 *华氏度+ 32.0
科学中常用的开尔文量表是一个刻度,其中0代表绝对零度,即可能温度的下限。以下是将摄氏度转换为开尔文的公式:
开尔文=摄氏+ 273.16
Temperatures()函数应使用const来创建转换中出现的三个常量的符号表示。 main()函数应该使用循环来允许用户重复输入温度,在输入q或其他非数字值时停止。
我的代码是:
#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只是胡说八道。
答案 0 :(得分:3)
您要求通过scanf输入浮点%f作为输入,但将其存储为double。 float和double通常具有不同的大小,如果是这样,在尝试将float存储在double中时,你会得到垃圾。尝试使用%lf,或将“farh”更改为float。
答案 1 :(得分:2)
您正在使用scanf获取输入并将其强制转换为某种类型,在这种情况下,为了获得华氏温度float
。
scanf("%f", &farh);
但是,您要将farh
初始化为双...
...
int main(void)
{
double farh;
...
将此更改为float farh;
并查看是否有帮助。
已更新,可在以下评论中回答问题
如果你想接受一个double而不是float,那么将scanf行更改为如下所示:
scanf("%lf", &farh);
答案 2 :(得分:1)
完全有效的功能
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");
}
}
答案 3 :(得分:0)
(°F - 32) x 5/9 = °C
and aslo excercise要求将f转换为开尔文所以: 华氏度为开尔文:
(5/9 * (Fahrenheit - 32) + 273 ).
无论如何,有人可以帮助如何做到这一点:main()函数应该使用循环来允许用户重复输入温度,在输入q或其他非数字值时停止。 thnks
答案 4 :(得分:-1)
超出练习范围的替代版本。在这里,我希望函数返回值。但是,函数不能返回两个值,而不会进入更高级的主题,指针等。因此,我们将Celsius和Kelvin计算分成两个独立的函数,并将它们返回给main()。
我试图非常清楚地说明这个例子,注意在这个例子中使用i和j,因为它演示了这些变量如何在函数本身中使用,而不是在程序的主体中。 &#34; FAH&#34; (for fahrenheit)是发送给函数的变量,我们告诉函数返回哪些变量。请注意这些函数如何以与代数函数相同的方式工作,它们基于相同的思想。 f(x)=(y)(z)。只有(y)(z)部分超出主程序的主体。在这个类比中,f(x)中的x是&#34;传递的值&#34;到功能。并且&#34; f&#34;可以是我们想要的任何东西......所以当然我选择了最明显的名字,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;
}