Transcript 计算机

程序设计思想与方法
董笑菊
电子信息与电气工程学院
计算机科学与工程系
教师信息




办公地点:电院楼群3号楼519室
电话:34205060转602
E-mail
[email protected]
[email protected]
网址
http://basics.sjtu.edu.cn/~xiaoju/CT
2
助教

靳阳
– [email protected]

作业
请确定通过Python验证后发给助教
每个星期三晚上12点之前
3
课程信息

教材
– 《程序设计思想与方法——问题求解与计算思维》
高教出版社,2013

参考书
– Python Programming: An Introduction to
Computer Science. (电子版)
– How to Think Like a Computer Scientist—
Learning with Python.(电子版)
http://openbookproject.net/thinkCSpy/
– Python学习手册
4
课程信息

下载python 软件的地址
http://secant.cs.purdue.edu/
cs190c:textsoft09
5
教学方式

课堂教学
- 每星期四3, 4节
–讲课, 演示

机房上机
–双周周一1, 2节, 电院4号楼311教室
–完成当天上机作业并提交
–答疑
6
考核方式

期末考试
– 笔试, 占最终成绩的50%

平时作业
– 编一些小程序, 邮件或ftp上传给助教, 占最终成
绩的20%

大作业
– 编一个大程序, 期末提交, 占最终成绩的30%
7
7
第1章 计算与计算思维
计算机: 硬件(1)
输入设备
CPU
输出设备
主存储器
次级存储器
9
计算机:硬件(2)

中央处理器(CPU):执行指令
– 每条指令只能完成简单的操作!

例如: 加法, 比较, 移动, etc.
– 但按一定的次序执行大量简单指令能完成复杂任
务!

存储器: 存储信息(程序和数据)
– 主存: CPU能直接访问,速度快但易失
– 次级存储器:速度慢但持久

输入/输出设备:人机交互
10
10
计算机:软件

计算机是信息处理机器,信息处理过程
由预定的程序控制.
–单条指令是做不了什么事情的,需要大量
指令组成一个逐步执行的指令序列,即程序.


各种程序统称为计算机软件.
没有软件的计算机毫无用处.
11
11
计算

计算: 利用计算机执行程序来解决问题.
–不是狭义的数学计算!

程序使得简单指令能完成复杂任务.
–问:只会加法的小学生能完成乘法运算任务吗?
–答:能!关键是编写合适的程序
在纸上写下0,记住结果;
给所记结果加上第1个n,记住结果;
给所记结果加上第2个n,记住结果;
……
给所记结果加上第m个n,记住结果;
报告结果(即m×n)
12
12
通用计算机

计算机执行一个程序即可实现一个功能;换着
执行不同的程序即可实现不同的功能.
–例如: word, media player, 录音机, etc

通用计算机:可以加载不同的程序来执行.
–与一些电器的比较
 电视机:功能单一
 洗衣机:功能较多(可加载多种洗涤程序)
 手机:功能更多,基本上就是计算机.
13
计算机科学

并非研究计算机!
– 计算机之于计算机科学家正如望远镜之于天
文学家. (E. W. Dijkstra)

CS研究计算的基础,实现与应用.
– 例如,CS的一个基本问题:什么是可计算的?

本课程的目标:像计算机科学家一样思考
14
14
程序设计

计算的关键是程序设计(编程).
–给定一个问题,利用计算机支持的简单操
作,设计出一个操作步骤的序列,计算机执
行这个序列从而解决问题.

学习程序设计的好处:
–做计算机的主人
–提高问题求解能力
–本身是很有乐趣的智力活动
15
程序设计语言

问:用什么语言告诉计算机做什么?
答:用精确无歧义的程序设计语言.
– 精确的语法和语义(形式和意义)
16
16
程序设计语言

有不同层次的程序设计语言
– 计算机的“母语”: 机器语言

例如: 0000010000000001.是Intel8086能理解
的一条指令
– 将机器语言用助忆符表示:汇编语言

