K&R书练习4-2

Posted

技术标签:

【中文标题】K&R书练习4-2【英文标题】:K&R book exercise 4-2 【发布时间】:2015-10-21 11:01:24 【问题描述】:

我正在学习 K&R 书籍。我目前在第 4 章。我正在阅读第 71 页的 atof() 函数。函数 atof(s) 将字符串转换为其等效的双精度浮点数。

atof()的代码如下: //atof: 将字符串s转成double

double atof2(char s[])

   double val, power;
   int i, sign;

   for (i = 0; isspace(s[i]); ++i) //skip white space
       ;
   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;

我的问题是关于变量:权力。为什么我们需要它?

我确实了解变量:“val”的使用,但我不确定变量:“power”。为什么我们将 val 除以幂?

【问题讨论】:

【参考方案1】:

变量power 用于将数字除以幂,得到浮点数的结果。

让您的字符串为 -12.83 ,然后第一个 for 循环将检查空格并增加 i ,因为没有空格所以 ,i=0

sign 将是 -1s[i]=s[0]='-'

在接下来的两个循环中,字符串的值被转换为整数并存储在val不包括. - 自己弄清楚)。

现在在两个循环之后 val 将是 1283 。但最后一个循环将迭代2 次,power 将更改为100.00(第一次迭代中为10*1.0,第二次迭代中为10*10.0)。

现在得到浮点值 val 除以 power 并乘以 sign

所以,它将返回 -1*1283/100 ,因此 -12.83 是您的浮点数。

【讨论】:

好的。但是为什么他们使用两个循环: 1) for (val = 0.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - '0'); 2) for (power = 1.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - '0');功率 *= 10.0;我们不能简单地将两个 for 循环合并到一个循环中,如下所示: for (val = 0.0, power = 1.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - ' 0');功率 *= 10.0; 我希望我把我的问题说清楚了吗? @HusseinBarada 第一个将字符串转换为数字,直到遇到'.'。它在遇到任何非数字时结束。第二个循环是将'.' 之后的字符转换为数字。 @HusseinBarada -12.83 第一个循环将前两个字符(after '-' in string)转换为整数并存储在 val 中,第二个循环将执行此操作'.'之后的字符 @HusseinBarada 这个if (s[i] == '.')++i; 是获取'.' 的索引,然后增加i 并在第二个循环中使用它。这个if 是在遇到'.' 时采取行动。 好的,知道了。整个功能对我来说更有意义。感谢您的帮助@ameyCU

以上是关于K&R书练习4-2的主要内容,如果未能解决你的问题,请参考以下文章

在R中练习k-meas聚类

快速排序示例中的错误(K&R C 书)?

算法笔记_079:蓝桥杯练习 区间k大数查询(Java)

OJ练习第60题——合并 K 个升序链表

#yyds干货盘点# LeetCode 腾讯精选练习 50 题:合并K个升序链表

练习2.272.282.29