关于scanf()和while/do-while一起使用的总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这里不对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.本人只是小白,以上内容仅是在学习的过程中对他们的使用的一些理解,欢迎各位大佬指正,或者贡献更好的解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值