- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浙大程设教材第四章讲述
PAGE
第四章 大型综合程序范例解析
本章提供了三个范例程序——通讯录、简单计算器和俄罗斯方块游戏的设计与开发。我们从程序的功能分析、设计、编码和测试等方面对这三个大型程序给予了详细的介绍,通过具体案例引导读者回顾和领略大型程序的设计思想和开发方法,并在程序的实现过程中体验高级编程技术的应用,提高实际动手编程能力以及培养团队合作精神。
4.1 通讯录
4.1.1 问题描述
通讯录是人们日常生活中经常要用到的通讯管理工具,它以文件的方式保存用户录入的数据,并提供查询的功能供用户查询和使用通讯录信息。在本节中我们将介绍一个用C语言实现的简易通讯录管理系统,它支持基本的录入、删除、查找、修改和文件读写功能。程序中涉及大量基本块和指针的操作,结构体和共用体数据结构的定义、使用,以及文件的读写、定位等。
4.1.2 功能分析
通讯录要求实现最基本的功能,包括录入、删除、查找和修改,为此需要首先定义记录项的格式,其基本属性包括姓名、性别、住址、联系电话、电子邮件等。为了实现对所有联系人的分组管理,还可以添加组别属性,同时系统还需要记录用户的所有记录项内容和总的项数。作为简易通讯录,目前仅考虑英文姓名、地址数据输入,不支持中文。
功能:
录入:操作添加一条新的记录项;
删除:删除一条已经存在的记录项;
修改:改变记录项的一个或多个属性,并用新的记录项覆盖已经存在的记录项;
查找:根据用户输入的属性值查找符合条件的记录项。依据某一属性是否可以唯一地确定一条记录项,可以将属性区分为主属性和非主属性。对非主属性上的查找可能返回多条记录项。为了区分,系统可以在数据录入时为每个记录项自动分配一个记录编号,这样就可以实现所有项的精确查找。
通讯录数据以文件形式存储在磁盘上,因此在程序运行中需要对文件进行读取操作。编程人员可以根据实际需要自己定义文件的存储格式,在数据读写时必须精确定位,以免破坏文件的正确性。除此之外,程序中还要不停处理用户的输入,对输入数据的容错性进行检查,可以保证通讯录数据的合法性,避免恶意和非恶意的操作对用户数据的破坏。
4.1.3 设计
1.程序总体结构
程序主要包括三大模块:输入输出模块、管理模块和文件操作模块。输入输出模块的主要功能是人机交互,包括程序界面显示、用户输入响应、结果输出等;管理模块从输入输出模块读取用户命令并进行相应的操作,包括录入、删除、修改、查找、列表等;文件操作模块获取管理模块中的数据或命令,然后进行存储文件的读写,最后将结果返回给管理模块。图4-1显示了系统模块结构图。
图 4- SEQ 图 \* ARABIC 1 通讯录的总体结构图
2.界面设计
系统使用基本C语言输入输出函数处理交互事件,通过屏幕输出显示功能选项,用户通过键盘输入完成相应操作。程序的主界面是一个文本方式的菜单(如图4-2所示),通过键盘方向键控制光条的上下移动,选取相应的操作指令。
图 4- SEQ 图 \* ARABIC 2 程序命令菜单
3.重要数据的数据结构设计
通讯录中的记录项用结构体myrecord表示,包含8个属性。num属性是记录项的唯一编号,由系统进行管理和维护,用户可以读,但是不可写,编号用从某一基数开始的连续整数表示,基数BASE使用宏定义;group标识记录项的组别,从1到10共十组;name、gender、address、phone、email分别代表用户的姓名、性别、地址、联系电话和电子邮件,字符数组的最大长度用宏MAXLEN表示;Birthday属性表示的是联系人的生日,类型为自定义的结构date。
struct myrecord{
unsigned int num;
unsigned int group;
char name[MAXLEN+1];
char gender;
date birthday;
char address[MAXLEN+1];
char phone[MAXLEN+1];
char email[MAXLEN+1];
};
typedef struct myrecord myrecord;
日期类型date包括三个属性,分别表示年、月、日,程序中需要检查用户输入日期的值以保证通讯录中都是合法的数据。
struct mydate{
unsigned int year;
unsigned int month;
unsigned int day;
};
typedef struct mydate date;
为了更方便地实现查找功能,程序中还定义了名为mysearch_entry的共用体(联合体),其中包含了三个查询关键字:记录编号、组别和联系人姓名。查询模块可以根据输入的某一关键字进行查找。
union mysearch_entry{
un
文档评论(0)