2023年9月

8-FCxNfOuUU6NV7V5.png

开灯问题

  • 问题描述:

    n盏灯,编号1~n,第一个人把所有灯打开,第二个人按下所有编号为2的倍数的开关,第三个人按下所有编号为3的倍数的开关,以此类推,一共有k个人,文最后有哪些等开着,输入n和k,输出开着的灯的编号: k<=n<=1000, 编写C++程序?

例子1:
输入:

10 5

输出:

1 4 6 7 8 10

例子2:
输入:

20 7

输出:

1 4 8 10 11 12 13 14 15 16 17 19

编写一个C++程序来模拟这个问题,根据输入的n和k计算最后哪些灯开着

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, k;
    cout << "请输入灯的数量 n:";
    cin >> n;
    cout << "请输入操作次数 k:";
    cin >> k;

    vector<bool> lights(n, false);

    for (int i = 1; i <= k; ++i) {
        for (int j = i - 1; j < n; j += i) {
            lights[j] = !lights[j];
        }
    }

    cout << "最后开着的灯的编号是:";
    for (int i = 0; i < n; ++i) {
        if (lights[i]) {
            cout << i + 1 << " ";
        }
    }
    cout << endl;

    return 0;
}

这个程序首先读取输入的灯的数量n和操作次数k,然后创建一个bool型的vector来表示每盏灯的状态,初始状态都是关着的(false)。

然后,程序使用两层循环来模拟每个人的操作。外层循环迭代k次,模拟k个人的操作,内层循环按照当前人的编号(i)来切换对应编号的灯的状态。

最后,程序遍历vector,找出开着的灯的编号并输出。

对于比赛,程序应该严格按照题目要求,不能有多余的输入和输出; 这里为了方便演示,多了一些额外的输入与输出提示

蛇形填数

  • 问题描述:

    蛇形填数问题:在nn的方阵里面填入1, 2, ..., nn,
    要求填成蛇形,从左上角第一个格子开始,第一行开始,然后最后一列,最后一行,依次类推,构成蛇形,编写C++程序实现

例子1:
输入:

4

输出:

1       2       3       4
12      13      14      5
11      16      15      6
10      9       8       7

例子2:
请输入n的值:10
蛇形填数结果:
1 2 3 4 5 6 7 8 9 10
36 37 38 39 40 41 42 43 44 11
35 64 65 66 67 68 69 70 45 12
34 63 84 85 86 87 88 71 46 13
33 62 83 96 97 98 89 72 47 14
32 61 82 95 100 99 90 73 48 15
31 60 81 94 93 92 91 74 49 16
30 59 80 79 78 77 76 75 50 17
29 58 57 56 55 54 53 52 51 18
28 27 26 25 24 23 22 21 20 19

你可以输入不同的n和k来测试程序的功能。这个程序适用于n和k的范围在1到1000之间的情况。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cout << "请输入n的值:";
    cin >> n;

    vector<vector<int>> matrix(n, vector<int>(n, 0));

    int num = 1;
    int row = 0, col = 0;
    int direction = 0; // 0: 向右,1: 向下,2: 向左,3: 向上

    while (num <= n * n) {
        matrix[row][col] = num++;
        
        // 向右
        if (direction == 0) {
            if (col + 1 < n && matrix[row][col + 1] == 0) {
                col++;
            } else {
                direction = 1;
                row++;
            }
        }
        // 向下
        else if (direction == 1) {
            if (row + 1 < n && matrix[row + 1][col] == 0) {
                row++;
            } else {
                direction = 2;
                col--;
            }
        }
        // 向左
        else if (direction == 2) {
            if (col - 1 >= 0 && matrix[row][col - 1] == 0) {
                col--;
            } else {
                direction = 3;
                row--;
            }
        }
        // 向上
        else if (direction == 3) {
            if (row - 1 >= 0 && matrix[row - 1][col] == 0) {
                row--;
            } else {
                direction = 0;
                col++;
            }
        }
    }

    // 输出结果
    cout << "蛇形填数结果:" << endl;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}

