提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这里不对while,do-while以及scanf的使用过多介绍,只要讲解一些二者结合使用的方法。
提示:以下是本篇文章正文内容,下面案例可供参考
一、以一个题目作为讲解的开始
实现一个录入学生成绩的函数,要求输入的数字大于100或小于0重新输入(-1除外),-1作为输入结束标志。
二、具体实现
1.使用do-while和scanf()
代码如下(示例):
int input(int a[])
{
int i;//数组下标
printf("请输入一些整数(成绩>=0并且<=100,-1退出)");
do
{
scanf("%d",&a[i]);
while((a[i]<0&&a[i]!=-1)||a[i]>100)
{
printf("错误,请重新输入:");
scanf("%d",&a[i]);
}
i++;
}while(a[i-1]!=-1);
return i-1;
}
函数功能:
将成绩录入数组a[](为了方便先把成绩定为整型,实际上float或者double更准确),并输出成绩的数量。
具体解析:
我们使用do-while循环实现成绩地循环读入,先用scanf读入数据,再对读入的数据进行判断。在内部嵌套while循环实现当录入不符合要求的成绩时的重新读入。
注:
1.这里有个注意点,因为我们的结束条件是-1,所以在while循环重读的时候要将a[i]!=-1的条件加上,不然会一直重复读入,变成了死循环。
2.结束条件这里因为数组下标在实现后i++了所以在结束的时候要使用a[i-1]去判断。(这样也有一个好处,要是程序一开始就输入-1呢,直接结束循环)。
3.返回值这里也要注意,是i-1不是i,因为我们是对i++后再进行判断的。如果不理解,我们可以假设,我一开始就输入-1,那么i++,然后结束循环,输出i-1=0,人数为0。
4.这里有个不好的地方,就是无论如何都会把结束标志-1录入到数组中,不过我们可以在后续操作中控制下标,使其读不到-1这个数,由此解决这个问题。
2.使用while和scanf()
代码如下(示例):
int input1(int a[])
{
int i=0;
printf("请输入一些整数(成绩>=0&&<=100,-1退出)");
scanf("%d",&a[i]);
while(a[i]!=-1)
{
i++;
scanf("%d",&a[i]);
while((a[i]<0&&a[i]!=-1)||a[i]>100)
{
printf("错误,请重新输入:");
scanf("%d",&a[i]);
}
}
return i;
}
由于while是先判断再执行,所以我们要是想进入循环a[0]需要先有值,这里是通过外部输入的方式记录第一个成绩,并且进入循环的。
但是有一个很明显的bug:如果一开始数字就>100或者<0不就不满足条件了吗?所以,要是想要正确必须保证第一个数据符合条件(0<=数据<=100,-1是可以的)。
那若是把这个限制条件放入while中呢,似乎也不行,那就不满足不符合条件重新输入的条件了!!
那就让我们重新想想,若是一开始给a[0]赋个初值,保证可以进去循环,然后再再循环中重新为a[0]赋值新输入的成绩,再进入判断可不可以呢?
我们来试试:
int input1(int a[])
{
int i=0;
printf("请输入一些整数(>=0&&<=100,-1退出)");
a[0]=0;
while(a[i]!=-1)//error
{
scanf("%d",&a[i]);
while((a[i]<0&&a[i]!=-1)||a[i]>100)
{
printf("错误,请重新输入:");
scanf("%d",&a[i]);
}
i++;
}
return i-1;
}
这里的问题似乎比上一个问题更大,因为我只保证了第一个数组可以判断,但是其他的呢,若是此时i=1;a[1]此时还没有赋值,这不就乱套了吗!!
所以使用while到底可不可以实现这个功能呢?答案是可以的,见下方:
3.使用使用while和scanf()
代码如下(示例):
int i=0;
int x;//i即是数组下标,又是学生人数,x是中间成绩承接
int n;
while(1)//用死循环使程序输入不断进行
{
printf("Input score(-1 to quit):");
scanf("%d",&x);
while(x>100)//如果成绩大于100重新输入
{
printf("请重新输入:");
scanf("%d",&x);
}
if(x>=0)//满足条件,读数据到数组中
{
score[i]=x;
i++;
}else //读入的数据小于0,停止读取
{
break;
}
}
这里我们用一个死循环让判断一直进行,先用一个x来承接数值,如果满足条件就读入进数组a,不符合就重新输入或者退出。
这个程序就完美吗?不,这里我们希望的是逐个输入,如果一次性输入多个就不行了!
总结
1.这里我们总结了几种复杂限制下,对while,do-while与scanf()函数的结合使用,我们可以清楚的看到do-while和while的优缺点。
2.在此说明,对于以上程序,最好的方式是逐个键入成绩,这样的话可以更加完美的实现功能,当然对于程序1,2来说多个键入也可以,不过请尽量保证数据符合条件。
3.本人只是小白,以上内容仅是在学习的过程中对他们的使用的一些理解,欢迎各位大佬指正,或者贡献更好的解决方法。