*“在得知转专业成功后我便开始了各方面的准备
这个五一假期来的十分及时,刚好给予了我学习C语言基础的时间
(虽然我不太喜欢调休,不过以后的课程数量,调不调休应该都差不多吧,习惯就好)”*
《打印空心金字塔》这是我在C语言课程学习中,遇到的一个很有趣的项目,主要是对循环语句的考察
先打印一个四层金字塔
* ——第一层,1个"*",前半部分n-1个" "
*** ——第二层,3个"*",前半部分n-2个" "
***** ——第三层,5个"*",前半部分n-3个" "
******* ——第四层,7个"*",前半部分n-4个" "
以此类推得到:
...... ——第n-1层 , [2(n-1)-1]个"*", 前半部分n-(n-1)个" "
...... ——第n层 , (2n-1)个"*" , 前半部分n-n个" "
代码如下:
void main()
{
int i, j, k, n
printf("请输入您希望打印的金字塔的层数\n")
scanf_s("%d", &n)
for (i = 1
{
for (j = 1
{
printf(" ")
}
for (k = 1
{
printf("*")
}
printf("\n")
}
system("pause")
}
运行结果如下:

先打印一个四层空心金字塔
* ——第一层,前半部分n-1个" ",第一个"*"与最后一个"*"之间有0个" "
* * ——第二层,前半部分n-2个" ",第一个"*"与最后一个"*"之间有1个" "
* * ——第三层,前半部分n-3个" ",第一个"*"与最后一个"*"之间有3个" "
******* ——第四层,前半部分n-4个" ",打印7个"*"
以此类推得到:
...... ——第n-1层 ,前半部分n-(n-1)个" ", 第一个"*"与最后一个"*"之间有[2(n-1)-1]个" "
...... ——第n层 ,前半部分n-n个" ",打印(2n-1)个"*"
代码如下:
void main()
{
int i, j, k, n
printf("请输入您希望打印的金字塔的层数\n")
scanf_s("%d", &n)
for (i = 1
{
for (j = 1
{
printf(" ")
}
if (i < n)
for (k = 1
{
if (k == 1 || k == (2 * i - 1))
printf("*")
else
printf(" ")
}
else
for (k = 1
{
printf("*")
}
printf("\n")
}
system("pause")
}
运行结果如下:

上述代码是我自己思索出来的实现方法,通过运行上述代码,的确可以输出一个空心的金字塔
但有些地方写的比较繁琐,不够简洁省时
在我的学习中,通过对老师在课程中讲述的理解,了解到有一些地方可以改进
例如实行打印"*"号时,并不需要判断两个"*"之间有几个" "
只需要在需要打印"*"的地方打印,其它地方打印" "即可
具体代码替换如下
if (i < n)
for (k = 1
{
if (k == 1 || k == (2 * i - 1))
printf("*")
else
printf(" ")
}
else
for (k = 1
printf("*")
替换为
for (k = 1
{
if(k==1||k== (2 * i - 1)||i==n)
printf("*")
else
printf(" ")
}
这样写不但使代码更为简洁,也节省了判断语句的数量,节约时间、空间
替换后的代码如下,运行结果同上
void main()
{
int i, j, k, n;
printf("请输入您希望打印的金字塔的层数\n");
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n - i; j++)
{
printf(" ");
}
for (k = 1; k <= (2 * i - 1); k++)
{
if(k==1||k== (2 * i - 1)||i==n)
printf("*");
else
printf(" ");
}
printf("\n");
}
system("pause");
}
# 总结:本项目主要考察了循环语句的使用,for、while语句均可以实现,原理相同。虽然十分容易,但这也算是我完成的第一个项目。
“路恒久远,不忘初心,砥砺前行”
我是Lemon,在这里记录自己学习的成长过程
谢谢您的阅读,我们下期再见。