8-es7xztRr0fgvXfT.png

挺不错的C++入门教程www.learncpp.com

对于将C++编程作为比赛工具学生来说,快速入门,不需要太深入语言的细节,各种高阶的语言特性、复杂的应用设计等高阶概念,能够比较熟练C++常规的语言特性,构建比赛程序足以

要快速入门,和学习大部分语言类似,从开发环境搭建、hello world程序到调试工具的使用

  • 开发环境搭建
  • hello world
  • 调试工具(IDE)
这里就将语言背景介绍略过了,有心人可以从网络搜索到各种背景知识!

C++程序开发流程

2023-09-16T02:45:15.png

上图比较概括描述了C++程序是如何被开发出来的

  • Step 1: 定义我们需要解决的问题
  • Step 2: 设计一个解决方案
  • Step 3: 编写一个程序,实现这个方案
  • Step 4: 编译这个程序
  • Step 5: 链接目标文件
  • Step 6: 测试程序
  • Step 7: 调试程序(如果有问题,不符合预期等)

    #include

    int main()
    {

      std::cout << "Colored text!";
      return 0;

    }

一些工具的介绍

  • compiler 编译器
  • linker 链接器
  • libraries 库

如果我们有多个*.cpp文件,编译器会生成的哦个object(目标)文件,如下图:
2023-09-16T02:50:26.png

链接器程序将目标文件整合成可执行程序,比如Calculator.exe

IDE(Integrated Development Enironments) 集成开发环境

从命令行到图形化开发环境,可以使用的工具很多,初学者开始可能不习惯命令行,GUI(Graphics User
Interface)图形化用户界面可能更友好一些,但是对于专业开发人员,掌握命令行的工具使用,很有必要!
  • Windows上有微软的Visual Studio 版本,
    免费的社区版,可以供学习使用;商用的适合专业开发人员
    2023-09-16T02:54:36.png
  • Code::Blocks(跨平台使用,Linux or Windows)
    Code::Blocks官方下载链接
    CodeBlocks-IDE.png
Window上下载安装比较直观;Linux上也有比较简单的安装步骤,并不复杂

为每个程序创建独立的project

在Code::Blocks里面只有创建的project,才能使用调试功能;独立建立的文件无法使用内建的调试插件
  • 在Code::Blocks里面创建一个工程:

2023-09-16T03:43:11.png

  • 需要给工程选择一个目录,用来存储工程、程序文件:
    2023-09-16T03:43:35.png
  • 建好之后,在IDE里面有个专门工程管理窗口,列出工程相关的信息、文件列表等:
    2023-09-16T03:44:12.png
    默认建立的工程代码:

    #include

    int main()
    {

      std::cout << "Hello, world!";
      return 0;

    }

  • 编译执行,快捷键Ctrl-F9, 或者Build菜单->Build

2023-09-16T04:05:02.png

8-0u1CMzUE8CXOTIK.png

一个适合中学生NOI(全国青少年信息学奥林匹克竞赛)比赛的C++编程题目入门示例。 这个题目涉及到基本的算法和数据结构,适合初学者练习。

题目:计算数字的平均值

问题描述:

给定一组整数,计算它们的平均值,并找出大于平均值的整数的数量。

输入:

第一行包含一个整数n(1 <= n <= 100),表示整数的数量。
接下来的一行包含n个整数,每个整数都在-100到100之间。

输出:

第一行输出平均值(保留两位小数)。
第二行输出大于平均值的整数的数量。

示例输入:

5
12 7 3 15 9

示例输出

9.20
3

编程要求:

请使用C++编写一个程序,读取输入数据并计算平均值以及大于平均值的整数数量。然后输出结果。

