程序设计基础05_第1页
程序设计基础05_第2页
程序设计基础05_第3页
程序设计基础05_第4页
程序设计基础05_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章 结构化程序设计概论学习目标熟悉数据的基本概念,掌握数据的表示方法熟悉代码的基本概念,掌握代码的控制方法熟悉算法的基本概念,了解算法、程序与代码的关系掌握结构化程序设计的一般方法了解问题规模与程序控制结构之间的关系掌握程序测试的基本方法与手段了解代码优化的基本策略5.1 数据的基本概念数据与信息数据与地址数据类型文字常量变 量声 明数据与数据类型数据与信息数据:数据特征、数据名称与特征值信息:数据所具有的意义数据并不能解释自身,程序不了解数据的意义数据类型:对数据进行分类每一类数据具有同样的存储表示(存储分配格式),同样的操作集基本数据类型(预定义数据类型)与用户自定义类型(用户可按需创

2、建新的数据类型)文字与量文字常量:程序中出现的值只能以值的形式标识,其值不可改变若要声明严格意义的常量,使用 C99 的 const文字常量不可寻址,而普通常量可以寻址变量:程序中定义和命名的数据对象四个基本特征:VANT先声明后使用在程序执行期间,可改变变量的值,不能改变变量的名称、类型与地址声 明数据标识的目的:区分数据模拟世界中各种数据的联系,构造具有复杂结构的数据声明的目的将程序执行时数据对象的名字与类型信息通知编译器,在数据对象与数据值及存储位置间建立关联辅助编译器选择合适的存储表示使得类型检查静态化,减少程序错误声明与定义声明并不一定就是定义,声明虽引入名字,但只有那些确实在程序中

3、引入了实体的声明才是定义5.2 代码的基本概念表达式语义赋值与初始化代码与计算控制流断言与程序不变量表达式语义表达式语义:表达式的求值顺序C 语言未规定表达式求值顺序,一般由操作符的优先级与结合性决定例外情况递增递减操作符满足特定计算规则不同编译器的实现可能不同:出于优化的目的,编译器可能重排部分代码,表达式的求值顺序可能会发生用户事先无法察觉的变化既是优点(程序设计可以高度灵活)也是缺点(错误的求值顺序带来错误的计算结果)明确表达设计意图,尽量不在表达式中使用带副作用的操作符,表达式应尽量简短赋值与初始化赋值:将数据对象与某个具体值相关联的基本操作左值:出现在赋值号左边的数据对象具有左值,在

4、程序中表现为数据对象的地址右值:出现在赋值号右边的数据对象具有右值,在程序中表现为数据对象的值例:x = x;初始化初始化不是赋值:赋值可以在程序运行期间执行多次,初始化只在为变量分配存储空间时执行一次未初始化的数据对象只有左值没有右值,其存储内容维持原先位序列,所以不要引用未初始化的数据对象!代码与控制流代码与计算:代码是计算的简洁表达操作为程序的基本单位,一系列的操作构成计算以及计算的顺序静态代码文本与动态执行过程程序在运行期间根据静态代码文本产生计算过程,即动态执行过程两者并不相同,优秀的程序员应保证两者尽可能匹配,例如少用甚至不用goto语句控制流控制程序流向的程序结构:复合、分支、循

5、环断言与程序不变量断言与不变量的含义断言:程序中存在某些特定位置,在该处某些判断永真,该判断式即为断言不变量:无论程序如何执行,断言的值都应保持不变(具有恒定属性)断言与不变量的意义若断言值未保持,说明程序必然发生了错误断言在编程时非常重要,一个优秀程序员的第一行 C 代码应该从断言开始书写!断言与程序不变量示例在程序中使用 assert() 表达断言#include void ProcessString(char* str) assert( str != NULL ); assert( *str != 0 ); assert() 是宏而不是函数,位于头文件“assert.h”中如果不希望在编

6、译后的程序中出现断言代码,在程序开头声明 NDEBUG 宏后再编译上述代码需要对字符串str进行处理。在进行处理前,程序必须保证该字符串既不能不存在也不能为空串。如果断言未满足,则程序会在输出错误信息后终止执行5.3 算法及其表示方法概要程序的辨证统一:数据与代码数据表示:指定程序使用的数据结构与组织形式代码组织:数据上所进行操作的描述与组织形式算法的基本概念为解决某类问题而设计或采取的方法或步骤算法必须能够转化为计算机可执行的指令序列(代码)算法基本特征:有穷性、确定性、输入、输出与有效性代码与伪代码均可以用来表达算法设计思想与算法执行步骤代码与伪代码给定两个正整数m与n,设计求解最大公因子

7、的算法int gcd( int m, int n ) int r;start: r = m % n; if( r = 0 ) return n; m = n; n = r; goto start;代码以计算机语言书写,计算机易理解,程序员不易理解伪代码界于自然语言与计算机语言之间,一般用符号或文字表示算法的实际执行步骤,程序员易理解,计算机不理解输入:整数m与n输出:m与n的最大公因子步骤1:m除以n,余数为r步骤2:若r为0,则n为所求,算法终止;否则步骤3:将n作为新m,r作为新n,返回第1步重新计算5.4 结构化程序的组织程序的结构化程序的一般结构结构化与函数抽象程序范型程序的结构化结构

8、化结构化语句:满足单入口单出口条件的语句复合语句、分支语句与循环语句都是结构化语句结构化程序:使用结构化语句设计的程序结构定理:所有程序都可使用上述三类结构化语句实现结构化优点单入口单出口的控制流易于确定程序动态计算过程,易于理解注意事项结构化程序并不一定是好程序,程序的合理组织最重要!程序的一般结构根据用户输入的底面半径与高度,计算圆柱体体积#include /* 包含必要的头文件 */#define PI 3.14159265 /* PI宏定义, 一次定义多次使用 */float radius, height, volume; /* 全局变量声明 */void main() /* 主函数

