• C++
  • C++从解决实际问题学编程

  • @ 2025-7-7 21:23:34

C++编程入门教程:从题目到代码

亲爱的小朋友们,今天我们要一起学习C++编程,通过解决一些有趣的题目来掌握编程的基础知识。这些题目就像小游戏一样,只要我们认真思考,就能编写出正确的程序哦!

第一章:数组的应用——找出没到的同学

题目介绍:春游(GESP2306三级)

老师带同学们春游,班里有N位同学(编号0到N-1),同学们报了M次自己的编号。有的同学可能会报好几次,我们要找出哪些同学没到。如果都到了,就输出N;否则按从小到大输出没到的同学编号。

解题思路

  1. 我们可以用一个"计数器"数组来记录每个同学是否报过到
  2. 先把所有同学的计数器都设为0
  3. 每次有同学报编号,就把对应计数器加1
  4. 最后检查哪些同学的计数器还是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表示空心

解题思路

  1. 矩形有"高"行,"宽"列
  2. 如果是实心矩形,所有位置都画指定符号
  3. 如果是空心矩形:
    • 第一行和最后一行全部画符号
    • 中间几行只在第一列和最后一列画符号,中间画空格

代码实现(带注释)

// 包含常用的头文件,相当于一次性引入很多工具
#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

解题思路

  1. 矩阵有N行N列
  2. 对每一行每一列判断应该输出什么字符:
    • 如果是第一列或最后一列,输出|
    • 否则,如果是中间行,输出-
    • 其他情况输出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为奇数):

  • 两条对角线上的字符都是+
  • 其余字符都是-

解题思路

  1. X字由两条对角线组成
  2. 主对角线:行号等于列号(i == j)
  3. 副对角线:行号 + 列号 = N + 1(i + j == n + 1)
  4. 在这两条对角线上输出+,其他位置输出-

代码实现(带注释)

#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时,输出应该是:

+---+
-+-+
--+--
-+-+
+---+

总结与练习

通过这几个题目,我们学习了:

  1. 数组的应用:用数组做计数器,记录每个同学是否到了
  2. 循环嵌套:用两层循环控制行和列,绘制各种矩阵
  3. 条件判断:根据不同的位置(行号和列号)输出不同的字符

练习题

尝试修改H字矩阵的代码,让它变成题目中提到的"日字矩阵":

  • 最左列、最右列都是|
  • 第一行、最后一行,以及中间一行的第2到N-1个字符都是-
  • 其余字符都是x

提示:只需要修改判断条件,增加对第一行和最后一行的判断即可。

希望这篇教程能帮助你入门C++编程!编程就像搭积木,多练习就能越来越熟练哦!

1 条评论

  • 1