这个题目可以帮助学生练习基本的输入/输出操作,循环和条件语句的使用,以及基本的数学运算。同时,它也可以帮助他们熟悉C++的语法和编程环境。如果需要更多的编程题目,可以考虑扩展这个题目或查找其他类似的问题。

参考实现代码

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> numbers(n);
    int sum = 0;

    for (int i = 0; i < n; ++i) {
        cin >> numbers[i];
        sum += numbers[i];
    }

    double average = static_cast<double>(sum) / n;

    int countAboveAverage = 0;
    for (int i = 0; i < n; ++i) {
        if (numbers[i] > average) {
            countAboveAverage++;
        }
    }

    cout << fixed;
    cout.precision(2);
    cout << average << endl;
    cout << countAboveAverage << endl;

    return 0;
}

这段代码首先读取整数的数量n,然后使用一个vector来存储输入的整数。接着,它计算这些整数的总和,然后通过总和除以n来计算平均值。最后,它遍历整数数组,计算大于平均值的整数数量,并将结果输出到标准输出。

你可以将这段代码复制到C++编译器中进行编译和运行,以查看它的工作方式并测试不同的输入。希望这有助于你练习编程和理解基本的C++编程概念。

其他入门题目

题目1:计算阶乘

问题描述:

给定一个正整数n,计算n的阶乘。

输入:

一个正整数n(1 <= n <= 10)。

输出:

n的阶乘。

示例输入:

5

示例输出:

120

题目2:查找最大元素

问题描述:

给定一组整数,找出其中的最大元素。

输入:

第一行包含一个整数n(1 <= n <= 100),表示整数的数量。
接下来的一行包含n个整数,每个整数都在-100到100之间。

输出:

最大的整数。

示例输入:

7
12 7 3 15 9 21 8

示例输出:

21

题目3:数字反转

问题描述:

给定一个正整数,将其各位数字反转。

输入:

一个正整数x(1 <= x <= 10^9)。

输出:

x的各位数字反转后的结果。

示例输入:

12345

示例输出:

54321

这些题目涵盖了一些基本的算法和数据结构概念,包括循环、条件语句和基本的数学运算。它们可以帮助学生巩固C++编程基础和解决问题的能力。你可以使用这些题目作为练习,或者根据需要进行扩展和修改,以满足学生的需求和挑战级别

参考实现代码

题目1:计算阶乘

#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;

    int factorial = 1;
    for (int i = 1; i <= n; ++i) {
        factorial *= i;
    }

    cout << factorial << endl;

    return 0;
}

题目2:查找最大元素

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> numbers(n);

    for (int i = 0; i < n; ++i) {
        cin >> numbers[i];
    }

    int maxNumber = numbers[0];
    for (int i = 1; i < n; ++i) {
        if (numbers[i] > maxNumber) {
            maxNumber = numbers[i];
        }
    }

    cout << maxNumber << endl;

    return 0;
}

题目3:数字反转

#include <iostream>

using namespace std;

int main() {
    int x;
    cin >> x;

    int reversed = 0;
    while (x > 0) {
        reversed = reversed * 10 + x % 10;
        x /= 10;
    }

    cout << reversed << endl;

    return 0;
}

NOI

介绍

信息学奥林匹克竞赛是一项旨在挑战学生计算机科学和算法解决问题能力的竞赛。通常,信息学奥林匹克竞赛分为不同级别,包括初级、中级和高级,以适应不同年龄和能力水平的学生。以下是有关中学生信息学奥林匹克竞赛的一些常见信息:

  • 参赛资格:中学生信息学奥林匹克竞赛通常面向中学生,通常包括初中和高中学生。不同比赛可能有不同的年龄要求,但通常是13岁至18岁之间的学生。
  • 竞赛内容:竞赛内容通常涵盖计算机科学、算法、编程和问题解决。学生需要解决一系列难度递增的编程和算法问题,这些问题可能涉及数据结构、图论、搜索算法、动态规划等。
  • 编程语言:通常,竞赛允许学生使用多种编程语言来解决问题,包括Python、C++、Java等。学生可以选择他们最熟悉或最喜欢的编程语言。
  • 竞赛格式:中学生信息学奥林匹克竞赛的格式可以有所不同,但通常包括一轮在线笔试或编程挑战赛,以及一些学校或区域层面的选拔赛。表现优秀的学生可以晋级到国家或国际级别的比赛。
  • 准备和培训:为了参加竞赛,学生通常需要深入学习计算机科学和算法,并练习解决类似竞赛问题的编程练习。学校、教师和竞赛培训机构可能提供相关的培训和资源。
  • 奖励和认可:获奖学生通常会获得奖牌、证书、奖金或其他奖励,并且他们的成绩可能会被用于升学申请或获得学术和职业机会。

