ch结构化程序设计方法_第1页
ch结构化程序设计方法_第2页
ch结构化程序设计方法_第3页
ch结构化程序设计方法_第4页
ch结构化程序设计方法_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、国家级精品课程网站(本书配套教学网站) 1第第8章章 结构化设计方法结构化设计方法 8.1 结构体类型结构体类型8.2 枚举类型枚举类型8.3 自顶向下,逐步求精的程序设计方法自顶向下,逐步求精的程序设计方法8.4共用体共用体8.5数组和结构体数组和结构体8.6结构体中的结构体结构体中的结构体8.7结构体和指针结构体和指针8.8编译预处理编译预处理28.1 结构体类型构造类型数据构造类型数据各元素是属于同一个类型的各元素是属于同一个类型的数组数组。不同类型的数据组合成一个有机的整体,以便于引用。这些组合在不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。一

2、个整体中的数据是互相联系的。例如,学生信息:学号、姓名、性别、各科成绩,地址等这些例如,学生信息:学号、姓名、性别、各科成绩,地址等这些项都与某一学生相联系。如下图所示:项都与某一学生相联系。如下图所示:可以看到性别可以看到性别(sex)、年龄、年龄(age)、成绩、成绩(score)、地址、地址(addr)是属于是属于学号为学号为10010和名为和名为“Li Fun”的学生的。的学生的。如果将如果将num、name、sex、age、score、addr分别定义为互相独分别定义为互相独立的简单变量,难以反映它们之间的内在联系。立的简单变量,难以反映它们之间的内在联系。31.为什么要用结构为什么

3、要用结构? 在实际的处理对象中,有许多信息是在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到组成了一个有机的整体。此时,就要用到一种新的构造类型数据一种新的构造类型数据结构体结构体(structure),简称结构。结构体的使用为),简称结构。结构体的使用为处理复杂的数据结构(如动态数据结构等)处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。传

4、递不同类型的数据提供了方便。4结构体类型的定义结构体类型的定义结构体作为一种数据构造类型,在结构体作为一种数据构造类型,在C+语语言程序中也许需要经历言程序中也许需要经历定义(类型)定义(类型)声明声明(变量变量)调用调用结构体是由不同的数据类型的数据组成的结构体是由不同的数据类型的数据组成的。组成结构体的每个数据成为该结构体的成组成结构体的每个数据成为该结构体的成员项简称员项简称成员成员。在程序使用结构体时,首先要对结构体进在程序使用结构体时,首先要对结构体进行描述,这称为结构体的定义。行描述,这称为结构体的定义。5 结构体是用户自定义的新数据类结构体是用户自定义的新数据类型,在结构体中可以

5、包含若干个不型,在结构体中可以包含若干个不同数据类型和不同意义的数据项同数据类型和不同意义的数据项(当然也可以相同),从而使这些(当然也可以相同),从而使这些数据项组合起来反映某一个信息。数据项组合起来反映某一个信息。结构体相当于结构体相当于其他其他高级语言中的高级语言中的“记录记录” 。6定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct 结构体名结构体名数据类型成员名数据类型成员名1;数据类型成员名数据类型成员名2;:数据类型成员名数据类型成员名n; /此处的分号必须此处的分号必须7 在大括号中的内容也称为在大括号中的内容也称为“成员表列成员表列”或或“域表域表”

6、。其中,每个成员名的命名规。其中,每个成员名的命名规则与变量名相同;数据类型可以是基本变则与变量名相同;数据类型可以是基本变量类型和数组类型,也可以是指针变量类量类型和数组类型,也可以是指针变量类型,或者是一个结构体类型;型,或者是一个结构体类型;用分号用分号“;”作为结束符。整个结构的定义也用分号作作为结束符。整个结构的定义也用分号作为结束符为结束符, 8结构体类型的定义结构体类型的定义struct student char name20; unsigned long number; float math; float english; float physics;9结构体变量的声明结构体变

