我们的计算器还有好多问题,我们一个个解决。
本节解决用户输错就退出的问题。我们应该在用户输错时,提示并让其重新输入,如果一直错就一直提示,直到输对。用while循环语句做比较合适,如下:
//提示用户输入第一个数,需循环直到用户输入正确的数:
int r;
while(1){
printf("请输入第一个数:\n");
r = scanf("%d",&number1);
//查看Scanf是否收到了正确的数
if(r==0){
printf("别调皮,这样不好玩,我走了\n");
//清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
int c;
while ( (c = getchar()) != ‘\n‘ && c != EOF ) ;
}else{
//输对了,跳出循环
break;
}
}
这段代码会造成用户输错时,一直循环,重新让用户输入,直到输对才停止循环。
每次执行完循环体(就是大括号内的代码),都会回到while(1),重新检查条件,如果条件为真就再次进入循环体执行。while(1)这行,小括号里跟if语句一样,是条件,如果是真就执行大括号里的代码。这里永远是1,1就是是真,所以永远执行大扩号里的代码,也就是永远执行循环体。直到用户输对了,执行break时,才跳出了循环。注意是从break处直接跳出循环,break后面的代码不再执行。
while ( (c = getchar()) != ‘\n’ && c != EOF ) ; 这一句是为了清空输入流,如果用户输入的不是数字,那么其实scanf没有从输入流中将字取出,导致下一次再用scanf取时,直接返回0而不是等待用户输入。这种写法是跨平台通用的,用fflush(stdin)清空的话只能在windows下使用。
添加对第二个数和运算符的处理后,main函数是这样的:
int main(void)
{
//保存用户输入的数
int number1;
int number2;
int opt;//运算符
//提示用户输入第一个数,需循环直到用户输入正确的数:
int r;
while(1){
printf("请输入第一个数:\n");
r = scanf("%d",&number1);
//查看Scanf是否收到了正确的数
if(r==0){
printf("别调皮,这样不好玩,重来\n");
//清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
int c;
while ( (c = getchar()) != ‘\n‘ && c != EOF ) ;
}else{
//输对了,跳出循环
break;
}
}
//提示用户输入第二个数
while(1){
printf("请输入第二个数:\n");
r = scanf("%d",&number2);
//查看Scanf是否收到了正确的数
if(r==0){
printf("别调皮,这样不好玩,重来\n");
//清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
int c;
while ( (c = getchar()) != ‘\n‘ && c != EOF ) ;
}else{
//输对了,跳出循环
break;
}
}
int result;//存放计算结果
//提示用户输入运算符
while(1){
printf("请输入运算符(%d%d%d%d分别对应加减乘除):\n",jia,jian,cheng,chu);
r = scanf("%d",&opt);
if(r==0){
printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 重新输入吧\n");
//清空输入流。如果没有这一句,输入流中残存的字符将导致scanf不等待用户输入。
int c;
while ( (c = getchar()) != ‘\n‘ && c != EOF ) ;
//回到循环开始
continue;
}
//跟据运算符进行不同的运算
switch(opt){
case jia:
//加
result = number1+number2;
break;
case jian:
//减
result = number1-number2;
break;
case cheng:
//乘
result = number1*number2;
break;
case chu:
//除,现在只能整除
result = number1/number2;
break;
default:
printf("运算符必须是1,2,3,4之一才行!重来\n");
continue; //回到循环开始,重新来一遍
}
//当执行到这里时,说明运算符检查成功,应跳出while。
break;
}
//输出结果
printf("result : %d\n",number1,number2,result);
return 0;
}
可以看到一个新东西:continue ,其作用是跳回到循环的开始,也就是while(1)这一行。重新判断条件语句,如果为真就重入执行循环体。
以上是我们的计算器程序第6版。
上一篇:成为C++高手之宏与枚举
时间: 2024-10-04 11:50:14