标签:
字符金字塔输出美观,字符呈相对对称排列,很养眼.我们要想制作一个输出字符金字塔的程序,让用户自己定义金字塔最底端的中间的字符.
首先要设计一个算法.这个算法可以在用户输入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 }
运行结果:
标签:
原文地址:http://www.cnblogs.com/mrblug/p/5723465.html