C语言、Python与金字塔图形

前言

  昨天在和朋友看电影的时候,一个在南开大学就读的高中同学给我发来这样一道题目:

  输出一个大小为n的金字塔,金字塔是一个等腰三角形,大小为n的金字塔底层有n个*,每一层*的个数都是下一层的个数减2,第一层的*在最中央。因为这个问题太简单了,所以要求金字塔的顶可以朝上下左右四个方向。

  当时正是电影最为精彩的部分,所以我并没有对这道题太过在意。我只是大致看了一下,然后回复同学说“我现在在看电影”就退出了QQ的聊天框。到了晚上,我突然想起了还有这么一道题,也突然觉得这道题可以让我的无聊的晚上变得有趣起来。高中同学发来这道题的时候说要用C++编写程序,但是我对C++一无所知。最后,我还是决定试一下,用C语言和Python来完成这道题目。

初步的想法

  在离开实验室走回宿舍的路上,我一直在思考这道题该如何去完成。我想起了之前在刷Python编程练习100例的时候写过的类似的一个程序,使用Python 3.6编写如下:

from sys import stdout

for i in range(4):
    for j in range(2 - i + 1):
        stdout.write(' ')
    for k in range(2 * i + 1):
        stdout.write('*')
    print()

for i in range(3):
    for j in range(i + 1):
        stdout.write(' ')
    for k in range(4 - 2 * i + 1):
        stdout.write('*')
    print()

  输出结果如下:

   *
  ***
 *****
*******
 *****
  ***
   *

  当时写这个编程练习的时候,我的想法是先把图形分成前4行和后3行两部分来看,它们分别有不同的规律,可以利用for循环的嵌套,第1层控制行,第2层控制列,实现金字塔图形的输出。这样看来,同学问我的那道题,只不过是这道题的“进阶版”。
  题目中要求用户键入w/a/s/d来输出不同塔尖方向的金字塔。对于这一点,我们可以把w/a/s/d四个方向分成四部分,使用if-else if-else语句(或者在C语言中使用switch语句,Python没有switch语句)分类讨论。

用C语言实现

  如果觉得金字塔的规律不容易找出来,我们不妨找一张草稿纸,在纸上画一画。这里省略掉找规律的过程。程序源代码如下:

#include <stdio.h>
#include <stdlib.h>
int main (void)
{
	int num, i, j, h; 
	char direction; 
	printf ("请输入塔底长度和塔尖方向(w/a/s/d),使用空格分隔开:"); 
	scanf ("%d %c", &num, &direction); 
	h = (num + 1) / 2; 
	switch (direction)
	{
		case 'w':
			for (i = 1; i <= h; i++)
			{
				for (j = 1; j <= num; j++)
				{
					if (j > h - i && j < h + i)
					    printf ("%c", '*'); 
					else
					    printf (" "); 
				}
				printf ("\n"); 
			}
			break;  
		case 'a':
			for (i = 1; i <= num; i++)
			{
				for (j = 1; j <= h; j++)
				{
					if (j > h - i && j > i - h)
					    printf ("%c", '*'); 
					else
					    printf (" "); 
				}
				printf ("\n"); 
			}
			break; 
		case 's':
			for (i = 1; i <= h; i++)
			{
				for (j = 1; j <= num; j++)
				{
					if (j >= i && j <= num - i + 1)
					    printf ("%c", '*'); 
					else
					    printf (" "); 
				}
				printf ("\n"); 
			}
			break; 
		case 'd':
			for (i = 1; i <= num; i++)
			{
				for (j = 1; j <= h; j++)
				{
					if (j <= i && j <= 2 * h - i)
					    printf ("%c", '*'); 
					else
					    printf (" "); 
				}
				printf ("\n"); 
			}
			break; 
		default:
			printf ("Error! \n"); 
	}
	system ("pause"); 
	return 0; 
}

  下面给出几组输出样例:

请输入塔底长度和塔尖方向(w/a/s/d),使用空格分隔开:11 w
     *
    ***
   *****
  *******
 *********
***********
请输入塔底长度和塔尖方向(w/a/s/d),使用空格分隔开:9 a
    *
   **
  ***
 ****
*****
 ****
  ***
   **
    *
请输入塔底长度和塔尖方向(w/a/s/d),使用空格分隔开:13 s
*************
 ***********
  *********
   *******
    *****
     ***
      *
请输入塔底长度和塔尖方向(w/a/s/d),使用空格分隔开:17 d
*
**
***
****
*****
******
*******
********
*********
********
*******
******
*****
****
***
**
*

用Python 3.6实现

  在用Python来编写的时候,我从sys库中导入了stdout方法。在Python中,sys.stdout是一个文件对象,它对应解释器的标准输出流。此外,在Python中,文件对象sys.stdin和sys.stderr分别对应解释器的标准输入流和标准出错流。在此不再赘述,如果感兴趣的话可以自行查阅资料了解。
  使用Python 3.6编写的程序源代码如下:

from sys import stdout

num = int(input('请输入金字塔塔底长度:'))
direction = input('请输入金字塔塔尖方向(w/a/s/d):')
h = (num + 1) // 2

if(direction == 'w'):
    for i in range(1,h + 1):
        for j in range(1,num + 1):
            if((j > h - i) and (j < h + i)):
                stdout.write('*')
            else:
                stdout.write(' ')
        stdout.write('\n')
        
elif(direction == 'a'):
    for i in range(1,num + 1):
        for j in range(1,h + 1):
            if((j > h - i) and (j > i - h)):
                stdout.write('*')
            else:
                stdout.write(' ')
        stdout.write('\n')
        
elif(direction == 's'):
    for i in range(1,h + 1):
        for j in range(1,num + 1):
            if((j >= i) and (j <= num - i + 1)):
                stdout.write('*')
            else:
                stdout.write(' ')
        stdout.write('\n')

elif(direction == 'd'):
    for i in range(1,num + 1):
        for j in range(1,h + 1):
            if((j <= i) and (j <= 2 * h - i)):
                stdout.write('*')
            else:
                stdout.write(' ')
        stdout.write('\n')

else:
    print('Error! ')

  由于Python程序的输出结果与上面的C程序的输出结果相似,下面只给出一组输出样例:

请输入金字塔塔底长度:7
请输入金字塔塔尖方向(w/a/s/d):a
   *
  **
 ***
****
 ***
  **
   *

写在最后

  以上就是我对于金字塔图形这个经典编程练习的一些想法。输出金字塔图形的编程方法不唯一,欢迎与我进行交流。
  我的邮箱:[email protected]

发布了21 篇原创文章 · 获赞 6 · 访问量 1670

猜你喜欢

转载自blog.csdn.net/qq_45554010/article/details/102872754