首页 实践教学目标任务书

实践教学目标任务书

举报
开通vip

实践教学目标任务书实践教学目标任务书 《软件开发实训》 实 践 教 学 目 标 任 务 书 2004 – 2005学年 第三学期 实践教学项目: 软件开发实训 班级: 数英041、软英043 时间: 2005.7.24~8.24 指导教师: 戴 白 刃 制定日期 2005年6月26日 批准 审核 制表 邱碧龙 一、实训目的: 1(了解软件开发过程的基本原理和方法; 2(掌握软件开发的基本知识和技能; 3(熟练使用一种编码语言和软件开发环境,如C/C++语言、MS Visual Studio 6.0; 4(...

实践教学目标任务书
实践教学目标任务书 《软件开发实训》 实 践 教 学 目 标 任 务 书 2004 – 2005学年 第三学期 实践教学项目: 软件开发实训 班级: 数英041、软英043 时间: 2005.7.24~8.24 指导教师: 戴 白 刃 制定日期 2005年6月26日 批准 审核 制表 邱碧龙 一、实训目的: 1(了解软件开发过程的基本原理和 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ; 2(掌握软件开发的基本知识和技能; 3(熟练使用一种编码语言和软件开发环境,如C/C++语言、MS Visual Studio 6.0; 4(利用所学的知识和技能, 开发一个中小规模的软件,检验所学知识; 5(树立严肃认真的工作作风。 二、实训题目: 人口教育普查数据收集软件 ,,, 《软件开发实训》 三、题目描述 参见附件1 四、实训要求: 1(阅读并理解系统的分析与设计要求; 2(利用传统或面向对象的编程语言,如C/C++,准确表达出系统的设计要求; 3(完成软件的模块测试、综合测试和确认测试; 4(编写一个简要的软件开发文档 资料 新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单 ; 软件开发文档资料包括以下 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 : (1) 问题描述(定义) 要解决的问题是什么,具体包括:项目名称、背景、开发该系统的现状、项 目的目标等。 (2) 需求分析 系统所需的功能和完成功能的主要交互过程(步骤) (3) 总体设计 模块划分、软件结构图或类关系图 (4) 详细设计 系统关键数据结构描述,算法描述(流程图或IPO图) (5) 编码 符合文档化编码风格的源程序清单 1) 使用有意义的变量名称 2) 适当的注释 3) 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的书写格式 (6) 测试 模块测试使用的测试用例和测试结果: 测试用例::= 模块名称+{测试数据,期望结果} 测试结果::= 模块名称+{测试数据,期望结果,实际结果} 确认测试使用的测试用例和测试结果: 测试用例::= 确认项目+{测试数据,期望结果} 测试结果::= 确认项目+{测试数据,期望结果,实际结果} (7) 总结 重点突出对软件开发过程中完成的主要成果进行总结、评价成果的价值和进 一步研究的展望和设想。 (8) 参考书目和致谢等 ,,, 《软件开发实训》 五(考核方法及具体评分标准 成绩记录采取百分制。具体评分标准参见附件2。 六(主要参考书 1. 郑莉著,C++语言程序设计(含实验指导书)。清华大学出版社(结构化程序设计部分) 2. 钱能主编,C++程序设计教程,清华大学出版社,2000.113. 戴锋编著,Visual C++程序设计基础,清华大学出版社,2001.4 4. 吕日著,C++程序设计教程,清华大学出版社, 5. 参考书,C++大学教程,美国 Harvey M.Deitel等 ,,, 《软件开发实训》 附件一:人口教育普查数据收集软件 一、引言(问题描述) “中国改革的成功,取决于国家的法制道德建设和全民综合素质的提高”,人口教育普查对国民经济的合理配置和国家的经济发展有重大的意义。 人口教育普查中需要对人口数据进行收集、保存、统计和分析。人口数据量大面广,采用人工方法将无法在较短时间内完成统计和分析任务,这将失去人口教育普查的实际意义,因此,希望借助计算机高效强大的数据存储和处理能力来完成。 经调查验证表明,利用计算机高效强大的数据存储和处理能力进行人口数据进行收集、保存、统计和分析,便于收集和汇总人口教育普查数据;可以对人口教育普查数据进行自动审查、一致性检验和长期海量存储;所存储的人口数据具有检索迅速、查找方便、统计准确、分析高效等优点;完全可实现人口教育普查数据收集迅速、准确可靠、节约成本、减少费用的目标。 二、目标 本项目是开发一个人口教育普查数据收集的软件,简称“人口教育普查数据收集软件”。该软件能为人口教育普查数据的录入、保存、显示和简单的自动审查提供解决方案,使其能为人口教育普查数据的录入工作人员的数据录入工作提供方便,具体目标如下: 1) 提高人口教育普查数据的录入效率,尽可能减少录入的击键次数; 2) 准确保存录入的数据,保存的数据格式严谨规范,便于提交给人口教育普查汇总系统; 3) 清晰地列表显示录入的数据,为录入工作人员及时发现错误提供方便; 4) 软件便于扩充功能和移植。 三、需求分析 1、 系统需求 本次全国人口教育普查重点普查人口的文化教育状况,重点收集人口的文化教育数据。文化教育层次分为:未受教育、小学肄业、小学毕业、初中肄业、初中毕业、高中肄业、高中毕业、中职肄业、中职毕业、高职肄业、高职毕业、高专肄业、高专毕业、高校肄业、高校毕业、硕士生肄业、硕士生毕业、博士生肄业、博士生毕业、博士后肄业、博士后毕业。 普查数据内容为: 姓名、性别、民族、出生年月日、身份证号码、教育状况、最后受教育的学校 ,,, 《软件开发实训》 其中数据要求如下表: 序号 数据要求 取值范围 备注 数据名称 1 姓名 汉字和园点.组成 2到20个字符 2 性别 一个汉字 “男” 或 “女” 3 民族 汉字组成 1到12个字符,按国家 民政们核定的民族命 名规范取名 4 出生年月日 格式为XXXX年XX1880年1月1日到 月XX日 2008年12月31日 , 身份证号码 18位阿拉伯数字 ,,个字符由国家公 按国家公安部最新核安部提供 定的身份证号码规范身份证号 取值,旧身份证号码码编码规 用新身份证号码进行 范 规范化 , 教育状况 按上述的文化教育层 最多,,个字符 次规范名称 , 最后受教育的学校汉字组成 按国际上各国注册的由国家教 学校名称规范取值 育部提供 学校名称 本次全国人口教育普查数据收集按国家行政区属同步分别进行收集,行政区属自上而下分为:省(直辖市)、市(地区)、县(辖区)、乡(乡镇、街道)、村(村组、居委会)。 本次全国人口教育普查数据收集采用自下而上逐级向上汇总方式进行收集。国家行政区属的县(辖区)为基本的初始数据收集单位,初始数据收集由各县(辖区)的人口与计划生育部门具体负责实施,负责组织初始数据表格的填写和编码校对,并按乡(乡镇、街道)、村(村组、居委会)两级分类汇总,按时提交给市(地区)的人口与计划生育部门。市(地区)的人口与计划生育部门负责组织初始数据表格的数据录入,按时将录入数据提交给省(直辖市)的人口与计划生育部门,各省(直辖市)的人口教育普查数据直接汇总到国家信息中心。 人口教育普查数据收集软件应满足如下需求: 1) 为提高数据录入的效率,普查数据中除姓名外,全部采用编码方式直接录入。按照 ,,, 《软件开发实训》 录入数据的需要,建立录入数据的编码; 2) 满足基本数据按编码方式录入的要求,并有编码和被编码文字符号的提示; 3) 普查数据采用国家标准的计算机信息(中文信息用中文机内码,英文信息用标准的 ASCII码)编码方式存储; 4) 满足多个操作人员同时使用的要求,各个操作人员录入的数据能进行合并; 5) 合并后的数据能按不同的县(辖区)进行分类; 6) 提供录入数据的空白项和相悖审查,如教育状况和最后受教育的学校的相悖; 7) 提供身份证号码与出生年月日、性别的一致性审查; 8) 对操作人员的技能要求较低,便于使用; 9) 确保录入数据的安全。 2、 功能需求 基于对系统需求的分析,人口教育普查数据收集软件需要实现以下功能: 1) 用户管理 管理使用软件的操作人员,设置操作人员的用户名和口令,让不同的操作人员在不同的数据存储空间上保存各自的录入数据,数据存储空间按用户名加以区分,该用户只允许操作其拥有的数据存储空间。这样可以确保数据的安全,便于对该用户录入数据的考核。操作人员的用户名和初始口令由系统管理员制定分配,并建立用户名表。 用户名表由系统管理员进行维护和管理,操作人员可以修改口令,但不可以修改用户名。一般用户只有使用的权限。 用户名表维护和管理包含的功能有:添加用户,删除用户,修改口令,显示用户数据项(口令用特殊符号显示)和用户的数量。 2) 编码管理 按不同数据类型分别建立由编码和被编码数据组成的编码表,并维护该编码表。编码表中的编码和数据是一对一的关系,一个编码唯一地对应一个基本数据项。一个基本数据项一旦确定了编码,该编码就不可以用于其他的基本数据项。 编码表由系统管理员进行维护和管理,一般用户只有使用编码检索的权限。 编码表维护和管理包含的功能有:添加编码表数据项,删除编码表数据项,修改编码表数据项,显示编码表数据项和编码表中数据项的数量。 3) 数据录入 按不同日期录入的数据分别存放在不同的数据文件中,便于数据审查人员的审查和统计; 录入提示。按录入不同的数据类型时,分别显示其编码表,提示操作人员录入; 错误警告。录入错误及时警告,更正错误,提示重新录入; 自动焦点。录入当前数据符合数据类型和取值要求后,输入焦点自动激活动下一项; ,,, 《软件开发实训》 完整确认。当前记录数据的全部数据项录入结束后,输入焦点自动移到录入确认; 及时修改。当前记录数据的全部数据项录入后,操作人员发现错误,允许操作人员选择修改功能进行修改; 及时保存。录入确认后,当前记录数据自动保存,确保录入数据安全有效; 数据显示。显示已录入的数据记录的数量。 4) 数据审查 列表显示。列表方式显示数据文件的每条记录,并统计数据文件中记录的数量; 一致性审查。审查已录入数据的各条记录上是否存在相悖的数据项; 数据修改。修改已录入数据的某条记录。 5) 数据管理 数据合并。将任意两个数据文件合并成一个较大的数据文件; 数据拆分。将一个较大的数据文件拆分成几个数据文件; 3、 性能需求 1) 硬件环境 PC机硬件已经有很好的性能价格比,推荐的PC机配置: CPU: Intel P 2.8GHz MEM: DDR2 256MB HD: Maxtor 80GB NIC: 3COM 3C905 10/100BaseT DSP: 17”液晶显示器 其他标准配置 2) 软件环境 操作系统: DOS中文操作系统或MS Windows 2000简体中文操作系统(SP4)的命令窗口; 开发环境:MS Visual Studio 6.0 数据库系统:不需要; 其他支持系统:不需要; 3) 软件性能指标 在上述硬件和软件环境下运行,“人口教育普查数据收集软件”应达到如下性能指标: 显示提示编码表时间<0.5秒; 在100字符/分钟击键速度下,数据字符的显示间隔时间<0.75秒; ,,, 《软件开发实训》 四、总体设计 1、 设计依据 依据软件需求分析、性能指标和DOS CUI的特点等进行系统设计。 2、 系统结构 图一 系统总体SC图 主控模块 系统初用户登系统退权限识 始化 录 出 别 管理员控操作员控 制模块 制模块 编退用修数数数退 码出户改据据据出 管 管管口录审管操 理理理令入查理作 图二 用户管理模块SC图 用户管理 退出用添加修改删除显示 户管理用户口令用户用户 ,,, 《软件开发实训》 图三 编码表管理模块SC图 编码表管理 编码表管理 控制模块 退出编码选择编 表管理 码表 返回编码表编码添加修改删除显示 管理 检索编码编码编码编码 图四 数据录入模块SC图 数据录入 数据数据退出数据录入 显示录入修改控制 退出录录入及时完整 入控制提示确认保存 错误及时编码自动 检索警告修改焦点 ,,, 《软件开发实训》 图五 数据审查模块SC图 数据审查 数据数据一致性退出 修改显示审查 审查 图六 数据管理模块SC图 数据管理 数据数据数据退出 显示合并拆分管理 ,,,, 《软件开发实训》 3、 模块说明 1) 主控模块 模块编号 PE001 模块名称主控模块 简要注解 控制系统初始化和登录 输入 无 输出 退出代号 处理 1) 系统初始化; 2) 显示菜单如下; 1)用户登录 0)系统退出 选择功能项: 3) 开始消息循环; 4) 若用户输入选择号FunItem则 switch FunItem case (FunItem==1) { call 用户登录; switch 权限识别(用户信息对象) case (权限 is 管理员) { call 管理员控制模块; break; } case (权限 is 操作员) { call 操作员控制模块; break; } case else { 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 登录错误; break; } ,,,, 《软件开发实训》 break; } case (FunItem==0) { 退出消息循环; } case else { 报告错误(„选择功能错误?); break; } 5) 继续消息循环; 6) call 系统退出; 2) 系统初始化 模块编号PE002 模块名称 系统初始化 简要注解 构造系统初始各数据对象 输入 无 输出 系统各数据对象 处理 1) 显示‘系统初始化…’提示; 2) 若存在‘用户信息数据文件UserInfo’则 读取UserInfo数据构造用户信息对象集合; 否则 填写错误报告表(‘构造用户信息,失败。’& 原因); 3) 构造用户信息对象(UserID=,UserPWD=); 4) 构造系统编码名称表sysCodeNamedTable; 5) 对sysCodeNamedTable的每个元素thisTable,处理 若存在thisTable 所指的数据文件,则 { 读取thisTable 所指的数据文件,构造thisTable所指的数 据对象; } ,,,, 《软件开发实训》 否则 填写错误报告表(‘构造用户信息,失败。’& 原因); 6) 显示错误报告表; 7) 显示‘初始化结束’提示 8) 返回 3) 用户登录 模块编号 PE003 模块名称用户登录 简要注解 修改用户信息对象 输入 用户信息对象 输出 修改后用户信息对象 处理 1) 显示: 1)输入用户名称 2)输入用户口令 3)确定 0)退出 选择功能项: 2) 开始消息循环; 3) 若用户输入选择号FunItem则 switch FunItem case (FunItem==1) { 输入用户名curUserName; break; } case (FunItem==2) { 输入口令curUserPwd; break; } case (FunItem==3) { 用户确定(1),退出消息循环; ,,,, 《软件开发实训》 break; } case (FunItem==0) { 用户确定(0),退出消息循环; break; } case else { 报告错误(„选择功能错误?); break; } 4) 继续消息循环; 5) 若 用户确定(1) 则 { 用户信息对象.UserID= curUserName 用户信息对象.UserPWD= curUserPwd } 否则 { 用户信息对象.UserID= 用户信息对象.UserPWD= } 6) 返回; 4) 系统退出 模块编号PE004 模块名称系统退出 简要注解 输入 系统各数据对象 输出 退出代码(0) 处理 1) 显示?系统正在退出?信息; 2) 系统阻止一切消息接收; 3) 分别释放系统各数据对象存储空间; ,,,, 《软件开发实训》 4) 停止程序运行; 5) 返回退出代码(0)。 5) 权限识别 模块编号 PE005 模块名称权限识别 简要注解 判别用户对象,求用户对象的权限 输入 用户对象 输出 用户对象的权限 处理 1) 若用户对象属于系统用户信息对象集合,则 求用户对象的权限P, 否则 P=; 2) 返回用户对象的权限P 6) 管理员控制模块 模块编号 PE006 模块名称管理员控制模块 简要注解控制管理员的功能操作 输入 系统各数据对象 输出 无 处理 1) 显示菜单如下; 1) 用户管理 2) 编码管理 0) 退出 选择功能项: 2) 开始消息循环; 3) 若用户输入选择号FunItem则 switch FunItem case (FunItem==1) ,,,, 《软件开发实训》 { call用户管理; break; } case (FunItem==2) { call编码管理;; } case (FunItem==0) { 退出消息循环; } case else { 报告错误(„选择功能错误?); break; } 4) 继续消息循环; 5) 返回; 7) 操作员控制模块 模块编号PE007 模块名称操作员控制模块 简要注解控制操作员的功能操作 输入 系统各数据对象 输出 无 处理 1) 显示菜单如下; 1) 数据录入 2) 数据审查 3) 数据管理 4) 修改口令 0) 退出 选择功能项: ,,,, 《软件开发实训》 2) 开始消息循环; 3) 若用户输入选择号FunItem则 switch FunItem case (FunItem==1) { call数据录入; break; } case (FunItem==2) { call数据审查; } case (FunItem==,) { call数据审查; } case (FunItem==,) { call修改口令; } case (FunItem==0) { 退出消息循环; } case else { 报告错误(„选择功能错误?); break; } 4) 继续消息循环; 5) 返回; 8) 编码管理 模块编号 PE008 模块名称编码管理 ,,,, 《软件开发实训》 简要注解编辑系统编码表对象 输入 系统编码表对象 输出 无 处理 1) 显示菜单如下; 1) 输入编码表 0) 退出 选择功能项: 2) 开始消息循环; 3) 若用户输入选择号FunItem则 switch FunItem case (FunItem==1) { 编码表对象=选择编码表(); 若 (编码表对象!=),则 { call 编码表管理控制模块(编码表对象); } break; } case (FunItem==0) { 退出消息循环; break; } case else { 报告错误(„选择功能错误?); break; } 4) 继续消息循环; 5) call退出编码表管理; 6) 返回 ,,,, 《软件开发实训》 五、详细设计 本项目采用如下命名规则:以变量类型为前缀的采用匈牙利命名规则,达到顾名思义,自明其意的目的。如iFunItem代表整型变量,cFunItem代表字符型变量,sFunItem为字符串型变量,pFunItem为指针变量~模块级的变量采用“模块名简称_变量类型为前缀+变量名”的命名规则,如Init_iFunItem 表示该变量名为FunItem,并且属于Initialization()模块的整型变量。 采用的数据结构以及全局变量的声明: 全局数据结构 采用链表存储用户信息对象集合以及编码表 用户信息 Typedef Struct UserInfo { char UserID[20]; char UserPWD[20]; char Potency[20]; struct UserInfo *next; }UserNode; struct UserList { UserNode *head; }; 编码表 typedef struct Sex { char sSex[4]; char sSexCode[4]; struct Sex *next; } SexNode; struct SexList { struct Sex *head; ,,,, 《软件开发实训》 }; typedef struct EducationStatus { char sEStatus[20]; char sEStatusCode[5]; struct EducationStatus* next; }EStatusNode; struct EStatusList { EStatusNode *head; }; typedef struct LastSchool { char sLSchool[20]; char sLSchoolCode[5]; struct LastSchool* next; }LastSchoolNode; struct LastSchoolList { LastSchoolNode *head; }; 全局变量 用户信息 char UserID[20]; char UserPWD[20]; 编码表对应信息 char *sysCodeNamedTable[3]; “用户信息表”以及“性别”,“教育程度”,“最后后毕业学 校”三个编码表 UserList *pMyUserList; ,,,, 《软件开发实训》 SexList *pMySexList; EStatusList *pMyEStatusList; LastSchoolList *pMyLastSchoolList; 公共模块 异常处理模块 模块编号 PE000 模块名称 ErrorReport(char *Module,char *res) 传递参数 char *Module //为发生错误的模块 char *res //res为错误信息 简要注解 显示程序运行中的错误,并写入报告表 所用算法 无 输入 错误信息 输出 错误提示以及错误报告表 所用数据结构 无 流程逻辑 int ErrorReport(char *res) { FILE *fp; if( (fp=fopen("ErrorReport.txt","a"))==NULL ) { printf("can't open ErrorReport.txt!!!"); fclose(fp); return 0; } else { char *str="操作失败,原因: "; fputs(str,fp); fputs(res,fp); fputc('\n',fp); fclose(fp); return 1; } } 用户判断模块 模块编号 PE022 模块名称 isUserExisted(char *sID) 传递参数 char *sID为所要检索的UserID ,,,, 《软件开发实训》 简要注解 判断用户是否存在 所用算法 带头结点的单向链表检索算法 输入 用户对象信息表 输出 检索状况(0表示存在,1表是不存在) 所用数据结构 带头结点的单向链表 流程逻辑 1)判断用户信息表是否为空 UserNode *pNode; 若不为空,则进行检索 if( pMyUserList->head->next!=NULL ) { pNode=pMyUserList->head->next; while( pNode!=NULL && strcmp(pNode->UserID,sID)!=0 ) pNode=pNode->next; if( pNode==NULL) return 1; else { printf("该用户名已经被占用,请用新的用户名进行添 加~~\n"); return 0; } } 若为空,则返回状态 else return 1; 性别编码判断模块 模块编号 PE023 模块名称 isSexCodeExisted(char *sSex) 传递参数 char *sSex 为所要检索的性别 简要注解 判断性别编码是否已经存在 所用算法 带头结点的单向链表检索 输入 性别编码表对象 输出 状态代码(0代表存在,1代表不存在) 所用数据结构 带头结点的单向链表 流程逻辑 1)判断性别编码表是否为空 ,,,, 《软件开发实训》 SexNode *pNode; 若不为空,则进行检索 if( pMySexList->head->next!=NULL ) { pNode=pMySexList->head->next; while( pNode!=NULL && strcmp(pNode->sSex,sSex)!=0 ) pNode=pNode->next; if( pNode==NULL ) return 1; else { printf("该编码信息已经存在!!\n"); return 0; } } 若为空,则返回状态 else return 1; 教育状况判断模块 模块编号 PE024 模块名称 isEStatusCodeExisted(char *sEStatus) 传递参数 char *sEStatus //表示需要判断的教育状况 简要注解 判断新增教育状况编码是否已经存在 所用算法 带头结点的单向链表的检索 输入 教育状况编码表 输出 存在信息(0表示存在,1表示不存在) 所用数据结构 EStatusList 见数据结构声明 流程逻辑 1)判断教育状况编码表是否为空 EStatusNode *pNode; 若不为空,则进行检索 if( pMyEStatusList->head->next!=NULL ) { pNode=pMyEStatusList->head->next; while( pNode!=NULL && ,,,, 《软件开发实训》 strcmp(pNode->sEStatus,sEStatus)!=0 ) pNode=pNode->next; if( pNode==NULL ) return 1; else { printf("该编码信息已经存在!!\n"); return 0; } } 若为空,则返回状态 else return 1; 最后毕业学校判断模块 模块编号 PE025 模块名称 isLastSchoolCodeExisted(char *sLastSchool) 传递参数 char *sLastSchool //需要判断的学校名 简要注解 判断编码是否已经存在 所用算法 带头结点的单向链表检索 输入 最后毕业学校编码表 输出 是否存在状态(0表示不存在,1表示存在) 所用数据结构 LastSchoolList 见数据结构声明 流程逻辑 1)判断最后毕业学校编码表是否为空 LastSchoolNode *pNode; 若不为空,则进行检索 if( pMyLastSchoolList->head->next!=NULL ) { pNode=pMyLastSchoolList->head->next; while( pNode!=NULL && strcmp(pNode->sLSchool,sLastSchool)!=0 ) pNode=pNode->next; if( pNode==NULL ) return 1; else ,,,, 《软件开发实训》 { printf("该编码信息已经存在!!\n"); return 0; } } 若为空,则返回状态 else return 1; 模块详细设计 1) 系统初始化 模块编号 PE002 模块名称 Initialization() 传递参数 无 简要注解 管理系统的初始化及用户登录 所用算法 无 模块变量声明 UserNode *Init_pNode; //用于建立用户对象信息表 SexNode *Init_pSNode; //用于建立性别编码表 EStatusNode *Init_pENode; //用于建立教育状况编码表 LastSchoolNode *Init_pLNode; //用于建立最后毕业学校编码表 输入 用户信息对象表,编码表 输出 用户对象链表 所用数据结构 见全局数据结构和全局变量声明 流程逻辑 1)载入用户信息 pMyUserList=(UserList*)malloc(sizeof(UserList)); // pMyUserList见全局变量声明 pMyUserList->head =(UserNode*)malloc(sizeof(UserNode)); pMyUserList->head->next=NULL; 2)Read “用户信息表” FILE *fp; if( (fp=fopen("UserInfo.dat","r"))==NULL ) //打开用户信息表文件 { 填写错误报告表:系统初始化失败,并指明原因 退出系统; } else { ,,,, 《软件开发实训》 读取数据并载入到MyUserInfoList链表 Init_pNode=(UserNode*)malloc(sizeof(UserNode)); while( fread(Init_pNode,sizeof(UserNode)-4,1,fp)==1 ) { Init_pNode->next=NULL; Init_pNode->next=pMyUserList->head->next; pMyUserList->head->next=Init_pNode; Init_pNode=(UserNode*)malloc(sizeof(UserNode)); } free(Init_pNode); fclose(fp); 2)初始化用户信息对象以及sysCodeNamedTable // UserID ,UserPWD 以及sysCodeNamedTable见全局变量声明 UserID=“”; UserPWD=“”; sysCodeNamedTable[0]="Sex.dat"; sysCodeNamedTable[1]="EducationStatus.dat"; sysCodeNamedTable[2]="LastSchool.dat"; 4)根据sysCodeNamedTable每个元素所对应的文件建立编码表对象,例如:性别编码表的建立如下: //构造性别编码表对象 if( (fp=fopen(sysCodeNamedTable[0],"r"))==NULL ) //打开性别编码表文件 { printf("can't open file %s!!\n",sysCodeNamedTable[0]); ErrorReport( sysCodeNamedTable[0]); exit(1); } else { pMySexList=(SexList*)malloc(sizeof(SexList)); if( pMySexList==NULL ) { ,,,, 《软件开发实训》 printf("Memory assign fail!\n!"); 填写错误报告表:系统初始化失败,并指明原因~ Call ErrorReport 退出系统; } else { //建立头结点 pMySexList->head =(SexNode*)malloc(sizeof(SexNode)); pMySexList->head->next=NULL; } //分配结点空间 Init_pSNode=(SexNode*)malloc(sizeof(SexNode)); if( Init_pSNode==NULL) { printf("Memory assign fail!!"); exit(1); } else { while( fread(Init_pSNode,sizeof(SexNode)-4,1,fp)==1 ) { Init_pSNode->next=pMySexList->head->next; pMySexList->head->next=Init_pSNode; Init_pSNode=(SexNode*)malloc(sizeof(SexNode)); } } } 异常处理 见公共模块 限制条件 程序第一次运行之前应事先建立ErrorReport.txt,LastSchool.dat , Sex.dat,EducationStatus.dat这四个空白文件,其中ErrorReport.txt为错误报告表,LastSchool.dat ,Sex.dat,EducationStatus.dat为编码表,创 ,,,, 《软件开发实训》 建后应由管理员制定编码准则 测试计划 1) 采用黑盒测试,检测系统各初始化功能 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 各数据对象链表均能正确建立,各逻辑路径均能正常,异常处理也正常 实际测试结果 各数据对象链表均能正确建立,各逻辑路径均能正常,异常处理也正常 2)用户登录 模块编号 PE003 模块名称 UserLogin() 传递参数 无 简要注解 接收用户登录信息 所用算法 无 模块变量声明 int iFlag=1,iFunItem; //分别为while以及switch的控制变量 char curUserName[20],curUserPwd[20]; //接收用户对象信息 输入 用户对象信息 输出 无 所用数据结构 无 流程逻辑 1)开始消息循环: 2)显示: printf("1)输入用户名称;\n"); printf("2)输入用户口令;\n"); printf("3)确定;\n"); printf("0)退出;\n"); printf("请选择操作:"); 3)若用户输入选择号iFunItem则 switch iFunItem case (iFunItem==1) { 输入用户名curUserName; break; } case (FunItem==2) { 输入口令curUserPwd; ,,,, 《软件开发实训》 break; } case (FunItem==3) { 用户确定(1) 退出消息循环; break; } case (FunItem==0) { 用户确定(0),退出消息循环; break; } default: { 报告错误(„选择功能错误?); break; } 4)继续消息循环; 5)若 用户确定(1) 则 { 用户信息对象.UserID= curUserName 用户信息对象.UserPWD= curUserPwd } 否则 { 用户信息对象.UserID= 用户信息对象.UserPWD= } 6)返回; 异常处理 见公共模块 限制条件 iFunItem只能是数字字符 测试计划 1) 采用黑盒测试,检测用户名和口令的输入 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 用户名以及口令能正确输入,各逻辑路径均能正常,异常处理也正常 实际测试结果 用户名以及口令能正确输入,各逻辑路径均能正常,异常处理也正常 ,,,, 《软件开发实训》 3)系统退出 模块编号 PE004 模块名称 ExitApp() 传递参数 无 简要注解 无 所用算法 无 模块变量声明 无 输入 系统各数据对象 输出 退出代码 所用数据结构 无 流程逻辑 printf("系统正在退出..."); //注销用户 strcpy(UserID,""); strcpy(UserPWD,""); return 0; 无 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测用户名和口令的注销 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 用户名以及口令能正确注销,各逻辑路径均能正常,异常处理也正 常 实际测试结果 用户名以及口令能正确注销,各逻辑路径均能正常,异常处理也正 常 4)权限识别 模块编号 PE005 模块名称 JudgePermission() 传递参数 无 简要注解 判别用户对象,求用户对象的权限 所用算法 链表的遍历 模块变量声名 UserNode *Judge_pLNode=pMyUserList->head->next; 输入 用户对象 输出 用户对象的权限 所用数据结构 链表 1)在pMyUserInfoList中查找符合Judge_pNode->UserID=UserID流程逻辑 Judge_pNode->UserPWD=UserPWD的记录 if( UserID=="" || UserPWD=="" ) { ,,,, 《软件开发实训》 printf("用户名或密码不能为空!!\n"); ErrorReport("用户名或密码为空!!"); } else { while(Judge_pLNode!=NULL && ( Judge_pLNode->UserID!=UserID || Judge_pLNode->UserPWD!=UserPWD ) ) Judge_pLNode=Judge_pLNode->next; } 2)若用户不在用户对象集合中,则返回NULL if( Judge_pLNode==NULL ) { printf("您不是合法的用户!!\n"); return NULL; }否则返回权限 else return Judge_pLNode ->Potency; 见公共模块异常处理 iFunItem只能是数字字符 限制条件 测试计划 1) 采用黑盒测试,检测权限的识别以及异常的处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 能正确识别用户权限,各逻辑路径均能正常,异常处理也正常 实际测试结果 能正确输入用户权限,各逻辑路径均能正常,异常处理也正常 5)主控模块 模块编号 PE001 模块名称 Main() 传递参数 无 简要注解 控制系统初始化和登录 所用算法 无 模块变量声明 //iFlag为循环控制变量,iFunItem为switch操作识别变量 int iFunItem,iFlag=1; char sPermission[20]; //暂存权限信息,用于区别权限 输入 无 输出 退出代号 无 所用数据结构 流程逻辑 1)系统初始化; Initialization(); 2)开始消息循环; //iFlag为循环控制变量,iFunItem为操作识别变量 int iFunItem,iFlag=1; ,,,, 《软件开发实训》 3)显示菜单如下; while(iFlag==1) { printf("1)用户登录;\n"); printf("0")系统退出;\n"); printf("请选择操作:"); scanf("%d",&iFunItem); 若用户输入选择号iFunItem则 switchi FunItem case (iFunItem==1) { call 用户登录; UserLogin(); Call JudgePermission()返回用户权限信息 if( JudgePermission()!=NULL ) { strcpy(sPermission,JudgePermission()) 识别权限 按权限决定所调用的模块 } else { printf("sPermission is NULL\n"); } } case (FunItem==0) { 退出消息循环 调用系统退出模块 ExitApp(); iFlag=0; } default: { 报告错误(„选择功能错误?); ,,,, 《软件开发实训》 printf("错误的操作选择!!!\n"); ErrorReport("选择错误!!"); break; } 继续消息循环; } 见公共模块异常处理 iFunItem只能是数字字符限制条件 测试计划 1) 采用黑盒测试,检测各模块的调用以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 各模块均能正常调用,各逻辑路径均能正常,异常处理也正常 实际测试结果 各模块均能正常调用,各逻辑路径均能正常,异常处理也正常 6)管理员控制模块 模块编号 PE006 模块名称 AdmModule() 传递参数 无 简要注解 控制管理员的功能操作 所用算法 无 模块变量声明 //iFlag为循环控制变量,iFunItem为操作识别变量 int iFunItem,iFlag=1; 输入 系统各数据对象 输出 无 无 所用数据结构 流程逻辑 1)开始消息循环,显示菜单如下: //iFlag为循环控制变量,iFunItem为操作识别变量 int iFunItem,iFlag=1; while(iFlag==1) { printf("1)用户管理;\n"); printf("2)编码管理;\n"); ,,,, 《软件开发实训》 printf("0)系统退出;\n"); printf("请选择操作:"); scanf("%d",&iFunItem); 若用户输入选择号iFunItem则 switch iFunItem case (iFunItem==1) { call用户管理; break; } case (iFunItem==2) { call编码管理;; } case (iFunItem==0) { 退出消息循环; } case else { 报告错误(„选择功能错误?); break; } 2) 继续消息循环; } 3) 返回; 见公共模块异常处理 iFunItem只能是数字字符 限制条件 测试计划 1) 采用黑盒测试,检测各模块的调用以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 各模块均能正常调用,各逻辑路径均能正常,异常处理也正常 实际测试结果 各模块均能正常调用,各逻辑路径均能正常,异常处理也正常 7)用户管理模块 ,,,, 《软件开发实训》 PE009 模块编号 UserManagement() 模块名称 无 传递参数 对用户信息表进行管理 简要注解 无 所用算法 /iFlag为循环控制变量,iFunItem为操作识别变量 模块变量声明 int iFunItem,iFlag=1; 用户信息表对象 输入 无 输出 无 所用数据结构 流程逻辑 1)开始消息循环,显示菜单如下: //iFlag为循环控制变量,iFunItem为操作识别变量 //iFlag为循环控制变量,iFunItem为操作识别变量 int iFunItem,iFlag=1; while(iFlag==1) { printf("1)添加用户;\n"); printf("2)修改用户口令;\n"); printf("3)删除用户;\n"); printf("4)显示用户;\n"); printf("0)系统退出;\n"); printf("请选择操作:"); scanf("%d",&iFunItem); 若用户输入选择号iFunItem则 switch iFunItem case (iFunItem==1) { call添加用户模块; break; } case (iFunItem==2) { call修改用户口令模块;; } case (iFunItem==3) { call删除用户信息模块; ,,,, 《软件开发实训》 } case (iFunItem==4) { call显示用户信息模块;; } case (iFunItem==0) { 退出消息循环; } case else { 报告错误(„选择功能错误?); break; } 2) 继续消息循环; } 3) 返回; 见公共模块异常处理 iFunItem只能是数字字符限制条件 测试计划 1) 采用黑盒测试,检测各模块的调用 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 各模块均能正常调用,各逻辑路径均能正常,异常处理也正常 实际测试结果 各模块均能正常调用,各逻辑路径均能正常,异常处理也正常 8)添加用户模块 PE010 模块编号 AppendUser() 模块名称 无 传递参数 管理员添加新用户 简要注解 带头结点单向链表的首结点插入算法 所用算法 //用于将用户信息添加到用户信息表 模块变量声明 UserNode *Append_pLNode; //用于输入用户信息 char Append_sID[20],Append_sPWD[20],Append_Potency[20]; 用户信息对象,用户信息对象表 输入 添加成功信息~ 输出 ,,,, 《软件开发实训》 带头结点单向链表 所用数据结构 流程逻辑 1)输入新用户信息,存储到用户对象中 Append_pLNode=(UserNode*)malloc(sizeof(UserNode)); printf("所添加的用户名(1-20个字符):"); scanf("%s",Append_sID); printf("所添加的用户口令(1-20个字符):"); scanf("%s",Append_sPWD); printf("所添加的用户权限(Administrator/Operator/Guest:"); scanf("%s",Append_Potency); 2)//判断用户是否存在 call isUserExisted(Append_sID) 见公共模块 若不存在,则将信息添加到用户对象链表 strcpy(Append_pLNode->UserID,Append_sID); strcpy(Append_pLNode->UserPWD,Append_sPWD); strcpy(Append_pLNode->Potency,Append_Potency); Append_pLNode->next=NULL; //添加到用户信息对象表 if( pMyUserList!=NULL) { Append_pLNode->next=pMyUserList->head->next; pMyUserList->head->next=Append_pLNode; } else { printf("对象信息表不存在~~\n"); ErrorReport("对象信息表不存在~~"); exit(0); } 将新用户信息写入到用户信息表文件 FILE *fp; if( (fp=fopen("UserInfo.dat","a"))!=NULL ) //打开用户信息表文件 { fwrite(Append_pLNode,sizeof(UserNode)-4,1,fp); fclose(fp); } else { printf("不能打开UserInfo.dat!!\n"); ErrorReport("不能打开UserInfo.dat文件!!"); exit(0); } 3)提示添加完毕 (报告异常处理的信息)异常处理 见公共模块 iFunItem只能是数字字符 限制条件 测试计划 1) 采用黑盒测试,检测用户信息是否正确添加到用户信息对象表,是否写入UserInfo.dat文件以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 用户信息能正确写入用户信息表和文件,各逻辑路径均能正常, ,,,, 《软件开发实训》 异常处理也正常 实际测试结果 用户信息能正确写入用户信息表和文件,各逻辑路径均能正常,异常处理也正常 9)修改用户口令模块 PE011 模块编号 ModifyPWD() 模块名称 无 传递参数 用于管理员对用户口令的修改 简要注解 无 所用算法 //用于查找对应的用户信息 模块变量声明 UserNode *Modify_pNode=pMyUserList->head->next; char Modify_sID[20],Modify_sPWD[20]; 用户对象信息表和用户新口令 输入 用户对象信息表 输出 UserList //见数据结构声明 所用数据结构 1)输入需要更改PWD的用户名 流程逻辑 printf("请输入需要修改口令的用户名:"); scanf("%s",Modify_sID); printf("请输入新的口令:"); scanf("%s",Modify_sPWD); 2)扫描用户信息表查找相符合的用户名: while(Modify_pNode!=NULL&( strcmp(Modify_pNode->UserID,Mod ify_sID)!=0 ) ) Modify_pNode=Modify_pNode->next; 3)若Modify_pNode==NULL 则 if( Modify_pNode==NULL ) { printf("没有该用户的信息!!\n"); return 0; } else { strcpy(Modify_pNode->UserPWD,Modify_sPWD); 提示口令已经更改 return 1; } 见公共模块 异常处理 无限制条件 测试计划 1)采用黑盒测试,检测是否能按用户名检索到对应用户信息并修改其口令以及异常处理; 2)采用白盒测试,检测每条逻辑路径 期望测试结果 能够按用户名检索到相应的用户信息并能正确修改其口令以及对UserInfo.dat文件的正确更新; 各逻辑路径均能正常,异常处理也正常 ,,,, 《软件开发实训》 实际测试结果 能够按用户名检索到相应的用户信息并能正确修改其口令以及对UserInfo.dat文件的正确更新; 各逻辑路径均能正常,异常处理也正常 10)用户删除模块 PE012 模块编号 DelUserInfo() 模块名称 无 传递参数 用于管理员删除用户信息 简要注解 带头结点的单向链表的删除算法 所用算法 //用于对用户信息表的结点删除操作 模块变量声明 UserNode *Del_pNode=pMyUserList->head->next; UserNode *Del_pPreNode=pMyUserList->head; //用于保存要删除的用户信息 char Del_sID[20]; 用户对象信息表和用户新口令 输入 用户对象信息表 输出 UserList //见数据结构声明 所用数据结构 1)输入需要删除的用户名 流程逻辑 printf("请输入需要删除的用户名:"); scanf("%s",Del_sID); 2)扫描用户信息表查找相符合的用户名: while( Del_pNode!=NULL && ( strcmp(Del_pNode->UserID,Del_sID)!=0 ) ) { Del_pPreNode=Del_pNode; Del_pNode=Del_pNode->next; } 若Del_pNode==NULL 则 if( Del_pNode==NULL ) { printf("没有该用户的信息!!\n"); return 0; } else { 从链表中删除该用户 从表文件中删除该用户 提示删除成功 } 见公共模块 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测用户信息是否正确从用户信息对象表删除,是否更新UserInfo.dat文件以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 用户信息能正确从用户信息表删除并能更新文件,各逻辑路径均能 ,,,, 《软件开发实训》 正常,异常处理也正常 实际测试结果 用户信息能正确从用户信息表删除并能更新文件,各逻辑路径均能 正常,异常处理也正常 11)显示用户信息模块 PE013 模块编号 DispUserInfo() 模块名称 无 传递参数 用于显示用户对象信息 简要注解 带头结点的单向链表遍历算法 所用算法 //用于遍历链表 模块变量声明 UserNode *Disp_pCurrentNode=pMyUserList->head->next; 用户对象信息表 输入 用户对象信息输出 UserList见数据结构声明所用数据结构 流程逻辑 1)采用带头结点的单向链表遍历算法显示信息 while( Disp_pCurrentNode!=NULL) { printf("%s\t\t",Disp_pCurrentNode->UserID); printf("%s\t\t\t\t",Disp_pCurrentNode->UserPWD ); printf("%s\n",Disp_pCurrentNode->Potency ); Disp_pCurrentNode=Disp_pCurrentNode->next; } 见公共模块异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测用户信息是否正确显示以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 用户信息能正确显示,各逻辑路径均能正常,异常处理也正常 实际测试结果 用户信息能正确显示,各逻辑路径均能正常,异常处理也正常 12)编码管理模块 PE014 模块编号 CodeManagement() 模块名称 无 传递参数 选择编码表 简要注解 无 所用算法 //iFlag为循环控制变量,iFunItem为操作识别变量 模块变量声明 int iFunItem,iFlag=1; 无 输入 无 输出 ,,,, 《软件开发实训》 无 所用数据结构 1)开始消息循环,显示: 流程逻辑 printf("1)输入编码表;\n"); printf("0)退出;\n"); printf("请选择操作:"); 2)输入操作序号 scanf("%d",&iFunItem); 3)根据操作序号iFunItem的值调用相应的模块 switch(iFunItem) { case 1: { call 编码控制模块 } break; case 0: { 退出消息循环 } break; default: { printf("错误的操作选择!!!\n"); 发送到错误报告 } break; } 见公共模块 异常处理 iFunItem只能为数字字符 限制条件 测试计划 13)编码控制模块 PE015模块编号 CodeControl()模块名称 无 传递参数 选择需要进行操作的编码表简要注解 无所用算法 //iFlag为循环控制变量,iFunItem为操作识别变量 模块变量声明 int iFunItem,iFlag=1; 编码表对象集输入 需要进行操作的编码表对象 输出 无 所用数据结构 1)开始消息循环,显示: 流程逻辑 printf("选择编码表;\n"); printf("1)性别编码表;\n"); printf("2)教育情况编码表;\n"); printf("3)最后毕业学校编码表;\n"); ,,,, 《软件开发实训》 printf("0)退出;\n"); printf("请选择操作:"); 2)输入操作序号 scanf("%d",&iFunItem); 3)根据操作序号iFunItem的值调用相应的模块 switch(iFunItem) { case 1: { call 性别编码表管理模块 } break; case 2: { call 教育状况编码表管理模块 } break; case 3: { call 最后毕业情况编码表管理模块 } break; case 0: { 退出消息循环 } break; default: { printf("错误的操作选择!!!\n"); 发送到错误报告表 } break; } 见公共模块 异常处理 iFunItem只能为数字字符 限制条件 测试计划 1) 采用黑盒测试,检测各模块是否正确调用以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 各模块均能正确调用,各逻辑路径均能正常,异常处理也正常 实际测试结果 各模块均能正确调用,各逻辑路径均能正常,异常处理也正常 14)性别编码表管理模块 PE016模块编号 SexCodeManagement() 模块名称 无传递参数 提供对性别编码表的操作界面简要注解 无 所用算法 //iFlag为循环控制变量,iFunItem为操作识别变量模块变量声明 int iFunItem,iFlag=1; ,,,, 《软件开发实训》 无输入 无输出 无所用数据结构 1)开始消息循环,显示: 流程逻辑 printf("1)检索性别编码表;\n"); printf("2)添加性别编码;\n"); printf("3)修改性别编码;\n"); printf("4)删除性别编码;\n"); printf("5)显示性别编码表;\n"); printf("0)退出;\n"); printf("请选择操作:"); 2)输入操作序号 scanf("%d",&iFunItem); 3)根据操作序号iFunItem的值调用相应的模块 switch(iFunItem) { case 1: { call 性别编码检索模块 ; } break; case 2: { call t添加性别编码模块; } break; case 3: { call 修改性别编码模块; } break; case 4: { call删除性别编码模块 } break; case 5: { call 显示性别编码表模块 } break; case 0: { 退出消息循环 } break; default: { printf("错误的操作选择!!!\n"); call 异常处理(见公共模块); } break; } ,,,, 《软件开发实训》 见公共模块异常处理 iFunItem只能为数字字符限制条件 测试计划 1) 采用黑盒测试,检测各模块是否正确调用以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 各模块均能正确调用,各逻辑路径均能正常,异常处理也正常 实际测试结果 各模块均能正确调用,各逻辑路径均能正常,异常处理也正常 15)性别编码检索模块 PE017 模块编号 FindSexCode() 模块名称 无 传递参数 对性别编码表进行检索 简要注解 单向链表的遍历 所用算法 //用于遍历链表 模块变量声明 SexNode *Fsc_pNode=pMySexList->head->next; //用于暂时存储输入需要检索的性别 char Fsc_sSex[4]; 性别编码表 输入 性别信息 输出 SexList见数据结构声明 所用数据结构 判断当前性别编码表是否为空 流程逻辑 if( pMySexList->head->next==NULL ) 若为空,则提示: printf("当前性别编码表中数据为空!\n"); 若不为空,输入需要检索编码的性别: printf("请输入需要检索的性别(男/女):"); scanf("%s",Fsc_sSex); 遍历性别编码表,进行检索 while( Fsc_pNode!=NULL && strcmp(Fsc_pNode->sSex,Fsc_sSex)!=0 ) Fsc_pNode=Fsc_pNode->next; 若检索失败,即没有该编码信息,则 printf("没有对应的编码!\n"); 若检索成功 显示响应的信息 见公共模块 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测是否能够按所输入的性别正确检索编码以及 异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 能够按所输入的性别正确检索编码,各逻辑路径均能正常,异常处 理也正常 实际测试结果 能够按所输入的性别正确检索编码,各逻辑路径均能正常,异常处 ,,,, 《软件开发实训》 理也正常 16)添加性别编码模块 PE018 模块编号 AppendSexCode() 模块名称 无 传递参数 对性别编码表进行添加操作 简要注解 单向链表的首插入算法 所用算法 //用于添加新接点 模块变量声明 SexNode *Asc_pNode; //用于输入新的编码信息 char Asc_sSex[2]; char Asc_sSexCode[4]; 性别编码表 输入 性别编码表及删除情况提示信息 输出 SexList见数据结构声明 所用数据结构 1)判断当前性别编码表是否为空 流程逻辑 if( pMySexList->head->next==NULL ) 若为空,则提示: printf("当前性别编码表中数据为空!\n"); 若不为空,输入需要添加的编码信息: printf("请输入性别(男/女):"); scanf("%s",Asc_sSex); printf("请输入性别编码:(由0或1组成的整数):"); scanf("%d",&Asc_iSexCode); 2)检测新编码是否已经在编码表中存在 call isSexCodeExisted() //见公共模块 若不存在 将新的性别编码添加到链表 Asc_pNode=(SexNode*)malloc(sizeof(SexNode)); strcpy(Asc_pNode->sSex,Asc_sSex); Asc_pNode->iSexCode=Asc_iSexCode; Asc_pNode->next=pMySexList->head->next; pMySexList->head->next=Asc_pNode; 将新的性别编码表重新写入Sex.Dat文件 FILE *fp; if( (fp=fopen("Sex.dat","a"))!=NULL ) //打开用户信息表文件 { fwrite(Asc_pNode,sizeof(SexNode)-4,1,fp); fclose(fp); } 若该编码已经存在,则提示; 见公共模块 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测是否能够将所输入的编码信息正确添加到性别编码表,是否能够写入Sex.dat文件以及异常处理 2) 采用白盒测试,检测每条逻辑路径 ,,,, 《软件开发实训》 期望测试结果 能够将所输入的编码信息正确的添加到性别编码表并更新Sex.dat文件,各逻辑路径均能正常,异常处理也正常 实际测试结果 能够将所输入的编码信息正确的添加到性别编码表并更新Sex.dat文件,各逻辑路径均能正常,异常处理也正常 17)修改性别编码模块 PE019 模块编号 ModifySexCode() 模块名称 无 传递参数 管理员对性别编码做修改 简要注解 单向链表的顺序检索 所用算法 //用于检索链表 模块变量声明 SexNode *Msc_pNode=pMySexList->head->next; //用于暂时存储编码信息 char Msc_sSex[4]; char Msc_sSexCode[4]; 性别编码表 输入 性别编码表 输出 SexList 见数据结构声明 所用数据结构 流程逻辑 1)输入需要修改编码的性别以及新的编码 printf("请输入需要修改编码的性别:"); scanf("%s",Msc_sSex); printf("请输入新的编码:"); scanf("%d",&Msc_iSexCode); 2)扫描用户信息表查找相符合的用户名: while( Msc_pNode!=NULL && ( strcmp(Msc_pNode->sSex,Msc_sSex)!=0 ) ) Msc_pNode=Msc_pNode->next; 若找到,则对结点进行更新 Msc_pNode->iSexCode=Msc_iSexCode; 更新文件 Msc_pNode=pMySexList->head->next; FILE *fp; if( (fp=fopen("Sex.dat","w"))!=NULL ) //打开用户信息表文件 { while( Msc_pNode!=NULL ) { fwrite(Msc_pNode,sizeof(SexNode)-4,1,fp); Msc_pNode=Msc_pNode->next; } free(Msc_pNode); fclose(fp); } 见公共模块 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测是否能够按所输入的性别正确检索对应编码 ,,,, 《软件开发实训》 并修改编码,是否能够更新Sex.dat文件以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 能够正确的按所输入的性别检索对应编码并修改编码,并更新 Sex.dat文件,各逻辑路径均能正常,异常处理也正常 实际测试结果 能够正确的按所输入的性别检索对应编码并修改编码,并更新 Sex.dat文件,各逻辑路径均能正常,异常处理也正常 18)删除性别编码模块 PE020 模块编号 DelSexCode() 模块名称 无 传递参数 管理员进行编码的删除操作 简要注解 带头结点单向链表的结点删除算法 所用算法 //用于结点的删除操作 模块变量声明 SexNode *Dsc_pNode=pMySexList->head->next; SexNode *Dsc_pPreNode=pMySexList->head; char Dsc_sSex[4]; 性别编码表 输入 性别编码表以及删除状况提示 输出 SextList 见数据结构声明所用数据结构 输入需要删除的编码所对应的性别 流程逻辑 printf("请输入需要删除的性别(男/女):"); scanf("%s",Dsc_sSex); 扫描用户信息表查找相符合的用户名: while( Dsc_pNode!=NULL && ( strcmp(Dsc_pNode->sSex,Dsc_sSex)!=0 ) ) { Dsc_pPreNode=Dsc_pNode; Dsc_pNode=Dsc_pNode->next; } 若找到,则 删除该结点 更新Sex.dat文件 若找不到对应编码信息,则 给出相应提示; 见公共模块 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测是否能够将所输入的编码信息正确从性别秒 编码表中删除,是否能够更新Sex.dat文件以及异常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 能够正确的将所输入的编码信息从性别编码表中删除,并正确更新 Sex.dat表,各逻辑路径均能正常,异常处理也正常 实际测试结果 能够正确的将所输入的编码信息从性别编码表中删除,并正确更新 ,,,, 《软件开发实训》 Sex.dat文件,各逻辑路径均能正常,异常处理也正常 19)显示性别编码表模块 PE021 模块编号 DispSexCode() 模块名称 无 传递参数 显示性别编码表 简要注解 带头结点的单向链表遍历算法 所用算法 遍历链表 模块变量声明 SexNode *Disc_pCurrentNode=pMySexList->head->next; 性别编码表 输入 性别编码表 输出 SexList 数据结构说明 所用数据结构 while( Disc_pCurrentNode!=NULL) 流程逻辑 { printf("%s\t\t\t\t",Disc_pCurrentNode->sSex ); printf("%d\n",Disc_pCurrentNode->iSexCode ); Disc_pCurrentNode=Disc_pCurrentNode->next; } 见公共模块 异常处理 无 限制条件 测试计划 1) 采用黑盒测试,检测是否能够正确的显示性别编码表信息以及异 常处理 2) 采用白盒测试,检测每条逻辑路径 期望测试结果 能够正确的显示性别编码表信息,各逻辑路径均能正常,异常处理 也正常 实际测试结果 能够正确的显示性别编码表信息,各逻辑路径均能正常,异常处理 也正常 按照14-19的规格完成其余两个编码表的操作模块~ ,,,, 《软件开发实训》 ,,,,
本文档为【实践教学目标任务书】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_003124
暂无简介~
格式:doc
大小:115KB
软件:Word
页数:67
分类:初中语文
上传时间:2017-09-16
浏览量:84