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]