---恢复内容开始---

7-1 打印沙漏 (20 分)

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2
#include <stdio.h>
int main ()
{
int n; char c;
printf("输入数字和*用空格隔开比如:17 *:");
scanf("%d %c",&n, &c);
int y=0, N=-1, M=0, x=1, a, i, b, f, sum=0; //下面的循环,判断加了几次,得出第一行有几个字符
while(1)
{
N=N+2; M++; y=y+N;
if(n-2*y+1==0) //刚好相等,跳出循环
{
break;
}
if(n-2*y+1<0)//大于要输出的数增减2,得到开始输入的数,跳出循环
{
N=N-2; M=M-1;//次数逐次减1
break;
}
}
for(i=1; i<=M; i++)//上部分的循环,每次减2
{
for(a=0; a<N; a++)//打印循环
{
printf("%c", c);
}
N=N-2;//打印的字符减掉2个
printf("\n");//按要求换行 //打印字符前面的空格
if(i!=M)//当行数不等于个数的时候打印空格
{
for(b=1; b<=x; b++)
{    
printf(" ");  
  }    
x=x+1;
}
sum=sum+a;//计算用掉了几个字符 } //打印下面一半的字符 ,每次加2
i=0,a=0;
for(i=1;i<=M-1; i++)
{   
for(a=1; a<=x-2; a++)
{
printf(" ");
}
x=x-1 ;
 for(f=0; f<N+4; f++)
{
printf("%c", c);
}
N=N+2;
printf("\n");
sum=sum+f;
}
printf ("剩余*个数:%d",n-sum);
}
}

2)设计思路

第一步:定义字符和整数
第二步:利用while循环得出第一行和最后一行的字符个数,得出总共有几行
第三步:利用for循环逐步递减打印上部分字符,换行
第四步:利用if循环打印空格
第五步:利用for循环逐步递加打印下部分字符,打印空格,打印字符,换行
第六步:计算剩余字符个数

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

问题:看不懂题,数学有点差

解决方法:百度,请教他人。

4).运行结果截图

 

Python沙漏型 沙漏图形pta_for循环

 

 

---恢复内容结束---