编程总结1
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个*
,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
1)实验代码
#include <stdio.h>
int main()
{
int n;
char op;
scanf("%d %c",&n,&op);
int a=1;
int i=1;
while(a<=n)
{
a=a+2*(2*(i+1)-1);
if(a<=n)
i++;
}
int j,h;
for(j=1;j<=i;j++)
{
for(h=1;h<j;h++)
printf(" ");
for(h=1;h<=2*(i-j)+1;h++)
{
printf("%c",op);
}
printf("\n");
}
for(j=2;j<=i;j++)
{
for(h=1;h<=i-j;h++)
printf(" ");
for(h=1;h<=2*j-1;h++)
{
printf("%c",op);
}
printf("\n");
}
printf("%d",n-(a-2*(2*(i+1)-1)));
return 0;
}
2)设计思路
第一步: 定义变量n,符号型变量op,scanf语句输入变量值;
第二步:定义变量a,i,a表示所需要的符号数的最大值,将沙漏以中心为界分成两部分,i表示半个三角的行数,用while循环计算共需要多少个符号,及所得到的行数,以中心为起点,每增加一行符号增加2个;
第三步:定义变量j,h,j表示行,先打印上半部分,每行的空格数为行数减1,j的初始值是1,则每行打印的符号数为2(i-j)+1个,打印完一行就换行。
第四步:打印下半部分,打印上部分时已经打印了中心,则下部分从j=2开始,打印空格,打印符号,每行打印2*j-1个,打印完就换行;
第五步:输出剩余符号数。
3)本题调试过程碰到的问题及其解决办法
1.不知如何在符号两边都打印空格;
解决方案:只需打印符号左边的空格,右边直接换行。
2.最后输出剩余符号数错误;
解决方案:a在结束while循环后多加了个2(2(i+1)-1),a需减去1个2(2(i+1)-1),n再减a。