- C++
C++从解决实际问题学编程
- 2025-7-7 21:23:34 @
C++编程入门教程:从题目到代码
亲爱的小朋友们,今天我们要一起学习C++编程,通过解决一些有趣的题目来掌握编程的基础知识。这些题目就像小游戏一样,只要我们认真思考,就能编写出正确的程序哦!
第一章:数组的应用——找出没到的同学
题目介绍:春游(GESP2306三级)
老师带同学们春游,班里有N位同学(编号0到N-1),同学们报了M次自己的编号。有的同学可能会报好几次,我们要找出哪些同学没到。如果都到了,就输出N;否则按从小到大输出没到的同学编号。
解题思路
- 我们可以用一个"计数器"数组来记录每个同学是否报过到
- 先把所有同学的计数器都设为0
- 每次有同学报编号,就把对应计数器加1
- 最后检查哪些同学的计数器还是0,这些就是没到的
代码实现(带注释)
// 引入输入输出库,让我们能输入输出信息
#include<iostream>
// 使用标准命名空间,这样可以直接用cout、cin等
using namespace std;
// 定义一个全局数组tong,大小为2000(足够题目使用)
// 全局数组会自动初始化为0,正好符合我们的需求
int tong[2000];
int main() {
// 定义变量n(总人数)和m(报数次数)
int n,m;
// 输入n和m
cin>>n>>m;
// 循环m次,接收每次报的编号
for(int i=1;i<=m;i++){
int a; // 存储当前报的编号
cin>>a;
tong[a]++; // 对应编号的计数器加1
}
// 定义一个标记变量,true表示所有同学都到了
bool flag = true;
// 检查0到n-1号同学是否都到了
for(int i=0;i<=n-1;i++){
// 如果某个同学的计数器为0,说明没到
if(tong[i]==0){
flag = false; // 标记为不是所有人都到了
cout<<i<<" "; // 输出没到的同学编号
}
}
// 如果所有人都到了,输出n
if(flag == true){
cout<<n;
}
return 0;
}
代码讲解
- 全局数组:
int tong[2000];
定义在main函数外面,会自动初始化为0,很适合做计数器 - 循环输入:
for(int i=1;i<=m;i++)
循环m次,接收每个报的编号 - 标记变量:
flag
用来记录是否所有人都到了,一开始设为true,发现有人没到就改为false - 输出结果:如果有没到的人就输出他们的编号,否则输出n
小练习
试着输入下面的测试数据,看看程序会输出什么:
3 5
0 0 0 0 0
(答案应该是:1 2)
第二章:循环嵌套——画矩形
题目介绍:画矩形
根据输入的参数画矩形:
- 前两个参数:矩形的高和宽
- 第三个参数:画图用的符号
- 第四个参数:1表示实心,0表示空心
解题思路
- 矩形有"高"行,"宽"列
- 如果是实心矩形,所有位置都画指定符号
- 如果是空心矩形:
- 第一行和最后一行全部画符号
- 中间几行只在第一列和最后一列画符号,中间画空格
代码实现(带注释)
// 包含常用的头文件,相当于一次性引入很多工具
#include<bits/stdc++.h>
using namespace std;
int main() {
// 定义变量:g(高)、k(宽)、n(实心/空心)、f(画图符号)
int g, k, n;
char f;
// 输入四个参数
cin >> g >> k >> f >> n;
// 外层循环控制行数(高)
for (int i = 1; i <= g; i++) {
// 内层循环控制列数(宽)
for (int j = 1; j <= k; j++) {
// 如果是空心矩形(n==0)
if (n == 0) {
// 第一行、最后一行,或者第一列、最后一列,画符号
if (i == 1 || i == g || j == 1 || j == k) {
cout << f;
} else {
// 其他位置画空格
cout << " ";
}
} else {
// 如果是实心矩形,所有位置都画符号
cout << f;
}
}
// 一行画完后换行
cout << endl;
}
return 0;
}
小练习
输入 7 7 @ 0
,看看是不是能画出这样的矩形:
@@@@@@@
@ @
@ @
@ @
@ @
@ @
@@@@@@@
第三章:矩阵图案绘制——H字矩阵
题目介绍:小杨的H字矩阵(GESP2312二级)
构造一个N×N的H字矩阵(N为奇数):
- 最左列和最右列都是
|
- 中间一行(第(N+1)/2行)的第2到N-个字符都是
-
- 其余字符都是小写字母
a
解题思路
- 矩阵有N行N列
- 对每一行每一列判断应该输出什么字符:
- 如果是第一列或最后一列,输出
|
- 否则,如果是中间行,输出
-
- 其他情况输出
a
- 如果是第一列或最后一列,输出
代码实现(带注释)
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入N的值
// 计算中间行的位置
int mid = (n + 1) / 2;
// 外层循环控制行数,从1到n
for (int i = 1; i <= n; i++) {
// 内层循环控制列数,从1到n
for (int j = 1; j <= n; j++) {
// 第一列或最后一列,输出|
if (j == 1 || j == n) {
cout << "|";
}
// 中间行且不是第一列和最后一列,输出-
else if (i == mid) {
cout << "-";
}
// 其他情况输出a
else {
cout << "a";
}
}
// 一行输出完后换行
cout << endl;
}
return 0;
}
代码测试
当输入5
时,输出应该是:
|aaa|
|aaa|
|---|
|aaa|
|aaa|
第四章:X字矩阵绘制
题目介绍:小杨的X字矩阵(GESP2309二级)
构造一个N×N的X字矩阵(N为奇数):
- 两条对角线上的字符都是
+
- 其余字符都是
-
解题思路
- X字由两条对角线组成
- 主对角线:行号等于列号(i == j)
- 副对角线:行号 + 列号 = N + 1(i + j == n + 1)
- 在这两条对角线上输出
+
,其他位置输出-
代码实现(带注释)
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入N的值
// 外层循环控制行数
for(int i=1;i<=n;i++){
// 内层循环控制列数
for(int j=1;j<=n;j++){
// 判断是否在两条对角线上
// i == j 是主对角线,i + j - 1 == n 是副对角线
if(i == j || i + j - 1 == n){
cout<<"+"; // 对角线上输出+
}else{
cout<<"-"; // 其他位置输出-
}
}
// 一行结束后换行
cout<<endl;
}
return 0;
}
代码测试
当输入5
时,输出应该是:
+---+
-+-+
--+--
-+-+
+---+
总结与练习
通过这几个题目,我们学习了:
- 数组的应用:用数组做计数器,记录每个同学是否到了
- 循环嵌套:用两层循环控制行和列,绘制各种矩阵
- 条件判断:根据不同的位置(行号和列号)输出不同的字符
练习题
尝试修改H字矩阵的代码,让它变成题目中提到的"日字矩阵":
- 最左列、最右列都是
|
- 第一行、最后一行,以及中间一行的第2到N-1个字符都是
-
- 其余字符都是
x
提示:只需要修改判断条件,增加对第一行和最后一行的判断即可。
希望这篇教程能帮助你入门C++编程!编程就像搭积木,多练习就能越来越熟练哦!
1 条评论
-
admin SU @ 2025-7-7 21:24:37
- 1