无弯伴折 黄河九曲弯猜数字字0~27

前文链接:【重构】
  这个问题的解决并不复杂,最多只需要三个步骤:
&生成无重复数字的四位整数;
&重复猜数字最多10次,猜中则宣布胜利,程序结束;
&10次没猜中,宣布失败,程序结束。
  用C语言描述这个过程应该是这样:
#define TIMES 10
//最多10次
int main( void )
//1. 生成无重复数字的四位整数;
for( count = 0 ; count & TIMES ; count ++ )
//2. 重复猜数字最多10次,
//猜中则宣布胜利,程序结束;
//3. 10次没猜中,宣布失败,程序结束。
&  现在认真审视一下这个结构,思考一下它有无漏洞。这件事情很值得去做,千万不要错在起跑线上,否则后面的工作可能都是无用功。  没有什么漏洞吧?得到这个结论并不困难,因为这本身就是一个简单的问题。  接下来补充完善这个代码。  写代码可以从前写到后也可以从后向前写,没有一定之规。可以先写难写的部分也可以先完成容易的部分。下面的代码完成了较为简单的部分。
#include &stdio.h&
#define TIMES 10
//最多10次
int main( void )
//1. 生成无重复数字的四位整数;
for( count = 0 ; count & TIMES ; count ++ )
//2. 重复猜数字最多10次
//if( 猜中 )
puts("恭喜你猜对了");
//宣布胜利
//程序结束;
//3. 10次没猜中
printf("连续%d次你都没猜中,抱歉,游戏结束\n",TIMES); //宣布失败
//程序结束。
&  这个代码尽管没有完成全部功能,但却已经可以进行测试。测试之后继续完善  //1.&生成无重复数字的四位整数; 部分。  这部分首先应该到考虑这个四位整数的存储问题。考虑到后面的算法需要按位进行比较,因此将其数据结构选择为
#define NUM 4
//正整数位数
int main( void )
&即按位分别存储。  由于需要程序模拟随机效果,所以需要首先初始化种子数(seed)。否则程序每次运行的结果都将一样:
#include &stdlib.h&
#include &time.h&
srand( (unsigned) time( NULL ) );
&  接下来要做的事情是利用rand()函数生成一个各位不同的四位伪随机数,并将其分解然后存入dig数组,这事情不可能一蹴而就,所以这里大而化之地把这些任务交给一个函数完成
generate( dig , NUM );
&  这样,代码就演化成为:
#include &stdio.h&
#include &stdlib.h&
#include &time.h&
#define TIMES 10
//最多10次
#define NUM 4
//正整数位数
int main( void )
dig[NUM]; //存放四位整数
//1. 生成无重复数字的四位整数;
srand( (unsigned)time( NULL ) ); //初始化seed
generate( dig , NUM );
//生成无重复数字的四位整数,分解存入dig数组
for( count = 0 ; count & TIMES ; count ++ )
//2. 重复猜数字最多10次,
//if( 猜中 )
puts("恭喜你猜对了");
//宣布胜利
//程序结束;
//3. 10次没猜中
printf("连续%d次你都没猜中,抱歉,游戏结束\n",TIMES); //宣布失败
//程序结束。
&  generate()函数首要的任务是生成一个四位伪随机数,这可以通过rand() % ( 10000 - 1000 - 1 ) + 1000 这个表达式实现。之后需要检查这个四位数是否有重复数字,如果没有重复则将其分解存入数组。大体上这样
生成一个四位数
while(四位数有重复数字);
  但是为了更容易地判断四位数是否有重复数字,一个技巧性的写法是
