高级语言课程设计报告格式朱立刚

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安郵電學院

高级语言课程设计报告书

系部名称通信工程学院

学生姓名朱立刚

专业名称电子信息科学与技术班级电科0901班

学号04092013

指导教师夏虹

2010年11月22日至

时间

2010年12月03日

实验题目电话簿管理系统

一、实验目的

1.利用静态数组实现电话簿管理,数组中每一个元素是结构体类型;

2.通过这个例子了解数据管理的基本功能;

3.通过实验掌握数组元素为结构体的应用,数组作函数参数,文件读写等知识。

二、实验内容

1.用c语言编写一个简单、但操作齐全的电话簿管理系统;

2.编程时采用结构体、数组(链表)、文件等数据结构存储组织数据。实现:

数据的录入、数据读写和数据存储;数据的添加、修改、删除、查询操作;

数据的统计、排序及报表打印。

三、需求分析

要实现对电话簿进行操作,必须先定义主函数。对于一个合格的电话簿系统,首先必须考虑信息安全问题,我先写了一个密码保护函数,运行前先进行密码输入,有三次出错机会;正确,进入菜单选项,否则,跳出。

对于电话簿,必须能进行信息录入,于是设计了信息录入选项;信息录入后还必须进行显示,又设计了显示记录选项;对于通讯录的一个基本功能——查找,我设计了按姓名查找和按序号查找选项。

对于电话簿的添加、修改、删除问题,还必须有添加修改选项、删除选项。

为方便查找,我设计了按姓名字母字典顺序的排序方法;并进行了文件的保存与备份。对于一个刚打开的新程序,只有进行了文件读入才能对信息进行操作,否则就必须进行信息输入,为避免这种有违设计理念的问题,我加入了读取信息选项。

四、概要设计

1、方案设计

基本功能模块结构图

2、数据结构说明

#define M 50 /*估计的记录数*/

typedef struct

{

char name[20]; /*字符型姓名*/

char units[30]; /*字符型地址*/

char tele[10]; /*字符型电话号码*/

}ADDRESS; /*结构体类型名*/

各函数作用:

void main(); /*主函数*/

void password(); /*密码保护函数*/

int enter(ADDRESS t[]); /*输入函数*/

void list(ADDRESS t[],int n); /*显示记录函数*/

void search(ADDRESS t[],int n); /*按姓名查找记录函数*/

int delete(ADDRESS t[],int n); /*删除记录函数*/

int add(ADDRESS t[],int n); /*添加记录函数*/

void save(ADDRESS t[],int n); /*保存记录函数*/

int load(ADDRESS t[]); /*读取文件函数*/

void display(ADDRESS t[]); /*按序号查找显示记录函数*/

void sort(ADDRESS t[],int n); /*按姓名排序函数*/

void qseek(ADDRESS t[],int n); /*快速查找函数*/

void copy(); /*文件复制函数*/

void print(ADDRESS temp); /*显示单条记录函数*/

int find(ADDRESS t[],int n,char *s) ; /*查找函数*/

int menu_select(); /*菜单函数*/

3、各模块功能说明

main();主函数

程序采用模块化设计,主函数是程序入口,各模块相互独立,可分块调试,均由主函数控制调用。控制功能通过循环执行一个开关语句,该语句条件是通过调用主菜单函数得到的返回值,根据该值调用相应的各功能函数,同时设置一个断点(即当返回值为一定条件时运行exit()函数结束程序)以避免造成死循环。void password(); 密码保护函数

程序事先定义一个已知的字符串作为密码,通过数组将输入字符与原字符比较(用强制转化函数atoi()将字符转化为整型数字比较大小)。密文输入通过“for(i=0;i<3;i++){b[i]=getch();printf("*");}”实现。通过三个if嵌套语句实现整型数的比较与是否继续操作的判断。

int menu_select(); 主菜单

利用输出函数printf()输出字符串,在屏幕上显示一个菜单和提示输入选项,输入0~11之间的数字(字符型),然后执行c=atoi(s),将字符转化为数字,如果不在0~11之间则循环等待重新输入,入果在范围内则将此数字作为菜单函数的返回值返回给主函数,主函数根据返回值调用相应功能函数。

