调整课次结构:前9节重新排序,新建第06课一维数组,后3节不变
This commit is contained in:
151
第03课-嵌套循环与图形打印/教案-学生版.md
Normal file
151
第03课-嵌套循环与图形打印/教案-学生版.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# 第5课:嵌套循环与图形打印
|
||||
|
||||
## 教学目标
|
||||
- 理解嵌套循环的执行流程(外层管行、内层管列)
|
||||
- 能分析图形规律,写出对应的行列公式
|
||||
- 掌握矩形、直角三角形、等腰三角形、菱形的打印方法
|
||||
- 掌握多层循环以及分支与循环相互嵌套
|
||||
|
||||
## 核心考点:嵌套循环中的行列关系
|
||||
|
||||
### 考什么
|
||||
根据图形推导每一行的________数和________数,再使用嵌套循环输出。
|
||||
|
||||
### 必须理解
|
||||
________循环负责行数,________循环负责当前行中的字符数量。等腰三角形第 i 行有________个前导空格、________个星号。
|
||||
|
||||
### 核心写法
|
||||
```cpp
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= ________; j++) cout << ' ';
|
||||
for (int j = 1; j <= ________; j++) cout << '*';
|
||||
____________________;
|
||||
}
|
||||
```
|
||||
|
||||
### 常见错误
|
||||
- 换行应写在内层循环里面还是外面?________________
|
||||
- 为什么内层循环的次数常常与 i 有关?________________
|
||||
- 行号从0开始时,能否直接使用从1开始的公式?________
|
||||
|
||||
### 判断是否掌握
|
||||
- [ ] 我能列出每行空格数和符号数。
|
||||
- [ ] 我能由行号推导数量公式。
|
||||
- [ ] 我能正确安排内外层循环与换行。
|
||||
|
||||
---
|
||||
|
||||
## 课堂编程题
|
||||
|
||||
### 课堂1:实心与空心矩形【适中】
|
||||
|
||||
**题目描述:** 输入行数 `n`、列数 `m` 和模式 `type`。当 `type=1` 时打印实心矩形;当 `type=2` 时打印空心矩形。
|
||||
|
||||
**输入格式:** 依次输入行数、列数和图形模式。
|
||||
|
||||
**输出格式:** 用星号打印指定矩形。
|
||||
|
||||
**数据范围:** `1≤n,m≤30`,`type` 为 1 或 2。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3 5 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*****
|
||||
* *
|
||||
*****
|
||||
```
|
||||
|
||||
**解题思路:** 双层循环枚举行列。实心模式总输出星号;空心模式只在首尾行或首尾列输出星号。
|
||||
|
||||
**易错提醒:** 每打印完一行才换行;`n=1` 或 `m=1` 时所有位置都在边界上。
|
||||
|
||||
### 课堂2:四种直角三角形【适中】
|
||||
|
||||
**题目描述:** 输入 `n` 和类型 `type`,打印边长为 `n` 的直角三角形:1 左下、2 右下、3 左上、4 右上。
|
||||
|
||||
**输入格式:** 输入三角形边长和图形类型。
|
||||
|
||||
**输出格式:** 指定方向的星号三角形。
|
||||
|
||||
**数据范围:** `1≤n≤30`,`1≤type≤4`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
4 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*
|
||||
**
|
||||
***
|
||||
****
|
||||
```
|
||||
|
||||
**解题思路:** 第 `i` 行星号数量为 `i` 或 `n-i+1`;右对齐时先输出相应数量空格。
|
||||
|
||||
**易错提醒:** 右对齐不是改变星号数量,而是在星号前补空格。
|
||||
|
||||
### 课堂3:等腰三角形与菱形【适中】
|
||||
|
||||
**题目描述:** 输入 `n` 和模式 `type`。模式 1 打印高为 `n` 的实心等腰三角形;模式 2 打印上下高度均为 `n`、中间行不重复的菱形。
|
||||
|
||||
**输入格式:** 输入图形高度和图形模式。
|
||||
|
||||
**输出格式:** 指定图形。
|
||||
|
||||
**数据范围:** `1≤n≤20`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*
|
||||
***
|
||||
*****
|
||||
***
|
||||
*
|
||||
```
|
||||
|
||||
**解题思路:** 上半部分第 `i` 行有 `n-i` 个空格和 `2i-1` 个星号;菱形下半部分按相反规律输出。
|
||||
|
||||
**易错提醒:** 菱形下半部分从 `n-1` 开始,避免中间最长行重复。
|
||||
|
||||
### 课堂4:九九乘法表【适中】
|
||||
|
||||
**题目描述:** 输入 `n`,打印 `1~n` 的下三角乘法表。第 `i` 行输出 `1×i` 到 `i×i`。
|
||||
|
||||
**输入格式:** 输入乘法表的最大因数。
|
||||
|
||||
**输出格式:** 下三角乘法表,每项格式为 `j*i=积`,项之间一个空格。
|
||||
|
||||
**数据范围:** `1≤n≤9`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
1*1=1
|
||||
1*2=2 2*2=4
|
||||
1*3=3 2*3=6 3*3=9
|
||||
```
|
||||
|
||||
**解题思路:** 外层 `i` 控制行和第二个因数,内层 `j` 从 1 走到 `i`。
|
||||
|
||||
**易错提醒:** 内层上界是当前行号 `i`,不是固定的 `n`。
|
||||
|
||||
---
|
||||
|
||||
## 课后作业
|
||||
|
||||
> 请完成本课对应的课后作业,见编程题文件。
|
||||
310
第03课-嵌套循环与图形打印/教案-教师版.md
Normal file
310
第03课-嵌套循环与图形打印/教案-教师版.md
Normal file
@@ -0,0 +1,310 @@
|
||||
# 第5课:嵌套循环与图形打印
|
||||
|
||||
## 教学目标
|
||||
- 理解嵌套循环的执行流程(外层管行、内层管列)
|
||||
- 能分析图形规律,写出对应的行列公式
|
||||
- 掌握矩形、直角三角形、等腰三角形、菱形的打印方法
|
||||
- 掌握多层循环以及分支与循环相互嵌套的二级必考写法
|
||||
|
||||
## 核心考点:嵌套循环中的行列关系
|
||||
|
||||
### 考什么
|
||||
题目会给出矩形、三角形或菱形,要求分析每一行应输出多少空格和符号,再用嵌套循环打印。考试重点不是背某个图形,而是能从行号推导本行各部分的数量。
|
||||
|
||||
### 必须理解
|
||||
外层循环每执行一次就完成一整行,因此负责行数;内层循环在当前行中重复输出,负责列数或某种字符数量。解决图形题应先列出“第 i 行有多少空格、多少星号”,再把数量写成关于 i 和总行数 n 的公式。例如等腰三角形第 i 行:前导空格 `n-i` 个,星号 `2*i-1` 个。每一类字符分别使用一个内层循环,行末统一换行。
|
||||
|
||||
### 核心写法
|
||||
```cpp
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= n - i; j++) cout << ' ';
|
||||
for (int j = 1; j <= 2 * i - 1; j++) cout << '*';
|
||||
cout << endl;
|
||||
}
|
||||
```
|
||||
外层的 i 表示当前行,两个内层循环的上界由 i 决定,所以每行形状都会变化。
|
||||
|
||||
### 常见错误
|
||||
- 把换行写进内层循环,导致每输出一个字符就换行。
|
||||
- 内层循环上界始终写 n,无法随行号改变图形。
|
||||
- 行号从 0 开始,却直接套用从 1 开始推导的公式。
|
||||
- 只凭眼睛试代码,不先写出行号与数量表。
|
||||
|
||||
### 判断是否掌握
|
||||
面对新图形时,能先列前三行的空格数和符号数,推导出关于 i 的公式,再独立写出外层、内层和换行代码。
|
||||
|
||||
---
|
||||
|
||||
## 题目一:打印实心矩形
|
||||
|
||||
### 核心代码(一句话)
|
||||
> 嵌套循环的核心:**外层循环管行数,内层循环管列数**,两层 `for` 一套就行。
|
||||
|
||||
### 自然语言思路
|
||||
我们要打印一个 n 行 m 列的矩形,全是星号。
|
||||
|
||||
第一步,确定要印几行:n 行,所以外层循环从 1 到 n。
|
||||
第二步,每一行里面要印几个星号:m 个,所以内层循环从 1 到 m。
|
||||
第三步,每印完一行,记得换行 `cout << endl`。
|
||||
第四步,把上面三步写成代码 —— 外层 `for` 套一个内层 `for`,里面 `cout` 星号,外面 `cout` 换行。
|
||||
|
||||
> 想象你在一行一行地写字:外层决定写几行,内层决定每行写几个字。
|
||||
|
||||
### 伪代码
|
||||
```
|
||||
1. 输入 n, m
|
||||
2. for i = 1 到 n: // 外层:控制行
|
||||
3. for j = 1 到 m: // 内层:控制列
|
||||
4. 输出 "* "
|
||||
5. 输出换行
|
||||
```
|
||||
|
||||
### 真实代码
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n, m;
|
||||
cin >> n >> m;
|
||||
|
||||
for (int i = 1; i <= n; i++) { // 外层循环:n 行
|
||||
for (int j = 1; j <= m; j++) { // 内层循环:每行 m 个
|
||||
cout << "* ";
|
||||
}
|
||||
cout << endl; // 每行结束换行
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 注意点
|
||||
1. **内层循环变量名**:习惯用 `j`,因为 `i` 已经被外层用了。不要在外层和内层用同一个变量名。
|
||||
2. **换行位置**:`cout << endl` 放在外层循环里面、内层循环外面,每行结束只换一次。
|
||||
3. **嵌套理解口诀**:外层每走一步,内层跑完全程。就像时钟——时针走一格,分针转一整圈。
|
||||
|
||||
---
|
||||
|
||||
## 题目二:直角三角形(左下 + 右下)
|
||||
|
||||
### 核心代码(一句话)
|
||||
> 直角三角形的核心:**第 i 行打印 i 个星号**,内层循环的终止条件用 `j <= i`。
|
||||
|
||||
### 自然语言思路
|
||||
|
||||
**左下直角三角形**:
|
||||
第一步,观察规律:第1行1个星,第2行2个星,第3行3个星……第 i 行 i 个星。
|
||||
第二步,每行的星号数量**等于行号**。
|
||||
第三步,内层循环写成 `for (j = 1; j <= i; j++)`,就搞定了。
|
||||
|
||||
**右下直角三角形**:
|
||||
第一步,先看空格:第1行前面有 n-1 个空格,第2行前面有 n-2 个空格……第 i 行前面有 n-i 个空格。
|
||||
第二步,空格用**另一个内层循环**先打印:`for (j = 1; j <= n - i; j++)`。
|
||||
第三步,再打印星号,和第 i 行 i 个星一样。
|
||||
第四步,每行顺序:先空格、后星号、再换行。
|
||||
|
||||
### 伪代码
|
||||
|
||||
**左下直角三角形**:
|
||||
```
|
||||
1. 输入 n
|
||||
2. for i = 1 到 n:
|
||||
3. for j = 1 到 i: // 第 i 行 i 个星
|
||||
4. 输出 "* "
|
||||
5. 输出换行
|
||||
```
|
||||
|
||||
**右下直角三角形**:
|
||||
```
|
||||
1. 输入 n
|
||||
2. for i = 1 到 n:
|
||||
3. for j = 1 到 n-i: // 先打 n-i 个空格
|
||||
4. 输出 " " // 两个空格(跟星号对齐)
|
||||
5. for j = 1 到 i: // 再打 i 个星
|
||||
6. 输出 "* "
|
||||
7. 输出换行
|
||||
```
|
||||
|
||||
### 真实代码
|
||||
|
||||
**左下直角三角形**:
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= i; j++) { // 关键:j <= i
|
||||
cout << "* ";
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**右下直角三角形**:
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
|
||||
for (int i = 1; i <= n; i++) {
|
||||
// 先打空格
|
||||
for (int j = 1; j <= n - i; j++) {
|
||||
cout << " "; // 两个空格,跟 "* " 宽度一致
|
||||
}
|
||||
// 再打星号
|
||||
for (int j = 1; j <= i; j++) {
|
||||
cout << "* ";
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 注意点
|
||||
1. **空格数量要对齐**:如果星号之间用 `"* "`(星号+空格),那么空格也要打印两个空格 `" "`,否则对不齐。
|
||||
2. **左下直角三角形最简单**:第 i 行 = i 个星,这是所有图形打印的母题,先把这个吃透。
|
||||
3. **右下 = 左下 + 空格**:右下直角就是把左下直角往右推,推的力度 = 前面的空格数。
|
||||
|
||||
---
|
||||
|
||||
## 题目三:等腰三角形与菱形
|
||||
|
||||
### 核心代码(一句话)
|
||||
> 等腰三角形的核心:第 i 行有 **2i - 1** 个星号,前面的空格数为 **n - i**;菱形 = 正等腰 + 倒等腰。
|
||||
|
||||
### 自然语言思路
|
||||
|
||||
**等腰三角形**:
|
||||
第一步,观察规律:n=5 时,第1行1个星,第2行3个星,第3行5个星……每行多2个星。
|
||||
第二步,归纳公式:第 i 行星号数 = `2 * i - 1`。
|
||||
第三步,空格规律和右下直角一样:第 i 行前面 n-i 个空格。
|
||||
第四步,先打空格,再打星号,换行,搞定。
|
||||
|
||||
**菱形**:
|
||||
第一步,把菱形拆成两半:上半 = n 行等腰三角形,下半 = n-1 行倒等腰三角形。
|
||||
第二步,上半直接复用等腰三角形代码。
|
||||
第三步,下半倒过来:从第 n-1 行开始,递减到第 1 行。空格和星号公式不变,只是循环方向反过来。
|
||||
第四步,上下拼起来就是菱形。
|
||||
|
||||
### 伪代码
|
||||
|
||||
**等腰三角形**:
|
||||
```
|
||||
1. 输入 n
|
||||
2. for i = 1 到 n:
|
||||
3. for j = 1 到 n-i: // 空格:n-i 个
|
||||
4. 输出 " "
|
||||
5. for j = 1 到 2*i-1: // 星号:2i-1 个
|
||||
6. 输出 "*"
|
||||
7. 输出换行
|
||||
```
|
||||
|
||||
**菱形**:
|
||||
```
|
||||
1. 输入 n(上半部分行数)
|
||||
2. // 上半:正等腰三角形
|
||||
3. for i = 1 到 n:
|
||||
4. 打空格、打星号、换行(同上)
|
||||
5. // 下半:倒等腰三角形
|
||||
6. for i = n-1 递减到 1:
|
||||
7. 打空格、打星号、换行(同上)
|
||||
```
|
||||
|
||||
### 真实代码
|
||||
|
||||
**等腰三角形**:
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
|
||||
for (int i = 1; i <= n; i++) {
|
||||
// 空格
|
||||
for (int j = 1; j <= n - i; j++) {
|
||||
cout << " ";
|
||||
}
|
||||
// 星号:2i - 1
|
||||
for (int j = 1; j <= 2 * i - 1; j++) {
|
||||
cout << "*";
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**菱形**:
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
|
||||
// 上半部分:正等腰三角形
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= n - i; j++) cout << " ";
|
||||
for (int j = 1; j <= 2 * i - 1; j++) cout << "*";
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
// 下半部分:倒等腰三角形(n-1 行)
|
||||
for (int i = n - 1; i >= 1; i--) {
|
||||
for (int j = 1; j <= n - i; j++) cout << " ";
|
||||
for (int j = 1; j <= 2 * i - 1; j++) cout << "*";
|
||||
cout << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 注意点
|
||||
1. **等腰三角形星号公式 `2*i-1`**:这是最核心的公式,建议学生背下来。推导:第1行1个,每行多2个 → 等差数列 → 1 + 2×(i-1) = 2i-1。
|
||||
2. **菱形下半部分循环递减**:`for (i = n-1; i >= 1; i--)`,注意从 `n-1` 开始,不是 `n`,否则中间那行会重复。
|
||||
3. **空格只用一个空格**:等腰三角形通常用一个空格 `" "` 而不是两个,因为星号之间不加空格。
|
||||
4. **如果 n=1**:下半部分 `i = 0`,`0 >= 1` 为假,不执行,只打印一行星号,也是对的。
|
||||
|
||||
---
|
||||
|
||||
## 图形打印技巧总结
|
||||
|
||||
| 图形 | 第 i 行星号数 | 第 i 行空格数 | 关键点 |
|
||||
|------|-------------|-------------|--------|
|
||||
| 左下直角三角形 | `i` | 0 | 最简单,母题 |
|
||||
| 左上直角三角形 | `n - i + 1` | 0 | 倒过来即可 |
|
||||
| 右下直角三角形 | `i` | `n - i` | = 左下 + 空格 |
|
||||
| 右上直角三角形 | `n - i + 1` | `i - 1` | = 左上 + 空格 |
|
||||
| 等腰三角形 | `2i - 1` | `n - i` | 核心公式 |
|
||||
| 倒等腰三角形 | `2i - 1` | `n - i` | i 递减即可 |
|
||||
| 菱形 | 上同等腰,下同倒等腰 | 同上 | 上下拼接 |
|
||||
|
||||
---
|
||||
|
||||
## 本课打油诗
|
||||
|
||||
> 外层循环管行数,内层循环管列数。
|
||||
> 图形打印找规律,行列关系是正路。
|
||||
> 第 i 行星号看公式,空格星号分清楚。
|
||||
> 等腰三角二 i 减一,菱形上下拼一處。
|
||||
|
||||
---
|
||||
|
||||
## 课后作业
|
||||
1. 输入 n,打印左上直角三角形(第1行 n 个星,第2行 n-1 个星……)
|
||||
2. 输入 n,打印数字三角形(第1行1,第2行1 2……)
|
||||
3. 输入 n 和 m,打印 n 行 m 列的空心矩形(只有边框有星号)
|
||||
4. 输入 n,打印九九乘法表(第 i 行输出 i 个乘法式子)
|
||||
660
第03课-嵌套循环与图形打印/编程题-教师版.md
Normal file
660
第03课-嵌套循环与图形打印/编程题-教师版.md
Normal file
@@ -0,0 +1,660 @@
|
||||
# 第6课编程题(教师版)
|
||||
|
||||
## 本课知识点覆盖表
|
||||
|
||||
| 核心知识点 | GESP等级 | 对应课堂题 |
|
||||
|---|---|---|
|
||||
| 外层控制行、内层控制列、实心矩形 | 二级必考 | 课堂1 |
|
||||
| 行列关系、左下与右下三角形 | 二级必考 | 课堂2 |
|
||||
| 空格数与星号数、等腰三角形与菱形 | 二级必考 | 课堂3 |
|
||||
| 双层循环的非图形应用、行列组合 | 二级 | 课堂4 |
|
||||
|
||||
## 一、课堂练习(4题)
|
||||
|
||||
### 课堂1:实心与空心矩形【适中】
|
||||
|
||||
**题目描述:** 输入行数 `n`、列数 `m` 和模式 `type`。当 `type=1` 时打印实心矩形;当 `type=2` 时打印空心矩形。
|
||||
|
||||
**输入格式:** 依次输入行数、列数和图形模式。
|
||||
|
||||
**输出格式:** 用星号打印指定矩形。
|
||||
|
||||
**数据范围:** `1≤n,m≤30`,`type` 为 1 或 2。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3 5 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*****
|
||||
* *
|
||||
*****
|
||||
```
|
||||
|
||||
**解题思路:** 双层循环枚举行列。实心模式总输出星号;空心模式只在首尾行或首尾列输出星号。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n, m, type;
|
||||
cin >> n >> m >> type;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= m; j++) {
|
||||
if (type == 1 || i == 1 || i == n || j == 1 || j == m)
|
||||
cout << "*";
|
||||
else
|
||||
cout << " ";
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 每打印完一行才换行;`n=1` 或 `m=1` 时所有位置都在边界上。
|
||||
|
||||
### 课堂2:四种直角三角形【适中】
|
||||
|
||||
**题目描述:** 输入 `n` 和类型 `type`,打印边长为 `n` 的直角三角形:1 左下、2 右下、3 左上、4 右上。
|
||||
|
||||
**输入格式:** 输入三角形边长和图形类型。
|
||||
|
||||
**输出格式:** 指定方向的星号三角形。
|
||||
|
||||
**数据范围:** `1≤n≤30`,`1≤type≤4`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
4 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*
|
||||
**
|
||||
***
|
||||
****
|
||||
```
|
||||
|
||||
**解题思路:** 第 `i` 行星号数量为 `i` 或 `n-i+1`;右对齐时先输出相应数量空格。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n, type;
|
||||
cin >> n >> type;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
int stars = (type == 1 || type == 2) ? i : n - i + 1;
|
||||
int spaces = (type == 2 || type == 4) ? n - stars : 0;
|
||||
for (int j = 1; j <= spaces; j++) cout << " ";
|
||||
for (int j = 1; j <= stars; j++) cout << "*";
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 右对齐不是改变星号数量,而是在星号前补空格。
|
||||
|
||||
### 课堂3:等腰三角形与菱形【适中】
|
||||
|
||||
**题目描述:** 输入 `n` 和模式 `type`。模式 1 打印高为 `n` 的实心等腰三角形;模式 2 打印上下高度均为 `n`、中间行不重复的菱形。
|
||||
|
||||
**输入格式:** 输入图形高度和图形模式。
|
||||
|
||||
**输出格式:** 指定图形。
|
||||
|
||||
**数据范围:** `1≤n≤20`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*
|
||||
***
|
||||
*****
|
||||
***
|
||||
*
|
||||
```
|
||||
|
||||
**解题思路:** 上半部分第 `i` 行有 `n-i` 个空格和 `2i-1` 个星号;菱形下半部分按相反规律输出。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
void printRow(int spaces, int stars) {
|
||||
for (int j = 0; j < spaces; j++) cout << " ";
|
||||
for (int j = 0; j < stars; j++) cout << "*";
|
||||
cout << "\n";
|
||||
}
|
||||
|
||||
int main() {
|
||||
int n, type;
|
||||
cin >> n >> type;
|
||||
for (int i = 1; i <= n; i++) printRow(n - i, 2 * i - 1);
|
||||
if (type == 2) {
|
||||
for (int i = n - 1; i >= 1; i--) printRow(n - i, 2 * i - 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 菱形下半部分从 `n-1` 开始,避免中间最长行重复。
|
||||
|
||||
### 课堂4:九九乘法表【适中】
|
||||
|
||||
**题目描述:** 输入 `n`,打印 `1~n` 的下三角乘法表。第 `i` 行输出 `1×i` 到 `i×i`。
|
||||
|
||||
**输入格式:** 输入乘法表的最大因数。
|
||||
|
||||
**输出格式:** 下三角乘法表,每项格式为 `j*i=积`,项之间一个空格。
|
||||
|
||||
**数据范围:** `1≤n≤9`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
1*1=1
|
||||
1*2=2 2*2=4
|
||||
1*3=3 2*3=6 3*3=9
|
||||
```
|
||||
|
||||
**解题思路:** 外层 `i` 控制行和第二个因数,内层 `j` 从 1 走到 `i`。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= i; j++) {
|
||||
if (j > 1) cout << " ";
|
||||
cout << j << "*" << i << "=" << j * i;
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 内层上界是当前行号 `i`,不是固定的 `n`。
|
||||
|
||||
## 二、课后作业(3题)
|
||||
|
||||
### 课后1:实心正方形【简单】
|
||||
|
||||
**题目描述:** 输入 `n`,打印 `n×n` 的星号正方形。
|
||||
|
||||
**输入格式:** 输入正方形的边长。
|
||||
|
||||
**输出格式:** 实心正方形。
|
||||
|
||||
**数据范围:** `1≤n≤20`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
***
|
||||
***
|
||||
***
|
||||
```
|
||||
|
||||
**解题思路:** 外层循环 `n` 行,内层每行输出 `n` 个星号。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= n; j++) cout << "*";
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 换行语句应放在内层循环结束之后。
|
||||
|
||||
### 课后2:左下数字三角形【简单】
|
||||
|
||||
**题目描述:** 输入 `n`,第 `i` 行输出 `i` 个数字 `i`。
|
||||
|
||||
**输入格式:** 输入数字三角形的行数。
|
||||
|
||||
**输出格式:** 数字三角形。
|
||||
|
||||
**数据范围:** `1≤n≤9`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
4
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
1
|
||||
22
|
||||
333
|
||||
4444
|
||||
```
|
||||
|
||||
**解题思路:** 外层行号决定输出数字,也决定内层循环次数。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= i; j++) cout << i;
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 输出的是行号 `i`,不是列号 `j`。
|
||||
|
||||
### 课后3:棋盘格【简单】
|
||||
|
||||
**题目描述:** 输入 `n` 和 `m`,打印棋盘格;行列编号之和为偶数输出 `#`,否则输出 `.`。
|
||||
|
||||
**输入格式:** 输入棋盘格的行数和列数。
|
||||
|
||||
**输出格式:** `n` 行 `m` 列棋盘格。
|
||||
|
||||
**数据范围:** `1≤n,m≤30`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3 4
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
#.#.
|
||||
.#.#
|
||||
#.#.
|
||||
```
|
||||
|
||||
**解题思路:** 双层循环枚举位置,根据 `(i+j)%2` 决定字符。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n, m;
|
||||
cin >> n >> m;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= m; j++)
|
||||
cout << ((i + j) % 2 == 0 ? '#' : '.');
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 行列从 1 开始时,左上角的和为 2,应输出 `#`。
|
||||
|
||||
## 三、扩展练习(7题)
|
||||
|
||||
### 扩展1:坐标表【基础综合】
|
||||
|
||||
**题目描述:** 输入 `n m`,按行输出所有坐标 `(i,j)`。
|
||||
|
||||
**输入格式:** 输入坐标表的行数和列数。
|
||||
|
||||
**输出格式:** 每行输出一行坐标,坐标之间一个空格。
|
||||
|
||||
**数据范围:** `1≤n,m≤10`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
2 2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
(1,1) (1,2)
|
||||
(2,1) (2,2)
|
||||
```
|
||||
|
||||
**解题思路:** 外层决定第一坐标,内层决定第二坐标。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n, m;
|
||||
cin >> n >> m;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= m; j++) {
|
||||
if (j > 1) cout << " ";
|
||||
cout << "(" << i << "," << j << ")";
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 同一行坐标之间输出空格,行末不必输出多余空格。
|
||||
|
||||
### 扩展2:回文数字三角形【中等】
|
||||
|
||||
**题目描述:** 输入 `n`,第 `i` 行依次输出 `1~i~1`。
|
||||
|
||||
**输入格式:** 输入回文数字三角形的行数。
|
||||
|
||||
**输出格式:** 回文数字三角形。
|
||||
|
||||
**数据范围:** `1≤n≤9`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
4
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
1
|
||||
121
|
||||
12321
|
||||
1234321
|
||||
```
|
||||
|
||||
**解题思路:** 每行使用两个内层循环:第一个递增到 `i`,第二个从 `i-1` 递减到 1。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= i; j++) cout << j;
|
||||
for (int j = i - 1; j >= 1; j--) cout << j;
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 下降部分从 `i-1` 开始,避免中间数字重复。
|
||||
|
||||
### 扩展3:空心直角三角形【中等】
|
||||
|
||||
**题目描述:** 输入 `n`,打印左下空心直角三角形。
|
||||
|
||||
**输入格式:** 输入空心直角三角形的边长。
|
||||
|
||||
**输出格式:** 指定图形。
|
||||
|
||||
**数据范围:** `2≤n≤30`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
5
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*
|
||||
**
|
||||
* *
|
||||
* *
|
||||
*****
|
||||
```
|
||||
|
||||
**解题思路:** 第 `i` 行有 `i` 个位置;首列、斜边 `j=i`、底边 `i=n` 输出星号。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= i; j++) {
|
||||
if (j == 1 || j == i || i == n) cout << "*";
|
||||
else cout << " ";
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 第二行两个位置都属于边界,所以会输出两个星号。
|
||||
|
||||
### 扩展4:字母方阵【中等】
|
||||
|
||||
**题目描述:** 输入 `n`,第 `i` 行第 `j` 列输出从 `A` 开始向后平移 `i+j-2` 位的字母,超过 `Z` 循环。
|
||||
|
||||
**输入格式:** 输入字母方阵的边长。
|
||||
|
||||
**输出格式:** `n×n` 字母方阵。
|
||||
|
||||
**数据范围:** `1≤n≤20`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
ABC
|
||||
BCD
|
||||
CDE
|
||||
```
|
||||
|
||||
**解题思路:** 用行列共同决定平移量,字符公式为 `'A'+(i+j-2)%26`。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= n; j++)
|
||||
cout << (char)('A' + (i + j - 2) % 26);
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** ASCII 平移后要转换为字符;取模保证不会越过 `Z`。
|
||||
|
||||
### 扩展5:X形图案【中等】
|
||||
|
||||
**题目描述:** 输入奇数 `n`,打印 `n×n` 方阵,两条对角线输出 `*`,其他位置输出 `.`。
|
||||
|
||||
**输入格式:** 输入一个奇数,表示方阵的边长。
|
||||
|
||||
**输出格式:** X 形图案。
|
||||
|
||||
**数据范围:** `1≤n≤31`,`n` 为奇数。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
5
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*...*
|
||||
.*.*.
|
||||
..*..
|
||||
.*.*.
|
||||
*...*
|
||||
```
|
||||
|
||||
**解题思路:** 主对角线满足 `i=j`,副对角线满足 `i+j=n+1`。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= n; j++) {
|
||||
if (i == j || i + j == n + 1) cout << "*";
|
||||
else cout << ".";
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 副对角线条件使用 `n+1`,因为行列编号从 1 开始。
|
||||
|
||||
### 扩展6:空心菱形【略难】
|
||||
|
||||
**题目描述:** 输入 `n`,打印总高度为 `2n-1` 的空心菱形。
|
||||
|
||||
**输入格式:** 输入菱形上半部分的高度。
|
||||
|
||||
**输出格式:** 空心菱形。
|
||||
|
||||
**数据范围:** `1≤n≤20`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
*
|
||||
```
|
||||
|
||||
**解题思路:** 把每一行映射为到中间行的层数 `level`;输出前导空格、左边星号,宽度大于 1 时再输出内部空格和右边星号。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int row = 1; row <= 2 * n - 1; row++) {
|
||||
int level = n - abs(n - row);
|
||||
int outer = n - level;
|
||||
int inner = 2 * level - 3;
|
||||
for (int j = 0; j < outer; j++) cout << " ";
|
||||
cout << "*";
|
||||
if (inner >= 0) {
|
||||
for (int j = 0; j < inner; j++) cout << " ";
|
||||
cout << "*";
|
||||
}
|
||||
cout << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 顶点和底点只有一个星号,此时不能输出第二个星号。
|
||||
|
||||
### 扩展7:组合沙漏【略难】
|
||||
|
||||
**题目描述:** 输入 `n`,打印由星号组成的实心沙漏。第一行有 `2n-1` 个星号,逐行减少两个到 1,再逐行增加两个;中间行只输出一次。
|
||||
|
||||
**输入格式:** 输入沙漏上半部分的高度。
|
||||
|
||||
**输出格式:** 实心沙漏。
|
||||
|
||||
**数据范围:** `1≤n≤20`。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
*****
|
||||
***
|
||||
*
|
||||
***
|
||||
*****
|
||||
```
|
||||
|
||||
**解题思路:** 上半部分第 `i` 行输出 `i-1` 个空格和 `2(n-i)+1` 个星号;下半部分反向恢复。
|
||||
|
||||
**参考代码:**
|
||||
```cpp
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
void printRow(int spaces, int stars) {
|
||||
for (int j = 0; j < spaces; j++) cout << " ";
|
||||
for (int j = 0; j < stars; j++) cout << "*";
|
||||
cout << "\n";
|
||||
}
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++)
|
||||
printRow(i - 1, 2 * (n - i) + 1);
|
||||
for (int i = n - 1; i >= 1; i--)
|
||||
printRow(i - 1, 2 * (n - i) + 1);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
**易错提醒:** 下半部分从 `n-1` 开始,避免最窄的中间行重复。
|
||||
Reference in New Issue
Block a user