当前位置:编程学习 > C/C++ >>

C++问题:读不懂代码...

int i,j,n=4;
for (i=1;i<=n;i++)
{
for (j=1;j<=30;j++)
cout << ' ';

for (j=1;j<=8-2*i;j++)
cout << ' ';
for (j=1;j<=2*i-1;j++)
cout << '*';
cout << endl;

}
for (i=1;i<=n-1;i++)
{
for (j=1;j<=30;j++)
cout << ' ';
for (j=1;j<=7-2*i;j++)
cout << '*';
cout << endl;
}
就是这个..不知道那个8从哪蹦出来的..达到什么效果..还有下面的.
总的来说光能看懂第一句..空30列.
哪位大侠帮忙注释一下..感激不尽.
答案://n中的数决定平行四边形上半部分三角形的行数,即平行四边形的全高度为2*n-1行
int i,j,n=4;

//输出上边的三角形
//外层循环i用来控制三角形高度(行数)
for (i=1;i<=n;i++)
{
//外层循环每执行一次,即输出一行(本循环最后的 cout << endl 用来换行)
//内层循环1先输出30个空格,用来把菱形放到屏幕靠中间的位置
for (j=1;j<=30;j++)
cout << ' ';
//内层循环2继续输出若干空格,数量是8-2*i个,输出这些空格是为缩进
//注意这里的8本应写作2*n,只是因为n为4所以被直接写作8时没什么关系,但若将开头的n改为其它数图形就乱了
//而对第i行输出2n-2i即2(n-i)个空格是为了使三角形右边形成垂直边
//参见下面代码,第i行要输出的星号数量为2i-1个,最长的一行含有的星号数为2n-1个,因此为使右边对齐,
//第i行前面应空出(2n-1)-(2i-1)即2(n-i)个空格
for (j=1;j<=8-2*i;j++) //应改为for (j=1;j<=2*n-2*i;j++)

cout << ' ';
//内层循环3用来输出星号,星号的数量是2*i-1个
for (j=1;j<=2*i-1;j++)

cout << '*';
//完成输出一行,换行
cout << endl;

}

//以下输出下边的三角形,基本思路与输出上半部分类似
//但因为下面的三角形垂直边在左,就省略了对应前面的内层循环2的部分了
//又,这里i循环到n-1,是因为最长的一行已经在输出上半部分时候输出过了,所以下半部分就少一行了
for (i=1;i<=n-1;i++)
{
for (j=1;j<=30;j++)
cout << ' ';
//这里没有对应上面的内层循环2,是因为下半部分的三角形是左边对齐的,所以不用预先空出格来
//后面反正是空白,直接换新行就好了

//此处本应改为for (j=1;j<=2*n-2*i-1;j++) ,2*n的来历可参考前面关于8的注释
for (j=1;j<=7-2*i;j++)
cout << '*';
cout << endl;
}

实际输出为:








*







***






*****






*******






*****






***






*
------------
对补充提问的回答(关于内层循环中 2n-2i 的解释):
在前面已经说过,上半部三角形第i行是由2i-1个星号构成的,最长的一行(即第n行)的星号数为2n-1个,它上边一行则含有2n-3个星号,所以要使三角形右边形成垂直边,上边那行(第n-1行)的星号前就要比这行多输出2个空格,再上边一行(第n-2行)就要比第n行多4个空格……直到第1行,要比第n行多输出2(n-1)个空格。第i行要输出的空格数就是2(n-i)个。
要是还不明白我也不知道该怎么解释了……

上一个:用c++编写电梯程序怎么写
下一个:C++问题 急!急!急

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,