返回 课程
信奥AC之路-2级
0% 完成
0/0 步骤
-
第一课:字符5 主题|小节
-
第二课 嵌套循环与矩形图案(一)4 主题|小节
-
第三课 嵌套循环与矩形图案(二)3 主题|小节
-
第四课:矩形三5 主题|小节
-
第五课:字符矩形7 主题|小节
-
第六课:直角三角形6 主题|小节
-
第七课:倒三角形7 主题|小节
-
第八课:字符三角形8 主题|小节
-
第九课:字符倒三角形7 主题|小节
-
第十课:平行四边形6 主题|小节
-
第十一课:字符直角三角形5 主题|小节
-
第十二课:左斜三角形6 主题|小节
-
第十三课:等腰三角形6 主题|小节
-
第十四课:倒置等腰三角形7 主题|小节
-
第十五课:上下对称图形4 主题|小节
-
第十六课:复杂对称图形5 主题|小节
-
第十七课:左右对称图形5 主题|小节
-
第十八课:空心图形5 主题|小节
-
第十九课:空心图形3 主题|小节
-
第二十课:嵌套应用4 主题|小节
-
第二十一课:嵌套应用二4 主题|小节
-
第二十二课:嵌套应用三3 主题|小节
-
第二十三课:嵌套应用四3 主题|小节
课 进展
0% 完成
“小朋友们,让我们通过一系列有趣的实验来掌握空心图形的创建!”我兴奋地说,”我们将创建各种不同的空心图形!”
19.2.1 打印Z图形
题目描述:输入一个正整数n,输出一个n×n的Z形图案。
样例输入:
5
样例输出:
aaaaa
bbbab
bbabb
babbb
aaaaa
在这个Z形图案中,第一行、最后一行全部是字符’a’,其他行只在对角线位置(从右上到左下)打印字符’a’,其余位置打印字符’b’。
代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入图形的大小n
// 外循环:控制行数,从第1行到第n行
for(int i=1; i<=n; i++) {
// 内循环:控制每行的列数,从第1列到第n列
for(int j=1; j<=n; j++) {
// 判断条件:如果是第一行(i==1)或最后一行(i==n)或对角线位置(j==n+1-i)
// 对角线位置的计算公式n+1-i表示从右上到左下的斜线
if(i==1 || i==n || j==n+1-i) {
cout << 'a'; // 满足条件,输出字符'a'
} else {
cout << 'b'; // 不满足条件,输出字符'b'
}
}
cout << endl; // 每行结束后换行
}
return 0;
}
思考:
- 第一行和最后一行是完整的一行’a’字符:使用条件
i==1 || i==n - 对角线位置的计算是
j==n+1-i,代表从右上角到左下角的斜线 - 注意对角线的计算公式,它表示行号与列号之和等于n+1的位置
19.2.2 打印X图形
题目描述:输入一个正整数n,输出一个n×n的X形图案。
样例输入:
5
样例输出:
abbba
babab
bbabb
babab
abbba
在这个X形图案中,只在两条对角线位置打印字符’a’,其余位置打印字符’b’。
代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入图形的大小n
// 外循环:控制行数,从第1行到第n行
for(int i=1; i<=n; i++) {
// 内循环:控制每行的列数,从第1列到第n列
for(int j=1; j<=n; j++) {
// 判断条件:如果位置在主对角线(j==i)或副对角线(j==n+1-i)上
// 主对角线:从左上到右下,行列索引相等
// 副对角线:从右上到左下,行列索引之和等于n+1
if(j==i || j==n+1-i) {
cout << 'a'; // 满足条件,输出字符'a'
} else {
cout << 'b'; // 不满足条件,输出字符'b'
}
}
cout << endl; // 每行结束后换行
}
return 0;
}
思考:
- 主对角线:
j==i,代表从左上角到右下角的斜线 - 副对角线:
j==n+1-i,代表从右上角到左下角的斜线 - X图形是由两条对角线组成的
19.2.3 H图形
题目描述:输入一个正整数n,输出一个n×n的H形图案。
样例输入:
5
样例输出:
| |
| |
|---|
| |
| |
在这个H形图案中,左右两边是竖线’|’,中间行是横线’-‘,其余位置是空格’ ‘。
代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入图形的大小n
// 外循环:控制行数,从第1行到第n行
for(int i=1; i<=n; i++) {
// 内循环:控制每行的列数,从第1列到第n列
for(int j=1; j<=n; j++) {
// 判断条件1:如果位置在左边界(j==1)或右边界(j==n)上
if(j==1 || j==n) {
cout << '|'; // 在左右边界位置输出竖线'|'
}
// 判断条件2:如果位置在中间行(i==(n+1)/2)上
// (n+1)/2 计算中间行的索引,确保在奇数行数时正确计算中间位置
else if(i==(n+1)/2) {
cout << '-'; // 在中间行位置输出横线'-'
}
// 其他位置
else {
cout << ' '; // 不满足以上条件,输出空格' '
}
}
cout << endl; // 每行结束后换行
}
return 0;
}
思考:
- 左右边界:
j==1 || j==n,打印竖线’|’ - 中间行:
i==(n+1)/2,打印横线’-‘ - 使用
(n+1)/2计算中间行的索引,确保在奇数行数时正确计算中间位置
19.2.4 日字形
题目描述:输入一个正整数n,输出一个n×n的日字形图案。
样例输入:
5
样例输出:
|---|
| |
|---|
| |
|---|
在这个日字形图案中,左右两边是竖线’|’,第一行、中间行和最后一行是横线’-‘,其余位置是空格’ ‘。
代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入图形的大小n
// 外循环:控制行数,从第1行到第n行
for(int i=1; i<=n; i++) {
// 内循环:控制每行的列数,从第1列到第n列
for(int j=1; j<=n; j++) {
// 判断条件1:如果位置在左边界(j==1)或右边界(j==n)上
if(j==1 || j==n) {
cout << '|'; // 在左右边界位置输出竖线'|'
}
// 判断条件2:如果位置在第一行(i==1)、最后一行(i==n)或中间行(i==(n+1)/2)上
else if(i==1 || i==n || i==(n+1)/2) {
cout << '-'; // 在三条横线位置输出'-'
}
// 其他位置
else {
cout << ' '; // 不满足以上条件,输出空格' '
}
}
cout << endl; // 每行结束后换行
}
return 0;
}
思考:
- 日字形是在H形的基础上增加了第一行和最后一行的横线
- 条件判断使用
i==1 || i==n || i==(n+1)/2来确定所有需要打印横线的位置
19.2.5 N图形
题目描述:输入一个正整数n,输出一个n×n的N形图案。
样例输入:
5
样例输出:
+---+
++--+
+-+-+
+--++
+---+
在这个N形图案中,左右两边和主对角线位置打印字符’+’,其余位置打印字符’-‘。
代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读入图形的大小n
// 外循环:控制行数,从第1行到第n行
for(int i=1; i<=n; i++) {
// 内循环:控制每行的列数,从第1列到第n列
for(int j=1; j<=n; j++) {
// 判断条件:如果位置在左边界(j==1)、右边界(j==n)或主对角线(i==j)上
// 主对角线:从左上到右下,行列索引相等
if(j==1 || j==n || i==j) {
cout << '+'; // 满足条件,输出字符'+'
} else {
cout << '-'; // 不满足条件,输出字符'-'
}
}
cout << endl; // 每行结束后换行
}
return 0;
}
思考:
- N形由左边界、右边界和主对角线组成
- 使用条件
j==1 || j==n || i==j来确定这三部分的位置 - 注意N形的主对角线是从左上到右下,使用
i==j判断