C语言程序设计 输出图形

#include<stdio.h>
void main(void)
{
int i, j,n,m;
scanf("%d %c",&n,&m);
for(i = 1; i <=n; i++) /* 外循环的次数为图案的行数 */
{
for(j = n-2; j >= i - 1; j--) /* 第1个内循环负责输出每行前的空格 */
{
printf(" ");
}
for(j = 1; j <= 2 * i - 1; j++) /* 第2个内循环负责输出每行中的* */
{
printf("%c",m);
}
printf("\n"); /* 负责换行 */
}
}
这一步里如果n是5的话,j=n-2,第一行不是应该有3个空格吗?这是为什么? for(i = 1; i <=n; i++),当n=5时,i<=5,那i为什么没有再加一次加到第六行?还有第一个内循环是怎么控制空格数量的?他只是会输出空格怎么还能知道在什么位置停止呢?求解释。。问题比较多,谢谢了。

(1) 第一行,也就是i=1 ; j=n-2=3 j>=i-1=1-1=0 ;j循环从 3 到 2 到 1 到 0,循环4次啊,输出4个空格。

(2) 外层循环后,i加到6了,但是i= 6<=n=5不成立,所以不满足循环条件了,循环结束了。所以共输出5行。

(3) 第一个循环怎么控制空格数量,见(1)的分析,通过j的循环来控制的啊。

(4) 通过j循环来输出空格,循环结束了,就不输出空格了,它不知道在什么位置停止,而是你让输出几个就输出几个。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-13
for(i = 1; i <=n; i++) /* 外循环的次数为图案的行数 n=5时,循环1-5共五次*/
{
for(j = n-2; j >= i - 1; j--) /* 第1个内循环负责输出每行前的空格 j从3开始,直到相应的i,第一次3 2 1 0四次,第二次3 2 1三次 第三次3 2两次 第四次3一次,五次不会执行循环体*/
{
printf(" ");
}
for(j = 1; j <= 2 * i - 1; j++) /* 第2个内循环负责输出每行中的* 这里循环1-2*i-1 即1 3 5 7 9 次循环*/
{
printf("%c",m);
}
printf("\n"); /* 负责换行 */
}
for循环语句如下:分成三部分,各部分间用分号分隔
for( 初始化变量 ; 退出条件 ; 循环变量变化 )
退出条件 当条件返回假时,结束循环
第2个回答  2014-04-13
楼主,给你一个具体例子来讲解了一下,如果可以的话,望采纳

1
111
11111
1111111
假设行号为n,最大的行号为M
首先我们给每一行编号,这是第一个最外层的大循环
每一行有“ ”空格字符的个数是M-n个
每一行有的字符1的个数是2n-1个
以上两个就是你的循环退出条件
先打印“空格”再打印“字符1”,再每行循环完成后再打印一个“\n”
第3个回答  2014-04-13
1.n=5时,(j=3,;j>=0;j--),j=0,1,2,3,各输出一个空格。
2.这个是i先加完在进行判断,是否小于等于5,如果不小于等于,不会执行下面语句。
3.这个是程序员自己想的算法,他想要输出这样的模型,就自己想出了一个数学公式,按照这个公式来就可以了,并不是程序判断要输出这个图形,他就自己判断,在这停止,程序可没那么智能
第4个回答  2014-04-13
1)n = 5 ,从1 到 5不是只有五次么,你的i不是从0开始。
2)当执行到第四次时 j = 3而 j >= 4 就开始不成立了。