第五次作业C语言

1.函数的形式编写二分查找 

方法1

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int search(int *arr, int data, int len)
{
int left = 0;
int righ = len - 1;
while (left < righ)
{
int  med = (left + righ) / 2;
if (data == arr[left])
{
return left;
}
else if (data == arr[righ])
{
return righ;
}
else if (data == arr[med])
{
return med;
}
else if (data>arr[med])
{
left = med + 1;
}
else if (data < arr[med])
{
righ = med - 1;
}
}
return -1;
}
int main()
{
int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//二分查找前必须有序
int data = 0;
int len = 10;
int re = 0;
printf("请输入要查找的数:\n");
scanf("%d", &data);
re = search(arr, data, len);
if (re!= -1)
{
printf("找到了,在数组的第%d个数!\n",re+1);
}
else
{
printf("不存在!\n");
}
system("pause");
return 0;
}


方法2

//递归方法实现二分查找
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int search(int *arr,int low,int high, int data)
{
if (arr[low] == data )
{
return low;
}
else if (arr[high] == data)
{
return high;
}
else if (low < high)
{
int  med = (low + high) / 2;
if (data == arr[med])
{
return med;
}
else if (data>arr[med])
{
low = med + 1;
return search(arr, low, high,data);
}
else if (data < arr[med])
{
high = med - 1;
return search(arr,low, high,data);
}
}
return -1;
}
int main()
{
int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//二分查找前必须有序
int data = 0;
int len = 10;
int re = 0;
printf("请输入要查找的数:\n");
scanf("%d", &data);
re = search(arr,0,len-1, data);
if (re !=-1)
{
printf("找到了,是第%d个!\n",re + 1);
}
else
{
printf("不存在!\n");
}
system("pause");
return 0;
}

运行结果:



2.编写猜数字游戏 

了解:随机数和随机数种子

      在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器。
      不管用什么方法实现随机数发生器,都必须给它提供一个名为“种子”的初始值。而且这个值最好是随机的,或者至少这个值是伪随机的。“种子”的值通常是用快速计数寄存器或移位寄存器来生成的。
的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

       这个过程看起来很简单,问题是如果你每次调用srand()时都提供相同的种子值,那么,你将会得到相同的随机数序列,这时看到的现象是没有随机数,而每一次的数都是一样的了。例如,在以17为种子值调用srand()之后,在首次调用rand()时,得到随机数94。在第二次和第三次调用rand()时将分别得到26602和30017,这些数看上去是很随机的(尽管这只是一个很小的数据点集合),但是,在你再次以17为种子值调用srand()后,在对于rand()的前三次调用中,所得的返回值仍然是在对94,26602,30017,并且此后得到的返回值仍然是在对rand()的第一批调用中所得到的其余的返回值。因此只有再次给srand()提供一个随机的种子值,才能再次得到一个随机数。 

(1)rand:该函数是用来产生一个随机数(每次产生的随机数相同)。如:rand()%100相当于产生一个0~99之间的随机数;

(2)srand:该函数作用是在调用rand函数之前,去设置随机数 产生器,使得每次产生的随机数不同。(在一个程序内部被调用一次即可);

(3)time:该函数返回一个从当前时间点到计算机起始时间(1970年1月1日0点)之间的差值(随着时间的变化,差值在变)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("************************************\n");
printf("*******1.开始游戏   0.退出游戏******\n");
printf("************************************\n");
}
playgame()
{
int round_number = 0;
round_number = rand() % 100;//随机产生0~99的数
int temp = 0;
while (1)
{
printf("请输入要猜的数字:\n");
scanf("%d", &temp);
if(temp == round_number)
{
printf("恭喜你,正确!\n");
                        break;
}
else if (temp > round_number)
{
printf("很遗憾,猜大了!\n");
}
else if (temp < round_number)

printf("很遗憾,猜小了!\n");
}
}

}
int main()
{
int choose = 0;
srand((unsigned int )time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
playgame();
break;
case 0:
exit(1);
break;
default:
printf("选择错误!\n");
}
} while (choose);
system("pause");
return 0;
}
运行结果:

//方法2:
//这个游戏由三个人一起玩,
//一个人做主持人,心中默想一个1到100之间的数字,然后由其他两个人轮流猜,每次猜测之后,主持人就说出猜测的这个数比他心中
//的数字是大还是小,然后另外一个人根据这个信息继续猜测,如此轮流,最后谁猜中就算谁输了。(算赢了也可以) 这是一个相互挖坑
//让对方跳的过程,特别是最后几步,猜测范围越来越小,真是步步惊心,稍不留意,就踩到对方挖的坑里去了。


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("************************************\n");
printf("*******1.开始游戏   0.退出游戏******\n");
printf("************************************\n");
}
playgame()
{
while (1)
{
int round_number = 0;
int count = 0;
round_number = rand() % 100;//随机产生0~99的数
int min = 0;
int max = 99;
int temp = 0;
while (1)
{
printf("请输入要猜的数字:\n");
fflush(stdin);//清空输入缓存,以便不影响后面输入的数。比如你逐个输入字符,他帮你缓冲掉你每输入一个字符后面所敲的回车键。否则回车也会被当成字符保存进去。
scanf("%d", &temp);
++count;
if (temp<min || temp>max)
{
printf("输入的超出范围了!\n");
continue;
}
else if (temp == round_number)
{
printf("恭喜你,正确!共猜%d次\n",count);
break;
}
else if (temp > round_number)
{
max = temp;
printf("很遗憾,猜大了!\n");
}
else if (temp < round_number)
{
min = temp;
printf("很遗憾,猜小了!\n");
}
}
//本轮游戏结束,是否继续
fflush(stdin);
printf("是否再玩一次?Y or N");
char c;
scanf("%c", &c);
if (c == 'N')
{
break;
}


}

}
int main()
{
int choose = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
playgame();
break;
case 0:
exit(1);
break;
default:
printf("选择错误!\n");
}
} while (choose);
system("pause");
return 0;
}

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值