中学生信息学奥林匹克竞赛旨在鼓励学生对计算机科学和编程的兴趣,培养他们的解决问题和创造力。这类竞赛也为有志于从事计算机科学或相关领域的学生提供了一个宝贵的学习和发展机会。如果你是一名中学生,有兴趣参加这类竞赛,可以咨询你所在学校或地区的信息学奥林匹克竞赛组织,以获取更多详细信息和参赛指南。

如何入门?

要入门中学生信息学奥林匹克竞赛,你可以按照以下步骤逐渐准备和提高你的竞赛技能:

  • 了解竞赛规则和要求:

首先,获取关于中学生信息学奥林匹克竞赛的详细信息,包括规则、资格要求、竞赛格式和时间表。你可以从学校、教师、竞赛组织或官方竞赛网站获取这些信息。

  • 学习编程基础:

如果你还没有编程经验,建议首先学习一门编程语言,如Python,这是一个易于学习的语言,适合初学者。你可以通过在线教程、编程课程或自学来掌握基础编程概念和技能。
学习算法和数据结构:

竞赛通常涉及复杂的算法和数据结构问题,因此你需要学习和理解这些概念。阅读相关教材、参加在线课程或参考算法书籍都是提高算法能力的好方法。

  • 解决编程练习题:

练习是提高竞赛技能的关键。寻找在线编程挑战平台(如LeetCode、Codeforces、AtCoder等)并解决各种算法和编程问题。这些平台通常提供了大量的练习题目,可以帮助你熟悉不同类型的竞赛问题。

  • 参加竞赛训练班:

有些学校或培训机构提供专门为竞赛准备的培训课程。如果有机会,可以考虑参加这些课程,与其他有志于参加竞赛的学生一起学习和训练。
参加模拟竞赛:

参加模拟竞赛可以帮助你熟悉竞赛的格式和时间限制。寻找在线模拟竞赛或与其他学生一起组织模拟竞赛。
寻求指导和反馈:

如果有老师或教练可以提供指导和反馈,那将会很有帮助。他们可以帮助你识别问题并提供更有效的解决方法。

  • 坚持练习:

信息学奥林匹克竞赛需要长期准备和坚持不懈的努力。每天保持练习,不断提高自己的编程和算法技能。
参加竞赛并积累经验:

最后,积累参加竞赛的经验。即使你在刚开始可能不会获胜,但经验是非常宝贵的,可以帮助你在未来的比赛中表现更好。
总之,准备中学生信息学奥林匹克竞赛需要时间、耐心和坚持。通过不断学习和练习,你可以提高自己的编程和算法技能,逐渐在竞赛中取得更好的成绩。

C++ 入门教程

8-LeWD3rr3UzgTEpt.png

虚拟环境

在Python中,虚拟环境是一种用于隔离项目依赖和包的工具,以便在不同项目之间管理不同版本的库和包。虚拟环境允许你在同一系统上同时运行多个Python项目,每个项目都可以有自己独立的依赖,而不会互相干扰。

创建虚拟环境的基本步骤

以下是在Python中创建虚拟环境的基本步骤:

1. 安装virtualenv(可选):

