当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 请帮我来捉虫!
帖子发表于 : 2009-09-21 18:59 

注册: 2009-08-08 7:39
帖子: 32
送出感谢: 0 次
接收感谢: 0 次
我是一个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,这是怎么一回事呀?
如果当用户输入了非法的数,应该如何判断?请高手帮助解决一下!


附件:
文件注释: 运行时的界面
111.png
111.png [ 60.61 KiB | 被浏览 365 次 ]

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-09-21 21:07 
头像

注册: 2008-04-07 17:36
帖子: 4010
地址: 泰安人在阜新
送出感谢: 0 次
接收感谢: 0 次
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)结果相同。

估计是一个原理


_________________
宇宙数学物理 sssssssss Ubuntu 桌面培训 sssssssss 问打包的问题之前先看
和我一样的新手请看,我看过了,腰不酸了,腿不疼了,上楼也有劲了
想去IRC的点这里——一个比QQ群好N多的东西


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-09-21 22:02 

注册: 2009-08-08 7:39
帖子: 32
送出感谢: 0 次
接收感谢: 0 次
多谢二楼热心的朋友,我这里原意是当遇到非法输入时能够停止计算,并提示用户输入了非法数即可!我原来以为既然scanf()定义了%f为浮点型的数值,则如果在输入中出现了字符型等非浮点型的数值时会提示错误的,很可惜在c里他继续进行了运算并取得了一个结果-显然这个结果不是我想要的。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-09-21 22:37 
头像

注册: 2008-04-07 17:36
帖子: 4010
地址: 泰安人在阜新
送出感谢: 0 次
接收感谢: 0 次
那可能要你自己检测了


_________________
宇宙数学物理 sssssssss Ubuntu 桌面培训 sssssssss 问打包的问题之前先看
和我一样的新手请看,我看过了,腰不酸了,腿不疼了,上楼也有劲了
想去IRC的点这里——一个比QQ群好N多的东西


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-09-23 21:08 

注册: 2008-01-09 22:41
帖子: 18311
送出感谢: 0 次
接收感谢: 6
检测输入的数值

需要写个函数检测

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

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

用数组也比浮点准确


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-09-23 22:08 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
superypy 写道:
多谢二楼热心的朋友,我这里原意是当遇到非法输入时能够停止计算,并提示用户输入了非法数即可!我原来以为既然scanf()定义了%f为浮点型的数值,则如果在输入中出现了字符型等非浮点型的数值时会提示错误的,很可惜在c里他继续进行了运算并取得了一个结果-显然这个结果不是我想要的。


解析当前字符知道不能继续解释成浮点数
例如 1.23aa 就解释成 1.23 , aa 留在输入里面
如果连 1.23 都没有, 就不改动那个变量.

scanf 的返回值指示了成功读入了多少个项


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-10-03 13:11 
头像

注册: 2009-05-30 15:52
帖子: 46
地址: DL LIAONING CHN
送出感谢: 0 次
接收感谢: 0 次
.............
if(scanf("%f",&r)){
/*如果输入正确*/
.........
}
else /*输入错误*/
{
printf("输入错误.....\n");
}
..........


最后由 xiaocheng_zh 编辑于 2009-10-04 23:35,总共编辑了 1 次

页首
 用户资料  
 
8 楼 
 文章标题 : Re: 请帮我来捉虫!
帖子发表于 : 2009-10-04 23:26 
头像

注册: 2009-05-30 15:52
帖子: 46
地址: DL LIAONING CHN
送出感谢: 0 次
接收感谢: 0 次
#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);
}

...........


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译