使用C语言输出菱形详解
// 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是我在考研期间查资料发现的网站,很多高质量的文章与分享解决了我许多计算机领域的问题与困惑,非常棒。
这是我第一次发博客,因希望将知识分享给更多人、帮助更多人、也想以后方便回顾自己所学而写下了这篇文章,才疏学浅,如有错误之处望指正。每天都在向大家学习中,以后会继续分享一些小知识的,谢谢!