(提问前先看)如何调试程序与提问 V0.1

本文作于当C++助教之时,主要目的是希望当同学们在遇到问题时,可以有依据地思考和debug,在此基础上再请教别人。毕竟debug能力也是程序员的必备技能

编译未通过

一般是语法问题,比如错打分号,少个空格,敲错变量名,头文件名,main函数名等等。Visual Studio会给出错误提示,甚至是错误所在行号,仔细观察即可发现问题。如果问题比较奇怪,可以复制错误号问度娘,看看能不能得到相应的提示。
如果Visual Studio没问题,而oj不通过,很可能是复制过程出错。

没有得到预期的输出

1、断点调试法
跟踪程序执行过程,目前课上还没教到,有兴趣的同学可以先看一下网上的资源。比如:
百度经验:如何用vs2012对C语言进行调试
如何使用VS2012进行简单程序的DEBUG(入门级)
如果掌握了这个方法,可以找到几乎所有的入门级逻辑问题。

2、打印输出法
vs中,在main函数return之前,可使用system("pause")查看控制台输出,如果与预期不符,那一定是程序中某处出了逻辑问题。如果和预期一样,很可能是ascii码不一致的问题。
如果一时找不到,而且也不会使用断点调试法,那么可以采用一种比较原始的debug方式:打印中间过程变量,尤其是循环中的变量。这是工程上常用的方法之一:打调试日志。如果实在找不到问题,截图请教别人时,也希望同学们能采用这个办法,更方便他人定位问题。 下面举一个例子。

//要求:输入一个正整数,输出不大于该数,且是17的倍数的所有正整数
//输出用空格分割,结束时换行
#include <iostream>
using namespace std;
int main() {
    int a, i;
    cin >> a;
    for(i = 1; i <= a; i++)
    {
        if(i % 17 == 0){
            cout << i ;
            if(a - i > 17)
            cout <<' ';
        }
    }
    cout << endl;
    return 0;
}

这个程序看似把问题都考虑到了,但测试时却发现经常没有输出,如果肉眼看不出问题,就可以在循环中打印各表达式的值,观察运行结果,如下所示:

//要求:输入一个正整数,输出不大于该数,且是17的倍数的所有正整数
//输出用空格分割,结束时换行
#include <iostream>
using namespace std;
int main() {
    int a, i;
    cin >> a;
    for(i = 1; i <= a; i++);
    {
    	//加入这一行,打印循环中各关键表达式的值
    	//有助于发现逻辑错误,以及运算符优先级等错误
    	cout<<"debug: i = "<<i<<"  "<<"i % 17="<<i % 17<<endl;
        if(i % 17 == 0){
            cout << i ;
            if(a - i > 17)
            cout <<' ';
        }
    }
    cout << endl;
    return 0;
}

哎,debug怎么只打印了一次?是循环只运行了一次吗?哦,是for循环多打了一个分号,把它去掉就好了。当然,oj提交前别忘了把调试输出注释掉。
如果程序比较简单,顺序执行,没有循环,那么学习一下单步调试,这样更方便一些。
所以,如果运算结果与预期不符,建议同学们一定要先在循环中打印相关的表达式,如果仍然不能解决,再将表达式以及中间运算结果一并截图,到群里向别人提问

3、求助他人
如果1、2都不能解决,那么可以考虑求助大神。但正确的提问也是一种艺术,非常不建议直接丢出一坨代码,说“求问大神,我哪儿出错了”。为了能尽快获得答案,你需要尽可能多的提供有效信息,比如说步骤2所给出的中间变量,以及程序的正常运行结果。当然,良好的变量命名,正确的排版(比如缩进),以及关键语句的注释都会增强程序可读性,给人良好的印象。尤其是注释,写注释时候相当于自己重新梳理一遍程序的工作流程,很可能在写注释的时候,就找到了问题。

没有通过所有的测试用例

一般是问题没有考虑全。可以在本地调试时,多尝试不同的输入(一般不小于10组)。如果还没找到问题,可能陷入了思维死角,也可以携自己的测试用例,寻求他人帮助。

oj上运行超时

除非有需要优化的场景,否则很可能是循环中出了问题。建议在循环中打印中间变量,以及在循环结束后打印提示信息,观察循环内代码段是否工作正常。

oj相关其他问题

不要输出任何提示字符,你所有的cout都会被认为是答案的一部分,而oj系统通过比对你的cout和标准答案,来确认你的答案是否正确。

正式提交时将system("pause")注释掉,因为服务器程序不会得到你的键盘输入,这样就会卡死并判定超时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值