9、*/ /* 输入半径与高度 */ printf(“This program computes the volume of the cylinder.n“); printf(“Please input the radius value: “); scanf(“%f“, &radius); printf(“Please input the height value: “); scanf(“%f“, &height); /* 计算体积 */ volume = PI * radius * radius * height; /* 输出体积 */ printf(“The volume of the cyl

10、inder is %fn“, volume);主函数包括输入、计算与输出三部分程序无非是对特定输入数据进行处理并输出处理结果的指令序列,所以任何程序都应包括输入、计算与输出三部分结构化与函数抽象程序设计过程按照功能需求,进行自顶向下的功能分解与逐步求精,最终形成代码大多数问题的求解过程非常复杂,如何合理地控制程序规模和复杂性呢?程序的分割与结构化:着重于安排操作序列而不是数据结构,使程序易于创建、理解与维护函数抽象:结构化程序设计的主要工具体现要执行的命令、计算或任务,这些抽象构成了函数用户只关心抽象的语法和该抽象提供的功能或服务,不关心如何实现该功能结构化与函数抽象示例根据用户输入的底面半径

11、与高度,计算圆柱体体积#include /* 包含必要的头文件 */#define PI 3.14159265 /* PI宏定义, 一次定义多次使用 */float radius, height, volume; /* 全局变量声明 */void Input(); /* 输入半径与高度,将实际的输入操作隐藏在函数内部 */void Compute(); /* 计算体积,将实际的计算过程隐藏在函数内部 */void Output(); /* 输出体积,将实际的输出操作隐藏在函数内部 */void main() /* 主函数,表现为对上述函数的调用,无其他代码 */ Input(); Comput

12、e(); Output();主函数是否更容易理解?没有复杂的输入、计算与输出的实现细节,理解主函数一点都不困难在主函数层次,只需了解一旦声明三个全局变量,连续调用上述三个函数即能完成主函数的计算任务就可以了结构化与函数抽象示例(续)void Input() printf(“This program computes the volume of the cylinder.n“); printf(“Please input the radius value: “); scanf(“%f“, &radius); printf(“Please input the height value: “); s

13、canf(“%f“, &height);void Compute() volume = PI * radius * radius * height;void Output() printf(“The volume of the cylinder is %fn“, volume);只有在确实必要的时候才需要了解这三个函数的具体实现细节与代码通过程序分割与逻辑分组,程序分离成一个一个的模块在需要的时候,我们可以使用这些模块像积木一样构造整个程序5.4 程序范型范型:实现特定程序代码的通用模式有助于形成函数抽象编写出的代码容易重用:不加修改或部分修改就可以适应其他场合示例:数据输入模式具有重复性输出

14、提示信息,接受用户输入输入:提醒用户输入数据的提示信息输出:数据值步骤1:输出提示信息步骤2:获取数据值并输出程序范型示例float radius, height, volume; float GetFloatValue(char* prompt);float GetFloatValue(char* prompt) float t; printf(“%s“, prompt); scanf(“%f“, &t); return t;void Input() printf(“This program computes the volume of the cylinder.n“); /* 调用GetF

15、loatValue函数进行radius值的实际输入操作 */ radius = GetFloatValue(“Please input the radius value: “); /* 调用GetFloatValue函数进行height值的实际输入操作 */ height = GetFloatValue(“Please input the height value: “);功能分解与逐步求精自顶向下的功能分解先从整体考虑问题,将原始问题分解成逻辑上相互独立的多个部分;一一实现分解后的各部分,将上述实现组装成原始问题的解功能分解必须按照程序需求进行,分解后的各部分应能实现为单入口单出口的函数逐步

16、求精对于复杂系统,功能分解可能不会一步到位,对于某些部分可能需要重复上述功能分解步骤在功能分解与逐步求精过程中,我们最关心的既不是数据对象,也不是具体算法,而是算法模式(程序范型)5.5 程序测试与代码优化程序测试顺序结构:一般一次测试分支结构:所有分支路径都需测试循环结构:第一次迭代,最后一次迭代,中间一次迭代程序调试:查找与改正错误语法错误与逻辑错误程序效率与代码优化正确性不是程序设计的全部,效率同样重要程序测试示例编程实现摄氏温度到华氏温度的转换,温度转换公式为 ,c 为摄氏温度值,f 为转换后的华氏温度值#include /* 包含必要的头文件 */float f, c; /* 全局变

17、量声明 */float GetFloatValue(char* prompt); /* 获取用户输入的浮点数据 */void Input(); /* 输入数据,将实际的输入过程隐藏在函数内部 */void Compute(); /* 温度转换,将实际的计算过程隐藏在函数内部 */void Output(); /* 输出结果,将实际的输出操作隐藏在函数内部 */void main() /* 主函数,表现为对上述函数的调用,无其他代码 */ Input(); Compute(); Output();程序测试示例(续)float GetFloatValue(char* prompt) float t

18、; printf(“%s“, prompt); scanf(“%f“, &t); return t;void Input() c = GetFloatValue(“Please input temperature value(C): “);void Compute() f = c * 1.8 + 32;void Output() printf(“Temperature Value(F): %fn“, f);功能分解的好处:本例主函数的实现与体积计算程序完全相同,程序结构也相同程序调试示例下述程序存在一些错误,请找出#include float f, c; float GetFloatValue(char* prompt); void Input(); void Compute(); void Output(); void main() Input(); Comput(); Output()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论