调试技巧主要是如何操作。具体问题千变万化,这里只做简单介绍。文章重点是课后的一个道打印菱形的习题。
调试技巧
主要讲了如何调试程序。这里我只写一下常用的快捷键。
F5:启动调试至下一个断点处,没有断点则运行;
F9:在光标处加入断点。可以通过右键设置条件;
F10:逐过程调试。这里注意,一个过程可能是一次函数调用;
F11:逐语句调试。每次只执行一条语句,可以用来进入函数内部;
Ctrl+F5:直接运行不调试
打印菱形
要求
用C语言在屏幕上输出以下图案:
这里总行数只能是单数。还是和之前一样,通过思路-代码的形式解析这个题。
观察与思路
观察
- 图案上的菱形是由
*
和_
组成的(_
表示空格,下同),看起来是根据行数不同,打印不同的*
和_
; - 整个图案是13行,中间行(7)最长,以中间行为分界,图案分为上下两个部分;
- 第一行的
*
前面有6个_
,后面有6个_
,打印*
的位置是第7个; - 第二行的第一个
*
前面有5个_
,后面有5个_
; - 第3~7行左右各少1个
_
,多一个*
; - 第8~13行相反;
思路
- 打印图案,就是在特定的位置上打印
*
和_
; - 第一行打印的
*
在中间,第二行的*
向左右扩展各1个,直到第7行; - 打印13行,中间行正好是13个
*
; - 下半部分则是由两边向中间,左右各减少一个
*
; - 整个图案可以作为一个二维数组,只不过这个二维数组的行=列;
思考到这里,差不多可以开始写代码了。
代码
获取行数m,标记打印*
的两个位置left和right,根据行数更新left和right。上半部分和下半部分分开打印。上代码:
int main()
{
int m = 0;
int left = 0;
int right = 0;
int i = 0;//每行的位置,如果是二维数组,相当于数组的列号
printf("请输入要打印的行数(只能是奇数):>");
while (scanf("%d", &m) != EOF)
{
left = m / 2;//标记打印第一个*的位置
right = m / 2;//标记打印最后一个*的位置
for (int n = 0; n<m / 2 + 1; n++)//前m/2+1行,上半部分,m/2+1是中间行
{
while (i < m)//遍历一行中的每一个位置,用for循环也可以,我想多练习
{
if (i<left || i>right)//位置在left左边或者right右边
{
printf(" ");
i++;
}
else if (i >= left && i <= right)//位置在left和right中间
{
printf("*");
i++;
}
else//其他情况,应该永远不会出现,我是为了if语句完整。
{
printf(" ");
i++;
}
}
//for循环版本
// for (i = 0; i < m;i++)
// {
// if (i<left || i>right)
// {
// printf(" ");
// }
// else if (i >= left && i <= right)
// {
// printf("*");
// }
// else
// {
// printf(" ");
// }
// }
printf("\n");//打印一行之后记得换行
left--;//起始位置左移1
right++;//结束位置右移1
i = 0;//注意位置归0
}
//上半部分打印完之后,打印下半部分:
left = 1;//下半区是倒着的,因此是从1开始(0是一行的起始,参考二维数组)
right = m - 2;
for (int n = m / 2 + 2; n <= m; n++)//m/2+2是中间行的下一行
{
while (i < m)
{
if (i<left || i>right)
{
printf(" ");
i++;
}
else if (i >= left && i <= right)
{
printf("*");
i++;
}
else
{
printf(" ");
i++;
}
}
printf("\n");
left++;
right--;
i = 0;
}
}
return 0;
}
这样就可以实现任意奇数行的菱形打印了。
运行效果
写代码时候遇到的坑
这个代码写的还算顺,碰到2个坑:
- 打印完一行后忘记换行;
- 打印完一行后忘记将位置号置零;
其余都是位置想错了,很简单的就可以修正回来。