C Primer Plus编程练习题

时间:2011-06-10 09:28:26

标签: c

我正在通过'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只是胡说八道。

5 个答案:

答案 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)

计算华氏度到celcius的公式是错误的......而不是

(°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;
}