计算机与程序
通用计算机 计算机是具有如下特征的机器: 人们造了各种各样的计算机,但:所有计算机具有相同的能力! 能够存储和处理信息 信息处理由程序控制 输入处理输出 信息处理由程序控制 计算机程序是一个详细的逐步执行的指令序列,告诉计算机该做什么. 程序可改变:不同的程序完成不同的处理任务. 人们造了各种各样的计算机,但:所有计算机具有相同的能力! 2 2 Lu Chaojun, SJTU Lu Chaojun, SJTU
软件统治硬件 程序决定了计算机做什么. 程序设计:编写软件的过程. 程序设计极具挑战性: 为何学程序设计? 没有程序,计算机只是一堆废铁. 既要具备大视野 又要关注细枝末节 为何学程序设计? 做计算机的主人 乐趣 培养问题求解能力 Lu Chaojun, SJTU
什么是计算机科学? 并非研究计算机! CS研究计算的基础及其实现与应用. CS要回答的基本问题:什么是可计算的? 计算机之于计算机科学家正如望远镜之于天文学家. (E. W. Dijkstra) CS研究计算的基础及其实现与应用. CS要回答的基本问题:什么是可计算的? 对此问题的回答有三种方式: 实际设计一个解决问题的算法 理论分析问题的可解性 无解的,不是能行可解的 通过实验来研究问题. 4 Lu Chaojun, SJTU
硬件基本知识 CPU 输出设备 输入设备 主存 次级存储器 Lu Chaojun, SJTU
硬件基本知识(续) 中央处理器(CPU):执行运算. 存储器存储程序和数据. 输入/输出设备:人与计算机交互 只提供简单的运算,如加法,比较等. 存储器存储程序和数据. CPU只能直接访问主存. 主存快但易失,次级存储器慢但持久 输入/输出设备:人与计算机交互 Lu Chaojun, SJTU
程序设计语言 问:用什么语言告诉计算机做什么? 答:用精确无歧义的程序设计语言. 有不同层次的程序设计语言 精确的语法和语义 计算机自己的母语:机器语言 例如: 0000010000000001.是Intel8086能理解的一条指令. 把机器语言用助忆符表示:汇编语言 上例即: ADD AL,1.需要汇编器处理后机器才懂. 适合人用的语言:高级语言 如: x = y + 1. 需要编译器或解释器翻译后机器才懂. Lu Chaojun, SJTU
高级语言 高级程序设计语言有很多种,据说2008年网上被引用最多的10个语言是(按字母顺序): C, C++, C#, Java, JavaScript, Perl, PHP, Python, Ruby, SQL. 高级语言的翻译 编译:源代码编译成目标代码,再执行.一次编译,多次执行. 解释:源代码直接被解释执行.每次执行都要重新解释. Lu Chaojun, SJTU
Python 荷兰计算机科学家Guido van Rossum于1990年发明. 特色:通用OOPL/跨平台/开源/自由(免费) Python采用编译/解释混合方式:先编译成字节码,再解释执行. 安装Python 2.x 与新的Python 3.x有不兼容的地方. 启动Python解释器 命令行 GUI:IDLE Lu Chaojun, SJTU
初识Python 语句 串,数,表达式 变量与赋值 执行单条语句vs语句块(函数) 函数 模块(脚本)文件 注释 定义,调用,参量,左缩进 模块(脚本)文件 注释 应用实例:模拟(chaos.py) Lu Chaojun, SJTU
Python程序基本构件
程序设计需要系统化的方法 程序设计是用精确的语言告诉计算机该做什么,要精确到最细节处. 计算机只会刻板地执行程序. 一方面要写大型程序,一方面要精确到细枝末节,这极具挑战性. 细节上的微小差错可带来巨大灾难. 1971/9/10,东风五号首枚遥测弹因软件设计问题致使二级主发动机提前关机,落点偏离565公里. 1996年Ariane 5火箭首次鉴定发射失败的原因是将一个浮点数转换为整数的程序代码有问题. Lu Chaojun, SJTU
软件开发过程 需求分析:问题是什么? 制定程序规格:程序要做什么? 设计:程序怎么做? 实现:用某种程序设计语言翻译设计. 对简单程序描述输入输出即可. 设计:程序怎么做? 主要任务是设计出满足规格的算法 一般用伪代码给出总体结构,不纠缠细节. 实现:用某种程序设计语言翻译设计. 测试与排错:测试程序是否如预期,排除bug. 维护:运行中还会不断有问题. Lu Chaojun, SJTU
例:温度转换 需求:预报摄氏度,想知道对应华氏度. 规格:输入摄氏度,显示输出华氏度.两者对应关系是F=(9/5)C+32. 设计算法:简单的IPO(详见下页) 实现:翻译成Python程序(详见下页) 测试:常用边界数据.如输入0,100 Lu Chaojun, SJTU
算法与实现 伪代码算法: Python程序实现: 输入摄氏度celsius 计算华氏度fahrenheit=9/5 celsius + 32 # convert.py # A program to convert Celsius temps to Fahrenheit # by: Suzie Programmer def main(): celsius = input("What is the Celsius temperature? ") fahrenheit = 9.0 / 5.0 * celsius + 32 print "The temperature is", fahrenheit, "degrees Fahrenheit.“ main() Lu Chaojun, SJTU
程序构件:标识符 标识符:值,变量,函数,模块等的名字. 良好编程风格:选择有意义的名字,并且风格保持一致. 字母下划线开头,后接字母数字下划线 大小写敏感 良好编程风格:选择有意义的名字,并且风格保持一致. 保留字不能用于命名: and, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while, yield Lu Chaojun, SJTU
程序构件:表达式 表达式:能计算出一个数据值的代码片段. 运算符 良好编程风格:用空格,括号增加可读性. 字面值: 3.9, “abc” 变量: 如x, celsius 表达式 op 表达式: 3.9 * x * (1x) 运算符 不同类型的数据有不同运算 数值数据的运算: 运算符有优先级 良好编程风格:用空格,括号增加可读性. Lu Chaojun, SJTU
程序构件:输出语句 如何描述语句的语法和语义? 输出语句print的语法: 需要一套元语言来描述,我们用语句模板表示法. 输出语句print的语法: print print <expr> print <expr>, <expr>, …, <expr> print <expr>, <expr>, …, <expr>, print的语义:自左向右计算表达式的值并在一行上显示,值之间以空格隔开. 最后输出换行,但以逗号结尾时不换行. Lu Chaojun, SJTU
程序构件:赋值语句 语法 语义: 计算表达式<expr>的值,存入变量<var>. <var> = <expr> 语义: 计算表达式<expr>的值,存入变量<var>. Python特色:可以随时随地通过赋值语句创建变量;变量类型由赋值语句决定. 一个变量可被多次赋值,但总是持有最后一次赋值的结果. Lu Chaojun, SJTU
程序构件:赋值语句(续) 输入赋值语句 语义 良好风格 <var> = input(<prompt>) 等待用户输入一个表达式(以回车键结束) 计算用户输入的表达式,得到input( )的值 把input( )的值存入<var>. 良好风格 用<prompt>提醒用户输入 <prompt>以空格结束. (Why?) Lu Chaojun, SJTU
程序构件:赋值语句(续) 同时赋值 语义:计算右边各表达式的值,分别存入左边的对应变量. 例如:如何交换两个变量的值? <var>, ... ,<var> = <expr>, ... ,<expr> 语义:计算右边各表达式的值,分别存入左边的对应变量. 例如:如何交换两个变量的值? 传统语言的做法:引入一临时变量 Python特色: x, y = y, x input( )也可为多个变量同时赋值 多个输入用逗号分隔 Lu Chaojun, SJTU
程序构件:for循环 语法 for <var> in <sequence>: <body> 循环次数是确定的.(特别地,称为计数循环) <sequence>是一个值的序列,如[1,3,5,7,9]或range(10)(即[0,1,…,9]). <body>可以是任何语句序列,用左缩进标识. 语义:<var>依次取遍<sequence>的每个值,对每一取值执行一次<body>. Lu Chaojun, SJTU
程序的控制流 程序的诸语句通常是顺序执行的,但循环语句改变了控制流,表示一种控制结构. 控制流可以用流程图直观表达 <body> 无 <var>取<seq>的下一个值 有 <body> Lu Chaojun, SJTU
End