第01讲:绪论

《计算机程序设计》

苏醒

计算机学院计算机研究所编译系统研究室

1. 课程介绍

课程概况

  • 课程基本情况
    • 学校公共基础选修课(限选课其实是必修
    • 48学时,3学分
    • C++为教学语言,主要是兼容C的部分
  • 为什么要学习C/C++编程?
    • 三大科学研究方法:理论、实验、计算
    • 培养计算思维:现代工程学科是专业领域与计算的交叉
    • C/C++:进一步理解计算机的底层原理
    • 编程的乐趣

编程的乐趣

  • 创造事物的纯粹乐趣,掌控全局的驾驭感
  • 持续学习与非重复性劳动的快乐

Your are the GOD to computer while programming!

教员箴言

学习编程,既有用,又好玩 !

教材与参考书

教材

参考书

温馨提示

点击课件上的链接可以直达目标!

教学平台

  • 头歌平台
    • 教学班级邀请码N2KRO
    • 功能:实训、测试与考试

温馨提示

课件右下角校徽其实是课程主页传送门 :-D

教学安排

课次 教学模块 课次 教学模块 课次 教学模块
1 绪论 9 指针 17 链表
2 语言基础 10 程序调试 18 综合应用2
3 控制结构 11 数组进阶 19 文件IO
4 控制结构 12 字符串 20 函数进阶
5 输入输出 13 函数参数 21 标准库
6 工具链 14 综合应用1 22 大模型
7 函数初步 15 结构 23 总结复习
8 数组初步 16 联合与枚举 24 答疑

上机安排

上课当天第9-10节,地点同上课教室

翻转课堂

  • 本学期课程设置翻转课堂活动,初步执行方案如下:
    • 学员分组,每组3-4人
    • 每次课由一组学员讲解一个内容主题
    • 时间8-10分钟,准备材料:PPT、源代码、文稿等
    • 讲清组内成员的分工、贡献度

推荐主题(包括但不限于

  • 知识点精讲(在课堂教学基础上拓展、加深)
  • 算法题目精讲(leetcode等)
  • 解决编译、链接错误的经验
  • 开发工具使用经验(VSCode等开发环境及插件)
  • 程序调试技巧
  • 大模型在程序设计中的应用

教员箴言

不打无准备之仗,不讲无准备之课!排练!排练!排练!

成绩评定

成绩模块 比例 备注
课堂练习 10% 简短编程练习、翻转课堂表现
实训作业 20% 有严格限时,期末补交有罚分
单元测试 20% 无期中考试,计划5次单元测试
期末考试 50% 闭卷机试,10道编程题

温馨提示

  • 本课程不采用期末考试一票否决制!
  • 单元测试通常安排在上机时间
  • 务必重视平时成绩的积累!

2. 程序设计概述

计算机系统(回顾)

硬件是身体,软件是灵魂!

计算机系统组成

软件的三个组成部分:程序、数据、文档

计算机程序

  • 程序是对计算任务的处理对象处理规则的描述
    • 处理对象:程序要处理的数据,包括数字、文字和图像等,数据组织形式称为数据结构
    • 处理规则:施加在数据上的的操作步骤,使用算法描述

名人名言

程序 = 数据结构 + 算法

— Niklaus Wirth

计算机科学史讲堂

Niklaus Wirth,瑞士计算机科学家,ETH教授,瑞士计算机科学主要奠基人之一,1984年图灵奖(首位德语获奖者)、1988年IEEE计算机先驱奖获得者,Pascal/Modula-2/Oberon发明者,首次提出“软件危机”概念。

Niklaus Wirth (1934-2024)

Niklaus Wirth (1934-2024)

软件开发过程

---
config:
  look: handDrawn
  themeVariables:
    fontSize: 28px
---
flowchart LR
  ra[需求分析]
  ad[算法设计]
  ci[程序编码]
  td[测试调试]
  ra --> ad
  ad --> ci
  ci --> td
  td --> ci

  • 需求分析:明确要解决的问题
  • 算法设计:将问题转化为计算机算法
  • 程序编码:用程序设计语言实现算法
  • 测试调试:发现和纠正程序中错误

算法设计

问题:求两个整数的商,若除数为0则向用户报错

文字描述

  1. 读入两个整数,即被除数和除数
  2. 如果除数等于0,则输出除数为0的错误信息
  3. 否则,计算被除数和除数的整商,并输出结果

流程图描述

---
config:
  look: handDrawn
  themeVariables:
    fontSize: 24px
---
flowchart LR
  start(["开始"])
  input[/"读入除数、被除数"/]
  if0{"除数为0"}
  compute["计算整商"]
  output[/"输出整商"/]
  error[/"输出错误"/]
  End(["结束"])
  start --> input
  input --> if0
  if0 -- 否 --> compute
  compute --> output
  if0 -- 是 --> error
  output --> End
  error --> End

  classDef condition height:10,width:20
  class if0 condition

软件开发过程

---
config:
  look: handDrawn
  themeVariables:
    fontSize: 28px
---
flowchart LR
  ra[需求分析]
  ad[算法设计]
  ci[程序编码]
  td[测试调试]
  ra --> ad
  ad --> ci
  ci --> td
  td --> ci

  • 需求分析:明确要解决的问题
  • 算法设计:将问题转化为计算机算法
  • 程序编码:用程序设计语言实现算法
  • 测试调试:发现和纠正程序中错误

程序编码

---
config:
  look: handDrawn
  themeVariables:
    fontSize: 24px
---
flowchart LR
  start(["开始"])
  input[/"读入除数、被除数"/]
  if0{"除数为0"}
  compute["计算整商"]
  output[/"输出整商"/]
  error[/"输出错误"/]
  End(["结束"])
  start --> input
  input --> if0
  if0 -- 否 --> compute
  compute --> output
  if0 -- 是 --> error
  output --> End
  error --> End

#include <iostream>
using namespace std;

int main() {
  int dividend, divisor, quotient; //变量声明
  cout << "Please enter the dividend:" << endl;  //提示输入被除数
  cin >> dividend;
  cout << "Please enter the divisor:" << endl;  //提示输入除数
  cin >> divisor;
  if (divisor == 0) {
    cout << "Error: divisor cannot be zero!"<< endl; //输出错误信息
  } else {
    quotient = dividend / divisor; //执行除法
    cout << "Quotient is " << quotient << endl; //输出商
  }
  return 0;
}

程序设计语言

考考你

回顾《大学计算机基础》课程内容,程序设计语言按照抽象层次分为哪些类别?

  • 机器语言
0001 01 00001111
0011 01 00001101
0100 01 00010011
  • 汇编语言
MOV a,R1
ADD b,R1
MOV R1,sum
  • 高级语言
int a = 1;
int b = 2;
int c = a + b;

程序设计的巴别塔

不完全统计,人类已经发明近9000种程序设计语言!

高级程序设计语言简史(1956–2004)

世界上最好的语言?

高级程序语言活跃度分析平台——TIOBE Index

TIOBE Index

教员箴言

没有最好,只有最合适!

3. 初识C/C++语言

C/C++语言

1973年,Ken Thompson与Dennis Ritchie在实现UNIX操作系统过程中设计了C语言

  • 1989年,ANSI制定了C语言标准C89
  • 1999年,ISO制定了C99标准
  • 不断更新的C语言标准:C11/17/23

1983年,贝尔实验室Bjarne Stroustrup对C进行改进和扩充,命名为C++

  • 在C语言中引入了面向对象的思想
  • 兼容C语言,可不加修改地使用C语言代码
  • C++语言标准:C++98/03/11/14/17/20/23/26

C语言:可爱又迷人的反派角色

  • 优势
    • 可移植性
    • 最小化设计
    • 极致的性能
    • 高质量的标准库
  • 不足
    • 高级语言中最低级
    • 学习难、编程难
    • 内存安全风险极高
    • 社区分散

高级语言设计:性能与易用性的折中

“C语言诡异离奇,缺陷重重,却获得了巨大的成功”

——《C陷阱与缺陷》

计算机科学史讲堂

  • Ken Thompson与Dennis Ritchie,贝尔实验室骨灰级游戏玩家,UNIX操作系统与C语言发明者,1983年图灵奖。

Ken Thompson (1943–)

Dennis Ritchie (1941–2011)

Thompson and Ritchie working at a PDP-11

Hello World!

helloworld.cpp
#include <iostream>
using namespace std;

// 主函数
int main() {
  cout << "Hello world!\n";
  return 0;
}

庖丁解牛

  • #include <iostream>:包含外部库,类似于Python的import
  • using namespace std;:使用标准命名空间,类似于Python的from ... import *
  • int main():主函数,C/C++程序的执行入口
    • main函数参数列表为空
    • main函数返回值类型为整型int
    • {}:代码块,不同于python使用缩进界定代码块边界,C/C++使用花括号标记代码块的开始和结束
    • return 0;:返回0,表示程序正常结束,若非0则表示发生错误(别问为什么,问就是惯例)
  • cout << "Hello world!\n";:输出字符串,类似于Python的print('hello world')
  • //:行注释,编译器将忽略注释内容
  • ;:语句结束符,所有C/C++语句必须以分号结束,多个语句可以写在同一行,一个语句可以分成多个行

C/C++开发过程

  • 编辑:编写源代码
  • 编译:将源代码转换为目标代码(二进制)
  • 链接:将目标代码与库文件链接为可执行文件
  • 调试:发现和纠正程序中错误

---
config:
  look: handDrawn
  themeVariables:
    fontSize: 28px
---
flowchart LR
  编辑 --> 编译 --> 链接 --> 调试
  调试 -.-> 编辑

进入helloworld.cpp所在的目录,编译、链接此程序并运行

$ g++ -c -o helloworld.o helloworld.cpp # 生成目标文件helloworld.o
$ g++ -o helloworld helloworld.o # 链接生成可执行程序helloworld
$ ./helloworld # 运行可执行程序

对于单一文件构成的程序,编译、链接可以合并为一步

$ g++ -o helloworld helloworld.cpp

考考你

目标代码和可执行程序均为二进制程序,它们之间有何区别?

4. 开发环境部署

编程环境

  • 课程教学采用Ubuntu Linux系统下的C++开发环境
    • 推荐采用WSL(Windows Subsystem for Linux)方式部署
  • 开发工具:VSCode

温馨提示

  • 本课程不强制要求使用Linux系统,但强烈推荐使用
  • 如果部署遇到难题,也可采用Windows下的MinGW开发环境

安装WSL

参照官方文档安装WSL

WSL启用后安装Ubuntu

常见问题

如果遇到“无法解析的服务器地址”,可尝试如下方法

安装工具链

启动WSL Ubuntu系统,执行下列命令安装C++开发工具

sudo apt update
sudo apt install binutils gcc g++ gdb make clang-format clangd

安装C++开发工具

安装VSCode

  • 参照官方文档安装VSCode

  • 安装插件

    • Remote-SSH
    • WSL
    • clang-format
    • clangd

安装VSCode插件

总结

课后作业

  • 安装开发环境(务必完成
  • 完成翻转课堂分组,请课代表提交分组信息:组名+成员名单
  • 预习
    • 教材第2、3章

计算机程序设计