目前主要分为三个专栏,后续还会添加:
专栏如下: C语言刷题解析 C语言系列文章 我的成长经历
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的金字塔图案。
输入描述:
多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。
输出描述:
针对每行输入,输出用“*”组成的金字塔,每个“*”后面有一个空格。
思路 :
首先可以想到这个由普通的直角三角形进行添加空格的操作
然后变成金字塔的形状 也是先打印空格 然后再打印星号加空格
*
**
***
****
*****
.......
由上面的直角三角形变形而来
先在星号后面加空格
然后在空格和星号前面加空格
-
理解问题:首先,要清楚题目要求打印一个等腰三角形图案,该三角形由星号(
*
)组成,且星号后面跟着一个空格。 -
确定输入:题目要求输入一个整数(2~20),这个整数表示金字塔一边的星号数量,同时也决定了打印的行数。
-
确定输出格式:每行的星号数量从1开始递增,直到达到最底层的n个星号。每行星号之间用空格分隔,星号后面也要跟一个空格。空格的数量需要根据当前行的位置来确定,以保证星号居中对齐。
-
设计算法:
- 使用一个外部循环(
for
循环)来控制行数,循环变量i
从1遍历到n。 - 对于每一行,首先需要打印一定数量的空格,使得星号能够居中。空格的数量可以通过
(n - i) * 2
来计算,因为除了最中间的星号外,每增加一行,两边都会多出一个空格。 - 接着,使用一个内部循环(另一个
for
循环)来打印星号。每行的星号数量为2 * i - 1
,这是因为除了第一行和最后一行外,其他每行的星号数量都是奇数,并且随着行数的增加,星号数量线性增加。 - 每行打印完成后,使用
printf("\n")
输出一个换行符,以便开始打印下一行。
- 使用一个外部循环(
-
编写代码:根据上述算法设计,编写C语言代码实现功能。
-
处理多组输入:题目中提到有多组输入,因此使用
while
循环结合scanf
函数来持续读取输入,直到EOF(文件结束符)。
代码 1 :
/*思路 : 首先可以想到这个由普通的直角三角形进行添加空格的操作
然后变成金字塔的形状 也是先打印空格 然后再打印星号加空格
*
**
***
****
*****
.......
由上面的直角三角形变形而来
先在星号后面加空格
然后在空格和星号前面加空格
*/
# include <stdio.h>
int main ()
{
int n = 0;
while(scanf("%d",&n)!=EOF)
{
int i = 0;
for(i = 0; i<n; i++)//控制行
{
int j = 0;
for(j=n-1;j>i;j--)//控制每行的空格 尤其要注意 j=n-1
//不能写成 j=n
{
printf(" ");
}
for(j=0;j<=i;j++)//这是打印星号和空格的循环
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
-------------------------------------------------------------------
#include <stdio.h> // 包含标准输入输出库
int main() // 主函数的开始
{
int n = 0; // 定义一个整型变量n,用于存储用户输入的金字塔一边的长度
// 使用while循环来处理多组输入直到文件结束符EOF
while(scanf("%d",&n)!=EOF)
{
int i = 0; // 定义一个整型变量i,用于控制外层循环,表示当前的行数
// 外层循环,控制打印金字塔的每一行
for(i = 0; i < n; i++) // 从第0行开始,直到第n-1行
{
int j = 0; // 定义一个整型变量j,用于控制内层循环
// 内层第一个for循环,控制每行前面的空格数量
// 空格的数量从最后一行的0个空格递增到第0行的n-1个空格
for(j = n - 1; j > i; j--) // 从n-1开始递减到i,打印空格
{
printf(" "); // 打印一个空格
}
// 内层第二个for循环,控制每行打印星号和空格
// 星号的数量随着行数的递增而递增,从第0行的1个星号到第n-1行的n个星号
for(j = 0; j <= i; j++) // 从0开始递增,打印i+1个星号和空格
{
printf("* "); // 打印一个星号和一个空格
}
printf("\n"); // 每行结束后打印换行符,以便开始新一行的打印
}
}
return 0; // 主函数结束,返回0表示程序正常结束
}
程序使用while
循环来处理多组输入,直到遇到EOF。在每次循环中,首先读取用户输入的整数n
,这个整数表示金字塔一边的长度。
外层for
循环控制打印金字塔的行数,从第0行开始直到第n-1行。
对于每一行,首先是内层第一个for
循环,用于打印空格,空格的数量从最后一行的0个递增到第0行的n-1个。
接着是内层第二个for
循环,用于打印星号和空格,星号的数量从第0行的1个递增到第n-1行的n个。
每完成一行的打印后,使用printf("\n")
来换行,准备打印下一行。当所有行都打印完毕后,while
循环结束,程序返回0,表示正常退出。
代码 2 :
#include <stdio.h>
int main() {
int n;
// 使用while循环处理多组输入直到EOF
while (scanf("%d", &n) != EOF) {
// 外层循环控制打印的行数
for (int i = 1; i <= n; i++) {
// 打印空格,使星号居中
for (int j = 0; j < (n - i) * 2; j++) {
printf(" ");
}
// 打印星号,每行的星号数量为2*i - 1
for (int k = 1; k <= 2 * i - 1; k++) {
printf("* ");
}
// 每行结束后换行
printf("\n");
}
}
return 0; // 程序结束
}
代码 3 :
//对于有行有列的图形采用双循环,i控制行,j控制列
//对于这种金字塔,倒三角,我们可以先利用循环把空格打印出来,然后在相应的位置放上*.
#include<stdio.h>
int main()
{
int i,j,n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) { //行
for (int j = 0; j <n - i-1; j++) {//列,观察列与行的关系
printf(" ");
}
for (int j = 0; j<= i; j++) {
printf("* ");
}
printf("\n");
}
}
}
-----------------------------------------------------------------------------
#include <stdio.h> // 引入标准输入输出库函数
int main() // 主函数开始
{
int i, j, n; // 定义三个整型变量i, j, n,分别用于控制行数,列数和读取用户输入的金字塔边长
// 使用while循环处理多组输入直到文件结束符EOF
while (scanf("%d", &n) != EOF)
{
// 外层循环,控制金字塔的行数,从0到n-1
for (int i = 0; i < n; i++)
{
// 内层第一个循环,控制每行前面的空格数量
// 空格的数量为n - i - 1,随着行数增加,前面的空格减少
for (int j = 0; j < n - i - 1; j++) // 列循环,打印空格
{
printf(" "); // 打印一个空格
}
// 内层第二个循环,控制每行打印星号的数量
// 星号的数量为i + 1,随着行数增加,星号数量增加
for (int j = 0; j <= i; j++) // 列循环,打印星号和空格
{
printf("* "); // 打印一个星号和一个空格
}
printf("\n"); // 每行结束后打印换行符,以便开始新一行的打印
}
}
return 0; // 主函数结束,返回0表示程序正常退出
}
程序使用while
循环来处理多组输入,直到遇到EOF。在每次循环中,首先读取用户输入的整数n
,这个整数表示金字塔一边的长度。
外层for
循环控制打印金字塔的行数,从第0行开始直到第n-1行。对于每一行,首先是内层第一个for
循环,用于打印空格,空格的数量为n - i - 1
。
接着是内层第二个for
循环,用于打印星号和空格,星号的数量为i + 1
。
每完成一行的打印后,使用printf("\n")
来换行,准备打印下一行。
当所有行都打印完毕后,while
循环结束,程序返回0,表示正常退出。