// Written by Harry
一、思维过程
观察要输出的形状 --- 确定大体思路 --- 转化为数学模型 --- 将问题逐个击破
二、完整代码(以7*7菱形为例)
#include <stdio.h>
int main()
{
int i,j,k; //定义菱形行数i、每行输出次数j、每行中输出空格计数器k
for(i=1;i<=4;i++) //上半部分有四行
{
k = 1; //空格计数器
for(j=1;j<=i+3;j++) //每行输出4~7次
{
if(k<=4-i)
{
printf(" ");
k++;
}
else printf("*");
}
printf("\n");
}
for(i=1;i<=3;i++) //下半部分有三行
{ k = 1; //计数器
for(j=1;j<=7-i;j++)
{
if(k<=i)
{
printf(" ");
k++;
}
else
printf("*");
}
printf("\n");
}
system("pause");
return 0;
}
输出结果:
三、分步说明
1.观察要输出的形状
将菱形分为上下两部分编程,这里分为上4行 + 下3行。
2.确定大体思路
每一部分有固定行数,可使用变量i借助 for循环 控制行数;
每一行有固定输出个数,可使用变量j借助 for循环 控制输出次数;
每一行输出的有空格或符号“*”,可使用 条件判断语句if 控制输出谁。
综上所述,菱形的每半部分都需要使用两个嵌套的for循环 + 一个if判断,这样大致结构(即架构 / 代码骨架)就构思出来了。
3.转化为数学模型
以上半部分举例,在第一个for循环里,变量i共要输出4行,故:
for(i=1;i<=4;i++)
第二个for循环要控制每行输出字符个数,变量j在第一行要输出4次,即i = 1时j = 4,以此类推:
| i = 1 | j = 4 |
| i = 2 | j = 5 |
| i = 3 | j = 6 |
| i = 4 | j = 7 |
可知,j输出范围为[4,7],随i变化而变化,即:
for(j=1;j<=i+3;j++)
这样两个for循环都解决,只剩如何判断每一行每一个字符输出的到底是谁这个问题,我们使用if判断语句,同样,先找出空格计数器(即变量k)的数学关系,这里如果找k与j的关系会很繁琐,所以直接跟i关联,转化为文字解释就是:“哪一行输出多少个 空格 又输出多少个 ‘*’ 呢”,数学关系如下:
| i = 1 | j = 3 |
| i = 2 | j = 2 |
| i = 3 | j = 1 |
| i = 4 | j = 0 |
显而易见,i + k恒等于4,这段代码如下:
if(k<=4-i)
{
printf(" ");
k++;
}
else printf("*");
因为每一行开始前计数器要归为1,所以在第一个for循环下,第二个for循环前赋值给空格计数器k = 1
k = 1;
又因为每行之间要换行,接着在第一个for循环最后增加换行语句:
printf("\n");
所以,菱形上半部分完整输出代码块如下:
for(i=1;i<=4;i++) //上半部分有四行
{
k = 1; //空格计数器
for(j=1;j<=i+3;j++) //每行输出4~7次
{
if(k<=4-i)
{
printf(" ");
k++;
}
else printf("*");
}
printf("\n");
}
4.将问题逐个击破
菱形下半部分与上部分同理,代码块如下:
for(i=1;i<=3;i++) //下半部分有三行
{ k = 1; //计数器
for(j=1;j<=7-i;j++)
{ if(k<=i)
{ printf(" ");
k++;
}
else
printf("*");
}
printf("\n");
}
将上下两块代码组合在一起,问题解决。
四、写在最后
CSDN是我在考研期间查资料发现的网站,很多高质量的文章与分享解决了我许多计算机领域的问题与困惑,非常棒。
这是我第一次发博客,因希望将知识分享给更多人、帮助更多人、也想以后方便回顾自己所学而写下了这篇文章,才疏学浅,如有错误之处望指正。每天都在向大家学习中,以后会继续分享一些小知识的,谢谢!
更多推荐
使用C语言输出菱形详解
发布评论