铁汁们,又见面啦!这次相隔时间比较久,呜呜呜~~天赋不够,努力来凑,用的时间比较久,不过,只要能学会知识点,花费的时间就是值得的。大家最近都在干什么呀(暗中观察)?有没有好好学习嘞?
本节知识我决定先分享关于VS调试的相关内容,再分享小游戏,这样当程序出现问题的时候,大家也能够自己通过调试找到错误啦!
每天都要加油 加油 冲鸭!!!
每天都要有收获!!!
一.VS的调试
1.何为bug和调试
bug现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。
调试(Debug)是指找到问题,并修复问题。
找到问题,可以是逐过程的调试,也可以是隔离和屏蔽代码,找到问题所的位置,最后确定错误产生的原因,再修复代码,重新测试。
2.Debug和Release
Debug:又称为调试版本,该版本不作任何优化,便于程序员调试程序(程序员在写代码的时候,需要经常性的调试代码,就将这里设置为 debug ,这样编译产生的是debug 版本的可执行程序),其中包含调试信息(也因此调试版本的文件比发布版本的文件所占内存大),是可以直接调试的。
Release:又称为发布版本,它往往是(编译器自己)进行了各种优化,使得程序在代码大小和运行速度上都是最优的(所占内存比Debug小),以便用户很好地使用。(该版本没有办法一步一步调试)。程序的质量符合交付给用户使用的标准,这个时候就会设置为 Release ,编译产生的就是Release 版本的可执行程序,这个版本是用户使用的,没有包含调试信息等。(测试人员测试的是Release版本,以保证用户所使用的没有问题)
对比可以看出同⼀段代码,编译生成的可执行文件(.exe)的大小,release版本明显要小。
3.VS调试快捷键
- 第一步:环境准备,Debug
- 第二步:快捷键介绍
- (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函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
- 如果种子一样,通过生成的随机数就一样,
– 如果种子不一样,通过生成的随机数就不一样
(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);
}