教授C语言二十年,如今根据专业培养需要,课程改为C/C++,写此教程,满足学生的学习需求。主要遵循以下四个特点:

1、教程特色

1.1 面向在线评测

计算机是一门应用科学,不用是不可能真正学会的。本教程用PTA构建习题,从易到难构建内容,理论学习主要的针对目标是解决在线评测的问题,以问题为导向进行实战学习。事实上,PTA,CSP,LeetCode等在线评测网站的不断练习,对学生未来读研和找工作都具有巨大的好处。

1.2 简明有用

大学中目前普遍存在的现象就是课时不足。如何在有限的课时里让学生掌握最主要的部分是一个挑战。因此在书写本教材时,不求面面俱到,只要学生能对实战编程的要点进行掌握即可。例如switch,goto等不建议使用的语法,在本教程中不会出现。知识学习有用即可,“多”绝大部分时候都是给学生带来负面影响,阻碍学习的积极性。

1.3 易用原则

作为第一门编程课,很多同学迟迟不能入门,这是对计算机专业认知的一个重要阻碍。因此本教程在构造时,从问题下手,对于解决同一问题的多种方法,讲解最简单的方式,让学生快速入门,建立成就感,形成正反馈。易用原则对学习是一个重要的原则。
例如在输入方式上,可以用C语言的scanf,也可以用C++的cin,但是很明显cin在书写和理解上都要更加简单方便,因此教程中忽略对scanf的讲解。

1.4 算法优化

在线评测都有时间和内存要求,教程中会有很多优化算法,帮助学生用最优的方式解决问题。

2. 计算机基本原理

现代电子计算机仍然没有超出由匈牙利科学家冯.诺依曼(von Neumann) 于1945年提出的冯.诺依曼体
系结构的范畴。在该结构中,计算机被认为由5大部件组成,如下图所示。
image.png
图1.1 冯.诺依曼体系结构
存储器又分为内部存储器及外部存储器两个部分。其中,内部存储器简称内存,通常是易失的,容量相对较小,但存取速度显著快于外部存储器。所谓易失,是指计算机断电后,内存中的数据会自动丢失。外部存储器通常指硬盘、固态硬盘、U盘等存储设备,相对于内存,其数据可以在断电后永久保存,容量通常也更大,但数据存取速度通常显著慢于内存。计算机处理的数据和指令(程序)一律用二进制表示,任何程序在运行时都要加载到内存,因此了解程序中相应部分在内存中的存储结构,才能更好地保证程序执行的正确性和效率。
一个二进制位称为比特(Bit),它是存储器的最小单位。但是比特太小了,通常以字节(Byte)作为内存管理的基本单位,一个字节为8比特。1KB=1024byte=210byte,1MB=1024KB=220byte,1GB=1024KB=230byte。

3. C++程序设计

3.1 C++程序基本结构

  1. #include <iostream> //输入输出流标准库文件,支持cout,cin的使用
  2. using namespace std; //标准命名空间
  3. int main() //C++的主函数,每个程序都有且仅有一个main函数
  4. { //一对大括号构成一个代码块
  5. cout<<"Hello World!"<<endl; //输出字符串Hello World!,其中endl表示换行符。
  6. return 0; //主函数的返回值,0表示程序正常结束
  7. }

Hello World!

  • C/C++中任何一条语句都必须以分号;结束。
  • //表示行注释,当前行//后的部分为注释。

    3.2 C++程序的编译与运行

    C++ 语言代码由固定的词汇按照固定的格式组织起来,简单直观,程序员容易识别和理解,但是计算机根本不认识这些代码。这就需要一个工具,将 C++ 代码转换成计算机 能够识别的二进制指令,也就是将代码加工成 .exe 程序的格式。这个工具是一个特殊的软件,叫做编译器(Compiler)。
    编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译。编译也可以理解为 “翻译”,类似于将中文翻译成英文,它是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件五个步骤,期间涉及到复杂的算法和硬件架构。
    本教程采用在Windows平台下的MinGW环境中的g++编译器。一定要选择C++11以上的版本选项。下例中选用C++17。在Codeblocks的settings菜单下选择comiler,在打开的窗口中选择C++17。
    image.png
    图1.2 编译器设定

    4. IDE的使用

    程序设计主要学习语法和算法知识,IDE的选择并不重要。Codeblocks和VSCode都是当前比较流行的IDE工具,前者在安装和使用上比较简单,VSCode相对配置比较繁琐,但是对学习这掌握一些底层编译有一定帮助。根据易用原则,甚至可以直接使用PTA在线编辑器进行编写,上面有测试模块,可以通过输出语句进行调试,能够满足基本编程需要。本教程使用Codeblocks为例进行讲解和配置。一定要选择带MinGW的setup版本进行下载。

    Codeblocks20.03版本下载地址:https://udomain.dl.sourceforge.net/project/codeblocks/Binaries/20.03/Windows/codeblocks-20.03mingw-setup.exe

4.1 Codeblocks新建项目

1) 选择File->New->Project菜单,弹出以下窗口,选择Cosole application,然后点击“Go”按钮。
image.png
2)在接下来的几个窗口中都直接点击Next按钮,直到出现以下窗口。在“Project title”中输入你的项目名称,在“Folder to create project in:”中选择你的程序的保存路径。然后点击Next按钮。
image.png
3)在最后的窗口点击Finish按钮,生成第一个项目。
image.png
4)在出现的窗口中,选择Projects标签页,展开下面的树状列表,双击显示main.cpp文件,然后输入你的程序。
image.png
5)点击工具条上的image.png进行编译,点击image.png运行程序,点击image.png编译并运行程序。特别说明,image.png只是运行编译好的文件,每次修改程序后,要先用image.png进行编译,然后才能运行。或者直接点击image.png编译并运行程序。很多初学者修改程序后运行结果不改变,就是因为这个问题。
打开工程所在的文件夹,main.cpp就是源文件。obj/Debug文件夹下有一个后缀为.o的文件,这就是编译之后的中间文件,它是二进制的,用于计算机进行识别。bin/Debug文件夹下有一个后缀为.exe的文件,这是该程序最后生成的可执行文件。

4.2 Codeblocks常用功能

  • 代码格式化

在代码编辑区的任意空白处,弹出右键菜单,点击Format use AStyle,进行代码格式化。专业的程序员必须要进行代码格式化,格式化之后的代码更容易阅读和理解,对于括号不匹配等问题,可以很容易发现。在Codeblocks中,将光标放在括号处,对应的括号会进行高亮,帮助发现对应的括号。

  • Ctrl+鼠标滚轮可以调整文字大小。
  • 选中对应的代码块,按Ctrl+Shift+C注释, 按Ctrl+Shift+X解除注释。在进行代码调试的时候,经常会用到大块区域的注释和解除注释。
  • 选中对应的代码块,按Tab键缩进,按Shift+Tab反向缩进。
  • 按F2和Shift+F2分别可以显隐下方Logs& others栏和左方的Management栏。