在某些Python发行版中,virtualenv已经包含在内,你可以直接使用。如果你使用的是较旧的Python版本或者没有安装virtualenv,你可以通过以下方式安装它:

pip install virtualenv

2. 创建虚拟环境:

选择一个用于存放虚拟环境的目录,并使用virtualenv命令创建虚拟环境。例如,假设你想在项目目录中创建一个名为myenv的虚拟环境,你可以运行以下命令:

virtualenv myenv

这将在当前目录下创建一个myenv文件夹,并在其中创建一个独立的Python解释器和标准库。

3. 激活虚拟环境:

在不同的操作系统上,激活虚拟环境的方式有所不同:

  • 在 Windows 上,使用以下命令激活虚拟环境:

    myenv\Scripts\activate

  • 在 macOS 和 Linux 上,使用以下命令激活虚拟环境:

    source myenv/bin/activate

一旦虚拟环境被激活,你的命令行提示符将会显示虚拟环境的名称,表示你正在使用虚拟环境。

3. 安装依赖:

在虚拟环境中,你可以使用pip来安装项目所需的依赖包,这些依赖包将仅在当前虚拟环境中可用,不会影响系统Python或其他虚拟环境。
例如

pip install pygame

4. 退出虚拟环境:

当你完成项目工作或者需要切换到另一个虚拟环境时,可以使用以下命令退出当前虚拟环境:

deactivate

这样,你就可以创建和管理多个独立的Python虚拟环境,每个虚拟环境都可以具有不同的依赖项,使项目之间保持隔离。这对于开发和维护Python项目非常有用。

virtualenv myenv 和 python -m venv myenv两种方式的区别

virtualenvpython -m venv 是两种用于创建 Python 虚拟环境的不同工具,它们有一些区别,包括支持的 Python 版本和一些功能。

1. virtualenv:

virtualenv 是一个独立的第三方工具,需要单独安装(使用 pip install virtualenv)。
它兼容多个 Python 版本,并且可以用于创建 Python 2.x 和 Python 3.x 的虚拟环境。
virtualenv 生成的虚拟环境通常较小,因为它不包含 Python 标准库。
可以使用 --system-site-packages 标志来让虚拟环境访问系统全局安装的包。
示例创建虚拟环境的命令:

virtualenv myenv

2. python -m venv:

python -m venv 是 Python 内置的虚拟环境创建工具,不需要额外安装。
它是 Python 3.3 及更高版本的一部分,因此只能用于创建 Python 3.x 的虚拟环境。
python -m venv 生成的虚拟环境包含了 Python 标准库。
默认情况下,虚拟环境是隔离的,不会访问系统全局安装的包,这有助于确保项目的依赖独立。
示例创建虚拟环境的命令:

python -m venv myenv

总的来说,如果你在使用 Python 3.x,推荐使用 python -m venv 来创建虚拟环境,因为它是 Python 内置的工具,并且通常更容易使用。如果你需要在多个 Python 版本之间切换,或者需要使用 Python 2.x,那么 virtualenv 可能是一个更好的选择。

小结

最新的python3 是主流,已经到python 3.12了,所以还是推荐使用python -m venv方式创建虚拟环境变量,用起来比较顺手。介绍的知识作为参考,上网查询的时候可能会碰到这些不同的做法,有个心理准备!

除了 virtualenv 和 python -m venv,还有其他一些方式可以创建虚拟环境,具体取决于你的需求和环境。以下是一些其他常见的虚拟环境管理工具, conda, pyenv,Pipenv
这些工具都具有不同的优点和特点,可以根据你的需求和偏好选择其中之一来管理虚拟环境。每种工具都有其独特的用例,因此可以根据项目的具体需求来选择最合适的方式。
细节就不展开了,等有了足够的经验,再自行探索,目前我们就用python -m venv myvenv创建虚拟环境
>python -m venv myvenv
>source myvenv/bin/activate
>deactivate