Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22113
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 42
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-24 11:08
文章分类
文章存档

2015年(3)

2014年(1)

我的朋友

分类: C/C++

2014-07-12 14:10:22

菜鸟一个,本着记录学习的过程做此笔记,高手见笑。
题目:让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:

这种图案要扩展到用户输入的字符。案例图案是输入E产生的图案。提示,可以使用一个外部循环管理行,每一行使用三个内部循环,第一个处理空格,第二个处理升序打印字母,第三个处理降序打印字母。
一开始死活也做不出来,后来网上看了一下别人的案例,睡了一觉起床后自己调试,得出源码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int rows,spaces,up,down;
  5.     char c='A';
  6.     char enter;    
  7.     printf("enter a upper charactor:");
  8.     scanf("%c",&enter);
  9.     
  10.     for(rows=0;rows<=enter-c;rows++)
  11.     {
  12.         for(spaces=enter-c;spaces>=rows;spaces--)
  13.             printf(" ");
  14.         for(up=0;up<=rows;up++)
  15.             printf("%c",c+up);
  16.         for(down=rows;down>0;down--)
  17.             printf("%c",c+down-1);
  18.         printf("\n");
  19.     }
  20.     return 0;
  21. }


解析如下:
      首先进行设计构想,四个循环,则先定义四个循环的计数变量,分别是rows,spaces,up,down。定义一个输入值的字符变量enter,后来测试过程中添加了一个字符变量c。
      开始设计外部循环,外部循环控制行数,明显,行数等于输入字符与A字符ASCII码的差值再加1,因此可以设定为
for(rows=0;rows<=enter-c;rows++)。因为设定行的起始计数器值为0了,所以就不用在其中加1了。
      设计第一内部循环,控制空格字符,因为我是菜鸟,不能一次直接写出全部代码,所以我采用各个测试的方法,先做第一个循环,并且将打印字符空格换成#,这样方便测试。这里使用的是降序相同字符的打印,相对而言还是比较简单一点,直接用            for(spaces=enter-c;spaces>=rows;spaces--)

            printf(" ");
因为设计的行数越多,那么第一行的空格越多,所以空格的数量和输入的值有关,spaces=enter-c,计数器的大小就是从最大开始,space--,然后每一行减少一个空格,当然根据行的控制,行数越大,那么空格就越少,因此spaces>=rows。第一个内部循环设计完成。
        设计第二个内部循环,控制升序打印字母。此时,我将第一个内部循环注释掉,单独调试第二个循环,这样的模块化方法避免相互干扰,比较好。当然,显示的内容就从

变成了
A
AB
ABC
之后联合调试加上第一个内部循环就可以纠正。这里使用的是:
for(up=0;up<=rows;up++)
   printf("%c",c+up);
这当然不是我一个菜鸟能一次性直接写出来了,也是一步步调试出来的。分析如下:
升序,所以计数器要逐渐增加,那么就应该用=,<或者<=,++的模式。这里因为涉及到字符ASCII码要逐渐增加的原因,因此变量从0开始计数以免输入A,加一个1就成了B(完成之前就是用的1,结果不方便,所以换成0)。up<=rows,行数越大,那么up就可以计数更多的循环,printf("%c",c+up);计数器每循环一次,那么打印的字符则增大一次。第二个内部循环设计完成。
        设计第三个内部循环,控制降序打印字母,分析得出,第一行必须为空,那么计数器就得增大一号,每次开始的字符都要比上一行增加一个ASCII码,那么打印字符应该和行相关联,经过反复调试之后,得出:
  for(down=rows;down>0;down--)
   printf("%c",c+down-1);
因为是降序嘛,所以就用=,>,--的模式。行数越大,打印字符越多,因此计数器和行数相关联。printf("%c",c+down-1);打印的字符从最大开始,而且又要和计数器相互关联,因此就使用了c+down-1表达式,为什么要减1?因为每次开始的字符都是比输入字符的ASCII码小1的,所以才这样打印。
            最后,取消注释,先联调前两个内部循环,无误后再联调三个,得出结果:

好了,希望我自己学习愉快。


阅读(1782) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:centos 7 下简单操作指定固定开机内核为win7

给主人留下些什么吧!~~