打印沙漏
Posted lxzlyf2022
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打印沙漏相关的知识,希望对你有一定的参考价值。
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。)
1)实验代码
2 #include<stdio.h>
3 int main(){
4 int i,j,k,n,l=1,t;
5 char c=‘ ‘;
6 scanf("%d %c",&n,&c);
7 while(l*l*2-1<=n){
8 l++;
9 }
10 l--;//得到打印上三角的行数
11 k=l;
12 for(i=1;i<=k;i++){//打印上三角
13 for(j=1;j<i;j++){
14 printf(" ");
15 }
16 for(j=1;j<=2*l-1;j++){
17 printf("%c",c);
18 }
19 l--;
20 printf("
");
21 }
22 t=k;
23 l=2;//下三角从第二行开始打印
24 for(i=2;i<=k;i++){//打印下三角
25 for(j=1;j<=t-i;j++){
26 printf(" ");
27 }
28 for(j=2*l-1;j>0;j--){
29 printf("%c",c);
30 }
31 printf("
");
32 l++;
33 }
34 printf("%d
",n-(2*t*t-1));
35 return 0;
36 }
(2)解题思路:把沙漏分成上半三角和下半三角来看。符号*的总个数与第一行的个数和总行数,总列数有关(第一行个数=总行数=总列数)。每一行*个数减二等于下一行*个数,直到中间只有一个*。
(3)代码思路
if(A>N) n=n-1; for(i=1;i<=(2*n+1);i++)//控制沙漏的行
{ for(j=1;j<=(2*n+1);j++)//控制沙漏每一行的字符的个数
{ if (j>=i&&i+j<=2*n+2) cout<<M;//输出沙漏的上半倒三角
else if(j<=i&&i+j>=2*n+2) cout<<M; //输出沙漏的下面部分的三角
else if(j<i&&i+j<2*n+2) cout<<" ";//输出沙漏体左边的空格部分 }
cout<<endl;//每行输出后要转行 }
最主要是精准控制每一行和每一列的输出,i,j,n三者之间的关系要理清。
4)解题过程中存在的问题,以及如何得到解决的:之前在沙漏的右边以为有空格,一直答案错误,经过删去有关右边输出空格的代码后问题解决
5)运行截图
以上是关于打印沙漏的主要内容,如果未能解决你的问题,请参考以下文章