上例即: ADD AL,1.需要汇编器处理后机器才懂
– 适合人用的语言: 高级语言

如: x = y + 1. 需要编译器或解释器翻译后机器才懂
17
17
程序设计语言

高级语言的翻译
– 编译
源代码编译成目标代码, 再执行
一次编译, 多次执行.
– 解释
源代码直接被解释执行
每次执行都要重新解释.
18
18
编译vs解释
源代码
编译器
目标代码
输入数据
处理器
源代码
解释器
输入数据
处理器
输出
输出
思考:为什么高级语言程序具有可移植性,
即同一个程序可以在不同厂商的计算机上执行?
19
算法与编码实现

程序设计
– 先用非形式化的语言将问题求解步骤表达
出来——算法;

伪代码
– 再用形式化的编程语言将上述算法实现—
—程序

代码
20
算法 例:欧几里德算法
欧几里德算法:求最大公约数.
输入:自然数a, b
输出: a, b的最大公约数
步骤:
第1步:令r为a除以b所得余数
第2步:若r = 0,则算法结束, b即为答案
否则置a←b, b←r,转到第1步.

21
对算法的要求

算法的每个步骤必须是明确的,可行的.
– 不明确:"在菜中放点盐"
– 不可行:"用青菜豆腐做出龙肝凤髓的美味"
– 每个步骤不必是最底层的琐细步骤,可以是组合的
高级步骤.如:"焯水"


算法的所有步骤必须在有限时间内完成.
我们说的计算,即是指"算法计算":用明确可
行的基本步骤组成的序列来解决问题.
22
计算思维

