zimage-skill:自动化Linux内核镜像处理工具详解与实践
2026/5/8 0:58:22
实现字母金字塔,通过键盘输入字符来控制层数,如输入D,则打印下面图形
A ABA ABCBA ABCDCBA由题目中的图形可知,主要是打印字母的金字塔,这个金字塔怎么构成的勒:
如果把这个字母金字塔看成一个整体,那么我们不但需要判断打印空格的时机,还要判断打印递增字母的时机,还得判断递减字母的时机,会导致思路很复杂。这种复杂的想法不适合初学者思考,因此我这边建议将图形分开成三份后再做处理。
假定:
i/j 0 1 2 3 0 * * * 1 * * 2 * 3 空格坐标图(以*表示占位)
根据空格图我们知道需要打印的空格以代码表示为:
for(inti=0;i<=len-1;i++){//从坐标图看从i=0开始就有,到3结束,共4列,也就等于len-1=4-1=3for(intj=0;j<len-1-i;j++){//从坐标图看从j=0开始,第一行打印到len-1-1结算,之后以此少打一个,即到j=(len-1)-i结束;printf(" ");//打印空格;}printf("\n");//一行打印完后进行换行}
i/j 0 1 2 3 0 A 1 A B 2 A B C 3 A B C D 字母递增图
空格已经打印完了的情况下,即空格已经占位好了,那么这个字母递增图从实际写代码出发会进行变种到如下所示:
| i/j | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 0 | A | |||
| 1 | A | B | ||
| 2 | A | B | C | |
| 3 | A | B | C | D |
字母递增图修订
根据坐标图我们知道需要打印递增字母以代码表示为:
for(inti=0;i<=len-1;i++){//从坐标图看从i=0开始就有,到3结束,共4列,也就等于len-1=4-1=3for(intj=0;j<=i;j++){//从坐标图看从j=0开始,每一行都是i=j的时候结束;printf('A'+j);//打印字母,以首字母A开始,每一列加j;}printf("\n");//一行打印完后进行换行}
i/j 0 1 2 3 0 1 A 2 B A 3 C B A 字母递减坐标图
根据坐标图我们知道需要打印的代码表示为:
for(inti=0;i<=len-1;i++){//从坐标图看从i=0开始就有,到3结束,共4列,也就等于len-1=4-1=3for(intj=1;j<=i;j++){//从坐标图看从j=1开始,每一行都是i=j的时候结束;printf('A'+i-j);//打印字母,每次结束的时候都是A,然后以此往坐标的左边加1,所以是-j,每一行又都是i=j时结束,所以加了一个i,带入公式验证两行无误即可编译验证;}printf("\n");//一行打印完后进行换行}intmain(intargc,charconst*argv[]){charchr;printf("input char A~Z/a~z/0-9:");scanf("%c",&chr);charchr_sop;intlen;switch(chr){case'A'...'Z':len=chr-'A'+1;chr_sop='A';break;case'a'...'z':len=chr-'a'+1;chr_sop='a';break;case'0'...'9':len=chr-'0'+1;chr_sop='0';break;default:printf("input error\n");return0;break;}for(chari=0;i<=len-1;i++){for(intj=0;j<(len-1)-i;j++){printf(" ");}for(intj=0;j<=i;j++){printf("%c",chr_sop+j);}for(intj=1;j<=i;j++){printf("%c",chr_sop+i-j);}printf("\n");}return0;}我这里汇总的代码与前面的图解代码几乎一模一样。
只是做了以下优化:
可以看到输出的结果与题目一模一样,且可以打印超过D大小的金字塔;
可以从坐标图清晰看出:
总结一下好处就是: