stuian 发表于 2018-3-20 16:23:52

S1E13:动动手的第2题代码怎么都看不明白

本帖最后由 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嘛,那这个式子有什么意义?

BngThea 发表于 2018-3-20 16:39:35

问题1: 因为你需要移位,比如原来是字符 '59',第一次后num存放的是5,第二次应该用5×10+9,而不是直接5+9
问题2:else表示读取的这个字符不是数字,所以进行判断,因为如果循环的时候前面读取过数字,那么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 + 5num = 125
第四次: num = 10 * 125 + 8num = 1258

第二个问题:
在这个循环里,不进if 就会进else,他只会进一个~
还是刚才那举例, ch是读了 '1' '2' '5' '8' '\n'
当读到'\n'的时候 是不是if就不成立了~ 那肯定就要进else
这时候else里面判断的是什么!是num!这时候要把num看做一个逻辑值,非0即为真~
所以执行else 里面的if break循环结束~

stuian 发表于 2018-3-21 15:47:42

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

我能再问一个问题嘛,所以else后面判断的时候,num已经是1258了嘛(如果输入的是‘1’,‘2‘,’5‘,’8‘)

stuian 发表于 2018-3-21 15:50:20

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

我打印了一下,但是好像不是

风过无痕丶 发表于 2018-3-21 17:45:41

stuian 发表于 2018-3-21 15:50
我打印了一下,但是好像不是

你问的是这个吧~ 我们在就break之前,把num的值打印出来~

stuian 发表于 2018-3-21 17:57:02

风过无痕丶 发表于 2018-3-21 17:45
你问的是这个吧~ 我们在就break之前,把num的值打印出来~

非常感谢,明白了{:5_109:}
页: [1]
查看完整版本: S1E13:动动手的第2题代码怎么都看不明白