查错的方法

  • 1.目测法
    • 1 首先你要找到一组使你程序错误的数据。
    • 2 然后把你的大脑想象成电脑。
    • 3一步一步执行程序中的语句。
    • 4 比较你的输出结果和标准输出结果是否相同。
  • 2.调试法
    • 其实很简单,就是在中途输出变量,判断变量的值是否正确。
  • 3.对拍法(初谈)
    • 1 新建一个文件夹并打开
    • 2 新建三个文件:my.cpp std.cpp make.cpp
    • 3 打开make.cpp ,写造数据的程序
    • 4 把std.cpp make.cpp my.cpp 编译,不需要运行
    • 5 新建一个文件 run.bat
    • 6.右键run.bat 点击编辑,用记事本打开
    • 7.将下面这段话复制到run.bat中,保存,关闭
    • 8.双击运行run.bat

在写完代码的时候,测一下样例,很多时候样例过了,但交到OJ上却挂了,始终找不到错误原因。有时候连样例都过不了。因此,我总结了三种方法教给大家,让大家有方向地去查错,而不是看着程序发呆。希望大家可以把三种方法熟练掌握,并懂得去运用。

1.目测法

目测法并不是简单的目测。
此方法用于数据小且少的题目。

用例子来说话:

FZU-1889 龟兔赛跑
原题 vjudge

这题其实很简单。

直接给代码。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>#define R                  register int
#define re(i,a,b)          for(R i=a; i<=b; i++)
#define ms(i,a)            memset(a,i,sizeof(a))
#define MAX(a,b)           (((a)>(b)) ? (a):(b))
#define MIN(a,b)           (((a)<(b)) ? (a):(b))using namespace std;typedef long long LL;int main() {int X;scanf("%d",&X);while(X--) {int t,k,u,v;scanf("%d%d%d%d",&t,&k,&u,&v);int a=(t-k)*u;int b=t*v;if(a>b) printf("0\n");else if(a<b) printf("1\n");else printf("-1\n");}return 0;
}

这题固然简单,但万一你在测样例的时候错了。
目测法应该是比较好的方法。

那到底怎么目测呢?

1 首先你要找到一组使你程序错误的数据。

比如t=6,k=3,u=6,v=3

2 然后把你的大脑想象成电脑。

3一步一步执行程序中的语句。

读入:

scanf("%d%d%d%d",&t,&k,&u,&v);

计算:

int a=(t-k)*u;
int b=t*v;

把此时的计算结果牢牢记在脑子里。

判断输出:

if(a>b) printf("0\n");else if(a<b) printf("1\n");else printf("-1\n");

4 比较你的输出结果和标准输出结果是否相同。

这有点想NOIP初赛里的看程序写结果。

2.调试法

Dev-cpp这个软件自带调试功能,但我建议大家不要用。
我希望大家手动调试。
原因:
1 Linux环境下没有Dev-cpp这个软件
2 许多大神用的都是Linux,他们没有用这种调试功能
3 手动调试可以提高你对代码的熟悉程度和熟练程度
4 某些比赛不提供Dev-cpp这个软件
5 当程序复杂的时候,用自动调试很困难
6 用手动调试可以加快打字速度,以免在比赛的时候来不及

好,废话不说,直接开始讲。

其实很简单,就是在中途输出变量,判断变量的值是否正确。

完。

比如说很多初学者会犯这样的错误:

int main() {int i=0;int a[20];while(i++) {scanf("%d",&a[i]);if(i==10) break;}return 0;
}

运行一下发现没有读入。

你可以这样:

int main() {int i=0;int a[20];while(i++) {scanf("%d",&a[i]);cout << "###" << endl;if(i==10) break;}return 0;
}

这是看while()循环有没有执行
也可以这样:

int main() {int i=0;int a[20];while(i++) {scanf("%d",&a[i]);cout << a[i] << endl;if(i==10) break;}return 0;
}

看一下a[i]有没有被读入。

其实把i++改成++i就可以了。

注意:调试完了一定要删除调试的语句,或这样:

//cout << a[i] << endl;

不然很可惜,你就WA了。

3.对拍法(初谈)

对拍,又称“对答案”。
这种方法相对来讲就比较高级了。

在OI/ACM比赛中,这种方法是很常见的。