7、量的声明(1)先定义结构体类型,再定义结构体类型变量。)先定义结构体类型,再定义结构体类型变量。 例如,日期类型可以定义为例如,日期类型可以定义为struct Date int da_year; int da_mon; int da_day; Date yesterday, today, tomorrow; /说明了说明了3个日期类型的变量:个日期类型的变量: yesterday、today和和tomorrow10(2)定义类型的同时声明变量。例如,)定义类型的同时声明变量。例如, struct Date int da_year; int da_mon; int da_day; yesterd

8、ay, today, tomorrow;(3)直接定义结构体类型变量,不出现结构体类型名。)直接定义结构体类型变量,不出现结构体类型名。11/Example 8-1: 结构体变量的初始化和使用结构体变量的初始化和使用#include #include struct Dogchar name20;/姓名姓名char sex;/性别性别 int age;/年龄年龄;12void main()Dog dog1, dog2=WangCai, m, 2;strcpy(, XiaoQiang);dog1.sex=f; dog1.age =1;cout第第1条狗:条狗:t

9、dog1.sextdog1.ageendl;cout第第2条狗:条狗:tdog2.sextdog2.ageendl;dog2=dog1;cout复制后第复制后第2条狗变为:条狗变为:endl;cout第第2条狗:条狗:tdog2.sextdog2.ageendl;138.2 枚举类型 如果某个数据项只可能取少数几种可能的值,则可以如果某个数据项只可能取少数几种可能的值,则可以将该数据项定义为枚举类型数据。将该数据项定义为枚举类型数据。 enum ; 每个枚举元素实际上是一个以其所在位置顺序为值的每个枚举元素实际上是一个以其所在位置顺序为值的常量常量(0, 1

10、, 2, ),每个枚举元素取值为某一个整数值,每个枚举元素取值为某一个整数值,所以它无法直接进行输入和输出所以它无法直接进行输入和输出 。14 例例: / 定义星期几类型定义星期几类型enum Weekday_typeSUNDAY, / 星期日星期日MONDAY, / 星期一星期一TUESDAY, / 星期二星期二WEDNESDAY, / 星期三星期三THURSDAY, / 星期四星期四FRIDAY, / 星期五星期五SATURDAY / 星期六星期六;Weekday_type workday; /定义变量属于该枚举类型定义变量属于该枚举类型workday = MONDAY ; /将枚举值赋给

11、枚举变量将枚举值赋给枚举变量 15例例8-2 根据键盘输入的首字符选择对应颜色根据键盘输入的首字符选择对应颜色 难点:难点:每个枚举符号实际上是一个整数值(每个枚举符号实际上是一个整数值(0、1、),无法进行直接的输入和输出,要想),无法进行直接的输入和输出,要想获得变量的符号值,必须采用间接方法。获得变量的符号值,必须采用间接方法。 算法:算法:枚举类型颜色的符号值可以通过读入其前一个枚举类型颜色的符号值可以通过读入其前一个或两个字符来区分,或两个字符来区分,可以先从键盘上读入两个可以先从键盘上读入两个字符,然后用选择结构将对应的值找出来并赋字符,然后用选择结构将对应的值找出来并赋给变量,对

12、该变量再一次使用选择结构打印输给变量,对该变量再一次使用选择结构打印输出正确的符号值。出正确的符号值。/ Example :选择颜色:选择颜色#include int main() enum Colors blue, brown, green, red, white, yellow choose; /定义枚举类型颜色并同时声明一个该类型的定义枚举类型颜色并同时声明一个该类型的变量变量char ch1, ch2;coutPlease input the first two letters of the colors youve chosen:ch1ch2;/输入两个字符输入两个字符17/判断键盘

