又是在洛谷刷题的一天,因为我是从入门级别开始做的,所以题目开始很简单,知道往后面刷,遇到了一道比较有代码量的题目。一般代码较长的代码调试起来会比较麻烦,不知从何下手,今天就给大家分享一个debug小技巧—— “注释+输出”调试法 

话不多说,咱们先看题目和代码:

题目 

代码debug小技巧分享_代码debug技巧

代码 

#include<bits/stdc++.h>
using namespace std;

int n;
char a[10][10],b[10][10];
int g(char **x)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(x[i][j]!=b[i][j])return 0;
}
}
return 1;
}

char** f1(char x[10][10])//90deg
{
char **p=new char*[n];
for(int i=0; i<n; i++)
{
p[i]=new char[n];
for(int j=0; j<n; j++)
{
p[i][j]=x[i][j];
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
p[j][n-1-i]=x[i][j];
}
}
return p;
}

char **f2(char **x)//180deg
{
char **y=new char *[n];
for(int i=0; i<n; i++)
{
y[i]=new char[n];
for(int j=0; j<n; j++)
{
y[i][j]=x[i][j];
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
y[j][n-1-i]=x[i][j];
}
}
return y;
}

char **f3(char **x)//270deg
{
char **y=new char *[n];
for(int i=0; i<n; i++)
{
y[i]=new char[n];
for(int j=0; j<n; j++)
{
y[i][j]=x[i][j];
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
y[j][n-1-i]=x[i][j];
}
}
return y;
}


char **f4(char x[10][10])
{
char **p=new char*[n];
// cout<<"f4"<<endl;
for(int i=0; i<n; i++)
{
p[i]=new char[n];
// cout<<"f42"<<endl;
for(int j=0; j<n; j++)
{
p[i][j]=x[i][j];
}
}
for(int i=0; i<n; i++)
{
for(int j1=0,j2=n-1; j1<j2; j1++,j2--)//这点要格外注意!<号
{
// cout<<"f43"<<endl;
swap(p[i][j1],p[i][j2]);
}
}
return p;
}

int f5(char x[10][10])
{
char **p=f4(x);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
x[i][j]=p[i][j];
}
}
char **q=f1(x);
if(g(q))
{
return 1;
}
char **h=f2(q);
if(g(h))
{
return 1;
}
char **l=f3(h);
if(g(l))
{
return 1;
}
return 0;
}

int main()
{
cin>>n;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cin>>a[i][j];
if(a[i][j]=='-')a[i][j]='+';
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cin>>b[i][j];
if(b[i][j]=='-')b[i][j]='+';
}
}
char **p=NULL;
//1
//cout<<1<<endl;
p=f1(a);
if(g(p))
{
cout<<1;
return 0;
}
//2
//cout<<2<<endl;
p=f2(f1(a));
if(g(p))
{
cout<<2;
return 0;
}
//3
//cout<<3<<endl;
p=f3(f2(f1(a)));
if(g(p))
{
cout<<3;
return 0;
}
//4
//cout<<4<<endl;
p=f4(a);
if(g(p))
{
cout<<4;
return 0;
}
//5
//cout<<5<<endl;
if(f5(a))
{
cout<<5;
return 0;
}
//6
int flag=1;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(a[i][j]!=b[i][j])
{
flag=0;
}
}
}
if(flag)
{
cout<<6;
return 0;
}
//7
cout<<7;

return 0;
}

洛谷的一个好处就是可以下载部分测试点,在运行过程中,我发现有一组测试数据有问题,运行时程序会异常终止,即“RE”,一般这种问题,大概率是数组越界,或者死循环等,这里我用的数组不多,而且每个数组都有绝对的自信没有问题。于是,我就把目光着眼到了循环中,而循环出现的地方,就是我写的这些函数。由于我main里调用函数,于是我就在每个函数的后头加上了 输出语句cout ,因为程序是顺序执行,所以如果我那部分函数没有问题,对应的输出语句就会打印在控制台。

所以,我就用这样的方法修改代码后,在此运行了那组测试数组,结果发现,确实有一个函数有问题,然后,我又在那个函数中,再次加入了 输出 语句,用来精确定位,最后我找到了问题所在是 f4函数 ,果然是死循环。而死循环的原因,就是i,j,一个递增,一个递减,循环条件是i!=j,则可能出现,没有i==j的情况,所以会死循环,改成i<j,就没有问题啦~


以上就是今天给大家分享的代码debug小技巧啦,希望对大家有帮助哦~