请帮我来捉虫!

软件和网站开发以及相关技术探讨
回复
superypy
帖子: 32
注册时间: 2009-08-08 7:39

请帮我来捉虫!

#1

帖子 superypy » 2009-09-21 18:59

我是一个C语言的初学者,在学习过程中编写了一个计算圆的面积和周长的程序,源代码如下:
#include <stdio.h>
#define PI 3.1415926
int main()
{
float r,l,s;
printf("请输入圆的半径:") ;
scanf("%f",&r);
l=2*PI*r;
s=PI*r*r;
printf("圆的周长为:%f\n",l);
printf("圆的面积为:%f\n",s);
}
编译没有问题,运行时的界面如下图:

在这个程序中出现了两个问题,一个问题就是当输入半径r时,如果输入的是非数字型的值,该软件没有报错,却出现了两个返回值,这是根据什么计算出来的呢?另一个问题就是,如果使用计算器来计算同样半径的圆面积,其结果为:2827.43334,与该程序返回的相差:0.00001,这是怎么一回事呀?
如果当用户输入了非法的数,应该如何判断?请高手帮助解决一下!
附件
运行时的界面
运行时的界面
头像
wzssyqa
帖子: 4010
注册时间: 2008-04-07 17:36
来自: 泰安人在阜新

Re: 请帮我来捉虫!

#2

帖子 wzssyqa » 2009-09-21 21:07

atof(将字符串转换成浮点型数)
相关函数 atoi,atol,strtod,strtol,strtoul
表头文件 #include <stdlib.h>
定义函数 double atof(const char *nptr);
函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数
字或正负符号才开始做转换,而再遇到非数字或字符串结束时
('\0')才结束转换,并将结果返回。参数nptr字符串可包含正负
号、小数点或E(e)来表示指数部分,如123.456或123e-2。
返回值 返回转换后的浮点型数。
附加说明 atof()与使用strtod(nptr,(char**)NULL)结果相同。

估计是一个原理
superypy
帖子: 32
注册时间: 2009-08-08 7:39

Re: 请帮我来捉虫!

#3

帖子 superypy » 2009-09-21 22:02

多谢二楼热心的朋友,我这里原意是当遇到非法输入时能够停止计算,并提示用户输入了非法数即可!我原来以为既然scanf()定义了%f为浮点型的数值,则如果在输入中出现了字符型等非浮点型的数值时会提示错误的,很可惜在c里他继续进行了运算并取得了一个结果-显然这个结果不是我想要的。
头像
wzssyqa
帖子: 4010
注册时间: 2008-04-07 17:36
来自: 泰安人在阜新

Re: 请帮我来捉虫!

#4

帖子 wzssyqa » 2009-09-21 22:37

那可能要你自己检测了
delectate
帖子: 18311
注册时间: 2008-01-09 22:41

Re: 请帮我来捉虫!

#5

帖子 delectate » 2009-09-23 21:08

检测输入的数值

需要写个函数检测

至于说精确度,c语言老师说浮点好像在内存存储时候就不精确,小数点后边经常出问题。

如果算pi,建议lz参考源里的pi程序代码

用数组也比浮点准确
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 请帮我来捉虫!

#6

帖子 BigSnake.NET » 2009-09-23 22:08

superypy 写了:多谢二楼热心的朋友,我这里原意是当遇到非法输入时能够停止计算,并提示用户输入了非法数即可!我原来以为既然scanf()定义了%f为浮点型的数值,则如果在输入中出现了字符型等非浮点型的数值时会提示错误的,很可惜在c里他继续进行了运算并取得了一个结果-显然这个结果不是我想要的。
解析当前字符知道不能继续解释成浮点数
例如 1.23aa 就解释成 1.23 , aa 留在输入里面
如果连 1.23 都没有, 就不改动那个变量.

scanf 的返回值指示了成功读入了多少个项
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
xiaocheng_zh
帖子: 46
注册时间: 2009-05-30 15:52
来自: DL LIAONING CHN

Re: 请帮我来捉虫!

#7

帖子 xiaocheng_zh » 2009-10-03 13:11

.............
if(scanf("%f",&r)){
/*如果输入正确*/
.........
}
else /*输入错误*/
{
printf("输入错误.....\n");
}
..........
上次由 xiaocheng_zh 在 2009-10-04 23:35,总共编辑 1 次。
头像
xiaocheng_zh
帖子: 46
注册时间: 2009-05-30 15:52
来自: DL LIAONING CHN

Re: 请帮我来捉虫!

#8

帖子 xiaocheng_zh » 2009-10-04 23:26

#include <stdlib.h>
.............
if(scanf("%f",&r)){
l=2*PI*r;
s=PI*r*r;
printf("圆的周长为:%f\n",l);
printf("圆的面积为:%f\n",s);
}
else {
printf("输入错误,程序退出........\n");
exit(1);
}

...........
回复