1.金字塔
#include<stdio.h>
void main(){
int a;
printf("请输入金子塔层数:");
scanf("%d",&a);
//1.最外层的for循环针对金字塔的层数,i即层数、a为金字塔最低层
for(int i=1;i<=a;i++){
//2.循环体内部第一套for循环针对' '(空格)的输出。
// 2*a-1为金字塔最低一层的'*'个数,2*i-1为第i层'*'个数,其差的1/2为图形每行左边的空格数。
for(int k=1;k<=((2*a-1)-(2*i-1))/2;k++){
printf(" ");
}
//3.第二套用来输出前'*',2*i-1为第i行的'*'个数
for(int j=1;j<=2*i-1;j++){
printf("*");
}
printf("\n");
}
}
2.菱形
#include<stdio.h>
#include<math.h>
void main(){
int a,b;
printf("请输入菱形层数(奇数):");
scanf("%d",&b);
a = (b+1)/2;
if(b%2==1){
//使用嵌套循环,内部使用三套循环(不是三层),根据金字塔演化得出。
//1.最外层的for循环针对菱形的层数,i即层数、a为菱形中间那一层
for(int i=1;i<=(2*a-1);i++){
//2.循环体内部第一套for循环针对' '(空格)的输出,abs()函数为取绝对值函数
// 2*a-1为金字塔最低一层的'*'个数,2*i-1为第i层'*'个数,其差的1/2为图形每行左边的空格数。
for(int k=1;k<=abs((2*a-1)-(2*i-1))/2;k++){
printf(" ");
}
//循环体内部第二套和第三套均是用来输出'*',用if语句来选择前部分和后部分
if(i<=a){
//3.第二套用来输出前 a 行'*',2*i-1为第i行的'*'个数
for(int j=1;j<=2*i-1;j++){
printf("*");
}
}
else
//4.循环体内部第三套用来输出b-a行的'*',2*a-i以a行为轴,与上方对称的行号相同,所以2*(2*a-i)-1为第i行'*'个数。
for(int m=1;m<=2*(2*a-i)-1;m++){
printf("*");
}
printf("\n");
}
}
else
printf("输入错误,请输入奇数!");
}
金字塔进阶版(区别在空格的输出)
#include<stdio.h>
void main(){
int a,i,j,k;
printf("请输入金子塔层数:");
scanf("%d",&a);
//1.最外层的for循环针对金字塔的层数,i即层数、a为金字塔最低层
for(i=1;i<=a;i++){
//2.循环体内部第一套for循环针对' '(空格)的输出。
// 金字塔进阶版与旧版主要区别就是空格的输出,以a-i取代了((2*a-1)-(2*i-1))/2
// 旧版太过繁琐(不但要学会找规矩,而且要找最简的方式)
for(k=1;k<=a-i;k++){
printf(" ");
}
//3.第二套用来输出前'*',2*i-1为第i行的'*'个数
for(j=1;j<=2*i-1;j++){
printf("*");
}
printf("\n");
}
}
假设金字塔是四层
每层的’*'个数 | 每层靠左边的空格数 |
---|---|
1 | 3 |
3 | 2 |
5 | 1 |
7 | 0 |
规律 | 每层靠左边的空格数=总层数-层数 |
菱形也是同理
这里要注意一个问题,在C89下必须先定义变量才能使用,其规定,在任何语句执行之前,在块的开头声明所有局部变量,这里由于某些原因没有出错,但是将其复制新建文件编译就会出错。解决方法:先定义i、j、k、m等变量,for 循环中赋值即可。
新建文件复制以上代码重新编译就会出现如此错误: