请教一个while循环问题

问题遇到的现象和发生背景

循环语句位置变化,所得的结果不同了 ;下面的程序是求输入一个浮点数,输出其小数的位数。

问题相关代码,请勿粘贴截图

程序1:
#include
#include
using namespace std;
int main()
{
char ch;
bool flag = false;
int num = 0;
while ((ch = getchar()) != '\n')
{

    if (flag)
    if (ch >= '0'&&ch <= '9')
         num++;
       else
       {
         num = 0;
         break;
       }
    if (ch=='.')flag = true;
}
if (num > 0)
    cout << num << endl;
else
    cout << "输入不正确!" << endl;
return 0;

}

程序2:
#include
#include
using namespace std;
int main()
{
char ch;
bool flag = false;
int num = 0;
while ((ch = getchar()) != '\n')
{
if (ch == '.')flag = true;
if (flag)
if (ch >= '0'&&ch <= '9')
num++;
else
{
num = 0;
break;
}
}
if (num > 0)
cout << num << endl;
else
cout << "输入不正确!" << endl;
return 0;
}

运行结果及报错内容

程序1:
输入:1.6
输出:1
程序2:
输入:1.6
输出:输入不正确!

我的解答思路和尝试过的方法

这2个程序别的都是一样的,只是while循环里的语句 if (ch == '.')flag = true; 位置不一样。

我想要达到的结果

我认为2个程序结果应该是一样的

你自己思考一下:
if (ch == '.')flag = true;
if (flag)
if (ch >= '0'&&ch <= '9')
num++;
else
{
num = 0;
break;
}
======
这个代码能成立不?只有ch为点符号的时候flag才是true,然后就判断ch是否为数字,这本身就矛盾啊。ch已经是点符号了,怎么会同时又是数字呢?当不是数字时,你就break了。当然不正确
=========
而第一段代码的区别,其实是flag为true,和判断if逻辑分别在两次循环中,也就是判断的是两个字符。当前一个字符是点符号时,才会判断下一个字符是不是数字。这就能正确判断输入的是否为浮点数

程序是顺序执行的, if (ch == '.')flag = true;放在前面就是先判断是否遇到.了,然后再判断if(flag)。
正常的逻辑应该是:

不对哦,第二个程序,当你输入“.”的时候,flag满足条件,变成true,可以进入下一个if,if (ch >= '0'&&ch <= '9')不满足条件,进入else,执行num = 0;break; 退出循环,打印输入不正确。 所以你再怎么输入,都会在你输入“.”的时候退出循环。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632