一叶枫残 发表于 2021-1-30 17:57:09

C++(2nd for one)

本帖最后由 一叶枫残 于 2021-2-8 17:58 编辑

上一节课后思考作业
要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置。当用户按下键盘上的
“Enter”键时,数据输入结束,程序自动对所有的整数进行求和并打印出结果。
小甲鱼实现的C语言版本为:
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main()
{
        int i;
        int sum=0;
        char ch;
       
        printf("请输入一串整数和任意数目的空格:");
       
        while(scanf("%d",&i) == 1)
        {
                sum += i;
               
                while( (ch = getchar()) == ' ')
                {
                        ;
                }
               
                if ( ch == '\n')
                {
                        break;
                }
               
                ungetc( ch , stdin );
        }
        printf("结果是:%d",sum);
        printf("\n");
        system("pause");
}

我以我的理解和方法来解释一下其中的ungetc函数原理
我们以输入13   24   358   4   56来运行程序来解释,我会逐步分析

(我们采取输入流的方法来解释,这里的输入流是我自己理解的输入流,至于与输入流的真正意义有什么区别我不太清楚,看就OK了,很容易理解,先说明一点:输入流(我理解的输入流)是从头流入程序的)

情况1:没有ungetc( ch , stdin );
输入13   24   358   4   56
未执行时,输入流为13   24   358   4   56

第一次循环:i读到了输入流中的13,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数24中的2,把2给读进了ch同时把2流出了输入流,输入流变为:4   358   4   56;

第二次循环:i读到了输入流中的4,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数358中的3,把3给读进了ch同时把3流出了输入流,输入流变为:58   4   56;

第三次循环:i读到了输入流中的58,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数4中的4,把4给读进了ch同时把4流出了输入流,输入流变为:   56;

最后一次循环:i读到了输入流中的56,加进sum,while( (ch = getchar()) == ' ')中第一次就读到回车也就是'\n',if语句判断为真break退出循环;

于是这样情况下的输出的数就由13+24+358+4+56变成13+4+58+56了;

情况2:有ungetc( ch , stdin )
输入13   24   358   4   56
未执行时,输入流为13   24   358   4   56
第一次循环:i读到了输入流中的13,加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数24中的2,把2给读进了ch同时把2读出了输入流,输入流变为4   358   4   56,但是ungetc( ch , stdin )的作用是把ch的值返回给输入流,也就是把ch的值2返回给输入流,输入流又变为24   358   4   56;

第二次循环:i读到了输入流中的24,加进加进sum,while( (ch = getchar()) == ' ')把空格滤掉,ch读到下一个数358中的3,把3给读进了ch同时把3读出了输入流,输入流变为58   4   56,但是ungetc( ch , stdin )的作用是把ch的值返回给输入流,也就是把ch的值3返回给输入流,输入流又变为358   4   56;

后面的循环也是这样的情况,就不多啰嗦了,最后输出的值就为正确的13+24+358+4+56。


当输入带其他字符的情况,例如带字母和标点符号,程序只会计算遇到第一个非数字和空格前的输入流加起来的值,
例如输入14    24a525 s   2s55
第一个非数字和空格的输入为24a5中的a,此时a前面的输入流为14    24,程序就只会计算这段输入流加起来的值,最后输出结果为14+24=38
原因:while(scanf("%d",&i) == 1)语句当读到a时,scanf("%d",&i) == 0,while语句判断为假,直接退出了循环。

途中调试遇到的问题:
dev c++中调试查看面板不要试图去查看scanf("%d",&i)值,如下图,
你会发现调试的时候怎么点下一步都不会有什么反应,但是去掉查看值重新调试时又好了

页: [1]
查看完整版本: C++(2nd for one)