题目:编写程序实现输出以下图形。
*
* * *
* * * * *
* * * * * * *
尝试第一次编写:
#include<stdio.h>
int main(){
int x,y,z;
for(x=1;x<=6;x++){
for(z=6;z>x;z--){
printf(" ");
}
for(y=1;y<=x;y++){
printf(" * ");
}
printf("\n");
}
return 0;
}
结果:
*
* *
* * *
* * * *
* * * * *
* * * * * *
明显不符合题意。
分析当前程序结构:
首先这是个两层for循环嵌套。
其结构如下
for
|
|
for - for
第二层有两个并列的for循环
现在想象一个坐标系
————————————>Y
|
|
|
|
X
外层for循环用于控制y轴
内层第二个for循环用于控制x轴
int main(){
int x,y,z;
for(x=1;x<=6;x++){
for(y=1;y<=x;y++){
printf(" * ");
}
printf("\n");
}
return 0;
}
现在保持这种状态,以这种方式分析
最外层for循环x初始值为1,当x<=6的时候执行,执行完成后对变量x进行累加1操作
内层for循坏用于控制x轴,其y初始值为1,当y<=x的时候执行,执行完成后对变量y进行累加操作
x的最大值为6,y的最大值始终小于或者等于x
过程如下:
修改后
#include <stdio.h>
int main() {
int x, y, z;
for (x = 1; x <= 4; x++) { // 控制总行数
// 打印前导空格
for (z = 4; z > x; z--) {
printf(" ");
}
// 打印星号
for (y = 1; y <= (2 * x - 1); y++) {
printf("*");
if (y < (2 * x - 1)) { // 在非最后一个星号后面加空格
printf(" ");
}
}
printf("\n"); // 换到下一行
}
return 0;
}
这里的关键点在于:
x 控制行数,从1到4。
第一个内层循环(用变量z)用来打印前导空格,随着行数的增加,前导空格的数量减少。
第二个内层循环(用变量y)用来打印星号及其间的空格,每行的星号数量应该是 2 * x - 1,这样可以确保图案正确地扩展成一个等腰三角形。
标准答案
#include <stdio.h>
int main() {
int i, j, rows = 4; // 定义行数为4
for (i = 1; i <= rows; i++) { // 外层循环控制行
// 打印前导空格
for (j = i; j < rows; j++) {
printf(" ");
}
// 打印星号
for (j = 1; j <= (2 * i - 1); j++) {
printf("*");
if (j < (2 * i - 1)) { // 防止在最后一个星号后添加空格
printf(" ");
}
}
printf("\n"); // 换行
}
return 0;
}