您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页通讯录程序设计报告

通讯录程序设计报告

来源:测品娱乐
前 言

一、设计内容与设计要求 1.设计目的:

当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。

尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理而设计的。

通讯录管理系统的建立是可以有效节省同学、朋友、客户间日常交流的投资(指时间、精力),其设计理念很简单,变传统的纸张与笔录方式为计算机自动化进行通讯录信息管理系统,既省时间又提高效率。因此在系统构建时,只要我们本着丰富通讯录的信息资源,为用户提供最为方便的快捷的信息阅览途径和管理手段,去吸引用户,那么通讯录管理系统是完全可行的。

通讯录软件设计的灵感来源于生活和工作中的需要。如今,随着社会的飞速发展,信息时代改变着人们的各种生活方式。人们的联系信息,联系方式变得复杂而多样化,以前所使用的各种电话簿、通讯本等小册子由于查找不方便、功能单一等缺陷已经无法胜任它的“时代使命”,而现在各种手机,商务通内设的电话簿尽管携带方便却又挥之不去其“记录量少,界面小,浏览不方便”的缺点。工作中看到有些人巧妙地利用excell或者word制表格来建立通讯录,每逢用时再打开,可是查找极其不便,维护起来也麻烦。

通讯录系统设计,它的内容对于计算机来说是至关重要的,通讯录系统为计算机的使用者提供充足的信息和快捷的查询手段。用c语言构建的通讯录系统设计,通过课上学到的和查阅一些文献的一些关于结构体[1]、数组、指针、函数以及循环函数的运用[1]和字符串的处理[2]等基本知识可以初步的实现通讯录的输入、显示、查找、删除、快速查询等通讯录简单而用的一些实用的功能,给人们带来更多的方便。本管理系统设计合理、操作方便、运行稳定、功能完备,具有较高的实用价值。

2。设计内容:

设计与开发一个通讯录管理系统,对通讯录中的姓名、单位、电话、QQ 、mail等基本信息进行管理、主要功能如下:输入记录、显示记录、按姓名查找显示记录、删除记录、插入记录、记录保存为文件、从文件中读记录、按姓名排序、显示单条记录。

本系统首先设计出了主函数,然后根据去要实现的功能分别设计拉,显示、删除、查找、添加等功能的子函数。在显示的函数设计过程中首先运用拉文件的读取等必要的知识通过把文件的内容读取到内存然后打印出来。删除函数的设计是首先从文件内找到要删除的人,然后通过写一个实现删除目的的FOR循环将该人从内存里删除,然后再用写的方式打开文件,将内存内的信息写入文件,实现删除。查找也是先打开文件,用一个字符串对比的方法找出用户要查找的人,然后打印出来。修改也大体和删除相同,添加函数在设计时通过申请一片空间,然后通过指针将需要添加的信息添加进去,从而实现添加功能。本课程设计主要运用C语言中的结构体、数组、链表、等数据结构,设计一个简单的管理系统应用程序。本程序设计出了通讯录管理系统的基本功能,并设计了简单的界面,主要考察对自定义函数的熟悉程度,使用的是数组的相关操作,包括结构体数组的输入、输出、查找、删除等。通过完成本课题进一步熟悉C语言基本知识,并掌握数据结构的一些基本算法思想,进一步熟悉指针的用法,数组的建立运用和函数调用,加深对数据结构的理解,提高算法设计的能力,锻炼编程的能力。

2.设计要求:

1).设计正确,方案合理。 2).界面友好,使用方便。 3).程序精炼,结构清晰。

4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。

5).建立通讯录信息,信息至少包含姓名、电话、通讯地址; 6).能够提供添加、删除和修改通讯录信息的功能;

7).能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询; 8).将通讯录保存在文件中; 9).能够按表格方式输出通讯录信息。

10).实际操作过程中遇到的问题及解决方法:设计总结及心得体会. 11).上机演示。 二、进

度安排

第十九周 星期一 12:30——16:30 星期二 12:30——15:00 星期二 18:30——22:00 星期四 12:30——15:00

2

附:

课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。 正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。 正文总字数要求在5000字以上(不含程序原代码)。

3

目 录

一. 系统主要功能 ......................................... 5

1.

2. 3. 4. 5. 6. 7. 8. 9.

