脆皮之调试与“猜数字,关机小游戏”

铁汁们,又见面啦!这次相隔时间比较久,呜呜呜~~天赋不够,努力来凑,用的时间比较久,不过,只要能学会知识点,花费的时间就是值得的。大家最近都在干什么呀(暗中观察)?有没有好好学习嘞?

本节知识我决定先分享关于VS调试的相关内容,再分享小游戏,这样当程序出现问题的时候,大家也能够自己通过调试找到错误啦!


每天都要加油 加油 冲鸭!!!
每天都要有收获!!!

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一.VS的调试

1.何为bug和调试

bug现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞

调试(Debug)是指找到问题,并修复问题。
找到问题,可以是逐过程的调试,也可以是隔离和屏蔽代码,找到问题所的位置,最后确定错误产生的原因,再修复代码,重新测试。

2.Debug和Release

在这里插入图片描述

Debug:又称为调试版本,该版本不作任何优化,便于程序员调试程序(程序员在写代码的时候,需要经常性的调试代码,就将这里设置为 debug ,这样编译产生的是debug 版本的可执行程序),其中包含调试信息(也因此调试版本的文件比发布版本的文件所占内存大),是可以直接调试的

Release:又称为发布版本,它往往是(编译器自己)进行了各种优化,使得程序在代码大小和运行速度上都是最优的(所占内存比Debug小),以便用户很好地使用。(该版本没有办法一步一步调试)。程序的质量符合交付给用户使用的标准,这个时候就会设置为 Release ,编译产生的就是Release 版本的可执行程序,这个版本是用户使用的,没有包含调试信息等。(测试人员测试的是Release版本,以保证用户所使用的没有问题)
在这里插入图片描述对比可以看出同⼀段代码,编译生成的可执行文件(.exe)的大小,release版本明显要小。

3.VS调试快捷键

  1. 第一步:环境准备,Debug
  2. 第二步:快捷键介绍
  • (1)F9:创建断点和取消断点
    (打上断点就可以使得程序执行到想要的位置暂停执行,再配以F10,F11使用,观察代码的执行细节)
    (条件断点:满足条件才触发断点,例如:在某次循环中,我觉得前五次的i值没有问题,只想运行第五次之后的,可以右击断点,设置条件)
    在这里插入图片描述

在这里插入图片描述

  • (2)F9和F5配合:当你确定在第n行没有问题,想直接从第n行开始调试,可以先在第n行设置一个断点(F9),再调试(F5:是让程序执行到下一个断点处)
  • (3)F10:逐过程,通常用来处理一个过程。一个过程可以是⼀次函数调用,或者是一条语句。
  • (4)F11:逐语句,就是每次都执行一条语句,并且可以使我们的执行逻辑进入函数内部
  • (5)Ctrl + F5:开始执行不调试(程序直接运行起来而不调试)

4.监视和内存

