| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 475 人关注过本帖, 1 人收藏
标题:请教一个问题,希望帮忙解决,谢谢!
只看楼主 加入收藏
widemanzhao
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-10-11
收藏(1)
 问题点数:0 回复次数:8 
请教一个问题,希望帮忙解决,谢谢!
在 C Primer Plus 中有一道题,就是让把华氏温度转换为摄氏温度和开尔文温度(英文版第5章最后一题)。转换的过程很容易实现,但是跳出循环时却出问题了。我把我编写的程序贴出来,请高手帮我看看问题出在什么地方。

/* exe5_8.c -- calculates temperatures */

#include <stdio.h>
#include <conio.h>

void Temperatures( double n );

int main( void )
{
    double ft;            /* input a Fahrenheit temperature */
    char flag;
        
    printf( "Enter a temperature:" );
    scanf( "%lf", &ft );
    flag = (int)ft;
        
    while ( flag != 'q' ){                            (*)
          Temperatures( ft );
          printf( "Enter next temperature:" );
          scanf( "%lf", &ft );
          flag = (int)ft;
    }
   
    printf( "\n\nPress any key to continue..." );
    getch();
    return 0;
}

void Temperatures( double n )
{
     const float CELSIUS = 1.8;
     const float KELVIN = 273.16;
     
     double cel, kel;
     
     cel = CELSIUS * n + 32.0;
     kel = cel + KELVIN;
     
     printf( "The Celsuis temperature is %.2lf\n", cel );
     printf( "The Kelvin temperature is %.2lf\n\n", kel );
}

问题出在(*)这一行,我的意思是当输入 q 时就退出,但是输入后就陷入死循环,怎么也跳不出来。而当输入 113 时(即 q 的 ASCII 码),却可以正常跳出循环。请问这是怎么回事?怎样才能修改成我想要的方式来结束循环?
谢谢!
2008-09-18 17:22
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
你接受的是个double,你想让一个double等于'q'????

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 17:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
代码结构真差阿……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 17:45
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
程序代码:
#include <stdio.h>

void Temperatures(double n)
{
    const float CELSIUS = 1.8;
    const float KELVIN = 273.16;

    double cel, kel;

    cel = CELSIUS * n + 32.0;
    kel = cel + KELVIN;

    printf("The Celsuis temperature is %.2lf\n", cel);
    printf("The Kelvin temperature is %.2lf\n\n", kel);
}

int main(void)
{
    double ft;
    while (scanf("%lf", &ft) == 1)
        Temperatures(ft);
    return 0;
}


在数据最后再输入一个'q'试试看?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 17:49
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
回复 4# StarWing83 的帖子
我想LZ的想法肯定是输入特定的字母q,才退出。
而不是像你这样,scanf接收数据不成功就退出吧。
你这么判断退出条件,太投机取巧了,简直就是错误。
2008-09-18 17:52
widemanzhao
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-10-11
收藏
得分:0 
可是我已经将类型强制转换了啊,就算改成 (char)ft 也不行。而版主也没给我说为什么我输入 q 的 ASCII 码时程序可以正常运行,而输入字符时就死循环了呢?如果要输入 q 退出,我该怎么改?
2008-09-18 17:54
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
回复 6# widemanzhao 的帖子
double ft;            /* input a Fahrenheit temperature */
不要偷懒,把数据既取浮点数,又要和字符做比较。
scanf( "%lf", &ft );可以勉强接收整数113,但是收不了字符q。
2008-09-18 17:57
widemanzhao
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-10-11
收藏
得分:0 
看了版主的修改,彻底解决了问题。多谢版主了。看来我设的 flag 变量完全是多此一举。
C语言博大精深,初涉不久,要学习的地方还很多。希望以后遇到问题了还能得到大家的指点。
2008-09-18 18:11
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]woshiyun[/un] 在 2008-9-18 17:52 的发言:[/bo]

我想LZ的想法肯定是输入特定的字母q,才退出。
而不是像你这样,scanf接收数据不成功就退出吧。
你这么判断退出条件,太投机取巧了,简直就是错误。


事实上,能解决问题的最简单的方法一般都是最好的方法。
如果非要限定,输入q退出,输入其他非法字符忽略掉,看下面的代码:

程序代码:
#include <stdio.h>

void Temperatures(double n)
{
    const float CELSIUS = 1.8;
    const float KELVIN = 273.16;

    double cel, kel;

    cel = CELSIUS * n + 32.0;
    kel = cel + KELVIN;

    printf("The Celsuis temperature is %.2lf\n", cel);
    printf("The Kelvin temperature is %.2lf\n\n", kel);
}

int main(void)
{
    double ft;
    do
        while (scanf("%lf", &ft) == 1)
            Temperatures(ft);
    while (getchar() != 'q');
    return 0;
}



尝试输入123 a 124 q看看?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-18 18:18
快速回复:请教一个问题,希望帮忙解决,谢谢!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013212 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved