? ? ? ? 写编程的人初学的时候都会遇到一些意想不到的问题,按照自己的想法写出来了初版的代码却经常发现甚至运行不了,下面以我对某道题的解题过程为例,示范一下调试可以有哪些方法。
描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
????????由于VS2022不支持增长数组的用法,所以我先限定数字进行测试,之后在线提交时再改成增长数组。
#include <stdio.h>
int main() {
int n = 5;
int i = 0;
char arr[5][5] = {0};
char err[5][5] = {0};
for (i = 0; i < n ; i++) {
for (int j = 0; j < n ; j++)
{
arr[i][j] = '*';
err[i][j] = ' ';
}
}
for (i = 0; i < n ; i++)
{
for (int j = 0; j < n; j++){
if (j == i || j == n - i-1)
printf("%c", arr[i][j]);
else
printf("%c", err[i][j]);
}
printf("%d\n");
}
return 0;
}
????????它的运行结果是这样的
* *1985518528
* * 1985518528
* 1985518528
* * 1985518528
* *1985518528
????????其实和我们要的结果已经很接近了,但是出于不明原因(当前尚不明确,其实发现以后会觉得简单到有点若至),后面多了一串数字,我们要将其删除。
? ? ? ? 在第一次调试时,我们从第一个for循环开始,用F11逐语句进行观察,重复25次后的到了如下结果:
????????发现数组是没有问题的,那是否在打印处有问题呢,我们接着往下
? ? ? ? 当运行到这一行时,依然没有出现错误,但是当运行到下一行时,发现数字出现了
? ? ? ? 检查代码,发现问题出在%d上,删除后便可以正常运行。
? ? ? ? 调试得到所需代码后,我们再稍加修改,得到我们需要的目标程序(实验后发现这里也不给用变长数组(恼),那我也就不讲武德用一下vector)
#include <stdio.h>
#include <vector>
int main() {
int n = 0;
int i = 0;
while( scanf ("%d", &n) !=EOF)
{
std::vector<std::vector<char>> arr(n, std::vector<char>(n, '*'));
std::vector<std::vector<char>> err(n, std::vector<char>(n, ' '));
for (i = 0; i < n ; i++) {
for (int j = 0; j < n ; j++)
{
arr[i][j] = '*';
err[i][j] = ' ';
}
}
for (i = 0; i < n ; i++)
{
for (int j = 0; j < n; j++){
if (j == i || j == n - i-1)
printf("%c", arr[i][j]);
else
printf("%c", err[i][j]);
}
printf("\n");
}
}
return 0;
}
? ? ? ? 这个代码其实根本没必要写这么复杂,多调用几次for循环其实就可以了,不过为了巩固才学的数组,这里就写的复杂了一点。
????????写完发现真的不应该错啊啊啊啊啊啊啊啊啊啊啊啊啊