*“在得知转专业成功后我便开始了各方面的准备
这个五一假期来的十分及时,刚好给予了我学习C语言基础的时间
(虽然我不太喜欢调休,不过以后的课程数量,调不调休应该都差不多吧,习惯就好)”*
《打印空心金字塔》这是我在C语言课程学习中,遇到的一个很有趣的项目,主要是对循环语句的考察
# 题目:打印一个空心的金字塔
## 思路:通过对输出结果的分析,逐渐推理出方法
### 过程1:先利用for循环打印一个n层的实心的金字塔
先打印一个四层金字塔
* ——第一层,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; i <= n; i++)
{
for (j = 1; j <= n - i; j++)
{
printf(" ");
}
for (k = 1; k <= (2 * i - 1); k++)
{
printf("*");
}
printf("\n");
}
system("pause");
}
复制代码
运行结果如下:
复制代码
### 过程2:再利用if语句判断是打印“*”还是“ ”,打印一个n层的空心的金字塔
先打印一个四层空心金字塔
* ——第一层,前半部分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; i <= n; i++)
{
for (j = 1; j <= n - i; j++)
{
printf(" ");
}
if (i < n)
for (k = 1; k <= (2 * i - 1); k++)
{
if (k == 1 || k == (2 * i - 1))
printf("*");
else
printf(" ");
}
else
for (k = 1; k <= (2 * i - 1); k++)
{
printf("*");
}
printf("\n");
}
system("pause");
}
复制代码
运行结果如下:
复制代码
# 改进
上述代码是我自己思索出来的实现方法,通过运行上述代码,的确可以输出一个空心的金字塔
但有些地方写的比较繁琐,不够简洁省时
在我的学习中,通过对老师在课程中讲述的理解,了解到有一些地方可以改进
例如实行打印"*"号时,并不需要判断两个"*"之间有几个" "
只需要在需要打印"*"的地方打印,其它地方打印" "即可
具体代码替换如下
复制代码
if (i < n)
for (k = 1; k <= (2 * i - 1); k++)
{
if (k == 1 || k == (2 * i - 1))
printf("*");
else
printf(" ");
}
else
for (k = 1; k <= (2 * i - 1); k++)
printf("*");
复制代码
替换为
复制代码
for (k = 1; k <= (2 * i - 1); k++)
{
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,在这里记录自己学习的成长过程
谢谢您的阅读,我们下期再见。
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END