我是一个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: 请帮我来捉虫!
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)结果相同。
估计是一个原理
相关函数 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)结果相同。
估计是一个原理
宇宙=数学 *物理 sssssssss Ubuntu 桌面培训 sssssssss 问打包的问题之前先看
和我一样的新手请看,我看过了,腰不酸了,腿不疼了,上楼也有劲了
想去IRC的点这里——一个比QQ群好N多的东西
和我一样的新手请看,我看过了,腰不酸了,腿不疼了,上楼也有劲了
想去IRC的点这里——一个比QQ群好N多的东西
-
- 帖子: 32
- 注册时间: 2009-08-08 7:39
Re: 请帮我来捉虫!
多谢二楼热心的朋友,我这里原意是当遇到非法输入时能够停止计算,并提示用户输入了非法数即可!我原来以为既然scanf()定义了%f为浮点型的数值,则如果在输入中出现了字符型等非浮点型的数值时会提示错误的,很可惜在c里他继续进行了运算并取得了一个结果-显然这个结果不是我想要的。
- wzssyqa
- 帖子: 4010
- 注册时间: 2008-04-07 17:36
- 来自: 泰安人在阜新
Re: 请帮我来捉虫!
那可能要你自己检测了
宇宙=数学 *物理 sssssssss Ubuntu 桌面培训 sssssssss 问打包的问题之前先看
和我一样的新手请看,我看过了,腰不酸了,腿不疼了,上楼也有劲了
想去IRC的点这里——一个比QQ群好N多的东西
和我一样的新手请看,我看过了,腰不酸了,腿不疼了,上楼也有劲了
想去IRC的点这里——一个比QQ群好N多的东西
-
- 帖子: 18311
- 注册时间: 2008-01-09 22:41
Re: 请帮我来捉虫!
检测输入的数值
需要写个函数检测
至于说精确度,c语言老师说浮点好像在内存存储时候就不精确,小数点后边经常出问题。
如果算pi,建议lz参考源里的pi程序代码
用数组也比浮点准确
需要写个函数检测
至于说精确度,c语言老师说浮点好像在内存存储时候就不精确,小数点后边经常出问题。
如果算pi,建议lz参考源里的pi程序代码
用数组也比浮点准确
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
Re: 请帮我来捉虫!
解析当前字符知道不能继续解释成浮点数superypy 写了:多谢二楼热心的朋友,我这里原意是当遇到非法输入时能够停止计算,并提示用户输入了非法数即可!我原来以为既然scanf()定义了%f为浮点型的数值,则如果在输入中出现了字符型等非浮点型的数值时会提示错误的,很可惜在c里他继续进行了运算并取得了一个结果-显然这个结果不是我想要的。
例如 1.23aa 就解释成 1.23 , aa 留在输入里面
如果连 1.23 都没有, 就不改动那个变量.
scanf 的返回值指示了成功读入了多少个项
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
- xiaocheng_zh
- 帖子: 46
- 注册时间: 2009-05-30 15:52
- 来自: DL LIAONING CHN
Re: 请帮我来捉虫!
.............
if(scanf("%f",&r)){
/*如果输入正确*/
.........
}
else /*输入错误*/
{
printf("输入错误.....\n");
}
..........
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: 请帮我来捉虫!
#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);
}
...........
.............
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);
}
...........