Ubuntu 10.04下手动安装Eclipse CDT手把手教程
时间:2011-04-18
来源:互联网
问题很简单。。。 
就是在下面的这个小程序里,如何实现在用非数值的字符输入时,能提示错误,并且重新开始循环
而不是死循环。。。。。
先谢谢大家

就是在下面的这个小程序里,如何实现在用非数值的字符输入时,能提示错误,并且重新开始循环
而不是死循环。。。。。
先谢谢大家

代码:
/*
2011年4月16日23:51:31
名称:猜数字小游戏
功能:随机四个十以内的数字,在位置提示(B)和位置以及值提示(A)下猜出它们正确的值以及位置
目标:训练 for 和do while 的循环流程
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>//使用当前时钟做种子
int main( void )
{
int i, a[5], b[4], c[5], h, A, B, H = 0;
srand( (unsigned)time( NULL ) );//初始化随机数
for( i = 1; i < 5; i= i+1)
{
do
{
a[i] = rand()%9; //随机数值
c[i] = a[i]; // 注意交换数值,以免自己与自己比较,从而陷入死循环
a[i] = -1; // 将自身的数据暂时放弃
}
while (c[i] == a[1] || c[i] == a[2] || c[i] == a[3] || c[i] == a[4] ); // 和自身以及其他的数值做比较,防止重复数值
a[i] = c[i];// 恢复自身的数据
}
//printf("%d %d %d %d\n", c[1], c[2], c[3], c[4]);// 调试用
printf("请输入四位数字:\n");
do
{
do
{
scanf("%d %d %d %d", &b[1], &b[2], &b[3], &b[4]);// 输入数值
H = H + 1;
for (i=1; i < 5; i++)
{
if (b[i] < 0 || b[i] >9)
{printf("数据不合法\n");
break;// 问题就在这里,为什么break 不能打断这个循环。。。如果打出来的是非0-9的整数,那么程序就会陷入一个死循环
}
}
}
while (b[i] < 0 || b[i] >9);
A = 0;// 注意每次循环都要清零
B = 0;// 注意每次循环都要清零
for (h = 1; h < 5; h++) // 判断位置提示(B)和位置以及值提示(A) 的循环
{
if (a[h] == b[h])
A = A + 1;
else
for (i = 1; i < 5; i++)
{
if (a[h] == b[i])
B = B + 1;
}
}
printf("A = %d, B = %d\n", A, B);
}
while (A != 4 ); // 如果A = 4 那么游戏胜利
printf("一共%d次,真厉害!\n", H);
return 0;
}
/*
---------------------------------------
正确的执行(随机的一个例子):
请输入四位数字:
1 2 3 4
A = 1,B = 0
5 6 7 8
A = 0,B = 3
1 2 3 9
A = 1,B = 0
2 1 9 0
A = 0,B = 1
1 0 9 4
A = 1,B = 0
1 5 6 7
A = 1,B = 3
1 7 5 6
A =4,B = 0
一共7次,真厉害!
Press any key to continue
-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=--=-=-=-
(在输入字符后的)错误执行:
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
(死循环)
。。。。。。
---------------------------------------
*/
2011年4月16日23:51:31
名称:猜数字小游戏
功能:随机四个十以内的数字,在位置提示(B)和位置以及值提示(A)下猜出它们正确的值以及位置
目标:训练 for 和do while 的循环流程
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>//使用当前时钟做种子
int main( void )
{
int i, a[5], b[4], c[5], h, A, B, H = 0;
srand( (unsigned)time( NULL ) );//初始化随机数
for( i = 1; i < 5; i= i+1)
{
do
{
a[i] = rand()%9; //随机数值
c[i] = a[i]; // 注意交换数值,以免自己与自己比较,从而陷入死循环
a[i] = -1; // 将自身的数据暂时放弃
}
while (c[i] == a[1] || c[i] == a[2] || c[i] == a[3] || c[i] == a[4] ); // 和自身以及其他的数值做比较,防止重复数值
a[i] = c[i];// 恢复自身的数据
}
//printf("%d %d %d %d\n", c[1], c[2], c[3], c[4]);// 调试用
printf("请输入四位数字:\n");
do
{
do
{
scanf("%d %d %d %d", &b[1], &b[2], &b[3], &b[4]);// 输入数值
H = H + 1;
for (i=1; i < 5; i++)
{
if (b[i] < 0 || b[i] >9)
{printf("数据不合法\n");
break;// 问题就在这里,为什么break 不能打断这个循环。。。如果打出来的是非0-9的整数,那么程序就会陷入一个死循环
}
}
}
while (b[i] < 0 || b[i] >9);
A = 0;// 注意每次循环都要清零
B = 0;// 注意每次循环都要清零
for (h = 1; h < 5; h++) // 判断位置提示(B)和位置以及值提示(A) 的循环
{
if (a[h] == b[h])
A = A + 1;
else
for (i = 1; i < 5; i++)
{
if (a[h] == b[i])
B = B + 1;
}
}
printf("A = %d, B = %d\n", A, B);
}
while (A != 4 ); // 如果A = 4 那么游戏胜利
printf("一共%d次,真厉害!\n", H);
return 0;
}
/*
---------------------------------------
正确的执行(随机的一个例子):
请输入四位数字:
1 2 3 4
A = 1,B = 0
5 6 7 8
A = 0,B = 3
1 2 3 9
A = 1,B = 0
2 1 9 0
A = 0,B = 1
1 0 9 4
A = 1,B = 0
1 5 6 7
A = 1,B = 3
1 7 5 6
A =4,B = 0
一共7次,真厉害!
Press any key to continue
-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=--=-=-=-
(在输入字符后的)错误执行:
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
数据不合法
(死循环)
。。。。。。
---------------------------------------
*/
作者: hardware 发布时间: 2011-04-18
break确实跳出内部for循环了,但scanf只在while循环第一次执行时读取了手动输入,如果都是字符,b不会被赋值
而且楼主所有的数组下标都是从1开始的……
而且楼主所有的数组下标都是从1开始的……
作者: 灰色小狼 发布时间: 2011-04-18
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28