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