鱼C论坛

 找回密码
 立即注册
查看: 936|回复: 4

[已解决]S1E13作业疑问

[复制链接]
发表于 2020-11-18 00:52:39 | 显示全部楼层 |阅读模式

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

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

x
如下图红圈所指,个人较难理解,求解答。
除此之外,为什么这里不能写成num = ch - 48('0')。(ps:括号都为注释,错误指值错误)
还有,要是在if循环体中用printf输出结果,输出结果错误,但在循环体外输出却正常。
最佳答案
2020-11-18 01:17:05
本帖最后由 jackz007 于 2020-11-18 01:20 编辑
. . . . .
        num = 0                                        // 初始化 num 为 0
        do {
                ch = getchar()        ;
                if(ch >= '0' && ch <= '9')             // 如果 ch 是数字字符 
                {
                        num = num * 10 + ch - '0' ;    // 结合前期 num 求取新值  
                } else {                               // ch 不是数字字符
                        if(num)                        // 如果 num 已经是非零值
                        {
                                break             ;    // 那就结束循环
                        }
                        
                }
        } while(ch != '\n')                       ;    // 如果 ch 不是换行(回车)字符,那就继续循环 
. . . . . .
        假设键入的字符分别是 '9','2','7', '5' ,'\n',那么,do ... while 将会循环 5 次,下面进行展开
第一次:num = 0    , ch = '9'   --> num = num * 10 + ch - '0' =   0 * 10 + '9' - '0' = 9
第二次:num = 9    , ch = '2'   --> num = num * 10 + ch - '0' =   9 * 10 + '2' - '0' = 92
第三次:num = 92   , ch = '7'   --> num = num * 10 + ch - '0' =  92 * 10 + '7' - '0' = 927
第四次:num = 927  , ch = '5'   --> num = num * 10 + ch - '0' = 927 * 10 + '5' - '0' = 9275
第五次:num = 9275 , ch = '\n'  --> ch 是非数字字符,而且,num 值非零,循环结束
        这样,最终通过键盘得到了整数 9275。
屏幕截图 2020-11-08 233456.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-18 01:17:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-18 01:20 编辑
. . . . .
        num = 0                                        // 初始化 num 为 0
        do {
                ch = getchar()        ;
                if(ch >= '0' && ch <= '9')             // 如果 ch 是数字字符 
                {
                        num = num * 10 + ch - '0' ;    // 结合前期 num 求取新值  
                } else {                               // ch 不是数字字符
                        if(num)                        // 如果 num 已经是非零值
                        {
                                break             ;    // 那就结束循环
                        }
                        
                }
        } while(ch != '\n')                       ;    // 如果 ch 不是换行(回车)字符,那就继续循环 
. . . . . .
        假设键入的字符分别是 '9','2','7', '5' ,'\n',那么,do ... while 将会循环 5 次,下面进行展开
第一次:num = 0    , ch = '9'   --> num = num * 10 + ch - '0' =   0 * 10 + '9' - '0' = 9
第二次:num = 9    , ch = '2'   --> num = num * 10 + ch - '0' =   9 * 10 + '2' - '0' = 92
第三次:num = 92   , ch = '7'   --> num = num * 10 + ch - '0' =  92 * 10 + '7' - '0' = 927
第四次:num = 927  , ch = '5'   --> num = num * 10 + ch - '0' = 927 * 10 + '5' - '0' = 9275
第五次:num = 9275 , ch = '\n'  --> ch 是非数字字符,而且,num 值非零,循环结束
        这样,最终通过键盘得到了整数 9275。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-18 01:18:10 | 显示全部楼层
num = 10 * num + (ch - '0') 这么来理解:减 ‘0’ 是把 ASCII 码转成数字,乘10就是将数字的个位这个位置空出来。比如数字 8,它现在占着个位的位置,如果乘以 10,就变成了80 了,8 就变成了十位上的数了,个位就空出来了,后转换的数 (ch - '0') 就可以在个位上了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-18 22:23:49 | 显示全部楼层
jackz007 发表于 2020-11-18 01:17
假设键入的字符分别是 '9','2','7', '5' ,'\n',那么,do ... while 将会循环 5 次,下面进行 ...

这个地方我一直有一个疑问,对于ch = getchar()在循环体内,它不是获取一个字符吗,那它(getchar())不是要先执行过循环体内的全部语句后才能再执行一次它吗,但执行程序的时候,它不是一次次的执行而是等我输入完我要输入的全部字符再执行。实质并不跟我想的一样。
就拿这题作例子,来解释我想表达的意思:
我画红圈的地方我写成num = ch - '0',后再补上printf("%d",num),能达到作业要求的同样的效果。
我设想的:输入q -->不打印 -->再输入1 --> 打印1 --> 再输入2 --> 打印2 -->再输入 a --> 不打印(结束)
此效果可参考python while 的效果。
(大概)实质: 输入qrqw124qrwr --> 打印124

我猜想可能getchar()是可接收并积累成多个字符的形式,while语句中相当于迭代出它积累的字符并依次判断后,最后再全部打印出来。(我有点无法理解,无法完整表达我所想的,求谅解)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-18 22:38:24 | 显示全部楼层
逆鳞丶樱之羽 发表于 2020-11-18 22:23
这个地方我一直有一个疑问,对于ch = getchar()在循环体内,它不是获取一个字符吗,那它(getchar())不是 ...

       getchar() 是带缓冲的键盘输入,就是说,并非每输入一个字符就会直接反馈给程序,而是用户输入的字符会先在键盘缓冲区保留,只有等到按下回车键的时候,getchar() 才会分多次把用户键入的所有字符反馈给程序。也正是因为这个原因,你的代码无法实现预期的交互式的输入输出的效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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