C程序之数字菱形

C函数之输出数字菱形

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

一、分析题目

如图,可发现:

  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循环(造轮廓)

3.1 for

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

3.2 for

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

3.3 for

四、下三角区

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循环(造轮廓)

4.1 for

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

4.2 for

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

4.3 for

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

五、全部代码

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 运行结果

5.1 result

六、最终结果

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

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

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

  • 37
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值