• 字符金字塔


    如何设计算法?

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

      首先要设计一个算法.这个算法可以在用户输入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 }

      运行结果:

  • 相关阅读:
    直接插入排序
    希尔排序
    堆排序
    红黑树
    hashMap原理
    JAVA随笔4
    JAVA随笔3(集合框架,流)
    Linux环境下如何生成core文件
    Centos6 升级glibc-2.17,解决Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法
    MediaWiki搭建步骤
  • 原文地址:https://www.cnblogs.com/mrblug/p/5723465.html
Copyright © 2020-2023  润新知