中文课件第1章 - RAD Lab

Download Report

Transcript 中文课件第1章 - RAD Lab

1896
程序设计思想与方法
行课安排为第1周-第16周
星期二 第6节-第8节
东上院101(1-16周)
1920
1987
2006
相关信息
1896
1920
教师
黄林鹏(电信学院计算机科学与工程系)
邮箱: [email protected]
课件资料:
ftp://ftp.cs.sjtu.edu.cn:990/lu-cj
助教
待定
2
1987
2006
教材和参考书
1896
1920
1987
教材
陆朝俊
《程序设计思想与方法——问题求解与计算思维》
高教出版社, 2013.
参考书
John V. Guttag
《Introduction to Computation and
Programming Using Python》
MIT Press 2013、2014
3
2006
考核方式
1896
1920
1987
2006
期末考试
• 笔试, 占最终成绩的50%
平时作业
• 编小程序, 邮件或ftp上传给助教, 占最终成绩的
20%
大作业
• 编一个大程序, 期末提交, 占最终成绩的30%
4
1896
1920
第1章 计算与计算思维
1987
2006
计算机:(1)
1896
1920
1987
控制器
运算器
文件子系统
内存
字符设备
内存管理
外存
硬件
软件
2006
计算机:硬件(2)
1896
1920
1987
2006
中央处理器(CPU):执行指令.
• 每条指令只能完成简单的操作!
• 例如:加法, 比较, 将数据从一个内存单元移到另
一单元, etc.
存储器:存储信息(程序和数据).
• 主存:CPU能直接访问,速度快但易失.
• 次级存储器:速度慢但持久.
输入/输出设备:人机交互
7
计算机:软件
1896
1920
1987
2006
计算机是信息处理机器,信息处理过程
由预定的程序控制.
• 单条指令是做不了什么事情的,需要
大量指令组成一个逐步执行的指令序
列-程序.
各种程序统称为计算机软件.
没有软件的计算机毫无用处.
8
计算
1896
1920
1987
2006
计算:利用计算机执行程序来解决问题.
• 不是狭义的数学计算!
程序使得简单指令完成复杂任务.
• 问:只会加法的小学生能完成乘法运算任务吗?
• 答:能!关键是编写合适的程序
在纸上写下0,记住结果;
给所记结果加上第1个n,记住结果;
给所记结果加上第2个n,记住结果;
……
给所记结果加上第m个n,记住结果;
报告结果(即m×n)
9
通用计算机
1896
1920
1987
计算机执行一个程序即可实现一个功能;换着执
行不同的程序即可实现不同的处功能.
通用计算机:可以加载不同的程序来执行.
• 与一些电器的比较:电视机功能单一,洗衣机则功能较
多(可加载多种洗涤程序),现在的手机则功能更多,基
本上就是计算机.
2006
计算机科学
1896
1920
1987
2006
并非研究计算机!
• 计算机之于计算机科学家正如望远镜之于天文学
家. (E. W. Dijkstra)
CS研究计算的基础,实现与应用.
• 例如,CS的一个基本问题:什么是可计算的?
本课程的学习目标:像计算机科学家一样思考.
11
程序设计
1896
1920
1987
2006
计算的关键是程序设计(编程).
• 给定一个问题,利用计算机支持的简单操作,设计
出一个操作步骤的序列,计算机执行这个序列从而
解决问题.
学习程序设计的好处:
• 做计算机的主人
• 提高问题求解能力
• 本身是很有乐趣的智力活动
12
程序设计语言
1896
1920
1987
2006
问:用什么语言告诉计算机做什么?
答:用精确无歧义的程序设计语言.
• 精确的语法和语义
有不同层次的程序设计语言
• 计算机的"母语":机器语言
• 例如: 0000010000000001.是Intel8086能理解的一条指
令.
• 将机器语言用助忆符表示:汇编语言
• 上例即: ADD AL,1.需要汇编器处理后机器才懂.
• 适合人用的语言:高级语言
• 如: x = y + 1. 需要编译器或解释器翻译后机器才懂.
13
编译vs解释
源代码
编译器
目标代码
输入数据
处理器
源代码
解释器
输入数据
处理器
1896
1920
1987
输出
输出
思考:为什么高级语言程序具有可移植性,即同一个程序
可以在不同厂商的计算机上执行?
2006
算法与编码实现
1896
1920
1987
程序设计
• 先用非形式化的语言将问题求解步骤表达出来——算
法;
• 伪代码
• 再用形式化的编程语言将上述算法实现——程序.
• 代码
2006
1896
1920
算法例:欧几里德算法
欧几里德算法:求最大公约数.
输入:自然数a、b
输出:a、b的最大公约数
步骤:
第1步:令r为a除以b所得余数
第2步:若r=0,则算法结束,b即为答案;否则置
a←b,b←r,转到第1步.
1987
2006
对算法的要求
1896
1920
1987
算法的每个步骤必须是明确的,可行的.
• 不明确:"在菜中放点盐"
• 不可行:"用青菜豆腐做出龙肝凤髓的美味"
• 每个步骤不必是最底层的琐细步骤,可以是组合的高
级步骤.如:"焯水"
算法的步骤必须在有限时间内完成.
我们说的计算,即是指"算法计算":用明确可行的
基本步骤组成的序列来解决问题.
2006
计算思维
1896
1920
1987
2006
计算思维(computational thinking)是计算
机科学家利用计算机(计算过程)解决问题时
的思想和方法.
• 计算机科学(CS)是关于“计算”的科学.
如何像计算机科学家一样思考?
18
计算思维?
1896
1920
1987
2006
人们在解决不同问题时有不同的思考方式
• 数学思维:解数学问题
• 工程思维:工程设计
• 形象思维:文学创作
• ......
计算思维:建立在计算机的能力与局限之上.
由于计算机的广泛应用,计算思维未来会成为人
们的基本能力.
• 与阅读,书写,算术能力一样!
19
19
1896
1920
1987
计算思维例:问题表示
问题的表示(建模)
• 抽象:将现实中的各种数量关系,空间关系,处理过程
抽象为计算机的数据结构和控制结构
• 例如:温度数据抽象为数值还是文字?
• 不同抽象层次
问题表示得合适与否直接影响问题的解法的发现
和效率
Lu Chaojun, SJTU
20
2006
1896
1920
1987
2006
计算思维例:算法设计
化难为易:分解,约简,嵌入,转换,模拟...
分治法,递归法,贪心法,动态规划...
递归地思考
并行处理
21
1896
1920
1987
2006
计算思维例:编程实现
类型系统与类型检查
结构化与模块化的思考
编程范型:过程式,面向对象,函数式,...
程序美学,系统设计的简洁与优雅
22
1896
1920
1987
2006
计算思维例:计算理论
算法复杂度分析
• 问题的解法是有效率差别的
• 有些问题是难解的
• 寻求近似解
问题的可计算性
• 有些问题是不可计算的
Lu Chaojun, SJTU
23
1896
1920
计算思维例:其他
预取和缓存
对最坏情况的预防,保护,恢复
启发式推理
时空等不可兼得要素的权衡
……
24
1987
2006
1896
1920
1987
2006
计算思维的特点
是概念化思考,而非编程
是基本思考能力,而非机械的套用
是人的思考,而非计算机
与数学思维和工程思维相结合
是思想,而非人造物
人人皆有,处处皆是
25
生活中的计算思维
1896
1920
1987
算法:小学算术中的长除法
查找方法:查黄页是顺序翻找还是借助索引
排序:整理扑克牌
排队:先来先处理
预取与缓存:书包存放当天上课用的书
并行处理:烧菜
……
「长除」,适用于整式除法、小数除法、多项式除法(
即因式分解)等较重视计算过程和商数的除法,过程中
兼用了乘法和减法。
26
2006
计算 + X
1896
1920
计算数学,计算几何,自动定理证明
计算物理学
计算化学
计算生物学,生物信息学
计算经济学
计算机艺术:电影特效,计算机作曲绘画书法
……
Lu Chaojun, SJTU
27
1987
2006
1896
1920
1987
2006
计算+X:十二五863计划
征集重大应用软件课题
• 聚变与裂变能源数值模拟
• 真实飞机外型全流场和优化设计数值模拟
• 航天飞行器全飞行流域数值模拟
• 新药研发与蛋白质折叠数值模拟
• 真实感动漫渲染与创作
• 大型工程设备结构力学分析
• 复杂电磁环境数值模拟
• 新型材料设计与性能评估
28
本课程的定位
1896
1920
1987
学习利用计算机解决问题的思想方法,应用于其
他专业领域
不是程序设计语言课程!
• 编程是计算思维的实践
• 坏消息:学习编程语言需要掌握非常繁琐的细节
• 好消息:Python语言非常简单,易学易用
不是算法和数据结构课程!
• 会学习一些基本的知识
Lu Chaojun, SJTU
29
2006
1896
1920
1987
2006
本课程的定位(续)
数学
计
算
思
维
计算机科学
可
计
算
性
理
论
程
序
设
计
语
言
算
法
设
计
与
分
析
数
据
结
构
理,化,生...
经,管,金融...
工程
艺术
30
Python语言
1896
1920
1987
2006
荷兰人Guido van Rossum于1980年代发明.
• 通用/跨平台/开源/自由(免费)
• 简单易学,高度的可读性
• 支持多种编程范型
编译+解释:源代码先编译成字节码,再解释执行
流行编程语言前10名之一.
http://www.tiobe.com/index.php/content/paperinfo/tp
ci/index.html
31
1896
1920
为什么使用 Python语言?
http://code.csdn.net/news/2820636
Philip Guo
1987
2006
1896
1920
1987
2006
Python是世界顶尖高校中最受欢迎的
入门编程语言
在美国top高校中,Python已经成为教授
计算机科学入门课程方面最受欢迎的语言。
Top10的CS系中有8所,Top39的CS系中有24
所,在入门课程中教授Python语言。
1896
1920
1987
2006
Python成为最受欢迎语言的动机
这是因为选择不同的语言不仅反映了不同
学校计算机系的教育哲学,更为重要的是,
它影响了许多学生对计算机科学的第一印
象。
被这些Top高校选择的语言暗示着计算机科
学教育的发展趋势,要知道,这些Top高校
实际上就是趋势的制定者。
1896
1920
1987
研究对象:大学CS、CSE、EECS这三个专业的CS0
和CS1课程。
CS1代表CS专业的学生最需要学习的课程,CS0代
表一门入门的编程课,上这门课的可能是还没有
定专业的学生或者是在上CS1前需要额外准备的
学生。
学习CS0和CS1都不需要其他任何CS方面的预备知
识。要不然他们也不会是学生选择的第一门CS课
程(学习CS1之前也不一定要学CS0)。
2006
1896
1920
1987
2006
尽管一些老师认为CS1指的就是入门编程课程,
研究还是将CS1和CS0放在一起,因为对许多学生
来说,它们都是在大学学习的第一门编程语言。
鉴于美国K-12(相当于国内的小学到高中)教育
在计算机科学教育方面的不幸状态,这些大学课
程可能是许多学生,特别是女性和少数民族,第
一次接触到编程语言。即使学生事先有编程经验,
编程语言第一次正式出现在大学课程中仍然具有
很大的影响力。
1896
1920
1987
我认为CS0和CS1同样重要,因为随着编程在科学
领域变得无孔不入,越来越多的非专业人士也开
始学习CS0课程。再者,少部分CS专业的学生在
学习CS1之前会先学习CS0,特别是那些之前没有
任何编程经验的学生。所以,对学生来说,CS0
课程作为通往计算世界的大门起着极其重要的作
用,没有这门课程,他们可能都不会知道自己在
这方面有着如此巨大的热情。
2006
七种最受欢迎的语言在Top39高校中的使用情况
1896
1920
1987
将每个柱形代表的数字加起来和大于39,这是因
为许多学校同时提供了CS0和CS1的课程。
2006
1896
1920
1987
Java语言在过去的十年中在入门课程教学中一直
占有主宰地位。但是现在,一些学校完全摒弃了
Java,全部使用Python,还有一些学校采取了一
个混合的方法,在CS0中使用Python,而在CS1的
教学中使用Java。
MATLAB经常在CS0课程中使用。跟在MATLAB之后是
C++,在过去十年中,C++的重要地位被Java完全
取代。在2003年,高中的AP课程甚至都用Java取
代了C++。从这个表格来看,C语言和C++语言受
欢迎的程度一致。
2006
1896
1920
1987
静态类型的功能性语言,比如说 Haskell 和
OCaml,这些语言在PL研究者中非常受欢迎。
动态类型的语言,比如说JavaScript,Ruby和
PHP,这些语言在网络编程者中非常受欢迎。
广泛使用的工业语言,这些语言一般和特定的平
台相关联,包括苹果的 Objective-C和微软的
C#/Visual Basic。
2006
Python安装与运行
1896
1920
1987
2006
版本:教材和上课都采用Python 2.7
• 与最新的Python 3.x有不兼容的地方.
安装后,启动Python解释器
• 命令行
• GUI
41
工具
MIT 课程使用 Python 2.7
1896
1920
1987
2006
(Canopy)
https://www.enthought.com/products/epd/fre
e/
Python 2.7
VPython 2.7
WingIDE
IDLE
PyDev (Eclipse)
http://radlab.sjtu.e
du.cn:1234
1896
1920
1987
2006
第一个程序:HelloWorld
交互方式
>>> print "Hello, World!"
Hello, World!
本课程的教学中常用交互方式演示新语句
实际上很少用交互方式执行程序
• 多次执行同一程序需要多次输入程序
• 多行语句无法一次性执行
43
1896
第一个程序:HelloWorld
程序文件
• 将语句保存在纯文本文件hello.py中
print "Hello, World!"
• 四种执行方式
•
•
•
•
在IDLE中用Run Module菜单执行
双击hello.py文件图标
>>> import hello
C:\Python27> python hello.py
1920
1987
2006
1896
1920
1987
2006
程序构件:数据
数据是被处理的信息
有不同类型的数据
• 字符串数据
>>> print "Hello, World!"
• 数值数据
>>> print 3.1415
45
1896
1920
1987
2006
程序构件:变量
和数学类似:用一个名字表示可变的数据
• 数学中多用单字母,程序中多用单词/词组
标识符:Python命名
• 以字母或下划线开头,后跟0个或多个字母,数字,
下划线.区分大小写字母.
合法: x xYz x_123 _ __ _w3
非法: 3q x-123 first name
良好的命名风格:有意义,风格一致
46
程序构件:表达式
1896
1920
1987
2006
表达式:能计算出一个值.
• 字面值: 3.14, “hello”
• 变量
• 数据+运算符(如    )
>>> 2+3*4-5
运算符
• 不同类型的数据有不同运算
• 运算符有优先级
良好编程风格:用空格,括号增加表达式的可
读性.
Lu Chaojun, SJTU
47
程序构件:语句
1896
1920
1987
2006
输出语句
• 我们用语句模板来给出正确用法
print <表达式>
print <表达式1>,<表达式2>,...
赋值语句
>>> x = 3.14
>>> print x * 10
48
程序构件:函数
1896
1920
1987
2006
多条语句构成一个整体,并命名
>>> def greet():
print "Hello!"
print "Goodbye!"
>>> greet()
Hello!
Goodbye!
习惯上为程序定义一个主函数main
49
程序构件:注释
1896
1920
1987
2006
程序中可以使用注释,用于解释变量用途,函
数功能等等信息.
# Author: John
# Version: 1.0
def main():
....
注释是给人看的,对程序执行没有作用,被编
译器/解释器忽略.
良好的编程风格:多用注释!
50
1896
谢谢!
1920
1987
2006