// 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语言输出菱形详解