目前主要分为三个专栏,后续还会添加:
专栏如下: C语言刷题解析 C语言系列文章 我的成长经历
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的K形图案。
输入描述:
多组输入,一个整数(2~20)。
输出描述:
针对每行输入,输出用“*”组成的K形,每个“*”后面有一个空格。
思路 :
由输出可以看出 这由一个正着直角三角形和一个倒立的直角三角形组成
也可以分成两部分 上面一部分 下面一部分
-
理解K形图案:K形图案是一个中心对称的图案,从上到下,每行的星号数量逐渐增加,直到中间行,然后每行的星号数量逐渐减少,回到第一行。
-
确定行数:输入的整数
n
决定了K形图案的行数。如果n
是奇数,那么中间行就是第(n+1)/2
行;如果n
是偶数,中间行是n/2
和n/2 + 1
行。 -
打印图案:
- 增加星号:从第1行开始,每行打印相应数量的星号,直到中间行。如果
n
是奇数,中间行有(n+1)/2
个星号;如果n
是偶数,中间两行各有n/2
个星号。 - 打印空格:每打印一个星号后,打印一个空格。
- 减少星号:从中间行之后,每行的星号数量逐渐减少,直到第1行。如果
n
是奇数,从(n+3)/2
行开始减少;如果n
是偶数,从n/2 + 2
行开始减少。
- 增加星号:从第1行开始,每行打印相应数量的星号,直到中间行。如果
-
处理边界情况:当
n=2
时,图案是对称的,需要特别处理。这种情况下,第一行和第二行有1个星号,第三行和第四行有2个星号。 -
实现逻辑:
- 使用一个循环来控制行数,从1到
n
。 - 在每一行,首先确定该行应该有多少个星号。这可以通过计算当前行数与中间行数的关系来实现。
- 然后,使用另一个循环来实际打印星号和空格。
- 最后,每打印完一行后,打印一个换行符以开始新的一行。
- 使用一个循环来控制行数,从1到
代码 1:
#define _CRT_SECURE_NO_WARNINGS/*由输出可以看出 这由一个正着直角三角形和一个倒立的直角三角形组成
也可以分成两部分 上面一部分 下面一部分
*/# include <stdio.h>
int main(){int n = 0;while (scanf("%d", &n) != EOF){int i = 0;//上半部分//控制每行的打印for (i = 0; i < n; i++)//这里是n行 下半部分就是n+1行{//上半部分 倒立的直角三角形//一个星号和一个空格int j = 0;for (j = 0; j < n+1-i; j++)//n+1-i 的意思就是按照题目的意思来打印星号和空格//当我们输入4的时候//总共的打印是n+1个 当打印第一行的时候 i就是0 就打印n+1就可以了//第二行的时候 i就是1 打印n就可以了//第三行的时候 i就是2 打印n-1个就可以了//因为i是小于n的 当i为3 的时候 i<4成立 继续打印//然后i为4的时候 条件不成立 退出循环 打印换行符 就行下半部分的打印{printf("* ");//按照题目的格式来输出}printf("\n");}//下半部分for (i = 0; i < n+1; i++)//n+1行{int j = 0;for (j = 0; j <= i; j++)//i是从0开始计算的 每次累积//i是1的时候打印一个星号和空格 是2的时候打印两个 是3的时候打印三个......{printf("* ");}printf("\n");}}return 0;
}
代码 2 :
// 打印*号的方法
void printXuqiu(int count) // 定义一个函数printXuqiu,用于打印K形图案的上半部分
{for (int i = 0; i <= count; ++i) // 循环从0到count(包括count),控制打印的行数{printf("* "); // 打印一个星号和一个空格if (i == count) // 当打印到上半部分的最后一行时{printf("\n"); // 打印一个换行符,结束当前行printXuqiu(--count); // 递归调用printXuqiu函数,打印下半部分,count减1}}
}// 打印下半部分*号的方法
void printXiaBan(int count) // 定义一个函数printXiaBan,用于打印K形图案的下半部分
{int num = 2; // 初始化变量num为2,用于控制每行打印的星号数量for (int i = 1; i <= count; ++i) // 循环从1到count,控制打印的行数{for (int j = 0; j < num; ++j) // 内层循环,打印当前行的星号{printf("* "); // 打印一个星号和一个空格}if (num <= count) // 当当前行不是最后一行时{printf("\n"); // 打印一个换行符,结束当前行num++; // 增加num的值,以便下一行打印更多的星号}}
}int main() // 定义主函数
{int count = 0; // 定义一个整型变量count,用于存储用户输入的行数scanf("%d", &count); // 读取用户输入的行数if (count >= 2 && count <= 20) // 检查输入的行数是否在2到20之间{printXuqiu(count); // 调用printXuqiu函数,打印K形图案的上半部分printXiaBan(count); // 调用printXiaBan函数,打印K形图案的下半部分}
}