C语言初阶——猜数字等等

 

目录

一.函数简介

1.system()

2.Sleep()

3.strcmp()

4.strlen()

5.rand()

(1)rand函数

(2)srand函数

(3)与time函数的合用

6.time()

二.几个例题

1.编写代码,演示多个字符从两端移动,向中间汇聚。

(1)下标定义

(2)主函数部分

(3)Sleep 和system 函数

(4)用for来写

2.密码登录

三.猜数字游戏

1.游戏描述

2.游戏方法

3.代码实现

(1)菜单打印

(2)主函数中

(3)主函数中的switch选择

(4)生成随机数

(5) game函数主体

4.总代码


我们这节讲几个很特别的例题,把前面学的知识都涵盖了,所以我们每个都要掌握

一.函数简介

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;
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值