13、输入字符所对应的枚举类型值判断键盘输入字符所对应的枚举类型值switch(ch1)case b:if(ch2=l)choose=blue;else choose=brown; break; case g:choose=green;break;18case r:choose=red;break;case w:choose=white;break;case y:choose=yellow;break;default:coutIllegal input!endl;/输出枚举类型值输出枚举类型值switch(choose)case blue:coutThe color youve chosen is

14、blueendl;break;case brown:coutThe color youve chosen is brownendl;break;case green:coutThe color youve chosen is greenendl;break;case red:coutThe color youve chosen is redendl;break;case white:coutThe color youve chosen is whiteendl;break;case yellow:coutThe color youve chosen is yellowendl;return 0

15、;208.3 自顶向下,逐步求精的程序设计方法自顶向下,逐步求精的程序设计方法 结构化程序设计支持结构化程序设计支持“自顶向下自顶向下, 逐步求精逐步求精”的程序的程序设计方法。设计方法。 “自顶向下自顶向下” 是将复杂、大的问题划分为小问题,找出问题的关是将复杂、大的问题划分为小问题,找出问题的关键、重点所在,然后用精确的思维定性、定量地去键、重点所在,然后用精确的思维定性、定量地去描述问题。描述问题。 “逐步求精逐步求精” 是将现实世界的问题经抽象转化为逻辑空间或求解是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。复杂问题经抽象化处理变为相对比较空间的问题。复杂问题经抽象化处理变为

16、相对比较简单的问题。经若干步抽象(精化)处理,最后到简单的问题。经若干步抽象(精化)处理,最后到求解域中只是比较简单的编程问题。求解域中只是比较简单的编程问题。 21基基 本本 思思 想想 和和 方方 法法基本思想基本思想 从问题本身开始,经过逐步求精,将解决问题的步从问题本身开始,经过逐步求精,将解决问题的步骤分解为由基本程序结构模块组成的结构化程序框骤分解为由基本程序结构模块组成的结构化程序框图,据此编写程序。图,据此编写程序。基本方法基本方法 从题目本身开始从题目本身开始, 找出解决问题的基本思路找出解决问题的基本思路, 将其用将其用结构化框图结构化框图(可能是非常粗糙可能是非常粗糙)表

17、示。表示。 对框图中的比较抽象的、用文字描述的模块进一步对框图中的比较抽象的、用文字描述的模块进一步分析细化,结果仍用结构化框图表示。分析细化,结果仍用结构化框图表示。 将所求解问题的所有细节都弄清楚后将所求解问题的所有细节都弄清楚后, 再可以根据框再可以根据框图直接写出相应程序代码。图直接写出相应程序代码。22例例8-3 验证验证“哥德巴赫猜想哥德巴赫猜想”“哥德巴赫猜想哥德巴赫猜想”任何一个大于等于任何一个大于等于4的偶数均可以表示为两个素数之和。的偶数均可以表示为两个素数之和。使用使用流程图流程图分析分析在分析的过程中用结构化框图表示解题思路的优点在分析的过程中用结构化框图表示解题思路的

