金字塔,原来这么简单
依稀记得在大一的时候学多层嵌套循环的时候对下面这些当初让我瑟瑟发抖的“金字塔”,由“矩形”–>“直角”–>“金子塔”–>“空心金字塔” --> “?”
***** * * * * * * * * * *
***** -> ** -> *** --> *** —- 》 * * *
***** *** ***** * * * * * * * * *
***** **** ******* * * * * *
***** ***** ********* ********** * * *
* * *
然而在我这段重温C语言的经历中,我终于搞懂了这段七十二变!!!
首先咱们来看第一个最简单的矩形五行星星
/*
* 分析:仔细观察图案可以发现改图是由5行星星构成(每行5个星星)
* 所以 定义一个变量i作为行,变量j作为列。i为外侧循环,j为内侧循环
* 定义一个变量s设置为设置每行每列的星星的个数在添加两个for循环并进行嵌套
*
*/
#include <stdio.h>
void main(){
int i,j,s=5;//定义一个变量i作为行,变量j作为列 s=5表示打印星星的个数。
for(i=1;i<=s;i++){//对变量i添加一个for循环作为外循环
for(j=1;j<=s;j++){//对j作为列数设为一个for循环为内循环
printf("*");//输出星星
}
printf("\n");//当内循环结束后,即一行星星打印完就进行一个换行操作 ok
}
输出效果:
*****
*****
*****
*****
*****
接下来我们在来看下一个直角三角形(单侧金子塔),掌握这个也就掌握了我们熟知的“九九乘法表”
/*
* 打印金字塔
* 从简单的金子塔开始慢慢改进操作
*/
//单侧金子塔
#include <stdio.h>
void main(){
int i,j,s=5; //定义变量i作为行,j作为列。s为每行星星的个数
for(i=1;i<=s;i++){ //外侧循环,定义为行数
for(j=1;j<=i;j++){//内侧循环定义列数
printf("*");//内侧循环输出星星
}
printf("\n");//换行操作
}
}
输出效果:
*
**
***
****
*****
接下来就是更为复杂的标准金字塔了,这里开始就要在原有的基础上在添加一个循环输出空格
//打印标准金字塔
/*
*首先我们来分析每行星星和星星前面空格的个数
* *(2*i-1)=2-1=1个 空格有4个=5-1
* ***(2*i-1)=2*2-1=3个 3个空格
* *****(2*i-1)=2*3-1=5个 2个空格
* *******(2*i-1)=2*4-1=7个 1个空格
* *********(2*i-1)=2*5-1=9个 0个空格
*/
#include <stdio.h>
void main(){
int i,j,k;
for(i=1;i<=5;i++){
//使用k控制空格的数量
for(k=1;k<=5-i;k++){//在输出星星时的前面添加空格 按照公式 5-i
printf(" ");
}
for(j=1;j<=2*i-1;j++){//每行输出星星的个数 符合公式 2*i-1
printf("*");
}
printf("\n");//当内层循环过后就需要进行换行操作了
}
}
输出效果:
*
***
*****
*******
*********
最后就是压轴抽芯金字塔了
//打印出空心金字塔
/*在输出*号的时候,需要考虑是否输出的*还是空格
*
* * //i=1该输入*号就输入*
* * * //如果是 第一个*和最后一个*输出的*。其他的应该输入 空格
* * * //如果是 第一个*和最后一个*输出的*。其他的应该输入 空格
* * * //如果是 第一个*和最后一个*输出的*。其他的应该输入 空格
* ********* //i=5该输入*号就输入*
*/
#include <stdio.h>
void main(){
int i,j,k,end=5;
for(i=1;i<=end;i++){//外层循环打印行数
for(k=1;k<=end-i;k++) {//定义一个内层循环用于输出空格效果
printf(" ");
}
for(j=1;j<=2*i-1;j++){//这时我们要摸清每行星星的输出规律
if(j==1||j==2*i-1 || i==end){//当i=1第一行或者是最后一行的时候就全部输出星
printf("*");
}else{
printf(" ");
}
}
printf("\n");
}
输出效果:
*
***
* *
* *
*********
大工告成!
以后有机会有一定要去看看金字塔