书上的例题看不懂,求助

pengle_008 2010-06-12 12:16:12
源程序
1. #include <ctype.h>
2.
3. doule atof ( char s[] )
4. {
5. doule val, power;
6. int i,sign;
7.
8. for ( i=0; isspace ( s[i] ); i++ )
9. ;
10. sign = ( s[i] == '-' ) ? -1 : 1;
11.
12. if ( s[i] == '+' || s[i] == '-' )
13. i++;
14.
15. for( val = 0.0; isdigit ( s[i] ); i++ )
16. val = 10.0 * val + ( s[i] - '0' );
17.
18. if ( s[i] == '.' )
19. i++;
20.
21. for ( power = 1.0; isdigit ( s[i] ); i++ ) {
22.
23. val = 10.0 * val + ( s[i] - '0' );
24. power * = 10.0;
25. }
26.
27. return sign * val / power;
28.
29. }



以上程序的作用是“把字符串S转换成相应的双精度浮点数”

我的问题:

把字符串转换成双精度浮点数有什么意义?
程序的第8行,目的是跳过空白,但是感觉只能跳过字符串头上的空白,中间的怎么跳?
第12行跳过正负号,但是字符串中间的正负号不需要跳吗?
能不能把每一行都给加上注释,谢谢!






...全文
119 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiwcdj 2010-06-12
  • 打赏
  • 举报
回复
完整的代码,跟踪运行下就知道每一步在干什么了。

#include <cstdio>
#include <cstring>
#include <ctype.h>

double atof ( char s[] )
{
double val, power;
int i,sign;

for ( i=0; isspace ( s[i] ); i++ )
;
sign = ( s[i] == '-' ) ? -1 : 1;

if ( s[i] == '+' || s[i] == '-' )
i++;

for( val = 0.0; isdigit ( s[i] ); i++ )
val = 10.0 * val + ( s[i] - '0' );

if ( s[i] == '.' )
i++;

for ( power = 1.0; isdigit ( s[i] ); i++ ) {

val = 10.0 * val + ( s[i] - '0' );
power *= 10.0;
}

return sign * val / power;
}

const int maxn=308;
char szInput[maxn];

int main()
{
double res=0.0;
memset(szInput,0,sizeof(szInput));// clear buffer

printf("Enter a string:");
fgets(szInput,sizeof(szInput),stdin);

res=atof(szInput);
printf("%lf\n",res);

return 0;
}
delphiwcdj 2010-06-12
  • 打赏
  • 举报
回复
我的问题:

把字符串转换成双精度浮点数有什么意义?
在程序中对字符串操作比较常见,操作后再还原回去。
比如,在做大数运算的时候要对字符串进行处理,然后还原为浮点类型

程序的第8行,目的是跳过空白,但是感觉只能跳过字符串头上的空白,中间的怎么跳?
在输入字符串的时候,应该保证是连续的,否者应视为非法输入。

第12行跳过正负号,但是字符串中间的正负号不需要跳吗?
符号应该是第一个非空白符。

能不能把每一行都给加上注释,谢谢!
程序的意思是分别读取每一位字符数字并转化为一个double类型,最后除以小数位数。这种方法有位数限制,否者会越界的
z569362161 2010-06-12
  • 打赏
  • 举报
回复
但是字符串中间的正负号不需要跳吗?

需不需要跳呢?不知道
z569362161 2010-06-12
  • 打赏
  • 举报
回复
把字符串转换成双精度浮点数有什么意义?

没什么意义。你的问题不知道该 怎么回答。
pengle_008 2010-06-12
  • 打赏
  • 举报
回复
谢谢大家,很详细,我再看看
giant1st 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kuyucman 的回复:]