比如说我要检查一段高精度加法有没有写错。
对拍是最好不过的选择。
它比手动造数据强多了。
(C++高精度模板:点击这里)

1 新建一个文件夹并打开

2 新建三个文件:my.cpp std.cpp make.cpp

make.cpp 用于自动制造数据
my.cpp 中放入你要检查的程序(高精度加法程序)
std.cpp 中放入标程(低精度加法程序)

//std.cpp
#include <iostream>
using namespace std;int a,b;int main() {cin >> a >> b;cout << a+b << endl;return 0;
}

3 打开make.cpp ,写造数据的程序

//make.cpp
#include<bits/stdc++.h>using namespace std; int main() {srand(time(0)); int a=rand()%1000+1;int b=rand()%1000+1;cout << a << endl << b << endl;return 0;
}

下面开始解释:

srand(time(0));

上者是播放随机种子,为制造随机数埋下伏笔。

int a=rand()%1000+1;
int b=rand()%1000+1;

上着是产生随机数。
rand()rand()rand() 可以产生 0 ~ 215-1 这个范围内的随机数。
rand()rand()rand()%1000+1 就是产生1 ~ 1000 这个范围的随机数。

如果你想更数据更大,可以尝试这样写:

long long a=1LL*rand()*rand()*rand();
long long b=1LL*rand()*rand()*rand();
cout << a << endl << b << endl;

上者是输出 输入数据。

4 把std.cpp make.cpp my.cpp 编译,不需要运行

其目的是为了生成exe文件

5 新建一个文件 run.bat

6.右键run.bat 点击编辑,用记事本打开

千万不要双击打开

7.将下面这段话复制到run.bat中,保存,关闭

@echo off
:loop
make > std.in
echo %time%
std < std.in > std.out
echo %time%
my  < std.in > my.out
echo %time%
fc std.out my.out
if errorlevel=1 pause
goto loop

这段话的分析:

make > std.in

用make.exe制造输入文件std.in

echo %time%

输出时间t1,得到程序开始的时间

std < std.in > std.out

运行std.exe得到标准输出文件

echo %time%

输出时间t2,t1−t2t1-t2t1−t2就是std.exe运行所用的时间

my  < std.in > my.out

运行my.exe得到my.cpp的输出文件

echo %time%

输出时间t3,t3−t2t3-t2t3−t2就是my.exe运行的时间,这可以检查你的my.cpp是否超时

fc std.out my.out

比较std.oout和my.out是否相同,结果返回到errorlevel

if errorlevel=1 pause

如果errorlevel=1(比较结果不相同),那么pause(暂停)

@echo off
:loop goto loop

无限循环

8.双击运行run.bat


如果一直找不到差异,那么它就不停地输出信息。

如果你的程序有错,就会出现这样的情况:

出现不同。
这个意思就是你的程序错了。

此时关闭run.bat

在文件夹中,你会找到std.in这个文件
这就是使你程序错的输入数据。

把你的程序改正之后,再次运行run.bat 看是否有错。

再谈:https://blog.csdn.net/Ljnoit/article/details/119640724

