2018秋寒假作业4—PTA编程总结1

7-1 打印沙漏 (20 分)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

1).实验代码
#include<stdio.h>
int main()
{
    int a,b,h,d,e,x,y,z;
    char op;
    while(1)
	{
        scanf("%d %c",&a,&op);
        if(a>0&&a<=1000)
           break;
    }
    b=a-1;
    for(e=0;d>=1;d-=2,e++){
        for(x=0;x<e;x++)
           printf(" ");
        for(x=0;x<d;x++)
           printf("%c",op);
           printf("\n");
    }
    z=e-2;
    for(d=3;b>=2*d;d+=2){
        b=b-2*d;
    }
    d-=2;
    h=d;
    for(y=3;y<=h;y+=2,z--){
        for(x=0;x<z;x++)
        printf(" ");
        for(x=0;x<y;x++)
        printf("%c",op);
        printf("\n");
    }
    printf("%d",b);
    return 0;
}

  

2) 设计思路

首先要把那个输出多少个数的那个数进行分解,就是倒过来思考,假如我要输出17个*,那么 17 我从中间那层开始分解,中间那层说好了必须是1 所有  17-1=16    这是第一层    然后中间这层往两边走 都是加2 也就是说  1+2=3 这是第二层要输出的个数  也就是说   16-3*2=10   第三层 是 3+2=5  正好 5*2=10  这样来计算出从中往外走着几层应该输出几层  然后每层输出多少, 通过一个循环  没递进一层 就是++,然后用for循环来判断我减了数字是否还大于我要计算的最后那层的个数,如果大于或等于就进入下一个循环。用第一个for来打印上沙漏上部分,再嵌套两个for,第一个用来输出符号,第二个用来输出空格,最后用一个计数器计算第一个for用了多少个符号,第二个for用来输出沙漏下部分,同上。

 

 

 

 3)本题调试过程碰到问题及解决办法

1,第一次编写出现了错误,因为思路错误,有些代码直接被跳过,导致图形只有四分之一个沙漏,将for循环的顺序进行了调整后成功打出了沙漏形状

 

 

4).运行结果截图

 

 

 

 

 

 

 

 

 
posted @ 2019-02-13 14:28  awq  阅读(218)  评论(2编辑  收藏  举报