输入通讯记录 ........................................................... 5 显示通讯记录 ........................................................... 5 查找通讯记录 ........................................................... 5 删除通讯记录 ........................................................... 6 插入通讯记录 ........................................................... 6 保存通讯记录 ........................................................... 7 读入通讯记录 ........................................................... 7 对通讯记录排序 ........................................................ 8 快速搜索通讯记录 ...................................................... 8

二. 系统功能模块划分 ..................................... 9

三. 功能模块的实现 ...................................... 10

1.

2. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

主函数流程图 .......................................................... 10 详细流程图 ............................................................. 11 菜单函数 ............................................................... 23 输入记录数 ............................................................. 24 显示记录 ............................................................... 24 查找记录 ............................................................... 25 删除记录 ............................................................... 26 插入记录 ............................................................... 27 保存文件 ............................................................... 27 读入文件 ............................................................... 28 按序号排列函数 ....................................................... 28 排序函数 ............................................................... 29 快速查找函数 .......................................................... 30 复制函数 ............................................................... 31 退出函数 ............................................................... 31

四. 程序调试 ............................................ 23

五. 总结 ................................................ 32

六. 附件 ................................................ 33

1.源程序代码 ................................................................ 33

2.参考文献................................................................... 41

4

一. 系统主要功能

1. 输入通讯记录

输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度。将结构体数组分成几个数组分别对每个数组赋值,用for循环来实现对不同地址的数组分别赋值。

