186-8-1计算机程序计-结构化设计方法.ppt_第1页
186-8-1计算机程序计-结构化设计方法.ppt_第2页
186-8-1计算机程序计-结构化设计方法.ppt_第3页
186-8-1计算机程序计-结构化设计方法.ppt_第4页
186-8-1计算机程序计-结构化设计方法.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

计算机程序设计 顾刚计算机教学实验中心 构造类型的含义 在编写程序中常使用数组来处理大量相同类型的数据数组被称为构造类型的数据 C 还有如下构造类型 结构体 共用体 枚举 类构造类型数据是由基本类型数据按一定规则组成的 又称它们为 导出类型 实际应用的程序设计中 只用几个变量的情况是极少的 更多的情况是处理大批量的相同类型或不同类型的数据相同类型数据举例 统计交大15 000学生英语4级统考成绩不同类型数据举例 管理交大师生员工档案信息记录 包括 姓名 学号 出生日期 班级 各科成绩等用数组和结构体来描述大批量相同或不同类型数据 使程序编写更简捷 结构体类型 有时需要将不同类型的数据组合成一个有机的整体 以便处理 在这个整体中的数据之间是互相联系的例如 工人工资单 姓名 单位 编号 例如 学生成绩单 学号 姓名 性别 各科成绩等这些数据项都与某一学生或工人相联系如果将这些数据项分别定义为互相独立的简单变量 难以反映它们之间的内在联系 如何定义表格中的数据项 职工工资单的层次结构 01工资单02工作部门 字符串 最大长度为10个字符02姓名 字符串 最大长度为8个字符02职务 含职称 工种 代码 0 9902参加工作时间03年份 1900 205003月份 1 1203日 1 3102家庭情况03婚否 0 否 1 是03是否双职工 0 否 1 是03独生子女出生日期02基本工资 0 10000 保留两位小数02岗位津贴 0 10000 保留两位小数02劳保福利 0 1000 保留两位小数02独生子女费 0 10 保留两位小数 02房租 0 10000 保留两位小数02电费 0 10000 保留两位小数02水费 0 10000 保留两位小数02取暖费 0 1000 保留两位小数02保育费 0 1000 保留两位小数02实发工资 0 10000 保留两位小数 结构体类型的定义 结构体作为一种数据构造类型 在C 程序中也许需要经历定义 声明 使用的过程结构体是由不同的数据类型的数据组成的 组成结构体的每个数据成为该结构体的成员项简称成员在程序使用结构体时 首先要对结构体进行描述 这称为结构体的定义 三种结构体变量声明方式 先定义结构体类型 再声明结构体类型变量例如日期类型可以先定义结构体类型为structdate intda year charda mon charda day 然后声明结构体变量structdateyesterday today tomorrow 说明了3个日期类型变量 yesterday today和tomorrow 三种声明结构体变量方式 定义结构体类型的同时声明结构体变量structdate intda year charda mon charda day yesterday today tomorrow 声明了3个日期类型的变量 yesterday today和tomorrow 三种声明结构体变量方式 直接定义结构体类型变量 例如 struct intda year charda mon charda day yesterday today tomorrow 不出现结构体类型名 结构体变量定义与使用 include includestructDog charname 20 姓名charsex 性别intage 年龄 intmain Dogdog1 dog2 Wangcai g 2 strcpy dog1 name Xiaoqiang dog1 sex m dog1 age 1 cout 第一条狗 dog1 name t dog1 sex t dog1 age endl cout 第二条狗 dog2 name t dog2 sex t dog2 age endl dog2 dog1 cout 复制后第二条狗变为 endl cout 第二条狗 dog2 name t dog2 sex t dog2 age endl return0 统计学生课程平均分的程序 定义二维数组student 6 5 该数组student前4列元素输入值 第1列为学号 第2列到第4列为3门课程的成绩 第5列为平均分 通过计算求得 输入200400180901002004002608070输出学号高数英语体育平均分 2004001809010090200400260807070 算法的伪代码描述如下 声明二维数组 循环输入10个学生成绩 输入学号 循环输入该学生的四个成绩 并向加 输出标题栏 循环输出10个学生的学号 成绩及总分 include definePERSON6 defineCOURSE3intmain intstudent PERSON COURSE 2 inti j cout student i 0 student i COURSE 1 0 for j 1 j student i j student i COURSE 1 student i COURSE 1 student i j student i COURSE 1 student i COURSE 1 COURSE cout 学号高数英语体育平均分 endl cout endl for i 0 i PERSON i i 1 for j 0 j COURSE 1 j j 1 cout student i j t cout endl return0 分析数据构造的问题 将处理数据硬性定义为int数据信息不完整 分数等控制流程离散 没反映内在联系 定义一个结构体类型StudentType 其中包含学号 姓名 各门课程成绩和平均分等数据成员 structStudentType charid 10 学号charname 9 姓名intscore 3 课程成绩floatGPA 平均分 structStudentTypexjtustudent 6 使用结构体重新编写程序 include definePERSON6 defineCOURSE3structStudentType charid 10 学号charname 9 姓名intscore COURSE 课程成绩floatGPA 平均分 intmain StudentTypexjtuStudent PERSON inti j cout xjtuStudent i id xjtuStudent i name xjtuStudent i GPA 0 for j 0 j xjtuStudent i score j xjtuStudent i GPA xjtuStudent i GPA xjtuStudent i score j xjtuStudent i GPA xjtuStudent i GPA COURSE cout 学号姓名高数英语体育平均分 endl cout endl for i 0 i PERSON i i 1 cout xjtuStudent i id t xjtuStudent i name t for j 0 j COURSE j j 1 cout xjtuStudent i score j t cout xjtuStudent i GPA endl return0 例8 7 词频统计程序 键盘输入一系列英文单词 单词之间用空格分开 输入 xyz 表示输入单词结束 统计输入过哪些单词及出现频率 按字典顺序输出单词和出现次数的对照表 include includestructWordList charword 50 英文单词intfreq 频率统计 voidSort structWordListlist intcount for inti 0 ii j if strcmp list j 1 word list j word 0 WordListtmp tmp list j 1 list j 1 list j list j tmp 词频统计程序主函数 intmain structWordListlist 5000 inti num 0 chartemp 50 cout temp while strcmp temp xyz 0 for i 0 i num strcpy list i word temp list i freq 1 num cin temp Sort list num cout 词频统计结果如下 endl for i 0 i num i cout list i word t list i freq endl return0 程序设计两种主流方法 结构化程序设计方法面向对象程序设计方法 结构化程序设计方法 软件危机 软件开发方法落后 供不应求寻求好的方法开发 生产软件 缓解软件危机程序设计的目标不应再集中于如何充分发挥硬件的效率方面 新的程序设计方法应以能设计出结构清晰 可读性强 易于分工合作编写和调试的程序结构化设计方法是以模块化设计为中心 模块化设计思路 模块化就是把程序划分为若干个部分 每个部分独立存放 完成一个特定的功能 称为模块每个模块可以是一条语句 一段程序 一个函数等模块控制流程只采用三种结构基本特征是其仅有一个入口和一个出口其目的是降低程序的复杂度 使设计出来的程序便于阅读 调试和维护 模块化结构示例 计算器程序设计 功能包括 求加 减 乘 除 开方 指数 对数 平方等运算 main add a b min a b intadd intx inty returnx y intmin intx inty returnx y floadexp intx returnexp x floatsin floadx returnsin x 结构化程序设计思想 结构化程序设计方法 自顶向下 逐步求精自顶向下将复杂 大的问题划分为小问题 找出问题的关键 重点所在 然后用精确的思维定性 定量地去描述问题逐步求精将复杂问题经抽象化处理变为相对比较简单的问题 经若干步抽象 精化 处理 最后到求解域中只是比较简单的编程问题 结构化设计具体方法 从题目本身开始 找出解决问题的基本思路 将其用结构化框图 可能是非常粗糙 表示对框图中的比较抽象的 用文字描述的模块进一步分析细化 结果仍用结构化框图表示将所求解问题的所有细节都弄清楚后 再根据框图直接写出相应程序代码 验证 哥德巴赫猜想 哥德巴赫猜想 是数论中的一个著名难题 200多年来无数数学家为其呕心沥血 却始终无人能够证明或伪证这个猜想 哥德巴赫猜想 表述为 任何一个大于等于4的偶数均可以表示为两个素数之和1742年法国数学爱好者哥德巴赫在给著名数学家欧拉的信中提出 哥德巴赫猜想 问题 验证哥德巴赫猜想的设计 求解第一步提出拟解决的问题 验证哥德巴赫猜想的正确性 验证歌德巴赫猜想 验证哥德巴赫猜想的设计 第二步 设一上限数M 验证从4到M的所有偶数是否能被分解为两个素数之和 X 4 X M 验证X是否能被分解为两个素数之和 X X 2 否 是 开始 结束 验证哥德巴赫猜想的设计 第三步 如何验证X是否能被分解为两个素数之和 验证哥德巴赫猜想的设计 第四步 将第三步中三个模块进一步细化对 生成下一个素数 细化如下 验证哥德巴赫猜想的设计 经过四步分解精化 将 验证哥德巴赫猜想 这个命题已经分解为计算机可以求解的数学模型了剩下的问题就是编程求解了 如何编程是程序设计课程要解决的问题 哥德巴赫猜想算法分析 1 用 筛选 法生成素数表PrimeList M 先在素数表中产生 到 1的所有自然数 然后将已确定的所有素数的倍数置 求模取余为 2 3 5 7 11 13 17 19 21 23 29 31 2 这样一来 素数表中有许多0 为找下一个素数 要跳过这些0 3 分解0到M 1之间的所有偶数 循环 x M x初值取4 先取素数P 2 判别若PrimeList x p 等于0 说明分解不成功 p取素数表中下一个素数 再执行 若PrimeList x p 不等于0 分解成功 打印分解式 x x 2 继续执行 检查下一个偶数 程序逻辑功能框图 程序模块结构 主函数main 子函数生成素数表CreatPrimeList 子函数求下一个素数NextPrimeNomber 子函数求下一个素数NextPrimeNomber 生成素数表子函数 include defineM100001 定义验证范围 voidCreatPrimeList intPrimeList inti j for i 0 i M i i 1 生成素数表 置初值 PrimeList i i i 2 i取初值2 while i M 2 A能分解为两个因子相乘的话 其中一个因子必小于或等于INT sqrt A for j i 1 j M j j 1 将表中各素数的倍数置0 if PrimeList j 0i NextPrimeNumber i PrimeList 取下一个素数 求下一个素数子函数 函数NextPrimeNumber 求下一个素数 intNextPrimeNumber intp intPrimeList p p 1 while PrimeList p 0 p p 1 returnPrimeList p 主函数 main intPrimeList M intx p CreatPrimeList PrimeList 生成素数表 x 4 从4到M开始验证 while x M 2 找到一个不能分解为两个素数和的偶数 cout Greatdiscovery Goldbaheiswrong n else PrimeList x p 0分解成功 cout Theevennumber x p x p endl 验证下一个偶数 x x 2 枚举类型数据 如果某个数据只可能取少数几种可能的值 则可以将该数据定义为枚举类型数据枚举类型数据定义格式如下 enum 例如 enumxyz zero one two three four 枚举类型变量声明类似结构体变量声明 三种形式 enumxyznumber1 number2 每个枚举元素实际上是一个以其所在位置顺序为值的常量 0 1 2 每个枚举元素取值为某一个整数值 定义星期几类型enumWeekday type SUNDAY 星期日MONDAY 星期一TUESDAY 星期二WEDNESDAY 星期三THURSDAY 星期四FRIDAY 星期五SATURDAY 星期六 enumWeekday typeworkday workday MONDAY cout workday 枚举类型数据定义实例 includeusingnamespacestd intmain 定义星期几类型enumWeekday type SUNDAY 星期日MONDAY 星期一TUESDAY 星期二WEDNESDAY 13 星期三THURSDAY 星期四FRIDAY 星期五SATURDAY 星期六 enumWeekday typeworkday workday MONDAY cout workday endl workday FRIDAY cout workday endl return0 枚举数据测试 例8 2题目分析 根据键盘输入的首字符选择对应颜色枚举类型颜色的符号值可以通过读入其前一个或两个字符来区分 可以先从键盘上读入两个字符 然后用选择结构将对应的值找出来并赋给变量 对该变量再一次使用选择结构打印输出正确的符号值 includeintmain enumColors blue brown green red white yellow choose 定义枚举类型颜色并同时声明一个该类型的变量charch1 ch2 cout ch1 ch2 输入两个字符 判断键盘输入字符所对应的枚举类型值switch ch1 case b if ch2 l choose blue elsechoose brown bre

温馨提示

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

评论

0/150

提交评论