字符金字塔

如何设计算法?

  字符金字塔输出美观,字符呈相对对称排列,很养眼.我们要想制作一个输出字符金字塔的程序,让用户自己定义金字塔最底端的中间的字符.

  首先要设计一个算法.这个算法可以在用户输入E后输出如下图案.

  

  通过观察,我们初步得出这个过程的伪代码:

  提示用户输入并检查输入

  循环:控制行数{

    循环:输出空格

    循环:正序输出字母至'A' + 行数

    循环:倒序输出字母(有可能不输出)

    输出换行符

  }

  我们把用户输入的字符声明为char input.将外层循环的循环变量声明为int i,内层为int j.

  然而,用户输入的是字符,怎么把它转换成输出的行数呢?因为大多数系统支持ASCII编码系统,通过观察ASCII码表,我们发现'A'到'Z'的字母是连续排列的.把用户输入的字符与'A'相减,我们把相减的值声明为int len.通过上图,我们知道,行数 = len + 1(因为'E' - 'A' = 4);所以可以将控制行数的循环写成for(i = 1; i <= len + 1; i++),更好的做法是for(i = 0; i <= len; i++).后续都使用这种更好的做法.

  通过观察空格的数量,可以得出规律:第i+1行,有len - i个空格.我们就可以把输出空格的循环写成for(j = 1; j <= len - i; j++) .

  "正序输出字母至'A' + 行数"的意思是正序输出到这行的中间位置,例如,第一行输出'A',第二行输出'A''B',第三行输出'A''B''C'.这样就可以把循环设计成for(j = 0 ; j <= i; j++),这时要注意,j在这里使用不会产生冲突,因为C语言程序是自顶向下执行代码的.循环完成后,每行中间位置的字母已经确定,在下一个倒序输出的循环中就不能重复这个过程了.

  因为正序输出的循环输出到每行中间,倒序输出就可能不会执行.需要提醒的是,for和while循环再执行循环体之前都先要检查循环继续的条件.所以,循环设计成for(j = i; j > 0; j--)是完全可以的,因为是倒序输出,我们采用递减j来提高程序代码的可读性.

  这样下来,我们就可以将上面自然语言描述的伪代码转换成类C的伪代码:

  get(input)

  len = input - 'A'

  for(i = 0; i <= len; i++){

    for(j = 1; j <= len -i; j++)

      put(" ")

    for(j = 0; j <= i; j++)

      put('A' + j)

    for(j = i; j > 0; j--)

      put('A' + j - 1)

    put('\n')

  }

  运用化归的思想,将复杂的问题分解成简单的问题来设计算法.

程序代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(int argc, char * argv[])
 5 {
 6     int i,j,len;
 7     char input;
 8     printf("Enter a letter:");
 9     input = getchar();
10     if(input > 'Z' || input < 'A')
11           exit(1);
12     len = input - 'A'; //'E' - 'A' = 4
13     for(i = 0; i <= len; i++){ //输出行
14         for(j = 1; j <= len - i; j++) //输出空格
15               printf(" ");
16         for(j = 0; j <= i; j++) //正序输出
17               printf("%c",'A' + j);
18         for(j = i; j > 0; j--) //倒序输出
19               printf("%c",'A' + j - 1);
20         printf("\n");
21     }
22     getch();
23     return 0;
24 }

  运行结果:

原文地址:https://www.cnblogs.com/mrblug/p/5723465.html