C语言课程设计报告通讯录
面向过程程序设计(C语言)课程设计
设计说明书
通讯录系统
起止日期: 2011年 01 月 03 日至 2011年 01 月 08 日
学生姓名XXX
班级
学号
成绩
指导教师(签字)
计算机与通信学院
2011 年 01 月 08 日
一、课题任务
设计一个通讯录管理系统。
课题的主要任务是:
1.对通讯录信息有添加、查找、显示、保存、删除、修改等操作功能。
2.可以将输入的数据保存在文本文件中,并可以将其调出使用。
我的主要任务是编写主函数,查找模块和修改模块。
二、设计要求
建立通讯录信息,信息至少包含姓名、住址、单位、固定电话、移动手机、分类(如同事、朋友、同学、家人等)、E-mail、QQ等。
该系统提供添加、删除、修改和查找功能,其中按姓名方式删除、修改,按姓名、单位、分类方式查找。
将通讯录保存在文件中。
能够输出通讯录中的信息。
二、程序的功能设计
创建:创建通讯录文件并对其命名
添加:添加通讯录记录
输出:显示通讯录记录
删除:删除通讯录记录
查找:查询通讯录记录
修改:修改通讯录记录
保存:将信息保存到文件中
四、程序的数据设计
该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询
数据和删除数据。
创建:用fopen()建立一个文本文件,然后用fprintf()向其中输入数据(例如,向文件中输入“姓名”,“地址”等),并对文件进行命名。
添加:可以添加通讯录记录,利用C语言文件,向文件中按顺序输入姓名、住址、单位、固定电话、手机号码、分类(如同事、朋友、同学、家人等)、E-mail、
QQ,再用fclose()函数关闭并保存文件。
输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。
删除:输入你要删除的人的姓名后,系统会自动删除他(她)的记录,在删除通过switch 语句满足提示你确认删除的功能,只有等你确认删除后才会删除。
查找:为了满足用户的实际需求,设计了三种查询方式,可以用姓名、单位、分类三种方式查找通讯录记录。这里用到strcmp()函数,通过比较字符串是否相同来
判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变
量所带的值输出到屏幕上。
修改:输入你要修改的那个人的姓名后,系统会查找该通讯录文件(此时用发ftell()函数来跟踪文件指针的指向地址,找到个人的记录后,会显示他(她)的记录,
然后通过fseek()函数来找到修改处的地址,然后用户再依次输入他(她)的相
关信息来替代以前的记录。
保存:用到fclose()函数,每次操作成功后会自动保存到指定的文件中。
如下图所示:
无数条记录的输入*/
************************\n\n");
printf("\n\t创建,请按1");
printf("\n\t添加,请按2");
printf("\n\t查找,请按3");
printf("\n\t修改,请按4");
printf("\n\t输出,请按5");
printf("\n\t删除,请按6");
printf("\n\t退出,请按0");
printf("\n\t*************************************************************\n \n");
printf("\n请选择(0--5): ");
scanf("%d",&n);
if(n<=6&&n>=0)
{
switch(n)
{
case 1:creat();break;
case 2:add(); break;
case 3:search(); break;
case 4:modify(); break;
case 5:output(); break;
case 6:del(); break;
case 0:exit(1);
}
printf("\n\n操作完成,请再次选择!");
}
else
printf("\n\n选择错误,请再次选择!");
}
上面主要是菜单部分,用来提醒用户需要选择哪些功能。
这部分是来通过一个无限循环(用while(1))来执行上述所有的功能模块,不断的输出菜单项目,用switch语句来执行用户选择的功能模块,每一个case后面就是对应的功能函数,(比如,用户输入数字2,那么就是执行添加功能,相应的就是执行case 2 后面的add()函数,然后用break语句跳出循环,再输出主菜单,如果用户要退出的话,只需选择“0”就可以成功退出并且自动将数据保存到指定的文件中。如果用户选择的时输入的数据有误的话,会提示“选择错误,请再次选择!”,这样,用户就能够再次输入数据。
查找模块:
该查找功能分3种方式查找,姓名查找(按1),分类查找(按2),单位查找(按3)。这是通过switch语句来实现,case 1后面是按姓名查找函数,case 2 后面是按分类查找函数,case 3 后面是按单位查找函数。如果用户要选择一种方式查找通讯录记录,只需输入对应的数字就可以。三种方法大同小异,下面就说明姓名查找吧!查找用户,进入查找界面后并且键入“1”后,就执行姓名查找方式,此时界面上会显示“请输入姓名”,然后系统将用户输入的姓名赋给对应的变量,然后用循环(用while(!feof(fp))这条语句来完成)来找出这个人的所有记录,并将其输出到屏幕上。如果没有此人的记录,那就会输出“对不起,通讯录中没有此人的记录”或“对不起,通讯录中没有此类人的记录”或“对不起,通讯录中没有此单位的记录”,这里输出视查找方式而定。执行查找功能后会返回主菜单,并提示用户再次选择。
修改模块:
用户使用这个功能的时候,界面上会显示“请你输入要修改人的姓名:”等用户输入数据后,系统会通过循环从文件中寻找此人,该过程和删除模块是一样的,每次从文件中读取数据后,便把数据赋给相应的变量,再用该数据与用户输入字符串比较,如果相同,那就说明已找到该人的数据;如果不同,那就执行下一个循环,直到找出为止,在寻找过程中,用ftell()函数来跟踪地址,修改的时候用fseek()函数来寻找地址,找到要修改的地址后,系统会显示该人的所有记录,然后输出“请输入新的姓名、住址、工作(或学习)单位、固定电话、手机号码、邮箱、QQ以及分类。”这时用户要按顺序输入数据。用户输入完成后,系统会显示“已修改!”并且返回主菜单。
六、函数编码及调试
编写的程序中很容易出现一些低级语法错误,(比如,有时候把%s写成了%d),当然这很容易找出并且更正,主要是一些算法错误很难找到,在调试的过程中,最令我头痛的就是
编写修改模块时用到的ftell和fseek函数,好郁闷的,改了好几天都没有进展,最后在机房里的时候请教了一下老师,经老师指点后,我就顿然开朗啦,原来是在寻找地址的时候出了错,但是待我修改后还是不可以,每次执行修改的时候总是修改了别的数据,不过我发现这个被修改的数据和我想修改的数据的都靠在一起,我就想是不是我输入数据的时候漏掉了一个字符本来文本文件用ftell和fseek函数的时候就特别容易出错,所以我碰到这个麻烦的时候,心情一点也不好,但潜意识告诉我,我不能放弃,然后我就再把程序看了几遍,我试着把下列的程序
fprintf(fp,"%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",https://www.360docs.net/doc/e39723277.html,, one.addr,
one.work_place,one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
改为
fprintf(fp,"%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s\n",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ, one.category);
改的时候就加了一个转义字符“\n”,然后我再运行了一下,结果竟然对了,太巧了,我把整个程序仔细一看,原来是在添加和创建模块的时候都有这个字符,如果后面修改的时候不加的话,文件上就会在排版上不符合导致在修改的时候修改错位置,嘿嘿,终于找到错误了,好有成就感的,就是这个小小的字符害我花了好几天时间,不过也获得了一个教训,那就是写程序的时候一定要注意前后的格式,要整体把握。
七、总结
这个课题是设计一个通讯录系统,该通讯系统能够较好的管理好我们的通讯录记录,也拥有比较完善的功能,但是该系统依旧有漏洞,此程序必须按照系统提示的操作来执行,不然的话就会使程序进入死循环,比如,如果我输入字符串的长度过长的话,程序就会终止运行了,并且还没有提示;后面的删除模块所用的方法是用空格替代,虽然可以删除,但达不到理想的效果。
在编写过程中,我逐步的了解了程序模块化设计的思想含义。在整个程序设计的过程中语法的错误还是比较容易检查的,但是对于那些逻辑思维的问题方面的缺陷不易查出,因此常常出现系统提示没有错误但是仍然不能够正常运行的境况,尽管有很多不足之处,但我在整个系统程序设计的过程中,我可以感受到自己对C语言有了一定的掌握,对整体的把握度也提高了很多。
此外编程是一项高精度的工作,所以我们要有规范化,标准化的代码编写习惯,良好的编写习惯,不但有助于代码的纠错,也有助于不同人员之间的协作。
?? 我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大的避免重复性的工作。另外我们要重视程序的算法,在程序中,算法是灵魂,我们要努力学习各种先进的算法,提高自己的编程能力。
附:系统的主要程序代码
主函数部分:
#include
#include
#include
struct person
{
char name[10]; /*姓名*/
char mobile_phone[16]; /*手机号码*/
char fixed_telephone[16]; /*固定电话*/
char work_place[20]; /*工作单位*/
char addr[20]; /*家庭住址*/
char e_mail[30]; /*邮箱*/
char QQ[12]; /*QQ聊天软件*/
char category[10]; /*分类*/
};
char dir_name[20]="e:\\通讯录.txt";
FILE *fp;
void creat(); /*创建一个通讯录并命名,下次如果要打开以前的通讯录话,就在创建的时候输入以前的文件名称。*/
void output();/*输出模块*/
void add();/*添加模块*/
void modify();/*修改模块*/
void del();/*删除模块*/
void search();/*查找模块*/
void main()
{
while(1) /*一次完成无数条记录的输入*/
{
int n;
printf("\n\t*******************欢迎使用通讯录系统
************************\n\n");
printf("\n\t创建,请按1");
printf("\n\t添加,请按2");
printf("\n\t查找,请按3");
printf("\n\t修改,请按4");
printf("\n\t输出,请按5");
printf("\n\t删除,请按6");
printf("\n\t退出,请按0");
printf("\n\t*************************************************************\n \n");
printf("\n请选择(0--5): ");
scanf("%d",&n);
if(n<=6&&n>=0)
{
switch(n)
{
case 1:creat();break;
case 2:add(); break;
case 3:search(); break;
case 4:modify(); break;
case 5:output(); break;
case 6:del(); break;
case 0:exit(1);
}
printf("\n\n操作完成,请再次选择!");
}
else
printf("\n\n选择错误,请再次选择!");
}
}
查找模块:
void search()
{
struct person one;
int k,j=0;
if((fp=fopen(dir_name,"r"))==NULL)
{
printf("\n不能打开通讯录");
getchar();
exit(1);
}
printf("\n姓名查找请按1");
printf("\n分类查找请按2");
printf("\n单位查找请按3");
printf("\n请选择查找方式(按回车键输入): ");
scanf("%d",&k);
switch(k)
{
case 1:
{
char s_name[10];
printf("\n请输入姓名: ");
scanf("%s",s_name);
while(!feof(fp))
{fscanf(fp,"%s%s%s%s%s%s%s%s",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(s_name,https://www.360docs.net/doc/e39723277.html,))
{printf("\n已经查到此人,记录为: \n");
printf("\n%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ,
one.category);
j=1;
}
}
if(!j) printf("\n对不起,通讯录中没有此人的记录");
fclose(fp);
}
break;
case 2:
{
char s_category[10];
printf("\n请输入类别: ");
scanf("%s",s_category);
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s%s%s",https://www.360docs.net/doc/e39723277.html,, one.addr,
one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(s_category,one.category))
{
printf("\n已经查到此类人,记录为: \n");
printf("\n%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ,
one.category);
j=1;
}
}
if(!j) printf("\n对不起,通讯录中没有此类人的记录");
fclose(fp);
}
break;
case 3:
{
char s_workplace[20];
printf("\n请输入工作单位 : ");
scanf("%s",s_workplace);
while(!feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s%s%s",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ,
one.category);
if(!strcmp(s_workplace,one.work_place))
{
printf("\n已经查到此单位,记录为:\n");
printf("\n%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ,
one.category);
j=1;
}
}
if(!j) printf("\n对不起,通讯录中没有此单位的记录");
fclose(fp);
}
break;
}
}
修改模块:
void modify()
{
struct person one;
int k=0;
long st;
char name_modify[10];
printf("\n请你输入要修改人的姓名: ");
scanf("%s",name_modify);
if((fp=fopen(dir_name,"r+"))==NULL)
{
printf("\n不能打开通讯录!");
getchar();
exit(1);
}
while(!feof(fp))
{
st=ftell(fp); /*跟踪地址*/
fscanf(fp,"%s%s%s%s%s%s%s%s\n",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
if(!strcmp(name_modify,https://www.360docs.net/doc/e39723277.html,))
{
k=1;
break;
}
}
if(k)
{
printf("\n该名字已找到,他(她)的记录是:\n");
printf("%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s",https://www.360docs.net/doc/e39723277.html,, one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ,
one.category);
printf("\n请输入新的姓名、住址、工作(或学习)单位、固定电话、手机号码、邮箱、QQ以及分类。请输入:\n");
scanf("%s%s%s%s%s%s%s%s",https://www.360docs.net/doc/e39723277.html,, one.addr,
one.work_place,one.fixed_telephone,
one.mobile_phone, one.e_mail, one.QQ, one.category);
fseek(fp,st,0); /*找到修改的地址*/
fprintf(fp,"%-10s%-20s%-20s%-15s%-15s%-20s%-15s%-10s\n",https://www.360docs.net/doc/e39723277.html,,
one.addr, one.work_place,
one.fixed_telephone, one.mobile_phone, one.e_mail, one.QQ,
one.category);
printf("已修改!");
}
else
printf("\n对不起,通讯录中没有此人的记录。");
fclose(fp);
}