1.下面程序的功能是读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
找出其中的错误,并改正之。
原错误程序:
#include "stdio.h"
main()
{ int i,a,n=1;
while(n<=7)
{
do
{
scanf("%d",a); //缺少取地址符;
}while(a<1 && a>50);//逻辑关系不对,
//导致无论输入何值都能输出结果
for(i=1;i<=a;i++)
printf("*");
printf("\n");
n++;
}
}
该源程序是可以通过编译的,但是无法显示任何输出结果
很明显,在scanf处没有加入取地址符&,导致a初始值是一个巨大的数,因此该循环体一次也无法执行。但是加入取地址符后会发现,无论输入多大的数,都可以执行输出星号这个操作,与题意不符,观察执行while循环体的条件while(a<1 && a>50),如果输入51,该条件表示为“51大于50且小于1”,明显不符合逻辑;把且&&改成或||即可符合逻辑。
改错结果如下:
#include "stdio.h"
main()
{ int i,a,n=1;//a为输入的值,n为数据个数统计器;
while(n<=7)//当输入的数据个数在7以内,可执行该循环体;
{
do
{
scanf("%d",&a);
}while(a<1 || a>50);//当输入错误数据,则无法打印*号;
for(i=1;i<=a;i++) //反之执行打印*操作;
printf("*");
printf("\n");
n++;//当n累积到7循环结束,输出结果。
}
}
但是该程序居然没有输入错误程序的提示。。。
因此我打算修改程序:当输入错误数据时,系统会给出错误提示,并且将要求当用户输入正确数值为止方可继续循环。
魔改程序如下:
#include "stdio.h"
main()
{ int i,a,n=1;
while(n<=7)
{
scanf("%d",&a);
while(a<1||a>50)//判断输入的a是否符合要求;
{
printf("Error! Please reput data (1<=x<=50)!\n");
scanf("%d",&a);
}//当且仅当a符合要求时,程序才会执行下一步打印*号操作;
for(i=1;i<=a;i++)
printf("*");
printf("\n");
n++;
}
}
peace.