for(i=0;iscanf(\"%s%s%s\输入记录*/ printf(\"----------------------------------------------\\n\"); }

然后返回输入值n。

2. 显示通讯记录

显示记录,参数为记录数组和记录条数。再利用for循环来时先显示的记录。 for(i=0;iprintf(\"%-20s%-20s%-20s\\n\ }

printf(\"************************end*******************\\n\"); }

此时程序会以

printf(\"\\n\\n*******************ADDRESS******************\\n\"); printf(\"name unit telephone\\n\"); printf(\"------------------------------------------------\\n\");此种形式输出。

3. 查找通讯记录

查找记录,输入待查找信息,调用查找函数,通过条件语句来实现。 printf(\"please search name\\n\"); scanf(\"%s\输入待查找姓名*/

i=find(t,n,s); /*调用find函数,得到一个整数*/ if(i>n-1) /*如果整数i值大于n-1,说明没找到*/ printf(\"not found\\n\"); else

print(t[i]); /*找到,调用显示函数显示记录*/ }

5

查找函数,参数为记录数组和记录条数以及姓名。利用for循环加上条件语句的嵌套完成查找函数,返回i值。

for(i=0;iif(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/

return i; /*相等,则返回该记录的下标号,程序提前结结束*/ }

return i; /*返回i值*/ }

4. 删除通讯记录

删除函数,参数为记录数组和记录条数。输入要删除的姓名,调用查找函数。

i=find(t,n,s); /*调用find函数*/再利用条件语句的嵌套来实现删除功能。

if(i>n-1) /*如果i>n-1超过了数组的长度*/

printf(\"no found not deleted\\n\"); /*显示没找到要删除的记录*/ else {

print(t[i]); /*调用输出函数显示该条记录信息*/

printf(\"Are you sure delete it(1/0)\\n\"); /*确认是否要删除*/ scanf(\"%d\输入一个整数或*/ if(ch==1) /*如果确认删除整数为*/ {for(j=i+1;jstrcpy(t[j-1].name,t[j].name);

strcpy(t[j-1].units,t[j].units); strcpy(t[j-1].tele,t[j].tele); }

n--; /*记录数减*/ }

5. 插入通讯记录

插入记录函数,参数为结构体数组和记录数。先输入插入信息,再输入插入位置,然后调用查找函数i=find(t,n,s);找到插入位置,利用一个for循环,来实现一个信息

6

的完整插入。

for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/ {

strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/ strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/ strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/ }

strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/ strcpy(t[i].units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/ strcpy(t[i].tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/ n++; /*记录数加*/ return n; /*返回记录数*/ }

6. 保存通讯记录

保存函数,参数为结构体数组和记录数。定义一个指向文件的指针。FILE *p;

利用条件语句来判断是否能成功打开文件。

if((fp=fopen(\"c:\\\\record.txt\打开文件,并判断打开是否正常*/

{

printf(\"can not open file\\n\");/*没打开*/ exit(1); /*退出*/

}之后将记录数写入文件printf(\"\\nSaving file\\n\"); /*输出提示信息*/ fprintf(fp,\"%d\将记录数写入文件*/ fprintf(fp,\"\\r\\n\"); /*将换行符号写入文件*/ for(i=0;ifprintf(fp,\"%-20s%-30s%-10s\格式写入记录*/

7. 读入通讯记录

读入函数,参数为结构体数组。同样定义一个指向文件的指针。FILE *p;

7

先判断文件是否能打开。再输入记录数,利用for循环来完成读入记录。fscanf(fp,\"%d\读入记录数*/

for(i=0;ifscanf(fp,\"%20s%30s%10s\/*按格式读入记录*/

fclose(fp); /*关闭文件*/

printf(\"You have success read data from file\\n\"); /*显示保存成功*/ return n; /*返回记录数*/ }

8. 对通讯记录排序

排序函数,参数为结构体数组和记录数。利用临时变量作为交换数据来进行排序。 ADDRESS temp; /*临时变量做交换数据用*/

for(i=0;iif(strcmp(t[i].name,t[i+1].name)>0) {

strcpy(temp.name,t[i].name); strcpy(temp.units,t[i].units); strcpy(temp.tele,t[i].tele); strcpy(t[i].name,t[i+1].name); strcpy(t[i].units,t[i+1].units); strcpy(t[i].tele,t[i+1].tele); strcpy(t[i+1].name,temp.name); strcpy(t[i+1].units,temp.units); strcpy(t[i+1].tele,temp.tele); } }

printf(\"sort sucess\\n\"); /*显示排序成功*/

9. 快速搜索通讯记录

快速查找,参数为结构体数组和记录数。输入要查找的信息,定义一个左边界

与右边界,利用当循环与条件语句的结合实现左右边界中的快速查找。

while(l<=r) /*当左边界<=右边界时*/

8

{

m=(l+r)/2; /*计算中间位置*/

if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/ {

print(t[m]); /*如果相等,则调用print函数显示记录信息*/ return ; /*返回*/ }

if(strcmp(t[m].name,s)<0) /*如果中间结点小*/ l=m+1; /*修改左边界*/ else

r=m-1; /*否则,中间结点大,修改右边界*/ }

if(l>r) /*如果左边界大于右边界时*/ printf(\"not found\\n\"); /*显示没找到*/ }

二. 系统功能模块划分

主 菜 单 输入记录 显示记录 查找记录 删除记录 插入记录 保存记录 读取记录 对记录排序 搜索记录

9

三. 功能模块的实现

1. 主函数流程图

开始 Int length,i=0 i>=0? m_s()=0? 调用输入函数 m_s()=1? 调用显示函数 m_s()=2? 调用查找函数 m_s()=3? 调用删除函数 m_s()=4? 调用插入函数 m_s()=5? 调用保存函数 m_s()=6? 调用读取函数 m_s()=7? 调用序号查找函数 m_s()=8? 调用姓名排序函数 m_s()=9? 调用快速查找函数 m_s()=10? 调用复制函数 m_s()=11? 调用退出函数 输入错误,请重新输入 结 束

10

2. 详细流程图

1. 菜单函数

菜单函数首先标出欢迎使用通讯录管理系,然后给出用户可选择的项目,用户可以通过选择该项前的代码来实现想要实现的功能,其流程图如下所示:

11

开始 int c 输入选项0—11 m<0||m>11 Y N 返回 m 结束

2. 输入通讯录

将结构体数组分成几个数组分别对每个数组赋值,用for循环对不同地址的数组分别赋值。其流程图如下所示:

12

开始 输入信息数目n i=0 i返回 n 结束

3. 显示通讯录

显示通讯录通过循环函数将全部的通讯录信息以此显示出来,其流程图如下所示:

13

开 始 int i i=0 i查找函数通过输入姓名与原通讯录中存储的姓名,两字符串的比较,找到与输入姓名相同的姓名的位置,其流程图如图6所示:

开始

结束 Y Y i=0 i14

5. 删除通讯录

删除通讯录通过数组中该位置之后的数据存放位置向前移一位来实现删除功能,其流程图如下示:

开 始 Int i,j,ch=0 i>n-1 没找到要删除的记录 输出信息 ch==1 j=i+1 j15

6. 插入记录函数

可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱后,会提示是否继续添加。

开 始 int i,j 输入插入位置 j =n-1 j >=i 将该位置信息向后移一位 j-- 输入插入信息 返回n++ 结 束

16

7. 保存函数

输入文件名(带后缀名)后,即可将通讯录信息保存到文件。

开 始 int FILE *p fp=fopen==NULL 保存文件 i=0 不能打开 i17

8. 读取函数

输入那个人的名字后,即可自动弹出该人信息。

开 始 int i,n FILE *p fp==NULL i=0 不能打开 i18

9. 按序号显示记录函数

通过定义一个指向文件的指针,利用条件语句实现。

开 始 int id,n FILE *fp fp==NULL 输入记录编号 不能打开 id>0&&id19

10. 排序函数

开 始 int I,j,flag, ADDRESS temp i=0 i0 结 束 将姓名按ASCⅡ排序 j++ i++

20

11. 快速查找函数

开 始 int l,r,m 输入姓名 l=0,r=n-1 l<=r m=(l+r)/2 strcmp==0 输出函数信息 strcmp<0 返 回 l=m+l r=m-1 l>r Not found 结 束

21

12. 复制文件函数

开 始 char outfile[20].int i,n ADDRESS temp[M].FILE *sfp,*tfp spf==NULL 输入文件名 不能打开 tfp==NULL i=0 不能打开 i22

四. 程序调试 1. 菜单函数

进入运行程序后,系统会出现如下图:

输入任意键后,会弹出如下菜单:

23

2. 输入记录数

在主菜单中输入0后,会显示please input num, 输入3后,会弹出信息框,输入三个人的个人信息。如下图所示:

3. 显示记录

返回菜单之后,输入1,系统会如下图所示:

24

4. 查找记录

再次返回主菜单后输入2,会弹出以下界面:

回车后会弹出以下显示:

25

5. 删除记录

回出菜单,输入3,会弹出以下信息框:

弹出信息框,输入确认信息1:

26

6. 插入记录

返回菜单栏输入4,弹出输入要添加的姓名,回车后如下显示:

7. 保存文件

在主菜单中输入5,会直接显示保存成功,如下所示:

27

8. 读入文件

在主菜单中输入6,在系统中会显示成功读取文件:

9. 按序号排列函数

在菜单中输入7,会成功在品目中显示如下:

28

10. 排序函数

在菜单中输入8,会成功在系统中显示排序成功:

29

11. 快速查找函数

返回菜单栏,输入9,会弹出如下信息框:

输入姓名后,回车:

30

完成后按任意键返回主菜单

12. 复制函数

菜单中输入12,会弹出以下信息框:

13. 退出函数

返回菜单后,按11退出菜单

31

五. 总结

这一周的实习已经接近尾声,从刚开始的不只如何下手到最后看到自己的程序按自己的想法运行,心里时不时的有一种喜悦。通过这一周的实习,我认识到书上和老师教的内容是有限的,要想掌握更多的知识我们必须多动脑,多思考,不断地靠自己去寻找资料去学习,同时我们还应向他人请教,与同学相互讨论,从而了解更多自己不知道的知识。在这段时间中我也掌握了一些基本的C语言进行程序设计的技巧,更深的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用通讯系统的基本方法,提高了书写程序设计开发文档的能力(书写课程设计报告)。也学会啦运用多种函数,在软件的设计过程中遇到拉很多的困难。在软件一次一次的调试失败下曾经想过要放弃。我最后还是让自己坚持啦下来,毫不畏惧困难,在同学的帮助与讲解下我总算是顺利的完成啦软件的设计。

虽然在调试程序遇到拉很多的困难,当软件调试成功时那种喜悦的感觉没有什么东西可以代替。在程序的编写过程中我发现我自己有很多的知识漏洞和缺陷,需要进一步努力学习来完善自己。

而这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。自己动手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。但是,收获还是不小的。

当我抽到通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,除了链表本身特别难以外,我也觉得这个不一定要用链表,于是改变了编程思路。当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。

其实,文件这个知识我们并没有学过,但通过看书,也可以得知,虽然说文件难以理解,但是比起链表来说,我觉得指针相对而言要容易很多,知识要记要背的东西比较多,因此这个程序我选择了用文件而不是用链表来解决。

这一周的实践让我受益匪浅,在此我要感谢孜孜不倦指导我们的三位老师,感谢在我困惑时给我帮助的同学,感谢学校给我们一个这样动手动脑的机会,使我们在理论与实践相结合方面又得到了一次很好的锻炼,让我们得到很大的收获。

32

六. 附件

1.源程序代码

/******头文件(.h)***********/ #include \"stdio.h\" /*I/O函数*/ #include \"stdlib.h\" /*标准库函数*/ #include \"string.h\"/*字符串函数*/ #include \"ctype.h\" /*字符操作函数*/ #define M 50 /*定义常数表示记录数*/ typedef struct /*定义数据结构*/ {

char name[20]; /*姓名*/ char units[30]; /*单位*/ char tele[10]; /*电话*/ }ADDRESS;

/******以下是函数原型*******/

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(); /*主菜单函数*/ /******主函数开始*******/ main() {

int i;

ADDRESS adr[M]; /*定义结构体数组*/ static int length; /*保存记录长度*/ clrscr(); /*清屏*/ for(;;)/*无限循环*/ {

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

{

33

case 0:length=enter(adr);break;/*输入记录*/ case 1:list(adr,length);break; /*显示全部记录*/ case 2:search(adr,length);break; /*查找记录*/

case 3:length=delete(adr,length);break; /*删除记录*/ case 4:length=add(adr,length); break; /*插入记录*/ case 5:save(adr,length);break; /*保存文件*/ case 6:length=load(adr); break; /*读文件*/ case 7:display(adr);break; /*按序号显示记录*/ case 8:sort(adr,length);break; /*按姓名排序*/ case 9:qseek(adr,length);break; /*快速查找记录*/ case 10:copy();break; /*复制文件*/

case 11:exit(0); /*如返回值为则程序结束*/ } } }

/*菜单函数,函数返回值为整数,代表所选的菜单项*/ menu_select() {

char s[80]; int c;

gotoxy(1,25);/*将光标定为在第行,第列*/

printf(\"press any key enter menu......\\n\");/*提示压任意键继续*/ getch(); /*读入任意字符*/ clrscr(); /*清屏*/ gotoxy(1,1);

printf(\"********************MENU*********************\\n\\n\"); printf(\" 0. Enter record\\n\"); printf(\" 1. List the file\\n\");

printf(\" 2. Search record on name\\n\"); printf(\" 3. Delete a record\\n\"); printf(\" 4. add record \\n\"); printf(\" 5. Save the file\\n\"); printf(\" 6. Load the file\\n\");

printf(\" 7. display record on order\\n\"); printf(\" 8. sort to make new file\\n\"); printf(\" 9. Quick seek record\\n\");

printf(\" 10. copy the file to new file\\n\"); printf(\" 11. Quit\\n\");

printf(\"***********************************************\\n\"); do{

printf(\"\\n Enter you choice(0~11):\"); /*提示输入选项*/ scanf(\"%s\输入选择项*/

c=atoi(s); /*将输入的字符串转化为整型数*/ }while(c<0||c>11); /*选择项不在~11之间重输*/

34

return c; /*返回选择项,主程序根据该数调用相应的函数*/ }

/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/ int enter(ADDRESS t[]) {

int i,n; char *s;

clrscr(); /*清屏*/

printf(\"\\nplease input num \\n\"); /*提示信息*/ scanf(\"%d\输入记录数*/

printf(\"please input record \\n\"); /*提示输入记录*/

printf(\"name unit telephone\\n\"); printf(\"------------------------------------------------\\n\"); for(i=0;iscanf(\"%s%s%s\输入记录*/ printf(\"----------------------------------------------\\n\"); }

return n; /*返回记录条数*/ }

/*显示记录,参数为记录数组和记录条数*/ void list(ADDRESS t[],int n) {

int i; clrscr();

printf(\"\\n\\n*******************ADDRESS******************\\n\");

printf(\"name unit telephone\\n\"); printf(\"------------------------------------------------\\n\"); for(i=0;iprintf(\"%-20s%-20s%-20s\\n\ }

printf(\"************************end*******************\\n\"); }

/*查找记录*/

void search(ADDRESS t[],int n) {

char s[20]; /*保存待查找姓名字符串*/ int i; /*保存查找到结点的序号*/ clrscr(); /*清屏*/

printf(\"please search name\\n\"); scanf(\"%s\输入待查找姓名*/

i=find(t,n,s); /*调用find函数,得到一个整数*/ if(i>n-1) /*如果整数i值大于n-1,说明没找到*/

35

printf(\"not found\\n\"); else

print(t[i]); /*找到,调用显示函数显示记录*/ }

/*显示指定的一条记录*/ void print(ADDRESS temp) {

clrscr();

printf(\"\\n\\n********************************************\\n\");

printf(\"name unit telephone\\n\"); printf(\"------------------------------------------------\\n\"); printf(\"%-20s%-30s%-10s\\n\ printf(\"**********************end***********************\\n\"); }

/*查找函数,参数为记录数组和记录条数以及姓名s */ int find(ADDRESS t[],int n,char *s) {

int i;

for(i=0;iif(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/

return i; /*相等,则返回该记录的下标号,程序提前结结束*/ }

return i; /*返回i值*/ }

/*删除函数,参数为记录数组和记录条数*/ int delete(ADDRESS t[],int n) {

char s[20]; /*要删除记录的姓名*/ int ch=0; int i,j;

printf(\"please deleted name\\n\"); /*提示信息*/ scanf(\"%s\输入姓名*/

i=find(t,n,s); /*调用find函数*/

if(i>n-1) /*如果i>n-1超过了数组的长度*/

printf(\"no found not deleted\\n\"); /*显示没找到要删除的记录*/ else {

print(t[i]); /*调用输出函数显示该条记录信息*/

printf(\"Are you sure delete it(1/0)\\n\"); /*确认是否要删除*/ scanf(\"%d\输入一个整数或*/ if(ch==1) /*如果确认删除整数为*/ {

36

for(j=i+1;jstrcpy(t[j-1].name,t[j].name); strcpy(t[j-1].units,t[j].units); strcpy(t[j-1].tele,t[j].tele); }

n--; /*记录数减*/ } }

return n; /*返回记录数*/ }

/*插入记录函数,参数为结构体数组和记录数*/

int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/ {

ADDRESS temp; /*新插入记录信息*/ int i,j;

char s[20]; /*确定插入在哪个记录之前*/ printf(\"please input record\\n\");

printf(\"************************************************\\n\");

printf(\"name unit telephone\\n\"); printf(\"--------------------------------------------------\\n\"); scanf(\"%s%s%s\输入插入信息*/ printf(\"------------------------------------------------\\n\"); printf(\"please input locate name \\n\"); scanf(\"%s\输入插入位置的姓名*/

i=find(t,n,s); /*调用find,确定插入位置*/

for(j=n-1;j>=i;j--) /*从最后一个结点开始向后移动一条*/ {

strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/ strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/ strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/ }

strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/ strcpy(t[i].units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/ strcpy(t[i].tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/ n++; /*记录数加*/

return n; /*返回记录数*/ }

/*保存函数,参数为结构体数组和记录数*/ void save(ADDRESS t[],int n) {

int i;

FILE *fp; /*指向文件的指针*/

37

if((fp=fopen(\"c:\\\\record.txt\打开文件,并判断打开是否正常*/

{

printf(\"can not open file\\n\");/*没打开*/ exit(1); /*退出*/ }

printf(\"\\nSaving file\\n\"); /*输出提示信息*/ fprintf(fp,\"%d\将记录数写入文件*/ fprintf(fp,\"\\r\\n\"); /*将换行符号写入文件*/ for(i=0;ifprintf(fp,\"%-20s%-30s%-10s\格式写入记录*/

fprintf(fp,\"\\r\\n\"); /*将换行符号写入文件*/ }

fclose(fp);/*关闭文件*/

printf(\"****save success***\\n\"); /*显示保存成功*/ }

/*读入函数,参数为结构体数组*/ int load(ADDRESS t[]) {

int i,n;

FILE *fp; /*指向文件的指针*/

if((fp=fopen(\"c:\\\\record.txt\打开文件*/ {

printf(\"can not open file\\n\"); /*不能打开*/ exit(1); /*退出*/ }

fscanf(fp,\"%d\读入记录数*/ for(i=0;ifscanf(fp,\"%20s%30s%10s\/*按格式读入记录*/

fclose(fp); /*关闭文件*/

printf(\"You have success read data from file\\n\"); /*显示保存成功*/ return n; /*返回记录数*/ }

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

int id,n;

FILE *fp; /*指向文件的指针*/

if((fp=fopen(\"c:\\\\record.txt\打开文件*/ {

printf(\"can not open file\\n\"); /*不能打开文件*/

38

exit(1); /*退出*/ }

printf(\"Enter order number...\\n\"); /*显示信息*/ scanf(\"%d\输入序号*/

fscanf(fp,\"%d\从文件读入记录数*/ if(id>=0&&idfseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/ print(t[id]); /*调用输出函数显示该记录*/ printf(\"\\r\\n\"); } else

printf(\"no %d number record\\n \如果序号不合理显示信息*/ fclose(fp); /*关闭文件*/ }

/*排序函数,参数为结构体数组和记录数*/ void sort(ADDRESS t[],int n) {

int i,j,flag;

ADDRESS temp; /*临时变量做交换数据用*/ for(i=0;iif(strcmp(t[i].name,t[i+1].name)>0) {

strcpy(temp.name,t[i].name); strcpy(temp.units,t[i].units); strcpy(temp.tele,t[i].tele); strcpy(t[i].name,t[i+1].name); strcpy(t[i].units,t[i+1].units); strcpy(t[i].tele,t[i+1].tele); strcpy(t[i+1].name,temp.name); strcpy(t[i+1].units,temp.units); strcpy(t[i+1].tele,temp.tele); } }

printf(\"sort sucess\\n\"); /*显示排序成功*/ }

/*快速查找,参数为结构体数组和记录数*/ void qseek(ADDRESS t[],int n) {

char s[20]; int l,r,m;

printf(\"\\nPlease sort before qseek!\\n\"); /*提示确认在查找之前,记录是否已排序*/

39

printf(\"please enter name for qseek\\n\"); /*提示输入*/ scanf(\"%s\输入待查找的姓名*/

l=0;r=n-1; /*设置左边界与右边界的初值*/ while(l<=r) /*当左边界<=右边界时*/ {

m=(l+r)/2; /*计算中间位置*/

if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/ {

print(t[m]); /*如果相等,则调用print函数显示记录信息*/ return ; /*返回*/ }

if(strcmp(t[m].name,s)<0) /*如果中间结点小*/ l=m+1; /*修改左边界*/ else

r=m-1; /*否则,中间结点大,修改右边界*/ }

if(l>r) /*如果左边界大于右边界时*/ printf(\"not found\\n\"); /*显示没找到*/ }

/*复制文件*/ void copy() {

char outfile[20]; /*目标文件名*/ int i,n;

ADDRESS temp[M]; /*定义临时变量*/ FILE *sfp,*tfp; /*定义指向文件的指针*/ clrscr();/*清屏*/

if((sfp=fopen(\"c:\\\\record.txt\打开记录文件*/ {

printf(\"can not open file\\n\"); /*显示不能打开文件信息*/ exit(1); /*退出*/ }

printf(\"Enter outfile name,for example c:\\\\f1\\\e.txt:\\n\"); /*提示信息*/

scanf(\"%s\输入目标文件名*/

if((tfp=fopen(outfile,\"wb\"))==NULL) /*打开目标文件*/ {

printf(\"can not open file\\n\"); /*显示不能打开文件信息*/ exit(1); /*退出*/ }

fscanf(sfp,\"%d\读出文件记录数*/ fprintf(tfp,\"%d\写入目标文件数*/ fprintf(tfp,\"\\r\\n\"); /*写入换行符*/ for(i=0;i40

{

fscanf(sfp,\"%20s%30s%10s\\n\ temp[i].tele); /*读入记录*/

fprintf(tfp,\"%-20s%-30s%-10s\\n\ temp[i].units,temp[i].tele); /*写入记录*/ fprintf(tfp,\"\\r\\n\"); /*写入换行符*/ }

fclose(sfp); /*关闭源文件*/ fclose(tfp); /*关闭目标文件*/

printf(\"you have success copy file\\n\"); /*显示复制成功*/ } _

2.参考文献

1.C语言程序设计/贾宗璞,许合利主编。-北京人名邮

电出版社,2010.9(2011.2重印)

2.谭浩强,张基温。C语言程序设计教程。第三版。北京:高等教育出版社,2006

3.谭浩强,张基温。C语言习题集与上机指导。第三版。北京:高等教育出版社,2006

4.中国铁道出版社出版的《C程序设计试验教程》《C程序设计教程》

5.刘振安。C语言程序设计[M]。机械工业出版社,2007

41

C语言程序设计评分表

课程名称: C语言程序设计

项 目 评 价 设计方案的合理性与创造性 设计与调试结果 设计说明书的质量 答辩陈述与回答问题情况 课程设计周表现情况 综合成绩

教师签名:

日 期:

42

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务