int enter(ADDRESS t[]); 输入记录函数

输入记录时按照一条一行的格式输入,每个数据之间用空格分隔。由于记录不是一次性全部输入,而是随时添加和删除的,而预先开辟的空间数往往大于实际记录数,所以程序设计为首先输入准备输入的记录数n,再用for循环语句

循环n次,输入记录。每一条记录有三个字段,都是字符串类型,用格式输入函数scanf(“%s%s%s”t[i].name,t[i].adr,t[i].tele)完成输入(用空格分隔)。输入停止,返回到主函数。

void list(ADDRESS t[],int n); 显示所有记录

将主函数传递过来的数组用for循环输出,循环次数由参数长度决定。void search(ADDRESS t[],int n);和

int find(ADDRESS t[],int n,char *s) ; 查找记录函数

按姓名查找采用顺序查找。先输入要查找姓名,然后按顺序查找结点,如果没有找到则输出没有找到,否则,显示找到的记录信息。查找函数自己定义了find()函数,专门用于查找。从第一条记录开始,将记录中的姓名字段和待比较的姓名字符串s进行比较,如果相等程序结束,返回该记录下标号i;如果不相等,则继续下一条比较,所有记录比较完后循环结束,返回下标变量i。search()函数通过调用find()得到整型数i,判断i值如果大于n-1,已超过实际记录数,说明所有记录都进行过比较,没有找到则查找不成功;否则,调用输出函数 printf(),显示第i条记录。

int delete(ADDRESS t[],int n); 删除记录函数

输入要删除记录的姓名,调用find()函数,如果没有该记录,显示没有找到信息;否则,调用printf()函数,显示记录,并接着显示是否要删除选项。如果确实要删除该记录,则将其后记录以次前移。所以删除第i条记录,用for循环语句,从第i+1开始,一次将每个字段拷贝到前一条记录相应字段,直到最后一条记录。由于删除了一条记录,所以记录总数减一,返回记录数,程序结束。int add(ADDRESS t[],int n);插入、修改记录函数

先输出插入、修改选项,1代表插入2代表修改。从键盘输入选择数,进入if循环函数,如果不是1或2,则显示出错并结束该次程序;否则;判断为1进入插入选项,判断为2进入修改选项。对于插入选项,定义一个临时变量temp,并将输入信息存放在该变量内;再输入插入位置的姓名,调用find()函数查找,找到后用for循环,将当前记录信息拷贝到后一条,再将新纪录信息拷贝到第i位;由于新插入,所以记录数n=n+1,并返回n值。对于修改记录选项,同样调用find()函数,找出需要修改者;再将新修改信息存储在临时变量temp中,最后分别将该新修改记录拷贝到第i位相应位置,并反回n 值。该程序结束。void save(ADDRESS t[],int n); 保存函数

先定义一个指向文件的指针,按照wb写的方式打开文件名为record.txt 的文件,如果文件不存在,则自动新创建该文件,如果文件不能正常打开则退出程序;否则,先写入记录数n,然后用循环语句,用文件格式输出语句fprintf(fp,"%2s%18s%32s",t[i].name,t[i].adr,t[i].tele);int load(ADDRESS t[])逐条写入记录,每输出一条,写入一个换行符号。

void display(ADDRESS t[]); 按序号查找函数

由于数组是按照顺序存储的,且对数组元素的访问可以直接按照其下标号实现随机访问,所以设计了按照记录位置访问记录。本函数实现的是从文件中查找,所以先用rb方式打开记录文件record.txt,输入对应序号id,从文件中读入记录数,判断序号位置在记录数范围内是顺序存放,所以指定序号id的存储位置首地址为(id-1)*sizeof(ADDRESS)利用fseek函数将记录指针移动到该位置,读出记录数,调用print()函数显示该条记录。

void sort(ADDRESS t[],int n); 按姓名排序函数

相关文档
最新文档