目录
二分查找法
那么我们了解以上过程之后,如何用代码呈现出来呢?
int key = 0;//需要查找的数字
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组中元素的个数
int right = sz - 1;
int mid = left + (right - left) / 2;
if (key > arr[mid])
{
left = mid + 1;
}
else if (key < arr[mid])
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
}
那么细心的我们了解后发现,每次一折半都伴随着一次mid的更新,那么我们就需要一个循环来保证我们可以反复更换mid直到找到目标数字。
#include<stdio.h>
int main()
{
int key = 0;//需要查找的数字
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组中元素的个数
int right = sz - 1;
printf("请输入需要查找的数字—>");
scanf("%d", &key);
while (left<=right)
{
int mid = left + (right - left) / 2;
if (key > arr[mid])
{
left = mid + 1;
}
else if (key < arr[mid])
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到啦\n");
}
return 0;
}
注意 我们while循环的判断条件left<=right切记不可省略"=",在我们上述例子查找目标7,最终left等于right;还有当我们找到目标数字时,记得跳出循环,否则会进入死循环,一直打印。
猜字游戏
猜字游戏,玩游戏嘛,首先我们要有游戏菜单,其次我们玩儿玩一次不爽之后还要一直玩儿。
还有最关键的,生成随机数。
那么解析来给大家介绍两个函数。
#include<stdlib.h>
void srand( unsigned int seed );//伪随机数生成器
int rand( void );//生成随机数,但需要搭配srand使用
如果不在rand函数之前引用srand函数,那么rand生成的随机数就不那么随机了,它生成的数字就是固定的。让我们来写一段简单代码测试一下。
这是两次运行结果,我们发现,数字是一样的,如果游戏是这样子的话,我觉得索然无味。
如果我们在srand();中放入一个常量,例如srand(100); ,虽然数字改变了,但也没完全变,老样子,让我们写一段简单代码测试一下。
我们不难发现,虽然数字变了,但大体情况还是一样的,游戏依然索然无味。
“srand函数设置生成一系列伪随机整数的起始点。种子的任何其他值将生成器设置为一个随机的起始点。”什么意思呢,srand函数生成的种子是rand函数随机数的起始点,而上述图片中的1000就是那个种子但1000是常量,每次rand生成随机数的起始点都是一样的,所以导致随机数也是一样的,因此srand()括号内的值就需要一个随机数,一个不断变化的数,来达到我们每次进入游戏,数字都不一样的目的。
到这就引入了时间戳的概念。我们知道,我们电脑上的时间是不断变化的,而时间也刚好是整型,满足srand函数的需要。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
srand((unsigned)time(NULL));
int ky = (rand() % 100) + 1;
//任何数除以100的余数其范围都是0-99,以此来达到将生成的随机数限制在1-100以内的目的
这样,我们每次玩儿游戏时,所猜的数字就不会固定啦,我们猜数字游戏最关键的部分就解决啦。
下面为大家奉上完整代码。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void begin()
{
printf("***************************\n");
printf("********1->开始游戏********\n");
printf("********0->退出游戏********\n");
printf("***************************\n");
}
void game()
{
int ky = (rand() % 100) + 1;
int number;
while (1)
{
printf("您猜这个数字是:?->");
scanf("%d", &number);
if (ky > number)
{
printf("猜小啦\n");
}
else if (ky < number)
{
printf("猜大啦\n");
}
else
{
printf("恭喜您! 猜对啦\n");
break;//猜到了就要跳出循环
}
}
}
int main()
{
int key = 0;
int input = 0;
srand((unsigned)time(NULL));
do
{
begin();
printf("玩儿与不玩儿,您的选择是:");
scanf("%d", &input);
switch (input)
{
case 1:
game(); break;
case 0:
printf("您已退出游戏\n"); break;
default:
printf("输入错误请重新输入:\n"); break;
}
} while (input);
//用do while循环来达到玩儿爽的目的。
return 0;
}
关机程序
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");//system是一个库函数,是用来执行系统命令的
while (1)
{
printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
//判断
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");//取消关机
break;
}
}
return 0;
}
从两端向中间闪烁打印代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
char str1[] = "Welcome to Bite!!!";
char str2[] = "******************";
int left = 0;
int right = strlen(str1) - 1;//strlen是求'\0'之前的字符个数;因为下标从零开始,再减去1;
while (left <= right)
{
str2[left] = str1[left];
str2[right] = str1[right];
printf("%s\n", str2);
Sleep(1000);//单位是毫秒 Sleep函数在指定的时间间隔内暂停当前线程的执行。
system("cls");//清屏
left++;
right--;
}
return 0;
}