如果想在调试的过程中观察上下文环境中变量的值,可以打开监视窗口。(监视的前提:已经fn+F10开始调试了

1.(1)监视在哪里找到
在这里插入图片描述
1.(2)监视窗口只有语句执行之后变量才会有值

在这里插入图片描述
2.内存(‘窗口’—内存)

在这里插入图片描述

2.(1)在打开内存窗口后,要在地址栏输入:arr,&num,&c,这类地址,就能观察到该地址处的数据。

2.(2)假如是想看int类型(4个字节)的变量的内存,可以将列设置为4。

  • 内存中的值以16进制展示
  • 一个16进制位 = 4个二进制位(在操作符详解有说明链接)…两个16进制位 = 8个二进制位(8个二进制位就是一个字节)

自动窗口:将上下文环境中的变量自动加进去,进行监视(自主加一些,去掉一些变量,不受自己控制,不太方便)
局部变量:和自动窗口相似。

二.小游戏

1.关机小程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int main()
{
	printf("电脑将在80s后关机,输入'practice make perfects',可取消关机\n");
	system("shutdown -s -t 80");//system(需要双引号)
	char input[100] = { 0 };
	int i = 0;
	char c;
	while ((c=getchar())!='\n'&&i<99)
	{
		input[i++] = c;
 //判断是否输入正确,需要比较两个字符串,用strcmp(记得头文件string.h)
		if (strcmp("practice make perfects", input) == 0)//strcmp(不需要双引号),两个相等则返回0
		{
			system("shutdown -a");
			printf("取消成功\n");
			break;
		}
		if (strcmp("practice make perfects", input) != 0)
		{
			printf("输入错误,未成功取消关机,可重新输入\n");
		
		}
	}

}

2.猜数字小游戏

(1)首先需要有一个菜单menu ( 可以在int main函数中调用menu函数,使得逻辑看起来简单清晰 ) ,来确定用户是否想进入游戏,以及在完成第一次游戏之后,是否想再次进入游戏(可以采用do while循环,因为他第一次必须弹出选择菜单)

(2)接下来是让用户输入值来确定是否进入游戏

(3)在int main函数中调用game函数

               game函数中

第一步:生成随机数并设置其范围
第二步:让用户输入猜测值,再判断是大是小
第三步:一局游戏结束,是否继续游戏

srand((unsigned int)time(NULL));
//使⽤time函数的返回值设置种⼦
//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换

第一步:(1)C语言提供了一个rand函数来生成随机数,但rand函数返回的是伪随机数(并不是真正的随机数,而是通过某种算法而生成的随机数,你会发现你每次重新调试出现的随机数都是同一个,那是因为rand函数是对一个叫’种子’的基准值进行运算,进而生成随机数。 如果你写的是int s =rand(),括号里面没有自己写种子,会默认种子是1,种子一直是1不变,每次运行随机数就不会变。如果想生成不同的随机数,需要时种子变化。)【另外rand函数的使用需要有头文件<stdlib.h>
在这里插入图片描述
(2)C语言又提供了srand函数,用来初始化随机数的种子(种子又叫生成器)【只能用来初始化种子,并不能使每次游戏的种子都随机,游戏不可能每次都手动改变种子,需要使种子随机,可用之后讲的time函数】
void srand (unsigned int seed);

  • 通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
  • 如果种子一样,通过生成的随机数就一样,
    – 如果种子不一样,通过生成的随机数就不一样
    种子是1
    在这里插入图片描述

(3) 为了使种子是随机的,我们可以让程序运行的时间作为种子(时间在变,种子就在变)。在C语言中,有一个time函数可以获得程序时间。【srand函数是不需要频繁调用的,一次运行的程序中调用一次就够了。(:注意srand的位置,如果放在循环中,则每循环一次,随机数就会变)】
time函数的原型是time_t time (time_t* timer);(<1> time函数会返回时间差值,返回类型是time_t(即32位或者64位的整型类型;<2> time_t*是一种指针类型<3> timer是time函数的参数:指针变量,在此之前还未涉及指针,此处传一个空指针NULL)time函数会返回一个时间戳(时间戳一直在变)【1970年1月1日时0分0秒----程序运行时间之间的差值(单位是秒),这个时间差就是时间戳。】

  • time函数返回的是time_t()类型的,即返回的种子是time_t类型(可简单理解为int),而srand需要的参数(种子)是unsigned int类型的值,可以强制类型转换,
#include<stdio.h> 
#include<time.h>        //使用time函数需要包含头文件
srand((unsigned int) time(NULL));

第二步:设置随机数取值范围
先想一下,一个数字对100取余,可能是几,肯定是0-99之间的数字.
如果想产生0-99之间的数字,可以加1.rand()%100
如果想产生1-100之间的数字,可以加1.rand()%100+1
产生100-200之间的数字 100+rand()%(200-100+1)
产生a-b之间的随机数:a+rand()%(b-a+1)

这只是一个示范,大家可以自己尝试一下哦!

//猜数字游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("    ----------    \n");
	printf("    0.退出游戏    \n");
	printf("    1.进入游戏    \n");
	printf("    ----------    \n");
}
void Game()
{
	srand((unsigned int)time(NULL));
	int q = rand() % 100;
	int i = 0;
	int n = 0;
	printf("请输入猜测值(整数):\n");
	scanf("%d", &n);
	for(i=1;i<=5;i++)
	{
		if (5 == i) {
			printf("猜测的机会已为0,游戏失败\n");
			break;
		}
		if (n == q) {
			printf("猜测正确\n");
			break;
		}
		else if (n > q) {
			printf("猜测值太大,请重新输入\n");
			scanf("%d", &n);
		}
		else if (n < q) {
			printf("猜测值太小,请重新输入\n");
			scanf("%d", &n);
		}
	}
	//printf("猜测的机会已为0,游戏失败");
}
int main()
{
	int input = 0;
	do {
		menu();
		printf("输入1进入游戏,输入0退出游戏\n");
		scanf("%d", &input);
		if (0 == input) {
			printf("已成功退出游戏\n");
		}
		else if (1 == input) {
			printf("共有五次猜测机会,猜测的范围1~99");
			Game();
		}
	} while (input);
}
  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值