目录
我们这节讲几个很特别的例题,把前面学的知识都涵盖了,所以我们每个都要掌握
一.函数简介
1.system()
#include <stdlib.h> 这个头文件来使用
是用来执行系统命令的一个库函数
system("shutdown -s -t 60");
//这是Windows系统下的一个关机命令
system("shutdown -a");
//取消关机命令
system("cls");
//清空屏幕
还有清屏等等很多的系统操作,我们慢慢普及
2.Sleep()
#include <windows.h> 这个头文件来使用
是用来间歇打印,停一会再打印的一个睡眠函数,单位是毫秒
Sleep(1000);
//屏幕休眠1秒
经常搭配system来使用,有时候系统操作太快了,我们就加个 Sleep() 来减缓它的时间
3.strcmp()
#include <string.h> 这个头文件来使用
是用来判断两个字符串是否相等的一个库函数
if (strcmp(password, "123456" ) == 0)
//就是判断你输入的password是不是123456
如果第一个字符串 > 第二个字符串时,返回值 < 0
如果第一个字符串 < 第二个字符串时,返回值 > 0
如果第一个字符串 = 第二个字符串时,返回值 为 0
就是放在 if 或者循环里面来判断两个字符串是否相等
4.strlen()
#include <string.h> 这个头文件来使用
这个函数不陌生了,计算字符串的长度的库函数
strlen(arr1);
//就是看看数组arr1的里的字符串长度
5.rand()
(1)rand函数
#include <stdlib.h> 这个头文件来使用
随机产生一个数的库函数,产生0-32767的随机数
而我们rand调用的时候rand()函数每次调用前都会查询是否调用过srand(seed);
是否给seed设定了一个值,如果有那么它会自动调用srand(seed)一次来初始化它的起始值;
若之前没有调用srand(seed),那么系统会自动给seed赋初始值,即srand(1)自动调用它一次;
(2)srand函数
srand函数是随机数发生器的初始化函数,就是这个给rand去初始化
这个函数需要提供一个种子,如srand(1),用1来初始化种子
rand()产生随机数时,如果用srand(seed)播下种子之后,一旦种子相同,产生的随机数将是相同的
(3)与time函数的合用
当然很多时候刻意让rand()产生的随机数随机化,用时间作种子 srand(time(NULL)),这样每次运行程序的时间肯定是不相同的,产生的随机数肯定就不一样了。
我们常常使用系统时间来初始化,使用time函数来获取系统时间,得到的值是一个时间戳
即从1970年1月1日0点到现在时间的秒数,然后将得到的time_t类型数据转化为(unsigned int)的数,然后再传给srand函数
srand((unsigned int)time(NULL)); srand((unsigned int)time(0));
//0跟NULL效果是一样的
//我们在使用rand和srand时,主要使用的就是这一种初始化方法!!
如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。
例如,srand((unsigned)time(NULL)*10)
如果想要表示一个数是从0开始到最大值的,比如说,想要产生一个0-99之间的随机数,那么用法如下
int num = rand() % 100;
如果想要产生一个数是从1开始到最大值的,比如说,想要产生一个1-100之间的随机数,那么用法如下
int num = rand() % 100 + 1;
6.time()
#include <time.h> 这个头文件来使用
这个函数会返回时间戳,产生随机数
函数原型: time_t time(time_t *timer)
参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),
timer=时间数值时,用于设置日历时间,time_t是一个unsigned long类型。如果 timer不为空,则返回值也存储在变量 timer中
函数功能: 得到当前日历时间或者设置日历时间
函数返回: 当前日历时间
time(NULL);
我们不需要time函数的参数的时候,就传一个空指针NULL,NULL就是0的意思就是空指针会返回一个值
加入函数返回的是time_t,编译器不认识,好我给你强制转换一下,加上(unsigned int)
(unsigned int)time(NULL); 强制转换为整形,这里的NULL跟0一样,所以我们这里面放0也可以。
二.几个例题
1.编写代码,演示多个字符从两端移动,向中间汇聚。
效果为
welcome to bit!!!!!
*******************
w*****************!
we***************!!
wel*************!!!!
...
welcome to bit!!!!!
我们直接上代码
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
//char arr[] = "bit";//[b i t \0]
// 0 1 2 3
//strlen(arr)-1;
//所以我们在找右下标的时候就是用字符串的长度减去1,就是减去\0它的下标数,就是最右边的数的下标
char arr1[] = "welcome to bit!!!!!";
char arr2[] = "*******************";
int left = 0; //左下标
int right = strlen(arr1)-1; //右下标
while (left<=right) //这个进行判断,看看打印完没有,因为两边向中间靠拢,所以当left>right的时候,就打印完了
{
arr2[left] = arr1[left]; //上面的替换下面
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //Sleep函数是实现睡眠,单位是毫秒
system("cls"); //system是一个库函数,可以执行系统命令,cls是清空屏幕的一个命令
left++; //向中间靠拢,左边往右
right--; //向中间靠拢,右边往左
}
printf("%s\n", arr2); //从*变为字符,所以打印arr2
return 0;
}
(1)下标定义
左下标就是0,右下标就是字符串最后一个值的下标,但是要注意,字符串自带\0的,它也是有下标数的,所以我们就用函数 strlen() 来计算他的长度减去1,就是减去\0所占的下标数。
(2)主函数部分
就是写两个数组,用上面的数组一个一个替换下面的数组然后打印出来,用while循环就是来循环一个一个向中间替换,最后我们的左下标大于右下标,就说明我们打印完了
(3)Sleep 和system 函数
Sleep(1000); //Sleep函数是实现睡眠,单位是毫秒
system("cls"); //system是一个库函数,可以执行系统命令,cls是清空屏幕的一个命令
(4)用for来写
//用for来写,为下面的代码
for (left = 0, right = strlen(arr1) - 1; left <= right; left++, right--)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf( "%s\n", arr2);
Sleep(1000);
system("cls");
}
2.密码登录
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序
#include <stdio.h>
#include <string.h>
int main()
{
//假设密码是:字符串“123456”
int i = 0;
char password[20] = {0}; //字符数组,可以存放字符串
int flag = 0;
for (i = 0; i < 3; i++)
{
printf("请输入密码:>\n");
scanf("%s", password); //数组名本质上就是地址,所以不需要取地址
//判断两个字符串是否相等,要使用strcmp函数,不能直接使用==
//int ret = strcmp(password, "123456");
//如果第一个字符串小于第二个字符串,返回<0的数字
//如果第一个字符串大于第二个字符串,返回>0的数字
//如果第一个字符串等于第二个字符串,返回0
if (0 == strcmp(password,"123456"))
{ //这个if就是判断你输入的字符串对不对
printf("登录成功\n");
flag = 1;
break;
}
else
{
printf("第%d次密码错误\n", i + 1);
}
}
if (flag == 0) //flag就是来判断,是你登录成功break来到这里,还是你输入不成功,来到的这里
{ //如果你是break来到这,你flag=1,这个if不成立,如果你不是上面那个if里出来的,你flag还是0
printf("三次密码均输入错误,退出程序\n");
}
return 0;
}
这个里最重要的就是
if (0 == strcmp(password,"123456"))来判断两个字符串是否相等
还有就是定义 flag 来判断,这个出现过很多次,就是当你出循环的时候,你可能是输入的不符合要求,出了循环,也有可能是break出的循环,所以这里用 flag 加个判断
flag就是来判断,是你登录成功break来到这里,还是你输入不成功,来到的这里
如果你是break来到这,你flag=1,这个if不成立,如果你不是上面那个if里出来的,你flag还是0
三.猜数字游戏
1.游戏描述
顾名思义,该程序让系统随机生成一个0-100的整数,让玩家来猜,玩家猜数字后,系统给予玩家回馈并且统计玩家猜的次数,直到玩家猜对为止。
2.游戏方法
1、生成游戏菜单 1. play(进入游戏) 0. exit (退出游戏)
2、使用循环语句,构建游戏框架,使玩家可以进行多次游戏,直到猜对为止。
3、设计游戏具体思路,使系统生成一个随机数,让玩家输入一个数字,然后两个数字对比,根据系统反馈信息,逐渐锁定目标。
3.代码实现
(1)菜单打印
我们用一个函数来打印它的菜单,直接引用就好啦
void menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
(2)主函数中
首先,这个猜数字游戏,要可以多次玩,不论怎样一开始都会一次。就比如我们玩的王者荣耀之类的游戏,都会一开始有一个登录界面。这样我们就会想到do...while循环很符合这样的思想。
int main()
{
do
{
menu();
printf("请输入:>");
}while()
return 0;
}
(3)主函数中的switch选择
玩家输入1代表要玩这个游戏,输入0代表退出这个游戏。输入的数字我用一个变量input来存,因为数字不只是0和1,还有其他数字。这种情况适合switch分支。当我们选择其他数字时,提示选择错误,我们这个游戏肯定不只是玩一次,所以我们还要回到上面,则while中的表达式选input正好合适。这样就简单的实现了一下游戏的逻辑。
#include <stdio.h>
void menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 2.exit *****\n");
printf("******************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
(4)生成随机数
这个时候,就要用到 rand 函数还有 srand 函数还有 time 函数,上面都有介绍
//放在game函数中,产生1-100的数
int ret = rand()%100+1;
//放在主函数中,只调用一次
srand((unsigned int)time(NULL));
注意:srand这个函数只要在工程中调动一次,你要是在game函数里调用,那么每次都会生成一个全新的随机值,那猜数字的人不要给你玩死啊。
(5) game函数主体
每次猜数字肯定不只有一次,所以game函数里的if语句要用while循环
void game()
{
int num = 0;
int count = 0; //搞个count,记录一下数了几次
int ret = rand()%100+1;
//就是随机生成1-100之间的数,rand函数还会调用srand来初始化,srand调用一次就可以了,就放在主函数中,这样产生的数更随机
while (1) //(1)就是死循环里面
{
printf("请猜数字:>");
scanf("%d", &num);
count++; //这个count++,循环上来就加一次
if (num < ret) //这里就是判断你猜的数与这个随机数的比较
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
printf("你一共猜了%d次,好厉害\n", count);
Sleep(5000); //这个函数的作用是让清屏3秒后再进行,因为你猜对后,直接就是清屏,你还没看见猜对了
system("cls"); //就直接清屏了,因为这个system是直接执行的,不给你时间反应,所以我们加个函数,让它3秒后清屏
break;
}
}
}
这里我加了一个count,可以计算出猜了多少次,每次在循环里面++,能知道猜了多少次
最后还加了一个Sleep函数,还有system函数,方便清屏,下一次游戏
Sleep(5000);
//这个函数的作用是让清屏3秒后再进行,因为你猜对后,直接就是清屏,你还没看见猜对了
system("cls");//就直接清屏了,因为这个system是直接执行的,不给你时间反应,所以我们加个函数,让它5秒后清屏
4.总代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
//菜单的打印,就是一个函数,让他输出就行了,然后再调用
void menu()
{
printf("**************************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("**************************\n");
}
//游戏的主体部分,也是一个函数,在主函数中引用就好啦
void game()
{
int num = 0;
int count = 0; //搞个count,记录一下数了几次
int ret = rand()%100+1;
//就是随机生成1-100之间的数,rand函数还会调用srand来初始化,srand调用一次就可以了,就放在主函数中,这样产生的数更随机
while (1) //(1)就是死循环里面
{
printf("请猜数字:>");
scanf("%d", &num);
count++; //这个count++,循环上来就加一次
if (num < ret) //这里就是判断你猜的数与这个随机数的比较
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
printf("你一共猜了%d次,好厉害\n", count);
Sleep(5000); //这个函数的作用是让清屏3秒后再进行,因为你猜对后,直接就是清屏,你还没看见猜对了
system("cls"); //就直接清屏了,因为这个system是直接执行的,不给你时间反应,所以我们加个函数,让它3秒后清屏
break;
}
}
}
//主函数部分
int main()
{
int input = 0; //这个随机数就是time(NULL)放一个空指针形成一个时间戳,因为生成编译器不认识,我们就强制类型为int
srand((unsigned int)time(NULL)); //产生随机数,本来放在game函数中,但是调用很多次,数字很接近,我们就放在主函数中,让其只调用一次
do //如果还觉很接近,我们可以 srand((unsigned)time(NULL)*10),这样就很随机了
{ //用do while就是我们先看见这个进入游戏的界面,再进行选择,所以用do while
menu(); //引用这个菜单打印出来
printf("请选择:>");
scanf("%d", &input);
switch (input) //这里用switch,可以很好的选择,1就是玩游戏,0就是不玩,其他的让你重新输入
{
case 1:
game(); //game函数中是猜数字的整个路基逻辑
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}