c语言题目:编写程序打印数字金字塔(用循环语句编写) 1
1
121
12321
1234321
123454321 展开
下面的程序可以实现打印数字金字塔,把源代码复制在下面了
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num;
int i;
int j;
int space=4;
num=1;
for(i=5;i>0;i--)
{
for(j=1;j<=space;j++)
{
printf(" ");
}
for(j=1;j<=num;j++)
{
printf("%d",j);
}
for(j=num-1;j>0;j--)
{
printf("%d",j);
}
for(j=1;j<=space;j++)
{
printf(" ");
}
num++;
space--;
printf("\n");
}
return 0;
}
可以自己跑一下程序,应该没错的,把我的运行结果截图了
你好,能麻烦您给出详细的过程注解吗?可以追加悬赏
好,我说一下大体的思路吧。先看一下这个数字金字塔,第1行输出'1',第5行输出'123454321',中间每1行输出的最大数字递增加1。这样就可以先用for循环来输出数字,像下面这样
1
12
123
1234
12345
上面的顺序是递增的,为了输出金字塔形状,可以再用for循环递减输出数字,从每1行的最大数字递减直到1为止。就像下面这样
1
121
12321
1234321
123454321
然后可以看每1行的数字前后的空格数,第1行数字前后有4个空格,后面递减,第5行就没有空格了,就是0。所以可以在数字前后分别循环输出空格,每1行输出的空格数都比前1行小1。最后输出一行结束后再换行就可以了。如果你具体哪个语句看不懂,可以再问我。
你好,能麻烦您给出详细的过程注解吗?可以追加悬赏
#include
int main()
{
int n,i,j;
scanf("%d",&n); //输入层数
for(i=1;i0;j--) //输出后半部分的……21
printf("%d",j);
printf("\n"); //换一行
}
system("pause"); //暂停,便于看清
}
#include<stdlib.h>
#define N 5
#define KG (N-i)
#define ZF (i*2+1)
void main()
{
int i,j,k;
for ( i=0;i<N;i++ ) //打印N行
{
for ( j=0;j<KG;j++ ) printf(" "); //每行前的空格
for ( j=0;j<ZF;j++ ) printf("%d",i-abs(i-j)+1); //每行输出ZF个数,每个数的计算
printf("\n");
}
}
你好,能麻烦您给出详细的过程注解吗?可以追加悬赏
这不是已经有注释了吗?还有什么方面看不懂的请再追问
请注意:
-外循环的次数N等于5,是因为你要求输出5行的金字塔,修改#define N 5的5成其他数字可输出你要求的行数,对应每行来说i的取值分别是0,1,2,3,4,内循环就通过使用这个i值来实现在不同行输出不同数
-内循环中的第1个j循环,解决每行前面的空格问题,第1行输出5个空格,因为第1行时i=0,用N-i可在i取值0~4时分别得到5,4,3,2,1,用这个N-i进行循环次数的控制就可以在第1行输出5个空格(执行printf(" ");语句5次),然后第2行4个,...
-数字前面的空格输出后,就要输出数字了,先关心每行输出的数字个数:1,3,5,7,9,这些数对应i=0,1,2,3,4来说用i来计算就是i*2+1,所以用这个式子控制printf的执行次数就可以控制得到输出相应的数字;
-再看数字内容,如果用printf("%d",j+1);得到的输出是
printf("%d",(i-j));得到
printf("%d",abs(i-j));得到(去掉负数)
观察一下用i值减掉上述表达式得到printf("%d",i-abs(i-j));
再在表达式上加1即可printf("%d",i-abs(i-j)+1);
所以这个输出是利用j和i进行计算凑出来的
-最后别忘了内循环最后每行都要输出换行printf("\n");