第五章结构化程序设计概论 机 程 序·学习目标 设 计 熟悉数据的基本概念,掌握数据的表示方法 基 础 熟悉代码的基本概念,掌握代码的控制方法 熟悉算法的基本概念,了解算法、程序与代码的 关系 掌握结构化程序设计的一般方法 了解问题规模与程序控制结构之间的关系 掌握程序测试的基本方法与手段 了解代码优化的基本策略 清华大学计算中心 http://learn.tsinghua.edu.cn 2
清华大学计算中心 http://learn.tsinghua.edu.cn 2 计 算 机 程 序 设 计 基 础 第五章 结构化程序设计概论 • 学习目标 – 熟悉数据的基本概念,掌握数据的表示方法 – 熟悉代码的基本概念,掌握代码的控制方法 – 熟悉算法的基本概念,了解算法、程序与代码的 关系 – 掌握结构化程序设计的一般方法 – 了解问题规模与程序控制结构之间的关系 – 掌握程序测试的基本方法与手段 – 了解代码优化的基本策略
计 算 5.1数据的基本概念 机 程 序·数据与信息 设 计·数据与地址 基 础 数据类型 文字常量 变量 声明 清华大学计算中心 http://learn.tsinghua.edu.cn 3
清华大学计算中心 http://learn.tsinghua.edu.cn 3 计 算 机 程 序 设 计 基 础 5.1 数据的基本概念 • 数据与信息 • 数据与地址 • 数据类型 • 文字常量 • 变 量 • 声 明
计 算 数据与数据类型 机 程 序·数据与信息 设 计 数据:数据特征、数据名称与特征值 基 础 信息:数据所具有的意义 数据并不能解释自身,程序不了解数据的意义 数据类型:对数据进行分类 每一类数据具有同样的存储表示(存储分配格 式),同样的操作集 基本数据类型(预定义数据类型)与用户自定义 类型(用户可按需创建新的数据类型) 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 4 计 算 机 程 序 设 计 基 础 数据与数据类型 • 数据与信息 – 数据:数据特征、数据名称与特征值 – 信息:数据所具有的意义 – 数据并不能解释自身,程序不了解数据的意义 • 数据类型:对数据进行分类 – 每一类数据具有同样的存储表示(存储分配格 式),同样的操作集 – 基本数据类型(预定义数据类型)与用户自定义 类型(用户可按需创建新的数据类型)
文字与 计算机程序设计基础 文字常量:程序中出现的值 只能以值的形式标识,其值不可改变 若要声明严格意义的常量,使用c99的 const 文字常量不可寻址,而普通常量可以寻址 变量:程序中定义和命名的数据对象 四个基本特征:VANT 先声明后使用 在程序执行期间,可改变变量的值,不能改变变 量的名称、类型与地址 清华大学计算中心 http://learn.tsinghua.edu.cn 5
清华大学计算中心 http://learn.tsinghua.edu.cn 5 计 算 机 程 序 设 计 基 础 文字与量 • 文字常量:程序中出现的值 – 只能以值的形式标识,其值不可改变 – 若要声明严格意义的常量,使用 C99 的 const – 文字常量不可寻址,而普通常量可以寻址 • 变量:程序中定义和命名的数据对象 – 四个基本特征:VANT – 先声明后使用 – 在程序执行期间,可改变变量的值,不能改变变 量的名称、类型与地址
计算机程序设计 声明 序·数据标识的目的:区分数据 模拟世界中各种数据的联系,构造具有复杂结构的数据 基 础°声明的目的 将程序执行时数据对象的名字与类型信息通知编译器, 在数据对象与数据值及存储位置间建立关联 辅助编译器选择合适的存储表示 使得类型检查静态化,减少程序错误 声明与定义 声明并不一定就是定义,声明虽引入名字,但只有那些 确实在程序中引入了实体的声明才是定义 清华大学计算中心 http://learn.tsinghua.edu.cn 6
清华大学计算中心 http://learn.tsinghua.edu.cn 6 计 算 机 程 序 设 计 基 础 声 明 • 数据标识的目的:区分数据 – 模拟世界中各种数据的联系,构造具有复杂结构的数据 • 声明的目的 – 将程序执行时数据对象的名字与类型信息通知编译器, 在数据对象与数据值及存储位置间建立关联 – 辅助编译器选择合适的存储表示 – 使得类型检查静态化,减少程序错误 • 声明与定义 – 声明并不一定就是定义,声明虽引入名字,但只有那些 确实在程序中引入了实体的声明才是定义
计 算 5.2代码的基本概念 机 程 序·表达式语义 设 计·赋值与初始化 基 础 代码与计算 控制流 断言与程序不变量 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 7 计 算 机 程 序 设 计 基 础 5.2 代码的基本概念 • 表达式语义 • 赋值与初始化 • 代码与计算 • 控制流 • 断言与程序不变量
计 算 表达式语义 机 程 序 表达式语义:表达式的求值顺序 设 C语言未规定表达式求值顺序,一般由操作符的优先级 计 与结合性决定 基 础·例外情况 递增递减操作符满足特定计算规则 不同编译器的实现可能不同:出于优化的目的,编译器 可能重排部分代码,表达式的求值顺序可能会发生用户 事先无法察觉的变化 既是优点(程序设计可以高度灵活)也是缺点(错 误的求值顺序带来错误的计算结果) 明确表达设计意图,尽量不在表达式中使用带副作用的 操作符,表达式应尽量简短 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 8 计 算 机 程 序 设 计 基 础 表达式语义 • 表达式语义:表达式的求值顺序 – C 语言未规定表达式求值顺序,一般由操作符的优先级 与结合性决定 • 例外情况 – 递增递减操作符满足特定计算规则 – 不同编译器的实现可能不同:出于优化的目的,编译器 可能重排部分代码,表达式的求值顺序可能会发生用户 事先无法察觉的变化 • 既是优点(程序设计可以高度灵活)也是缺点(错 误的求值顺序带来错误的计算结果) – 明确表达设计意图,尽量不在表达式中使用带副作用的 操作符,表达式应尽量简短
计 算 赋值与初始化 机 序·赋值:将数据对象与某个具体值相关联的基本操作 设 左值:出现在赋值号左边的数据对象具有左值,在程序 计 基 中表现为数据对象的地址 础 右值:出现在赋值号右边的数据对象具有右值,在程序 中表现为数据对象的值 例:x 初始化 初始化不是赋值:赋值可以在程序运行期间执行多次, 初始化只在为变量分配存储空间时执行一次 未初始化的数据对象只有左值没有右值,其存储内容维 持原先位序列,所以不要引用未初始化的数据对象 清华大学计算中心 http://learn.tsinghua.edu.cn
清华大学计算中心 http://learn.tsinghua.edu.cn 9 计 算 机 程 序 设 计 基 础 赋值与初始化 • 赋值:将数据对象与某个具体值相关联的基本操作 – 左值:出现在赋值号左边的数据对象具有左值,在程序 中表现为数据对象的地址 – 右值:出现在赋值号右边的数据对象具有右值,在程序 中表现为数据对象的值 – 例:x = x; • 初始化 – 初始化不是赋值:赋值可以在程序运行期间执行多次, 初始化只在为变量分配存储空间时执行一次 – 未初始化的数据对象只有左值没有右值,其存储内容维 持原先位序列,所以不要引用未初始化的数据对象!
计 算 代码与控制流 机 程 序·代码与计算:代码是计算的简洁表达 设 操作为程序的基本单位,一系列的操作构成计算以及计 计 基 算的顺序 础 静态代码文本与动态执行过程 程序在运行期间根据静态代码文本产生计算过程,即动 态执行过程 两者并不相同,优秀的程序员应保证两者尽可能匹配, 例如少用甚至不用goto语句 ·控制流 控制程序流向的程序结构:复合、分支、循环 清华大学计算中心 http://learn.tsinghua.edu.cn 10
清华大学计算中心 http://learn.tsinghua.edu.cn 10 计 算 机 程 序 设 计 基 础 代码与控制流 • 代码与计算:代码是计算的简洁表达 – 操作为程序的基本单位,一系列的操作构成计算以及计 算的顺序 • 静态代码文本与动态执行过程 – 程序在运行期间根据静态代码文本产生计算过程,即动 态执行过程 – 两者并不相同,优秀的程序员应保证两者尽可能匹配, 例如少用甚至不用goto语句 • 控制流 – 控制程序流向的程序结构:复合、分支、循环
计 算 断言与程序不变量 机 程 序·断言与不变量的含义 设 计 断言:程序中存在某些特定位置,在该处某些判 基 断永真,该判断式即为断言 础 不变量:无论程序如何执行,断言的值都应保持 不变(具有恒定属性 断言与不变量的意义 若断言值未保持,说明程序必然发生了错误 断言在编程时非常重要,一个优秀程序员的第 行C代码应该从断言开始书写! 清华大学计算中心 http://learn.tsinghua.edu.cn 11
清华大学计算中心 http://learn.tsinghua.edu.cn 11 计 算 机 程 序 设 计 基 础 断言与程序不变量 • 断言与不变量的含义 – 断言:程序中存在某些特定位置,在该处某些判 断永真,该判断式即为断言 – 不变量:无论程序如何执行,断言的值都应保持 不变(具有恒定属性) • 断言与不变量的意义 – 若断言值未保持,说明程序必然发生了错误 – 断言在编程时非常重要,一个优秀程序员的第一 行 C 代码应该从断言开始书写!