widemanzhao 发布留言 2008-9-18 17:22
请教一个问题,希望帮忙解决,谢谢!
在 C Primer Plus 中有一道题,就是让把华氏温度转换为摄氏温度和开尔文温度(英文版第5章最后一题)。转换的过程很容易实现,但是跳出循环时却出问题了。我把我编写的程序贴出来,请高手帮我看看问题出在什么地方。
/* exe5_8.c -- calculates temperatures */
#include
#include
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 码),却可以正常跳出循环。请问这是怎么回事?怎样才能修改成我想要的方式来结束循环?
谢谢!StarWing83 发布留言 2008-9-18 17:44
你接受的是个double,你想让一个double等于'q'????StarWing83 发布留言 2008-9-18 17:45
代码结构真差阿……StarWing83 发布留言 2008-9-18 17:49
以下内容为程序代码:
#include
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'试试看?woshiyun 发布留言 2008-9-18 17:52
回复 4# StarWing83 的帖子
我想LZ的想法肯定是输入特定的字母q,才退出。
而不是像你这样,scanf接收数据不成功就退出吧。
你这么判断退出条件,太投机取巧了,简直就是错误。widemanzhao 发布留言 2008-9-18 17:54
可是我已经将类型强制转换了啊,就算改成 (char)ft 也不行。而版主也没给我说为什么我输入 q 的 ASCII 码时程序可以正常运行,而输入字符时就死循环了呢?如果要输入 q 退出,我该怎么改?woshiyun 发布留言 2008-9-18 17:57
回复 6# widemanzhao 的帖子
double ft; /* input a Fahrenheit temperature */
不要偷懒,把数据既取浮点数,又要和字符做比较。
scanf( "%lf", &ft );可以勉强接收整数113,但是收不了字符q。widemanzhao 发布留言 2008-9-18 18:11
看了版主的修改,彻底解决了问题。多谢版主了。看来我设的 flag 变量完全是多此一举。
C语言博大精深,初涉不久,要学习的地方还很多。希望以后遇到问题了还能得到大家的指点。StarWing83 发布留言 2008-9-18 18:18
[un]woshiyun[/un] 在 2008-9-18 17:52 的发言:[/bo]
我想LZ的想法肯定是输入特定的字母q,才退出。 而不是像你这样,scanf接收数据不成功就退出吧。 你这么判断退出条件,太投机取巧了,简直就是错误。 |
事实上,能解决问题的最简单的方法一般都是最好的方法。
如果非要限定,输入q退出,输入其他非法字符忽略掉,看下面的代码:
以下内容为程序代码:
#include
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看看?
页: [1]