Lesson 8 VS调试技巧&打印菱形

调试技巧主要是如何操作。具体问题千变万化,这里只做简单介绍。文章重点是课后的一个道打印菱形的习题。

调试技巧

主要讲了如何调试程序。这里我只写一下常用的快捷键。
F5:启动调试至下一个断点处,没有断点则运行;
F9:在光标处加入断点。可以通过右键设置条件;
F10:逐过程调试。这里注意,一个过程可能是一次函数调用;
F11:逐语句调试。每次只执行一条语句,可以用来进入函数内部;
Ctrl+F5:直接运行不调试

打印菱形

要求

用C语言在屏幕上输出以下图案:

在这里插入图片描述
这里总行数只能是单数。还是和之前一样,通过思路-代码的形式解析这个题。

观察与思路

观察

  1. 图案上的菱形是由*_组成的(_表示空格,下同),看起来是根据行数不同,打印不同的*_
  2. 整个图案是13行,中间行(7)最长,以中间行为分界,图案分为上下两个部分;
  3. 第一行的*前面有6个_,后面有6个_,打印*的位置是第7个;
  4. 第二行的第一个*前面有5个_,后面有5个_
  5. 第3~7行左右各少1个_,多一个*
  6. 第8~13行相反;

思路

  1. 打印图案,就是在特定的位置上打印*_
  2. 第一行打印的*在中间,第二行的*向左右扩展各1个,直到第7行;
  3. 打印13行,中间行正好是13个*
  4. 下半部分则是由两边向中间,左右各减少一个*
  5. 整个图案可以作为一个二维数组,只不过这个二维数组的行=列;

思考到这里,差不多可以开始写代码了。

代码

获取行数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个坑:

  1. 打印完一行后忘记换行;
  2. 打印完一行后忘记将位置号置零;
    其余都是位置想错了,很简单的就可以修正回来。
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值