计算思维(computational thinkin
– 计算机科学家利用计算机(计算过程)解决问
题时的思想和方法
– 计算机科学(CS)是关于“计算”的科学

如何像计算机科学家一样思考?
23
23
真的有计算思维吗?

人们在解决不同问题时有不同的思考方式
–数学思维:解数学问题
–工程思维:工程设计
–形象思维:文学创作
–......


计算思维:建立在计算机的能力与局限之上.
由于计算机的广泛应用,计算思维未来会成为
人们的基本能力.
–与阅读,书写,算术能力一样!
24
计算思维 例:问题表示

问题的表示(建模)
– 抽象:将现实中的各种数量关系,空间关系,
处理过程抽象为计算机的数据结构和控制
结构

例如:温度数据抽象为数值还是文字?
– 不同抽象层次

问题表示得合适与否直接影响问题的解
法的发现和效率
25
计算思维 例:算法设计




化难为易:
分解, 约简, 嵌入, 转换, 模拟…
分治法, 递归法, 贪心法, 动态规划...
递归地思考
并行处理
26
计算思维 例:编程实现




类型系统与类型检查
结构化与模块化的思考
编程范型:过程式,面向对象,函数式,...
程序美学,系统设计的简洁与优雅
27
计算思维 例:计算理论

算法复杂度分析
– 问题的解法是有效率差别的
– 有些问题是难解的
– 寻求近似解

问题的可计算性
– 有些问题是不可计算的
28
计算思维 例:其他





预取和缓存
对最坏情况的预防,保护,恢复
启发式推理
时空等不可兼得要素的权衡
……
29
计算思维的特点






是概念化思考,而非编程
是基本思考能力,而非机械的套用
是人的思考,而非计算机
与数学思维和工程思维相结合
是思想,而非人造物
人人皆有,处处皆是
30
生活中的计算思维







算法:最大公约数
查找方法:查黄页是顺序翻找还是借助
索引
排序:整理扑克牌
排队:先来先处理
预取与缓存:书包存放当天上课用的书
并行处理:烧菜
……
31
计算 + X







计算数学,计算几何,自动定理证明
计算物理学
计算化学
计算生物学,生物信息学
计算经济学
计算机艺术:电影特效,计算机作曲绘画
书法
……
32
计算+X: 十二五863计划

征集重大应用软件课题
–
–
–
–
–
–
–
–
聚变与裂变能源数值模拟
真实飞机外型全流场和优化设计数值模拟
航天飞行器全飞行流域数值模拟
新药研发与蛋白质折叠数值模拟
真实感动漫渲染与创作
大型工程设备结构力学分析
复杂电磁环境数值模拟
新型材料设计与性能评估
33
2013年诺贝尔化学奖


多尺度复杂化学系统模型:在多尺度模
型的辅助下,化学家们让计算机“做帮
手”来揭示化学过程.
诺贝尔化学奖评选委员会:对化学家来
说,计算机是同试管一样重要的工具,计
算机对真实生命的模拟已为化学领域大
部分研究成果的取得立下了“汗马功劳”
34
Lu Chaojun, SJTU
34
本课程的定位


学习利用计算机解决问题的思想方法,应用于
其他专业领域
不是程序设计语言课程!
–编程是计算思维的实践
–坏消息:学习编程语言需要掌握非常繁琐的细节
–好消息:Python语言非常简单,易学易用

不是算法和数据结构课程!
–会学习一些基本的知识
35
本课程的定位(续)
数学
计
算
思
维
计算机科学
可
计
算
性
理
论
程
序
设
计
语
言
算
法
设
计
与
分
析
数
据
结
构
理,化,生...
经,管,金融...
工程
艺术
36
Python语言

荷兰人Guido van Rossum于1980年代
发明.
– 通用/跨平台/开源/自由(免费)
– 简单易学,高度的可读性
– 支持多种编程范型

编译+解释
源代码先编译成字节码,再解释执行
37
Python语言

流行编程语言前10名之一(当前第8位)
http://www.tiobe.com/index.php
/content/paperinfo/tpci/index.
html
38
Lu Chaojun, SJTU
38
Python安装与运行

版本:教材和上课都采用Python 2.7
–与最新的Python 3.x有不兼容的地方.

安装后,启动Python解释器
–命令行
–GUI
39
第一个程序:HelloWorld
交互方式
>>> print "Hello, World!"
Hello, World!
 本课程的教学中常用交互方式演示新语句
 实际上很少用交互方式执行程序

– 多次执行同一程序需要多次输入程序
– 多行语句无法一次性执行
40
第一个程序:HelloWorld

程序文件
– 将语句保存在纯文本文件hello.py中
print "Hello, World!"
– 四种执行方式
在IDLE中用Run Module菜单执行
 双击hello.py文件图标
 >>> import hello
 C:\Python27> python hello.py

41
程序构件:数据


数据是被处理的信息
有不同类型的数据
– 字符串数据
>>> print "Hello, World!"
– 数值数据
>>> print 3.1415
42
程序构件:变量

和数学类似:用一个名字表示可变的数
据
– 数学中多用单字母,程序中多用单词/词组

标识符:Python命名
– 以字母或下划线开头,后跟0个或多个字母,
数字,下划线.区分大小写字母.
合法: x xYz x_123 _ __ _w3
非法: 3q x-123 first name

良好的命名风格:有意义,风格一致
43
程序构件:表达式

表达式:能计算出一个值.
– 字面值: 3.14, “hello”
– 变量
– 数据+运算符(如    )
>>> 2+3*4-5

运算符
– 不同类型的数据有不同运算
– 运算符有优先级

良好编程风格:用空格,括号增加表达式的可
读性.
44
程序构件:语句

输出语句
– 我们用语句模板来给出正确用法
print <表达式>
print <表达式1>,<表达式2>,...

赋值语句
>>> x = 3.14
>>> print x * 10
45
Lu Chaojun, SJTU
45
程序构件:函数

多条语句构成一个整体,并命名
>>> def greet():
print "Hello!"
print "Goodbye!"
>>> greet()
Hello!
Goodbye!

习惯上为程序定义一个主函数main
46
程序构件:注释

程序中可以使用注释,用于解释变量用
途,函数功能等等信息.
# Author: John
# Version: 1.0
def main():
....


注释是给人看的,对程序执行没有作用,
被编译器/解释器忽略.
良好的编程风格:多用注释!
47
End
48