C程序之数字菱形

C函数之输出数字菱形

题目如下:
利用数字输出如下菱形图案,输入line即表示菱形中心的数字,如下为line = 4 的情形
C程序之数字菱形_第1张图片
下面,就依次讲解思路吧。

一、分析题目

如图,可发现:

  1. 该菱形左右两侧都是空的,因为C语言不允许凭空镂空,所以,左侧一定有字符,比如“空字符”;
  2. 中心即line = 4 可看出此时也是该行数是4的情况;
  3. 菱形可拆分成上下两部分;
  4. 对于上三角,每一行数字的前一部分是不断循环输出,从1增加,且循环数不会超过该行的中心数大小;
  5. 而每一行数字的后一部分,也应该是不断循环输出,从此行中心数减少,直到减少到1为止;
  6. 执行上述操作后,即可在大循环的基础上,输出换行;
  7. 对于下三角,执行的操作与上三角大致相同,无非就是从哪开始,每行输出的数字不断减少而已;
  8. 最后,前面提到的空字符,在上三角区,每行减一个,同时该行数字的会增加若干个,但这样最左侧数字一定是1,遂空字符在上三角区每行减一,在下三角区每行加一,整体上保证了菱形的轮廓;

二、函数大体

void PrintNumers(int line)
{
    int i, j, k;
    //	空字符数量,大概超过line大小即可,可自定义
    int space = 16;
    //	上三角区代码……
    //	space实现输出的空格使得从上三角到下三角实现跨越式转换
	space += 2;
	//	下三角区代码……
}

三、上三角区

for(i = 0; i < line; i ++)
{
	//  输出空格,为了直观,故改空格为星形符号*
	for(j = space; j > 0; j --)
		printf("*");
	//  输出前一部分1,2,3……
	for(k = 0; k < i + 1; k ++)
		printf("%d",k + 1);
	//  在当前基础上,重利用k的值,输出后一部分2,1,没0
	for(k = k - 1;k > 0; k --)
		printf("%d", k);
	//  每输出完一行内容,就减去一个占用空位,也就是星形符号
	space --;
	//  每输出完一行就换行
	printf("\n");
}

3.1 第一个for循环(造轮廓)

C程序之数字菱形_第2张图片

3.2 第二个for循环(数前部分)

3.2 for

3.3 第三个for循环(数后部分)

C程序之数字菱形_第3张图片

四、下三角区

for(int i = line - 1; i > 0; i --)
{
	//  输出空格,为了直观,故改空格为星形符号*
	for(j = space; j > 0; j --)
		printf("*");
	//  输出前一部分1,2,3……
	for(k = 0; k < i; k ++)
		printf("%d",k + 1);
	//  输出后一部分2,1,没0
	for(k = k - 1;k > 0; k --)
		printf("%d", k);
	//  每输出完一行内容,就增加一个占用空位,也就是星形符号
	space ++;
	//  每输出完一行就换行
	printf("\n");
}

4.1 第一个for循环(造轮廓)

C程序之数字菱形_第4张图片

4.2 第二个for循环(数前部分)

C程序之数字菱形_第5张图片

4.3 第三个for循环(数后部分)

C程序之数字菱形_第6张图片

补充下:
以上循环都是在前一个循环后进行的,才显示的结果,而所有循环都在最初的大循环(即上三角区或者下三角区)内进行的。

五、全部代码

void PrintNumers(int line)
{
    int i, j, k;
    int space = 16;
    //  上三角行循环,由于line与行数相关,故可直接使用line作为范围
    for(i = 0; i < line; i ++)
    {
        //  输出空格,为了直观,故改空格为星形符号*
        for(j = space; j > 0; j --)
            printf("*");
        //  输出前一部分1,2,3……
       	for(k = 0; k < i + 1; k ++)
            printf("%d",k + 1);
        //  在当前基础上,重利用k的值,输出后一部分2,1,没0
        for(k = k - 1;k > 0; k --)
            printf("%d", k);
        //  每输出完一行内容,就减去一个空位,也就是星形符号,以便下一行可以新增一个数字
        space --;
        //  每输出完一行就换行
        printf("\n");
    }
    //  在当前基础上,重利用space的值,因为上一步最后space--了,所以这次利用需要对space加两次,若加一次则和上三角最后的行等长
    space += 2;
    //  下三角行循环
    for(int i = line - 1; i > 0; i --)
    {
        //  输出空格,为了直观,故改空格为星形符号*
        for(j = space; j > 0; j --)
            printf("*");
        //  输出前一部分1,2,3……
        for(k = 0; k < i; k ++)
            printf("%d",k + 1);
        //  输出后一部分2,1,没0
        for(k = k - 1;k > 0; k --)
            printf("%d", k);
        //  每输出完一行内容,就增加一个空位,也就是星形符号,以便下一行可以减少一个数字
        space ++;
        //  每输出完一行就换行
        printf("\n");
    }
}

5.1 运行结果

C程序之数字菱形_第7张图片

六、最终结果

将星形字符*修改为空字符后,即得到题目要求的结果:

C程序之数字菱形_第8张图片
至此,全部结束了,需要注意的是,上三角循环和下三角循环直接有个过渡变化的space += 2,为的就是使下一行星形符号前后不一致,保证菱形的整体轮廓。
讲起来或许比较抽象,多试着理解每个循环在搞什么就好了。

==================== END ====================

你可能感兴趣的:(C语言,C语言,数字菱形)