鱼C论坛

 找回密码
 立即注册
查看: 2127|回复: 6

[已解决]S1E13:动动手的第2题代码怎么都看不明白

[复制链接]
发表于 2018-3-20 16:23:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 stuian 于 2018-3-20 16:24 编辑
# include <stdio.h>

int main()
{
        int ch;
        int num = 0;
        
        printf("请输入待转换的字符串:");
        
        do
        {
                ch = getchar();
                printf("%d",ch);
                
                if (ch >= '0' && ch<= '9') 
                {
                        num = 10*num + (ch-'0');
                        printf("%d\n",num);
                }
                else
                {
                        if(num)
                        {
                                break; //已有数字,则退出循环。 
                        }
                }
        }
        while (ch != '\n'); 
        
        printf("结果是:%d\n",num);
        
        return 0;
}

问题1:代码第15行if后面的条件和代码块我都懂,是用来识别0到9的数字,但是为什么num = 10*num+(ch-'0')中要10*num这个式子。
问题2:代码第20行else后面的if语句不明白是干什么的,num不是设定等于0嘛,那这个式子有什么意义?
最佳答案
2018-3-20 17:02:24
问这个题目的我好像看到过很多次了~
先说第一个问题
为什么要乘以10,因为是十进制啊~这么说理解了一点吗~言归正传 说题~
假定 你输入了 '1' '2' '5' '8'
既然你明白了if的条件 直接说里面的
num = 10 * num + (ch - '0')  括号里面的其实是一个字符型转换到整型的
打个比方  '0'的ascii值是 48  '1'的ascii值是49, 然后我就不用说了吧~
接着看循环~
第一次: num = 10 * 0 + 1   num = 1
第二次:   num = 10 * 1 + 2   num = 12
第三次: num = 10 * 12 + 5  num = 125
第四次: num = 10 * 125 + 8  num = 1258

第二个问题:
在这个循环里,不进if 就会进else,他只会进一个~
还是刚才那举例, ch是读了 '1' '2' '5' '8' '\n'
当读到'\n'的时候 是不是if就不成立了~ 那肯定就要进else
这时候else里面判断的是什么!是num!  这时候要把num看做一个逻辑值,非0即为真~
所以执行else 里面的if break  循环结束~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-20 16:39:35 | 显示全部楼层
问题1: 因为你需要移位,比如原来是字符 '59',第一次后num存放的是5,第二次应该用5×10+9,而不是直接5+9
问题2:else表示读取的这个字符不是数字,所以进行判断,因为如果循环的时候前面读取过数字,那么num中就存放了这个数,所以不为0,可以用来作为判断条件,跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 17:02:24 | 显示全部楼层    本楼为最佳答案   
问这个题目的我好像看到过很多次了~
先说第一个问题
为什么要乘以10,因为是十进制啊~这么说理解了一点吗~言归正传 说题~
假定 你输入了 '1' '2' '5' '8'
既然你明白了if的条件 直接说里面的
num = 10 * num + (ch - '0')  括号里面的其实是一个字符型转换到整型的
打个比方  '0'的ascii值是 48  '1'的ascii值是49, 然后我就不用说了吧~
接着看循环~
第一次: num = 10 * 0 + 1   num = 1
第二次:   num = 10 * 1 + 2   num = 12
第三次: num = 10 * 12 + 5  num = 125
第四次: num = 10 * 125 + 8  num = 1258

第二个问题:
在这个循环里,不进if 就会进else,他只会进一个~
还是刚才那举例, ch是读了 '1' '2' '5' '8' '\n'
当读到'\n'的时候 是不是if就不成立了~ 那肯定就要进else
这时候else里面判断的是什么!是num!  这时候要把num看做一个逻辑值,非0即为真~
所以执行else 里面的if break  循环结束~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-21 15:47:42 | 显示全部楼层
风过无痕丶 发表于 2018-3-20 17:02
问这个题目的我好像看到过很多次了~
先说第一个问题
为什么要乘以10,因为是十进制啊~这么说理解了一点吗 ...

我能再问一个问题嘛,所以else后面判断的时候,num已经是1258了嘛(如果输入的是‘1’,‘2‘,’5‘,’8‘)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-21 15:50:20 | 显示全部楼层
风过无痕丶 发表于 2018-3-20 17:02
问这个题目的我好像看到过很多次了~
先说第一个问题
为什么要乘以10,因为是十进制啊~这么说理解了一点吗 ...

我打印了一下,但是好像不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 17:45:41 | 显示全部楼层
stuian 发表于 2018-3-21 15:50
我打印了一下,但是好像不是

你问的是这个吧~ 我们在就break之前,把num的值打印出来~
QQ截图20180321174557.jpg
QQ截图20180321174623.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-21 17:57:02 | 显示全部楼层
风过无痕丶 发表于 2018-3-21 17:45
你问的是这个吧~ 我们在就break之前,把num的值打印出来~

非常感谢,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表