导语
26班的童鞋们,经过半个学期的c语言学习,大家与乐学系统相处得如何?是像上图的老哥一样面对满屏的红色而抓狂,还是一路绿灯顺利过关?不过宣委认为最尴尬的情况还是红绿参半,被某个保密项卡住而不知道自己的程序错在哪里。今天在这里给大家分享一个小技巧,希望大家熟练使用,从此告别乐学烦恼,告别头秃!
本篇推送中教程部分来自我们1926班可爱的封蕴籍大佬!
2019/11/23
当我们的程序通过了样例,是否意味着它一定能够AC(Accept)呢?根据大量的乐学经验,显然是不行的,这个时候我们怎么来排查自己程序的bug呢?所以我们需要自己设计一些数据,但有的题目数据很大,肉眼无法看出程序结果的正确性,手工计算又耗时耗力,于是,我们想到了对拍。
适用范围:
1.被乐学的保密数据卡得无法动弹;
2.(现阶段应该不会遇到)验证根据玄学的数学手段推理出的简便算法与原来的暴力程序结果是否一致。
材料:Windows系统电脑,Dev-C++,记事本,自己的bug代码和一份正确代码(可在乐学的“报表”的“优秀程序”中寻找自己熟悉的同学)
实例:
A+B Problem
输入数据:a b(a,b均小于100000000)
输出数据:a+b
1. 生成数据
打开Dev-C++,输入下列程序:
三个头文件包含了我们需要用到的函数:
rand()是随机函数,用以生成随机数;
time(NULL)是用来初始化随机函数,因为我们只能保证每次运行的时间是唯一的,不会重复,如果删掉这句话,你会发现每一次输出的a都是相同的,b也是相同的(所有的随机函数其实并不随机);
freopen用以打开data.in文件,系统会自动生成一个叫data.in的文件(可用记事本打开),w是write的缩写,此处意为“只写”,用来写入数据;
rand()%100000000指生成不大于100000000的随机数。
运行程序就会看到如下界面:
并且此程序所在的文件夹中会出现一个叫做“data.in”的IN文件,用记事本打开即可查看随机生成的a和b的值。
2. 编辑正确程序并命名为standard.cpp
第一个freopen用于scanf函数读取生成的随机数据,第二个freopen用于printf函数输出数据到standard.out这个文件,r是read(只读)的缩写;
3. 编辑带bug的程序并命名为haha.cpp(我强行造了一个bug)
原理同上,输出数据到haha.out;
4. 写windows对拍文件(对拍.bat)
新建一个记事本,敲入下列代码,然后保存成.bat格式文件,若要修改,则将bat改回txt即可(有相当一部分病毒程序也是bat格式文件,慎点)
第一行作用是关闭回显;
loop指开始循环;
依次生成数据,执行正确程序,执行bug程序;
fc:比较两个文件是否内容相同;
如果相同,继续执行循环;
否则暂停,显示错误的地方;
运行效果:
此时打开data.in即可获得自己程序错误的一组数据,也许就是乐学上的某一组保密程序,可以使用-调试功能进一步排查bug。
【下期预告】
利用对拍找出错误的输出结果后,我们如何得知错误是怎样产生的呢?
敬请期待下一期推送:
【编程教程之——调试】
—— E N D ——
编辑:封蕴籍
排版:崔墨迪
长
按
关
注
ID : BIT19信科26er