




免费预览已结束,剩余27页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 得分 得分 信电工程学院 课程设计报告 数据汇总系统数据汇总系统 课程 课程 高级语言程序设计高级语言程序设计 班级 班级 12 软件软件 1 学号 学号 20120510116 姓名 姓名 潘焕燚潘焕燚 指导教师 指导教师 丁宾丁宾 2013 年 7 月 1 日 2 目目 录录 1 程序目标及功能 1 1 1 课题背景 1 1 2 系统功能 3 1 3 设计要求 3 2 程序功能模块组成及流程图 4 2 2 系统功能模块 4 2 3 各模块流程图 5 3 程序主要数据结构及函数列表 8 3 1 程序中使用的数据结构 8 3 2 函数列表 10 4 程序代码及运行结果 14 5 总结与体会 32 3 题目 数据汇总题目 数据汇总 题目内容 题目内容 在数据处理中经常需要对大量数据进行汇总 将相同关键字记录的某些 数据项的值叠加起来 生成一个分类汇总表 假设某超级市场销售有 m 种商品 假设商品的编号为 1 2 3 m 有 n 台前台收款机 假设收款机的编号为 1 2 3 n 进行收款 以记 录的形式提供给计算机 每个记录表示某台收款机的一种商品一次交易的数量 和销售额 记录由 4 个域组成 收款机编号 商品编号 销售数量 销售金额 构造一个结构体类型 每次销售数据以一个结构体变量保存在一个数据文件中 本人完成的工作 本人完成的工作 1 编写实现将数据记录插入到数据文件的最后的函数 编写以收款机为单位的数据分类处理函数 构造 n 个单链表 每个链 表保存一台收款机的销售记录 这 n 个单链表的头指针存放在一个指针数组中 通过数组的下标就可以知道是哪台收款机 读取数据文件的记录 将所有的销 售记录 数据文件中的全部记录 分解插入到 n 个单链表 3 编写以商品为单位的数据分类处理函数 构造 m 个单链表 每个链 表保存一种商品的销售记录 这 m 个单链表的头指针存放在一个指针数组中 通过数组的下标就可以知道是哪种商品 读取数据文件的记录 将所有的销售 记录 数据文件中的全部记录 分解插入到 m 个单链表 4 统计每台收款机的销售总额 4 5 以收款机为单位 将所有收款机按销售总额的递增顺序构造一个单链 表并输出 6 以商品为单位 统计每种商品的销售总额 7 以商品为单位 将所有销售的商品按销售总额的递增顺序构造一个单 链表并输出 8 设计一个菜单 具有插入数据记录 按收款机统计销售总额 按商 品统计销售总额 退出系统等最基本的功能 所采用的数据结构 单链表所采用的数据结构 单链表 销售商品数据记录结构定义 销售商品数据记录结构定义 typedeftypedef structstruct GoodsGoods intint regNum regNum 收款机编号收款机编号 intint goodsNum goodsNum 商品编号商品编号 intint salesVol salesVol 销售数量销售数量 doubledouble salesAmount salesAmount 销售单价销售单价 Goods Goods typedeftypedef structstruct GoodsGoods ElemType ElemType 用于链表里的数据类型用于链表里的数据类型 单链表结点定义 单链表结点定义 typedeftypedef structstruct NodeNode ElemTypeElemType data data 链表所存的数据链表所存的数据 structstruct NodeNode next next 指向下一个结点的指针指向下一个结点的指针 LNode LNode LinkList LinkList 所设计的函数 所设计的函数 1 1 将数据记录插入到文件将数据记录插入到文件 data datdata dat 最后的函数最后的函数 5 intint AddrecordAddrecord Goods Goods goods goods 算法思想算法思想 首先判断参数是否非法 非法则返回 FAIL 否则以以二进制的 append 方式打开文件 data dat 文件指针为空则打开失败返回 FAIL 否则将 数据记录写入文件 然后关闭文件 返回 SUCCESS 流程图 流程图 2 以收款机为单位的数据分类处理函数 LinkList SortByReg int n 算法思想算法思想 判断打开文件是否成功 失败则打印 打开文件失败 并返回 FAIL 否则分配链表指针数组 然后判断内存是否充足 不足则打印 内存不 足 并返回 FAIL 否则初始化 n 个收款机链表 并读相应记录 存到对应的收款机 链表中的末尾结点 最后关闭文件 返回链表数组 流程图 流程图 开始 参数为空 返回 FAIL 结束 是 打开文件 失败 是 否否 把记录写入文件 关闭文件 返回SUCCESSSUCCESS 6 3 统计每台收款机的销售总额 double SumByReg int n 开始 打开文件失 败 打印 打开文 件失败 返回 FAIL 结束 是 分配链表指针数组 内存 不足 打印 内 存不足 否 是 初始化 n 个收款机链表 否 读相应记录 关闭文件 返回链表数组 数据块个数 不为 1 是链表为 空 否 初始化链表 是 将记录存到相应链 表的末尾结点 否 7 算法思想 算法思想 申请一个数组存储各台收款机的销售总额 申请不成功则打印 内存不足 并返回 FAIL 否则调用 SortByReg n 函数得到分类好的收款机链表指针数组 判断指针数 组是否为空 是则释放之前时申请的内存空间并返回 NULL 否则初始化总额数组 并进 行累计分析 之后释放收款机的链表内存 释放链表指针的内存 释放总额数组 返回总 额 amount 流程图 流程图 开始 结束 申请一个数组 储各台收款机的销 售总额 内存 不足 否 是 打印 内 存不足 返回 FAIL 调用 SortByReg n 函数得 到分类好的收款机 链表指针数组 指针数组为 空 释放之前申请的内存 返回 NULL 是 初始化总额 数组 否 记录总额累加 释放链表头指针的内 存 释放总额数组 返回总额 amount 初始化参数 i 0 i 0 结果打印 释放收款 机的链表内存 是 i 否 是 否 8 4 以商品为单位的数据分类处理函数 LinkList SortByGoods int m 算法思想 算法思想 判断打开文件是否成功 失败则打印 打开文件失败 并返回 FAIL 否则分配链表指针数组 然后判断内存是否充足 不足则打印 内存不 足 并返回 FAIL 否则初始化 m 个商品链表 并读相应记录 存到对应的商品链表 中的末尾结点 最后关闭文件 返回链表数组 流程图 流程图 9 5 以商品为单位 统计每种商品的销售总额 double SumByGoods int m 算法思想 算法思想 申请一个数组存储各种商品的销售总额 申请不成功则打印 内存不足 并返回 FAIL 否则调用 SortByGoods m 函数得到分类好的各种商品的链表指针数组 判 断指针数组是否为空 是则释放之前时申请的内存空间并返回 NULL 否则初始化总额数 组 并进行累计分析 之后释放收款机的链表内存 释放链表指针的内存 释放总额数组 返回总额 amount 开始 打开文件失 败 打印 打开文 件失败 返回 FAIL 结束 是 分配链表指针数组 内存 不足 打印 内 存不足 否 是 初始化 m 个商品链表 否 读相应记录 关闭文件 返回链表数组 数据块个数 不为 1 是链表为 空 否 初始化链表 是 将记录存到相应链 表的末尾结点 否 10 流程图流程图 开始 结束 申请一个数组 储存各种商品的销 售总额 内存 不足 否 是 打印 内 存不足 返回 FAIL 调用 SortByGoods m 函数 得到分类好的商品 链表指针数组 指针数组为 空 释放之前申请的内存 返回 NULL 是 初始化总额 数组 否 记录总额累加 释放链表头指针的内 存 释放总额数组 返回总额 amount 初始化参数 i 0 i 0 结果打印 释放收款 机的链表内存 是 i 否 是 否 11 6 设计一个菜单 具有插入数据记录 按收款机统计销售总 额 void RunMenu void 算法思想 算法思想 清除以前的无关输入 打印菜单 根据选择的菜单项进行相应的操作 开始 清除以前的 无关输入 打印菜单 根据选择的菜单项进行相应的 操作 结束 1 插入数 据记录 2 按收 款机 统计 销售 总额 4 退 出 系 统 3 按商品 统计销售 总额 12 7 用于输入一条新的记录 开始 goods regNum 0 输出总额和 记录条数 是 否 否 否 是 是 结束 14 程序运行结果 1 主程序运行 菜单打印 2 插入数据记录 15 3 按收款机统计销售总额 4 按商品统计销售总额 16 5 按商品销售记录排序 6 按收款机收款纪录排序 7 退出系统 17 源程序 include include include define SUCCESS 1 操作成功 define FAIL0 操作失败 define allRegisters 15 define allGoods 30 销售的商品数据记录 typedef struct Goods int regNum 收款机编号 int goodsNum 商品编号 int salesVol 销售数量 double salesAmount 销售单价 Goods typedef struct GoodsElemType 用于链表里的数据类型 typedef struct Node ElemType data 链表所存的数据 struct Node next 指向下一个结点的指针 LNode LinkList 构造一个空的线性表 LinkList InitList void LNode Head 18 Head LNode malloc sizeof struct Node 为链表的头结点分配空间 if Head printf Out of space return NULL Head next NULL return Head 返回头结点 第一个结点 head 是不存任何数据的 初始条件 线性表 L 已存在 操作结果 返回线性表 L 的最后一个结点 尾结点 LNode IsLast LinkList L LNode P L next if P while P next NULL 遍历线性表 L P P next return P 返回线性表 L 的最后一个结点 else return L 链表只有头结点 而它不存数据的 初始条件 线性表 L 已存在 操作结果 返回线性表 L 结点的个数 int ListLength LinkList L LNode P L next int num 0 while P 累积线性表 L 结点的个数 num P P next return num 返回线性表 L 结点的个数 19 构造一个数据域为 X 的新结点 LNode NewLNode ElemType X LNode S S LNode malloc sizeof struct Node 为新结点分配空间 if S printf Out of space return NULL S data X S next NULL return S 返回新结点 初始条件 线性表 L 已存在 操作结果 销毁线性表 L void DestroyList LinkList L LNode Head P if L 若线性表 L 已存在 Head L P Head next while P NULL 把链表中除头结点外的所有结点释放 free Head Head P P Head next free Head 释放头结点 L NULL 初始条件 线性表 L 中结点 P 已找到 新结点 S 已构造 操作结果 在该结点之 后插入新结点 X void ListInsert LNode Pre LNode S S next Pre next 20 Pre next S 用于输入一条新的记录 缺点就是没对输入的数据各种检查 一旦输入字母就不行了 Goods Newrecord Goods goods printf n 请输入商品信息 n 收款台号 保证录入正确的数据 while 1 fflush stdin printf 收款机编号 1 d allRegisters scanf d if goods regNum 0 if goods goodsNum 0 销量单价 printf 商品销售单价 scanf lf 清除可能输入缓冲区 fflush stdin return goods 21 专为 GOODS 而写的输出函数 void ListPrint LinkList L double amount LNode node int i int count ListLength L if L NULL return 第一个结点不存记录 所以从第二个开始 node L next if node NULL return 打印出表头 printf 注意 每打印 5 个记录 将会暂停 按 enter 继续 n printf 收款机 No R 商品 No G 单价 销售数量 n n 将全部记录按格式打印出来 i 0 while i data regNum node data goodsNum node data salesAmount node data salesVol if i 1 5 0 getch i node node next 这个就是打出总额了 Total 则是记录的条数 printf 销售总额 lf 记录条数 d n amount i 1 将数据记录插入到文件 data dat 最后的函数 int Addrecord Goods goods FILE ofp 非法参数 if goods NULL return FAIL 以二进制的 append 方式打开文件 data dat 22 if ofp fopen data dat ab NULL printf Open fail n return FAIL 把记录写入文件中 fwrite goods sizeof struct Goods 1 ofp 关闭文件 fclose ofp return SUCCESS 2 编写以收款机为单位的数据分类处理函数 LinkList SortByReg int n int i count FILE ifp Goods temp LinkList regArr 收款机的链表数组 if ifp fopen data dat rb NULL printf Open Fail n return FAIL 分配链表指针数组 regArr LinkList malloc n sizeof LinkList if regArr NULL printf Not enough memory n return FAIL n 个收款机链表初始化 for i 0 i n i regArr i NULL 开始根据收款机的编号将所读的记录进行分类 注意数组下标是从 0 开始 而收款机是从 1 开始数的 while 1 读相应的记录 正确读取时 count 为所读的字节数 count fread 出错或是到文件尾了 if count 1 break 23 第一次要初始化链表 if regArr temp regNum 1 NULL regArr temp regNum 1 InitList 存到对应的收款机链表中的末尾结点 ListInsert IsLast regArr temp regNum 1 NewLNode temp 关闭文件 fclose ifp return regArr 3 统计每台收款机的销售总额 double SumByReg int n int i recs double amount LNode node LinkList regArr 申请一个数组存储各台收款机的销售总额 if amount double malloc n sizeof double NULL printf Not enough memory n return FAIL 得到了分类好的收款机链表指针数组 regArr SortByReg n if regArr NULL free amount 释放之前申请的内存 return NULL 初始化总额数组 for i 0 i n i amount i 0 进行分析累加 for i 0 inext 链表是空的 if recs ListLength regArr i 0 24 continue 遍历一个收款机链表里有的所有记录 while recs 0 将该台收款机销售的商品记录的总额进行累加 amount i node data salesAmount node data salesVol node node next 释放收款机的链表内存 for i 0 i n i if regArr i NULL continue 打印出后再释放内存 ListPrint regArr i amount i DestroyList 释放链表指针头的内存 free regArr 释放总额数组 free amount return amount 4 排序收款机销售总额 double PaixuByReg int n int i recs k l temp double amount LNode node LinkList regArr 申请一个数组存储各台收款机的销售总额 if amount double malloc n sizeof double NULL printf Not enough memory n return FAIL 得到了分类好的收款机链表指针数组 regArr SortByReg n if regArr NULL free amount 释放之前申请的内存 return NULL 25 初始化总额数组 for i 0 i n i amount i 0 进行分析累加 for i 0 inext 链表是空的 if recs ListLength regArr i 0 continue 遍历一个收款机链表里有的所有记录 while recs 0 将该台收款机销售的商品记录的总额进行累加 amount i node data salesAmount node data salesVol node node next for k 0 k i 1 k for l k 1 lamount l temp amount k amount k amount l amount l temp printf 排序后的数组为 n 释放收款机的链表内存 for i 0 i n i if regArr i NULL continue 打印出后再释放内存 ListPrint regArr i amount i DestroyList 26 释放链表指针头的内存 free regArr 释放总额数组 free amount return amount 5 编写以商品为单位的数据分类处理函数 LinkList SortByGoods int m int i count 0 FILE ifp Goods temp LinkList goodsArr 各种商品的链表数组 if ifp fopen data dat rb NULL printf Open Fail n return FAIL 分配链表指针数组 goodsArr LinkList malloc m sizeof LinkList if goodsArr NULL printf Not enough memory n return FAIL m 种商品的链表初始化 for i 0 i m i goodsArr i NULL 开始根据商品的编号将所读的记录进行分类 注意数组下标是从 0 开始 而商品编号是从 1 开始数的 while 1 读相应的记录 count fread 出错或是到文件尾了 if count 1 break 第一次要初始化链表 if goodsArr temp goodsNum 1 NULL goodsArr temp goodsNum 1 InitList 27 存到对应的商品链表中的末尾结点 ListInsert IsLast goodsArr temp goodsNum 1 NewLNode temp 关闭文件 fclose ifp return goodsArr 6 以商品为单位 统计每种商品的销售总额 double SumByGoods int m int i recs double amount LNode node LinkList goodsArr 申请一个数组存储各种商品的销售总额 if amount double malloc m sizeof double NULL printf Not enough memory n return FAIL 得到了分类好的各种商品的链表指针数组 goodsArr SortByGoods m if goodsArr NULL free amount 释放之前申请的内存 return NULL 初始化总额数组 for i 0 i m i amount i 0 进行分析累加 for i 0 inext 链表是空的 if recs ListLength goodsArr i 0 continue 遍历一个商品链表里有的所有记录 28 while recs 0 将某种商品的销售记录的总额进行累加 amount i node data salesAmount node data salesVol node node next 释放商品的链表内存 for i 0 i m i 链表存在的话 if goodsArr i NULL continue 打印出后再释放内存 ListPrint goodsArr i amount i DestroyList 释放链表指针头的内存 free goodsArr 释放总额数组 free amount return amount 7 以商品为单位 排序每种商品的销售总额 double PaixuByGoods int m int i recs k l temp double amount LNode node LinkList goodsArr 申请一个数组存储各种商品的销售总额 if amount double malloc m sizeof double NULL printf Not enough memory n return FAIL 得到了分类好的各种商品的链表指针数组 goodsArr SortByGoods m if goodsArr NULL free amount 释放之前申请的内存 29 return NULL 初始化总额数组 for i 0 i m i amount i 0 进行分析累加 for i 0 inext 链表是空的 if recs ListLength goodsArr i 0 continue 遍历一个商品链表里有的所有记录 while recs 0 将某种商品的销售记录的总额进行累加 amount i node data salesAmount node data salesVol node node next for k 0 k i 1 k for l k 1 lamount l temp amount k amount k amount l amount l temp printf 排序后的数组为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外科口罩的试题及答案
- 外科护理考试题及答案
- 通知试题及答案10个
- 图书情报试题及答案分析
- 2025年杭州市住房租赁协议标准格式策划
- 2025年社区绿化工程建设项目施工协议书
- 企业信息安全与法规的应对
- 项目成本控制与预算管理策略
- 五金工具电器及设备供货服务的背景意义及必要性
- 粮食和物资储备科技创新的现状及总体形势
- 《军事理论与国家安全》参考试题库(含答案)
- 爬架悬挑找平架施工方案
- 某机械公司员工管理手册
- 呈阅件(清流县城市管理办法)
- 公务员职务与及职级并行规定课件
- 红河县年产50吨珍珠棉建设项目环评报告
- 术中大出血的抢救及护理配合
- 商务英语听说-对外经济贸易大学中国大学mooc课后章节答案期末考试题库2023年
- 第十二讲 建设社会主义生态文明PPT习概论2023优化版教学课件
- 国家湿地公园总体规划导则
- 阆中张飞牛肉名称的来历
评论
0/150
提交评论