赵纾寻  
a special world

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

7-1 打印沙漏 (20 分)

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

1).实验代码

#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).运行结果截图

 

 

 

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

posted on 2019-02-21 19:03  赵纾寻  阅读(1035)  评论(0编辑  收藏  举报