注释的不好:
C/C++ code
doule atof ( char s[] )
{
doule val, power;
int i,sign;

for ( i=0; isspace ( s[i] ); i++ ); //跳过数字开头空格,“但是感觉只能跳过字符串头上的空白,中间的怎么跳?”数值内部不能有空格的


sign = ( s[i] ==……
[/Quote]

注释的不错啊!
一般的 数字 中间没有空格吧? 这种小问题不要太在意的了
东莞某某某 2010-06-12
  • 打赏
  • 举报
回复
注释的不好:
doule atof ( char s[] )
{
doule val, power;
int i,sign;

for ( i=0; isspace ( s[i] ); i++ ); //跳过数字开头空格,“但是感觉只能跳过字符串头上的空白,中间的怎么跳?”数值内部不能有空格的


sign = ( s[i] == '-' ) ? -1 : 1; //判断正负


if ( s[i] == '+' || s[i] == '-' ) i++; //如果带正负号,则i++

//计算整数部分的值
for( val = 0.0; isdigit ( s[i] ); i++ )
val = 10.0 * val + ( s[i] - '0' );

if ( s[i] == '.' )
i++;

//小数点后面部分,逐步乘以10 ,并用power表示整个double数值扩大的倍数
for ( power = 1.0; isdigit ( s[i] ); i++ ) {

val = 10.0 * val + ( s[i] - '0' );
power * = 10.0;
}

// 正负号 * 扩大power倍数后的值 / 扩大的倍数
return sign * val / power;

}


考研数学150分是这样练成的主持人:亲爱的各位网友大家晚上好,欢迎光临海文考研大讲堂。海文教育集团传媒中心田振宇向您问好,今天我们又相聚在雄心启动未来—2007考研全程策划第三十二期节目中。今天我们为大家请到现场的是海文考研高级辅导专家王平老师,请他为大家讲讲考研数学150分是怎样炼成的。王平:各位网友大家晚上好,今天我为大家讲讲怎样能取得考研数学150分。其实分数只是我们说的一个概念,实质上是要取得好的成绩。考研数学作为一种选拔性考试,必然具有一定的难度。但是从近几年的试题来看,随着研究生招生规模的扩大,其整体难度已有所下降,考研数学越来越接近标准化考试,即试题越来越基础,越来越注重考察考生对基本概念、基本方法和基本性质的掌握程度,以及运算能力、逻辑推理能力等基本数学素质。 在备考之前,对考研数学的基本命题趋势和试题难度要有比较深刻的认识,根据自己对考研数学的定位,复习备考的主要策略:紧扣考纲,扎实基础,注重联系,加强训练。 第一,紧扣考纲。考研数学作为标准化考试,其命题范围有明确的规定,我的第一轮复习主要就是依据考试大纲,详细了解考试的基本要求,题型、类别和难度特点,准确定位。对于考试大纲未作要求的内容和知识点,我都没有看。因为从历年试题来看,偏题怪题越来越少,超纲题基本没有,因此没有必要在这上面浪费过多的时间和精力。 第二,扎实基础。考研数学所考察的重点就是考生的数学基本功,在根据考试大纲要求循序渐进地进行全面系统的复习的过程中,应该重点加强对基本概念、基本定理的理解,以及对基本方法的掌握。只有深入理解基本概念,牢牢掌握基本定理和公式,才能迅速而准确地找到解题的突破口和切入点,我们在考试中失分的一个重要原因就是对基本概念、定理记不全、记不牢,理解不准确,解题不得要领。 对于基本知识、基本定理和基本方法,关键在理解,而且理解还存在程度的问题,不能仅仅停留在看懂了的层次上,对一些易推导的定理,有时间一定要动手推一推,对一些基本问题的描述,特别是微积分中的一些术语的描述,一定要自己动手写一写,这些基本功都很重要,到临场时就可以发挥作用了。 第三,注重联系。考研试题中一般不太可能单独考察某个知识点,一般都是几个知识点结合起来考察考生的综合分析能力,因此复习时就应该注意知识点之间的联系,一是学科内部知识点的纵向联系,例如微积分中级数的求和一般都要用到微分或积分。同时还要注意三大学科之间的横向联系,例如概率试题通常都会用到微积分的知识等等。这些在综合练习时都是应该总结和注意的地方。 第四,加强训练。数学学科的特点,决定了数学考试要想取得好成绩就离不开大量有效的练习,俗话说熟能生巧,对于数学的基本概念、公式、结论等只有在反复练习中才能真正理解与巩固。数学试题虽然千变万化,其知识结构却基本相同,题型也相对固定,往往存在一定的解题套路,熟练掌握后既能提高正确率,又能提高解题速度。 数学考研题的重要特征之一就是综合性强、知识覆盖面广,一些稍有难度的试题一般比较灵活,对知识点串联的要求比较高,只有通过逐步的训练,不断积累解题经验,在考试时才更有机会较快找到突破口。平时有针对性的训练也有利于进一步理解并彻底弄清楚知识点的纵向与横向联系,转化为自己真正掌握了的东西,能够在理解的基础上灵活运用、触类旁通。 数学复习只是有一些值得注意的策略和方法,而没有一蹴而就的捷径,关键在个人的努力。当然,如果基础较弱,或者时间紧张,参加一定的考研辅导班也是不错的选择,因为大家从小到大,已经习惯了课堂的学习氛围。而且专业的考研辅导可以使你的复习更具方向性和目的性,能使你较快地发现自己原来的薄弱环节并予以补救。 总体的说就是要:1:注重基础,这是许多人可能都听别人所过但又不知如何入手的一点,一定要耐得住性子,冰冻三尺非一日之寒,看到别人成功辉煌的同时你也应该更多的去思考他(她)成功背后付出的努力。考研本身也是一个人综合素质的测定,一个系统的工程。 2:着力于思维的锻炼,它对于成绩的提高是整体性的,也是最可靠的途经。3:选好辅导书。我做的题目肯定不算最多的,甚至相对许多人是比较少的,但有一点我看的书的种类是比较多的,数学的每一门我都分别选了一册我认为最好的辅导教材,这 样才是比较合理的选书方法,也能达到最好的复习效果,没有必要将赌注都压在一本书上,也没有必要一本书反反复复地看。 4:稳定心态,不论复习状态或效果是好是坏,都不要有太大的波动,这点上文中提到了比较多。 这中间经常有同学

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