写在前面:
题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在教材或其他学习资源找到这些内容学习。😀
本题的预备知识:
- 变量的定义与赋值操作
- 输入(scanf)输出(printf)语句
- for、while循环语句及其嵌套
画一个字母组成的菱形
成绩 | 10 | 开启时间 | 2020年03月28日 星期六 05:50 |
折扣 | 0.8 | 折扣时间 | 2020年04月20日 星期一 08:50 |
允许迟交 | 是 | 关闭时间 | 2020年04月30日 星期四 05:50 |
输入顶行字符和图形的高,输出如图所示图形。
例如顶行字符为 ' A ' ,图形的高为 5
A
B B
C C
D D
E E
D D
C C
B B
A
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 |
|
| 1秒 | 64M | 0 |
题解
这种输出图形的题主要是分清楚图形的结构就好办了。
1、分析结构
首先,可以看到图形的第一行和最后一行与中间的行有一个本质的不同,就是它们只需要输出一个字母,而中间的行需要输出两个字母。那么我们在输出的时候肯定是需要对首尾两行单独特殊考虑的。其次,看字母的变化:在图形的上半部分(包含中间的一行)是每行递增的,而对于图形的下半部分是每行递减的。下图是对结构的完整分析:
考虑到对称的结构,我们这里巧妙地使用了循环遍历 i 来实现每行的变化。是不是很乖啊~
2、代码实现
结构分析清楚后,代码就很简单了。主要是注意:
- 上述结构没有表现字母的变化,在代码中是这样实现的:用一个flag标记当前输出的是上半部分还是下半部分,然后每次检测flag标记来确认我们应该将字母递增还是递减
- 最外层循环(对于行的循环),应该考虑用num来记录已经输出的行数目。整个图应该输出 2h-1 次行,那么就控制 while 循环执行 2h-1 次。
直接上代码啦~
#include <stdio.h> //导入stdio.h库,里面包含输入输出函数
int main() {
int h;
char c;
scanf("%c,%d", &c, &h);
int i = 1, num = 0; //i记录我们在分析时指定的循环变量、num记录已经输出的行数
int flag = 0; //flag = 0 表示正在输出上半部分(包含最中间行)、否则表示正在输出下半部分
/* 循环输出 2h - 1 行 */
while (num < 2 * h - 1) {
/* 输出首尾两行的情况 */
if (i == 1) {
for (int j = 0; j < h - i; j++) //输出 h-i 个空格
printf(" ");
printf("%c", c);
for (int j = 0; j < h - i; j++) //输出 h-i 个空格
printf(" ");
printf("\n");//一定记得换行
}
/* 输出中间行的情况 */
else {
for (int j = 0; j < h - i; j++) //输出 h-i 个空格
printf(" ");
printf("%c", c);
for (int j = 0; j < 2 * i - 3; j++) //输出 2i-3 个空格
printf(" ");
printf("%c", c);
for (int j = 0; j < h - i; j++) //输出 h-i 个空格
printf(" ");
printf("\n"); //一定记得换行
}
if (i >= h) //当已经输出了最中间的一行
flag = 1; //将flag设置为1
/* 在输出上半部分的时候 */
if (flag == 0) {
i++;
c++;
}
/* 在输出下半部分的时候 */
else {
i--;
c--;
}
num++; //输出的行数增加
}
}
关于scanf中的符号问题:
根据题意,此题的两个输入是用 ','(英)隔开的。平常在默认情况下,scanf在读取输入的时候,会默认在空格、换行处断开,然后一一读入,处理输出的时候只需要将相同数量的变量对应上即可。而这里scanf不再能自动分割,你需要告诉它在哪里分割、读入数据,所以在scanf语句中加入了 ',',以表示在读入数据时碰到 ',' 就将内容分割,分别存入安排的两个变量中。
有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~
end
欢迎关注个人公众号“ 鸡翅编程 ”,这里是认真且乖巧的码农一枚。
---- 做最乖巧的博客er,做最扎实的程序员 ----
旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~