生成一个四位数;
while(四位数有重复数字);
&  因此,generate()的这个函数的原型及定义为
#define MIN_5
#define MIN_4
#define TRUE
#define FALSE
void generate( int [] , int );
void generate( int d[] , int n )
int temp = rand() % ( MIN_5 - MIN_4 - 1 ) + MIN_4 ; //生成一个四位数
resolve( temp , d , n );
//分解存储;
while( be_reduplicate( d , n )
//四位数有重复数字
&  其中的resolve()函数的作用是将一个正整数分解并按次序存入数组:
#define TEN
void resolve( int ,
int [] , int );
void resolve( int t ,
int d[] , int n )
while( n-- & 0 )
d[n] = t % TEN ;
t /= TEN ;
  be_reduplicate()函数判断四位数字中是否有重复,如果有重复数字则再调用rand()重新生成。
int be_reduplicate( int [] , int );
int be_reduplicate( int d[] , int n )
for( i = 0 ; i & n - 1 ; i ++ )
for( j = i + 1 ; j & j ++ )
if( d[i] == d[j] )
return TRUE ;
return FALSE ;
&&  至此,//1.&生成无重复数字的四位整数;部分功能全部完成。下面继续完成  //2.&重复猜数字最多10次,中尚未完成的部分。  &//猜数字&的功能要求用户输入所猜的数,因此需要为这个输入的数据预备存储空间,所以
int g_dig[NUM];
&  &//猜数字&这个过程本身可以用一个函数实现
void guess ( int [] , int ) ;
int main( void )
int g_dig[NUM];
guess ( g_dig , NUM ) ; //猜数字
void guess ( int d[] , int n )
printf("输入你猜的数:");
for( i = 0 ; i & i ++ )
scanf("%1d" , d + i );
&  guess ()中的scanf("%1d" , d + i );是一种较为简洁的实现方法,但是这种方法的健壮性并不够。一旦用户输入了非十进制数字的非空白字符,就会出现问题。这个不足将在后面予以改进。  最后编写&//if( 猜中 )&部分的代码。是否&猜中&可由一函数判断
if( be_same(dig , g_dig , NUM ) == TRUE )
&  其中be_same()函数为
int be_same ( int [] , int [] , int );
int be_same ( int ori[] , int spe[] , int n )
int A = 0 , B = 0 ;
for( i = 0 ; i & i ++ )
if( spe[i] == ori[i] )
if( be_inside ( spe[i] , ori , n ) == TRUE )
if( A == n )
return TRUE ;
printf("%dA%dB\n",A,B);
//输出几A几B
return FALSE ;
&  其中的be_inside()函数用于判断第一个参数dig是否在后面的d数组中
int be_inside ( int
, int [] , int );
int be_inside ( int dig , int d[] , int n )
while( n-- & 0 )
if( dig == d[n] )
return TRUE;
return FALSE;
  至此,问题解决。下面给出这一问题的完整代码。这个代码在前面的基础上对guess ()的健壮性做了改进,另外添加了在10次没猜中时输出被猜的数的代码。
#include &stdio.h&
#include &stdlib.h&
#include &time.h&
#define TIMES
//最多10次
#define NUM
//正整数位数
#define MIN_5
#define MIN_4
#define TRUE
#define FALSE
#define TEN
void generate( int [] , int );
void resolve( int ,
int [] , int );
int be_reduplicate( int [] , int );
void guess ( int [] , int ) ;
int be_same ( int [] , int [] , int );
int be_inside ( int
, int [] , int );
void out( int [] , int );
int main( void )
dig[NUM]; //存放四位整数
//1. 生成无重复数字的四位整数;
srand( (unsigned)time( NULL ) ); //初始化seed
generate( dig , NUM );
//生成无重复数字的四位整数,分解存入dig数组
for( count = 0 ; count & TIMES ; count ++ )
//2. 重复猜数字最多10次,
int g_dig[NUM];
//预备数据存储空间
guess ( g_dig , NUM ) ; //猜数字
if( be_same(dig , g_dig , NUM ) == TRUE ) //if( 猜中 )
puts("恭喜你猜对了");
//宣布胜利
system("PAUSE");return 0; //程序结束;
//3. 10次没猜中
printf("那个数是:");
out( dig , NUM );
//输出被猜的数
printf("连续%d次你都没猜中,抱歉,游戏结束\n",TIMES); //宣布失败
//程序结束。
void out( int d[] , int n )
for( i = 0 ; i & i ++ )
printf("%d " , d[i]);
putchar('\n');
int be_inside ( int dig , int d[] , int n )
while( n-- & 0 )
if( dig == d[n] )
return TRUE;
return FALSE;
int be_same ( int ori[] , int spe[] , int n )
int A = 0 , B = 0 ;
for( i = 0 ; i & i ++ )
if( spe[i] == ori[i] )
if( be_inside ( spe[i] , ori , n ) == TRUE )
if( A == n )
return TRUE ;
printf("%dA%dB\n",A,B);
//输出几A几B
return FALSE ;
void guess ( int d[] , int n )
printf("输入你猜的数:");
for( i = 0 ; i & i ++ )
scanf("%*[^]"); //读非十进制数字字符
scanf("%1d" , d + i );
int be_reduplicate( int d[] , int n )
for( i = 0 ; i & n - 1 ; i ++ )
for( j = i + 1 ; j & j ++ )
if( d[i] == d[j] )
return TRUE ;
return FALSE ;
void resolve( int t ,
int d[] , int n )
while( n-- & 0 )
d[n] = t % TEN ;
t /= TEN ;
void generate( int d[] , int n )
int temp = rand() % ( MIN_5 - MIN_4 - 1 ) + MIN_4 ; //生成一个四位数
resolve( temp , d , n );
//分解存储;
while( be_reduplicate( d , n )
//四位数有重复数字
阅读(...) 评论()1.完成猜数字游戏。
2.写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)
3.编写代码模拟三次密码输入的场景。
最多能输入三次密码,密码正确,提示“登录成功”,密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。
4.编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。
1.完成猜数字游戏。
#define _CRT_SECURE_NO_WARNINGS 1
#include &stdio.h&
#include &time.h&
void meau()
printf("****************************************\n");
printf("**********
**********\n");
printf("**********
**********\n");
printf("****************************************\n");
void game()
int ret = rand() % 100 + 1;
int put = 0;
printf("请输入一个数\n");
scanf("%d",&put);
if (put & ret)
printf("输入大了\n");
else if (put & ret)
printf("输入小了\n");
printf("恭喜你,可以买彩票了\n");
int main()
int input = 0;
srand((unsigned)time(NULL));
printf("请输入-》");
scanf("%d", &input);
switch (input)
case 1:game();
printf("输入有误");
} while (input);
2.写代码可以在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1.(折半查找)
#include &stdio.h&
int main()
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int key = 5;
int size = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = size - 1;
int mid = 0;
while (left &= right)
mid = ((right - left) && 1) + left;
if (arr[mid] == key)
printf("找到了\n");
return mid;
else if (arr[mid] & key)
right = mid - 1;
left = mid + 1;
printf("幸好不到");
return -1;
3.编写代码模拟三次密码输入的场景。
最多能输入三次密码,密码正确,提示“登录成功”,密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。
#define _CRT_SECURE_NO_WARNINGS 1
#include &stdio.h&
#include &string.h&
#include &Windows.h&
int main()
char password[20] = "";
int i = 0;
for (i = 0; i & 3; i++)
printf("请输入密码");
scanf("%s",password);
if (0 == (strcmp("123456", password)))
if (3 == i)
printf("输入密码超时");
printf("login");
system("pause");
4.编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。
#define _CRT_SECURE_NO_WARNINGS 1
#include &stdio.h&
#include &string.h&
#include &ctype.h&
#include &Windows.h&
int main()
char ch = 0;
while ((ch = getchar()) != EOF);
if (ch & 'a'&&ch & 'z')
printf("%c\n",tolower(ch));
if (ch & 'A'&&ch & 'Z')
printf("%c\n", toupper(ch));
system("pause");
七夕的夜晚,依然那么美好,因为有代码作伴!
1.折半查找
int main()
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int key = 7;
int left = 0;
# includeint binary_search(int arr[], int key, int left, int right)
while (left & 1);
很多人都玩过猜数字游戏(给定一个范围的数字,通过几次猜测确定正确值),通过对C语言的学习,对猜数字游戏实现简单的编写。思路大概是,首先系统产生一个随机数,设定该随机数的范围,用户猜测值与随机数进行比较...
1.折半查找算法
原理:取中间元素与查找元素进行比较,如果查找元素比中间元素大,则在中间元素右边查找,如果查找元素比中间元素小,则在中间元素的左边查找。
代码例子:
int num = 0;
/*生成随机数字*/
num = rand();
printf(&%d\n&, num);选择玩游戏还是退出void...
折半查找法又称为二分查找,是在一个有序数组里面找到一个具体的数,方法我在代码里注释到了。
int binary_search(int *arr, int key, int sz...
《数据结构查找 顺序查找和折半查找 》
//顺序查找
//思路:从表中最后一个记录开始,逐个进行记录的关键字和
//给定值的比较,若某个记录的关键字和给定值比较相等,则
下面对比递归和迭代算法实现二分查找:
折半查找每次都要折半,所以可以使用递归的方法。#includint BinarySearch_I(int *a, co...
没有更多推荐了,脑筋急转弯 恶狼和疯狗做伴 --- 坏到一块了,猜数(0一9)_百度知道
脑筋急转弯 恶狼和疯狗做伴 --- 坏到一块了,猜数(0一9)
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
答案是不是8
只有这个是连着的
采纳数:531
获赞数:2667
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。字谜,注明:音,意,笔画(猜数字0-9) 一位牵手伴一生 二位春来满园春 三位皇叔请卧龙_百度知道
字谜,注明:音,意,笔画(猜数字0-9) 一位牵手伴一生 二位春来满园春 三位皇叔请卧龙
字谜,注明:音,意,笔画(猜数字0-9)一位牵手伴一生二位春来满园春三位皇叔请卧龙和值:用忌语:东边日出西边雨...
字谜,注明:音,意,笔画(猜数字0-9) 一位牵手伴一生 二位春来满园春 三位皇叔请卧龙
和值:用 忌语:东边日出西边雨
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:191
获赞数:669
擅长:暂未定制
答案是阿拉伯数字吗
你是头“”!
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一伴二六,猜数字_百度知道
一伴二六,猜数字
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:2702
获赞数:5460
擅长:暂未定制
您好!很高兴能够回答您提出的问题,261、126、216、26.5、26+1(二六和一),最好的答案应是:26+1是27.
采纳数:29
获赞数:38
应该是“柒”
1261旁边有2和6猜的哦!
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 黄河九曲弯猜数字 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信