【Code】代码答案错误怎么办?三种方法教你如何查错相关推荐

  1. 解决Navicat for MySQL 1045错误的三种方法

    解决Navicat for MySQL 1045错误的三种方法 Navicat连接MySQL数据库时难免会遇到1045错误,主要是因为用户输入的用户名或密码错误被拒绝访问,如果不想重装,需要找回密码或 ...

  2. Android电视kodi安装失败,电视提示“解析包出现错误” ?四种方法教你轻松解决...

    原标题:电视提示"解析包出现错误" ?四种方法教你轻松解决 日常生活中,我们经常会遇到智能电视提示:解析包时出现错误.遇到这样的问题,不要抓狂,小智教你轻松解决. 首先,我们要清楚 ...

  3. 三种方法教你开启/关闭win10系统唤醒睡眠模式时需要登录的教程

    Windows系统的睡眠设置给我们带来了极大的方便,因为使用睡眠设置可以保存我们电脑的当前工作状态,再次唤醒睡眠模式时我们可以接着当前的工作状态继续操作,但默认情况下,系统处于安全考虑,当我们从睡眠模 ...

  4. python控制示波器获取波形_三种方法教你用示波器快速捕获异常

    万事开头难!当你想用示波器来分析问题时,你一定有想过,我要如何才能把问题抓下来?当然,只有抓下来之后,才能进行后面种种的分析,否则一切都是空谈.本文将带你用三种最好用的方法将异常抓下来. 一.滚动模式 ...

  5. mac os 卸载java_三种方法教你在苹果Mac OS X系统中卸载软件

    刚刚接触mac系统的用户们因为太过陌生,总会遇到很多问题.比如,近来就有一些朋友反馈不懂得该如何卸载mac电脑中的软件,这要怎么办呢?这样会很影响我们的使用.今天小编就来教大家苹果Mac OS X系统 ...

  6. android 8 忘记图案,手机绘图解锁忘了怎么办?三种方法教你轻松搞定

    现在市场上的智能手机基本上都带有九宫格锁屏,这样的设计受到了广大用户们的喜爱,渐渐的成为了用户们的不二选择,当然这个锁屏的优点有很多,但是唯一不足的地方就是一旦忘记图案密码就会让人想抓狂.手机绘图解锁 ...

  7. php psot传值_三种方法教你如何用PHP模拟post提交数据

    php模拟post传值在日常的工作中用到的不是很多,但是在某些特定的场合还是经常用到的. 下面,我整理了三种php模拟post传值的方法,file_get_contents.curl和socket. ...

  8. PDF文件如何转JPG图片?三种方法教你快速转换

    PDF文件是我们经常用来处理工作的一种文件形式,它的体积很小,不仅占用储存空间很少,而且传输起来也非常方便,但是有时候我们也会根据工作需求来将PDF文件转换成其他类型的文件,为了浏览起来更方便,我们也 ...

  9. PDF如何翻译成中文?三种方法教你怎样翻译PDF上的文字

    小伙伴们在学习或工作中遇到外国文章时是不是会先翻译成中文再阅读呢?如果文章是word或者txt格式,我们可以直接复制文字进行翻译.但是有些文章为了看起来美观可能会生成PDF格式,我们想翻译的话,就需要 ...

最新文章

  1. 更改Oracle数据库的SID
  2. SqlServer中把结果集放到到临时表的方法
  3. html5发展前景-兄弟连,IT兄弟连 HTML5教程 HTML5的曲折发展过程 HTML5的诞生
  4. [No000014A]Linux简介与shell编程
  5. Java类class getClasses()方法及示例
  6. artdialog4.1.7 中父页面给子页面传值
  7. 电商项目中遇到的经典问题
  8. C语言/C++ 平方矩阵 数学最小值解法【简单易懂,代码可以直接运行】
  9. 【必应】Bing自动提交收录python脚本
  10. 市场调研—2021-2027全球与中国硬质托盘包装市场现状及未来发展趋势
  11. 如是古籍数字化工具平台介绍---自动秒级识别古籍OCR
  12. 补码一位乘--布斯公式
  13. 2018年最流行的十大编程语言,有你用的吗?
  14. 一键反推食谱,与狗对话,识别女票表情…愚人节,AI 也被玩坏了
  15. Embedding原理到实战
  16. 【JetPack+Retrofit+Rxjava】获取Bing每日一图并显示ViewModel+LiveData+DataBinding+MVVM 补充笔记
  17. 计算机网络-详解DNS域名解析全过程
  18. WEBGIS开发 数据处理软件CesiumLab学习使用总结
  19. Java不知道怎么学?看这个就对了!
  20. 如何解决 Google GMS 在被锁定失效后,无法再使用 Google Play Store的问题;亦适用于在不使用 Google GMS 的情况下,如何正常使用Google Play 商店

热门文章

  1. java 草稿_JAVA生成一张草稿
  2. c语言来自不兼容指针类型的分配,c - 为什么我会收到“警告:来自不兼容指针类型的分配”? 结构数组中的双链表 - 堆栈内存溢出...
  3. ASM(六) 利用TreeApi 动态生成以及转换方法字节码
  4. 企业邮箱外发被退信的处理过程
  5. 【xml】异常:不应有 xml xmlns=''。
  6. shotcut视频编辑器
  7. CKA考试习题:安全管理--Network Policy、serviceaccount、clusterrole
  8. PTA出现EOFError
  9. 事业单位招聘java_新华社新媒体中心2018年面向社会招聘事业单位人员
  10. 通达OA web页面与精灵显示内容更新后不一致的问题