7-1 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * ********
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * ********2 1).实验代码
#includeint 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 =2*d;d+=2){ b=b-2*d; } d-=2; h=d; for(y=3;y<=h;y+=2,z--){ for(x=0;x
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).运行结果截图