18、优点是框图中的每个程序模块与其他程序模块之间的关是框图中的每个程序模块与其他程序模块之间的关系非常简明系非常简明, 每次可以只集中精力分解其中的一个模每次可以只集中精力分解其中的一个模块而几乎不影响整个程序的结构。块而几乎不影响整个程序的结构。23验证验证“哥德巴赫猜想哥德巴赫猜想” 求解第一步求解第一步 提出问题:提出问题: 验证哥德巴赫猜想验证哥德巴赫猜想 验证哥德巴赫猜想验证哥德巴赫猜想24验证哥德巴赫猜想(续验证哥德巴赫猜想(续1) 第二步第二步 设一上限数设一上限数M,验证,验证 从从4到到M的所有偶数是否能被的所有偶数是否能被 分解为两个素数之和。分解为两个素数之和。 定义一个变量

19、定义一个变量X,初值为,初值为4。 每次令其加每次令其加2,并,并验证验证X能否被能否被分解为两个素数之和分解为两个素数之和,直到,直到X不不小于小于M为止。为止。X = 4X M 验证验证X是否能被分解是否能被分解为两个素数之和为两个素数之和X = X +2否否是是25验证哥德巴赫猜想(续验证哥德巴赫猜想(续2) 第三步第三步 如何验证如何验证X是否是否能被分解为两个素数能被分解为两个素数之和之和1. 从从P=2开始;开始;2. 判别判别X-P是否仍为素数:是否仍为素数:3. 若是,打印该偶数的分解若是,打印该偶数的分解式。式。4. 否则,换更大的素数,再否则,换更大的素数,再继续执行继续执

20、行2.。如此循环,。如此循环,直到用于检测的素数大直到用于检测的素数大X/2且且X 与其之差仍不是素数,与其之差仍不是素数,则打印则打印“哥德巴赫猜想哥德巴赫猜想”不成立。不成立。 P = 2P= X/ 2处理哥德巴赫猜想处理哥德巴赫猜想不成立的情况不成立的情况打印出打印出X的的分解情况分解情况是是否否268.4共用体(联合体) 在结构体中每一个数据成员都要单独占用一在结构体中每一个数据成员都要单独占用一个存储空间。结构体变量的长度是所有成员长度个存储空间。结构体变量的长度是所有成员长度之和。之和。 用同一内存段来存放两种或多种不同类型的用同一内存段来存放两种或多种不同类型的成员,但每一瞬间只

21、有一个成员起作用。这种特成员,但每一瞬间只有一个成员起作用。这种特殊的数据类型既为联合体。殊的数据类型既为联合体。27共用体类型定义方法:共用体类型定义方法: union ;例例8-4 学生信息管理学生信息管理8.4共用体(联合体)28例例8-4 学生信息管理学生信息管理 1.姓名姓名 name 2.年龄年龄 Age 3.职业职业 job:取值:取值student或或student 4. 职位职位 postion: /共用体共用体 对于对于student:年级:年级grade为为1、2、3、4 对于对于teacher:职称:职称title为教授、副教授、讲为教授、副教授、讲师(师(Profes

22、sor、AssociateProfessor、Lector)8.4共用体(联合体)298.5 数组与结构体结构体中的成员可以是数组。结构体中的成员可以是数组。Struct StudentType int id; /学号学号 char name20; /姓名姓名 int score5; /5门课成绩门课成绩 int gpa; /平均成绩平均成绩;30Struct StudentType int id; /学号学号 char name20; /姓名姓名 int score5; /5门课成绩门课成绩 int gpa; /平均成绩平均成绩;StudentType student30; /30个学生结构

23、体数组个学生结构体数组8.5 数组与结构体数组与结构体318.6结构体中的结构体 结构体成员也可以是结构体,结构体成员也可以是结构体,称为结构体嵌套。称为结构体嵌套。 P175页:定义职工工资单结构体页:定义职工工资单结构体 328.7 结构体与指针Struct StudentType int id; /学号学号 char name20; /姓名姓名 int score5; /5门课成绩门课成绩 int gpa; /平均成绩平均成绩;StudentType s1; StudentType *p=&s1 p-score1=90 /指针访问数据成员用指针访问数据成员用-338.8 编译预处

24、理编译预处理 4101 宏定义指令宏定义指令 4102 文件包含指令文件包含指令 4103 条件编译指令条件编译指令 348.8 编译预处理 C+将程序编译分为预处理和正式编译两个步骤。将程序编译分为预处理和正式编译两个步骤。 在编译在编译C+程序时,编译器中的预处理模块首先程序时,编译器中的预处理模块首先根据预处理命令对源程序进行适当加工,再进行正式根据预处理命令对源程序进行适当加工,再进行正式编译。编译。 所有预处理命令均以所有预处理命令均以#开头,它不是开头,它不是C+命令,所命令,所以不用语句结束符(;)。以不用语句结束符(;)。 C+中有中有3种主要编译预处理命令:种主要编译预处理命

25、令: 1.文件包含文件包含 2.宏定义宏定义 3.条件编译条件编译35文件包含(嵌入)指令文件包含(嵌入)指令#include 文件包含文件包含用用#include指令指令,预处理后将指令中指明的源程序,预处理后将指令中指明的源程序文件嵌入到当前源程序文件的指令位置处。格式为:文件嵌入到当前源程序文件的指令位置处。格式为:#include /适用于系统头文件适用于系统头文件或或#include 文件名文件名 /适用于自定义头文件适用于自定义头文件第一种第一种方式称为方式称为标准方式标准方式,预处理器将在,预处理器将在include子目录下搜子目录下搜索由文件名所指明的文件。这种方式适用于嵌入索

26、由文件名所指明的文件。这种方式适用于嵌入C+提供的提供的头文件,因为这些头文件一般都存在头文件,因为这些头文件一般都存在C+系统目录的系统目录的include子目录下。子目录下。第二种方式第二种方式编译器将首先在当前文件所在目录下搜索,如果编译器将首先在当前文件所在目录下搜索,如果找不到再按标准方式搜索。这种方式适用于嵌入用户自己建找不到再按标准方式搜索。这种方式适用于嵌入用户自己建立的头文件。立的头文件。36 一个被包含的头文件中还可以有一个被包含的头文件中还可以有#include#include指令,即指令,即includeinclude指令可以嵌套指令可以嵌套,但是,如果同一个头文件在同

27、一个源程序文但是,如果同一个头文件在同一个源程序文件中被件中被重复包含重复包含,就会出现,就会出现标识符重复定义标识符重复定义的错误的错误。条件编译指令条件编译指令。文件包含(嵌入)指令文件包含(嵌入)指令#include 37宏定义指令宏定义指令#define 1 1 不带参宏定义不带参宏定义用来产生与一个字符串对应的常量字符串,格式为:用来产生与一个字符串对应的常量字符串,格式为:#define #define 宏名宏名 常量串常量串 预处理后文件中凡出现该字符串处均用其对应的常量预处理后文件中凡出现该字符串处均用其对应的常量串代替。替换过程称为宏替换或宏展开。例如,如果串代替。替换过程称

28、为宏替换或宏展开。例如,如果使用指令使用指令#define PI 3.1415926#define PI 3.1415926则程序中可以使用标识符则程序中可以使用标识符PIPI,编译预处理后产生一个,编译预处理后产生一个中间文件,文件中所有中间文件,文件中所有PIPI被替换为被替换为3.14159263.1415926。宏替换只是字符串和标识符之间的简单替换,预处理宏替换只是字符串和标识符之间的简单替换,预处理本身不做任何数据类型和合法性检查,也不分配内存本身不做任何数据类型和合法性检查,也不分配内存单元单元。38宏定义指令宏定义指令#define 2 带参数的宏定义带参数的宏定义带参宏定义的

29、形式很象定义一个函数,格式为:带参宏定义的形式很象定义一个函数,格式为:#define 宏名宏名 ( 形参表形参表 ) 表达式串表达式串 例如作如下宏定义:例如作如下宏定义:#define S(a,b) (a)*(b)/2程序中可使用程序中可使用S(a,b),预处理后产生中间文件,其中,预处理后产生中间文件,其中S(a,b)被替换成被替换成(a)*(b)/2。注意,宏定义时形参通常要用括号括。注意,宏定义时形参通常要用括号括起来,否则容易导致逻辑错误。例如,如果定义:起来,否则容易导致逻辑错误。例如,如果定义:#define S(a,b) a*b/2那么程序中的那么程序中的S(3+5,4+2)就会被宏展开为就会被宏展开为3+5*4+2/2,不符合定义的真正的意图。不符合定义的真正的意图。带参宏定义形式上象定义函数,但它与

温馨提示

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

评论

0/150

提交评论