名称:通信录管理系统
学院:机电学院
班级:075102-23
姓名:闵德顺
学号:20101003082
指导老师:谷老师
前言
课程设计目的:C语言编程实践是学习C语言的一个重要环节,为提高学生的程序设计能力,通过课堂和上机实践使学生的程序设计能力有一个上升的台阶。通过前四单元的温故而知新、庖丁解牛、举一反三、熟能生巧等过程的练习之后能够解决一些简单的实际问题。
1、题目要求
具有数据的插入、修改、删除、显示和查询功能的电话簿管理程序。
(1)数据包括:人名、工作单位、电话号码和E-MAIL地址。
(2)可对记录中的姓名和电话号码进行修改。
(3)可增加和删除记录。
(4)可显示所有的保存记录。
(5) 可按人名或电话号码进行查询
2、需求分析
根据题目要求,建立文件,应选择结构体数组来存放数据,再定义一个全局变量和文件指针进行程序的运行,然后把数据信息存入文件中,所以要提供结构体和文件的输入输出等操作;在程序中要进行数据的插入、删除、更新、查询等操作,所以需要建立相应的模块来实现,为简便起见,还应建立一个主菜单,在每个模块中建立相应的副菜单;另外,还要提
供键盘式选择菜单来实现选择功能,使程序在运行时达到要求。
3、总体设计
根据题目要求,可以将系统分为:
1)输入数据模块;
2)查看数据模块
3)删除数据模块;
4)增加数据模块
5)修改数据模块
6)查找数据模块;
系统功能模块图
4、详细设计
1、主函数;
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。
流程图
程序代码:
void menu()
{int n;
int w1;
void add();
puts("\\n\\\\欢迎使用通讯录管理系统\\n\\n");
puts("\\**********************菜单**********************");
puts("\\\\1.输入联系人");
puts("\\\\2.查看联系人");
puts("\\\\3.删除联系人");
puts("\\\\4.增加联系人");
puts("\\\\5.修改联系人信息");
puts("\\\\6.查找联系人");
puts("\\\\0.退出系统");
puts("\\n\\n\\************************************************");
printf("请你选择(0-6):[ ]\\b\\b");
do { scanf("%d",&n);
if(n<0||n>6)
{printf("你的选择有误!请重新选择:\\n");
w1=1;getchar();}
else w1=0;
} while(w1==1);switch(n)
{
case 1:shuru() ;break;
case 2:chakan();break;
case 3:del() ;break;
case 4:zj() ;break;
case 5:xiugai() ;break;
case 6:cz();break;
case 0:{printf("\\n\\\谢谢使用!\\n");exit(0);}
}
}
2. 输入数据模块
这个模块的功能是输入并保存联系人的信息,输入是输入到全局结构体数组变量里的,调用save函数储存到文件里,然后调用back函数提示使用者进行下一步操作。
流程图
程序代码:
void shuru()
{
int i,n;
printf("你想添加多少个联系人? ");
scanf("%d",&n);
printf("\\n 现在开始增加联系人\\n\\n");
for(i=0;i printf("\\n 输入第%d个联系人的信息\\n",i+1); printf("姓名\\n"); scanf("%s",per[i].nam); printf("工作单位\\n"); scanf("%s",per[i].adr); printf("电话号码\\n"); scanf("%s",per[i].pho); printf("电子邮件\\n"); scanf("%s",per[i].email); } j=i ; save(); printf("\\n已经添加完成并保存。"); back(); }3浏览数据模块 这个模块的功能是查看所有文件中保存的联系人信息,直接调用show函数,然后调用back函数提示使用者进行下一步操作。 流程图 程序代码: chakan() { show(); back(); } 4.数据删除模块 这个模块的功能是删除通讯录中的联系人,先调用show函数,然后提示用户选择要删除的联系人的序号,然后修改结构体数组的数据,调用save函数保存。 流程图: 程序代码: void del() { int a,l,w; printf("\\n你想删除哪个联系人?\\n\\n"); show(); printf("\\n请输入你要删除的联系人的序号:"); scanf("%d",&a); do{ if(a<0||a>j){w=0; printf("\\n你的输入有误,请重新输入:"); scanf("%d",&a); } else w=1; }while(w==0); for(l=a-1;l j=j-1; save(); printf("\\n已经删除完成并保存。"); back(); } 5增加数据模块 这个模块的功能是向通讯录中增加联系人信息,和程序与输入模块类似,先通过load函数读取文件中的信息,然后增加数据,最后调用save 函数保存 流程图 : 程序代码: void zj() {int i,n=0; load(); printf("你想增加多少个联系人? "); scanf("%d",&n); printf("\\n 现在开始增加联系人\\n\\n"); for(i=j;i printf("\\n 输入第%d个联系人的信息\\n",i+1); printf("姓名\\n"); scanf("%s",per[i].nam); printf("工作单位\\n"); scanf("%s",per[i].adr); printf("电话号码\\n"); scanf("%s",per[i].pho); printf("电子邮件\\n"); scanf("%s",per[i].email); } j=i ;save(); printf("\\n已经增加完成并保存。"); back(); } 6修改数据模块 这个模块的功能是修改通讯录中联系人的信息,调用show函数让用户确定要修改的联系人,然后用户直接输入要修改的联系人的序号,在依次输入修改过后的信息最后调用save函数保存。 流程图 程序代码: void xiugai() { int i=0,w; show(); printf("\\n请输入你要修改的联系人的序号:"); scanf("%d",&i); do{ if(i<0||i>j){w=0; printf("\\n你的输入有误,请重新输入:"); scanf("%d",&i); } else w=1; }while(w==0); i--; printf("\\n请输入修改后的联系人的信息\\n:"); printf("姓名\\n"); scanf("%s",per[i].nam); printf("工作单位\\n"); scanf("%s",per[i].adr); printf("电话号码\\n"); scanf("%s",per[i].pho); printf("电子邮件\\n"); scanf("%s",per[i].email); save(); printf("\\n已经修改完成并保存。"); back(); } 7查找数据模块 这个模块的功能是查找联系人信息,可以通过姓名和电话号码查找,先调用load函数从文件中读取联系人信息,然后通过循环查找联系人,找到后输出联系人信息。- 程序代码: void cz() { int n,w=1; printf("你想通过什么方式查找?\\1.姓名\\2.电话号码\\n"); scanf("%d",&n); do{ if(n==1){ czxm();back();} if(n==2){ czdh(); back();} else {w=0;printf("\\n你的输入有误,请重新输入:"); scanf("%d",&n);}}while(w==0); } 流程图 通过姓名查找流程图 通过电话号码查找流程图 (1)通过姓名查找程序代码: void czxm() { int i; char a[20]; printf("\\n请输入你要查找的联系人的姓名:"); scanf("%s",a); load(); for(i=0;i if(strcmp(per[i].nam,a)==0) {printf("\\n你要查的联系人的信息是:\\n"); printf("\\n姓名\\工作单位\电话号码\电子邮件\\n"); printf("%-8s\%-8s\%-15s\%-15s\\n per[i].nam,per[i].adr,per[i].pho,per[i].email); break;} } if(i==j)printf("\\n\\n找不到你要查看的联系人!!!"); } (2)通过电话号码查找程序代码 void czdh() { int i; char a[20]; printf("请输入你要查找的联系人的号码:"); scanf("%s",a); load(); for(i=0;i if(strcmp(per[i].pho,a)==0) {printf("\\n你要查的联系人的信息是:\\n"); printf("姓名\\工作单位\电话号码\电子邮件\\n"); printf("%-8s\%-8s\%-15s\%-15s\\n per[i].nam,per[i].adr,per[i].pho,per[i].email); break;} } if(i==j)printf("\\n\\n找不到你要查看的联系人!!!"); } 8公共函数: (1)save函数 save函数的功能是把存放到结构体数组里的数据写入文件中,用于直接查看和下次读取。 程序代码 : void save() {int i; FILE *fq; if((fp=fopen("15.txt { printf("打开文件出错!!\\n"); return; } for(i=0;i fclose (fp); if((fq=fopen("通讯录.txt { printf("打开文件出错!!\\n"); return; } for(i=0;i fprintf(fq,"%d\%-16s%-16s%-16s%-16s\\n i+1,per[i].nam,per[i].adr,per[i].pho,per[i].email); }fclose (fq); } (2)load函数 load函数的功能是从已经保存的文件中读数据,把数据存入结构体数组中。同时把联系人个数存放到全局变量j中。 程序代码 : void load() {int i; if((fp=fopen("15.txt打开文件出错!!\\n"); for(i=0;!feof(fp);i++) fread(&per[i],sizeof(struct person),1,fp); fclose(fp); j=i; } (3)show函数: show函数的功能是从文件中读取联系人信息,然后输出到屏幕上。 程序代码 : void show() {int i; printf("序号\姓名\\工作单位\电话号码\电子邮件\\n"); load(); for(i=0;i printf("%d\%-16s%-16s%-16s%-16s\\n i+1,per[i].nam,per[i].adr,per[i].pho,per[i].email); } } (4)back函数 back函数的功能是在每次完成一个指令后提示用户进行下一步操作。 程序代码: void back() {int i,w; puts("\\n\\n"); printf("\\\现在你要做什么??\\n\\n\1.返回菜单\2.浏览联系人\3.退出系统\\n\\n"); printf("请你选择1-3:[ ]\\b\\b"); scanf("%d",&i); printf("\\n\\n"); do{ if(i==1){ w=1;menu();} if(i==2) {w=1;chakan();} if(i==3){w=1; printf("\\n\\\谢谢使用!\\n");exit(0);} else {w=0;printf("\\n你的输入有误,请重新输入:");scanf("%d",&i);} } while(w==0); } 5、运行结果 1、输入数据模块; 出现菜单后,输入1按Enter结果如下: 输入完成后出现下图: 2、输入数据模块 出现菜单后,输入2按Enter结果如下: 3、删除数据模块; 出现菜单后,输入3按Enter结果如下: 4、增加数据模块; 出现菜单后,输入4按Enter结果如下: 5、修改数据模块; 出现菜单后,输入5按Enter结果如下: 6、查找数据模块; 出现菜单后,输入6按Enter通讯录中不存在要查找的联系人时结果如下: 通讯录中存在要查找的联系人时结果如下: 6、总结与体会 在老师的带领下进行了C语言程序实践学习。在短短八天的实习期间使我获取了不少新知识也巩固了许多老知识。在这之前,我们已经对C语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在学习了解的范围,对里面的好多东西还是很陌生,并不是很熟练,有着许多欠缺,更多的在运用起来的时候还是感到很不好动手。 C语言是需要有一定基础、而且动手能力强的学科。上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、巩固贯穿系统知识、掌握程序设计方法、提高程序设计能力,这些都必须通过充分的实际上机操作才能完成。 课堂上许多关于C语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用C语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握C语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,更加巩固了学过的知识,而且在设计的时候学要系统的知识,也是一个较大的挑战,某一方面知识的欠缺都将影响到整个程序的设计。 这次上机实习让我学到了很多有用的东西,巩固了之前的学习,让我学到了在教室和做题中学不到的一些知识,通过这个程序的学习,使我进一步理解和运用结构化程序设计的思想和方法。相信对以后初步掌握开发一个小型实用系统的基本方法,学会调试一个比较长程序的基本方法,学会利用流程图表示算法,进一步掌握和提高利用C语言进行程序设计的能力。 程序设计的过程,实际上是确定解决问题的详细步骤,而这个步骤通常称为流程,设计好如何进行程序的细编在程序量很大的情况下解决问题是很重要的。一个大的程序,一般是经过很多步才完成,不断的进行程序的调试来完成它。 现在程序基本上是完成了,里面或多或少的存在问题。其中在对数据进行输入的时候,不太方便,可以设计一个程序使在完成一个的输入后返回副菜单而不是主菜单;删除模块可以加上一些程序使删除的时候有选择性而不是直接删除,没有后悔的余地。总的来说,这次课程设计还是比较成功的,虽然不是达到很完美。 附录:源程序清单 # include # include # include FILE *fp; int j; struct person { char nam[11]; char adr[20]; char pho[15]; char email[20]; }; struct person per[50]; void menu(); void save(); void show(); void chakan(); void shuru(); void cz(); void del(); void zj(); void czxm(); void xiugai(); void czdh(); void back(); void load(); void main() { menu(); } void menu() {int n; int w1; void add(); puts("\\n\\\\欢迎使用通讯录管理系统\\n\\n"); puts("\\**********************菜单**********************"); puts("\\\\1.输入联系人"); puts("\\\\2.查看联系人"); puts("\\\\3.删除联系人"); puts("\\\\4.增加联系人"); puts("\\\\5.修改联系人信息"); puts("\\\\6.查找联系人"); puts("\\\\0.退出系统"); puts("\\n\\n\\************************************************"); printf("请你选择(0-6):[ ]\\b\\b"); do { scanf("%d",&n); if(n<0||n>6) {printf("你的选择有误!请重新选择:\\n"); w1=1;getchar();} else w1=0; } while(w1==1);switch(n) { case 1:shuru() ;break; case 2:chakan();break; case 3:del() ;break; case 4:zj() ;break; case 5:xiugai() ;break; case 6:cz();break; case 0:{printf("\\n\\\谢谢使用!\\n");exit(0);} } } void shuru() { int i,n; printf("你想添加多少个联系人? "); scanf("%d",&n); printf("\\n 现在开始增加联系人\\n\\n"); for(i=0;i printf("\\n 输入第%d个联系人的信息\\n",i+1); printf("姓名\\n"); scanf("%s",per[i].nam); printf("工作单位\\n"); scanf("%s",per[i].adr); printf("电话号码\\n"); scanf("%s",per[i].pho); printf("电子邮件\\n"); scanf("%s",per[i].email); } j=i ; save(); printf("\\n已经添加完成并保存。"); back(); } void cz() { int n,w=1; printf("你想通过什么方式查找?\\1.姓名\\2.电话号码\\n"); scanf("%d",&n); do{ if(n==1){ czxm();back();} if(n==2){ czdh(); back();} else {w=0;printf("\\n你的输入有误,请重新输入:"); scanf("%d",&n);}}while(w==0); } void czxm() { int i; char a[20]; printf("\\n请输入你要查找的联系人的姓名:"); scanf("%s",a); load(); for(i=0;i if(strcmp(per[i].nam,a)==0) {printf("\\n你要查的联系人的信息是:\\n"); printf("\\n姓名\\工作单位\电话号码\电子邮件\\n"); printf("%-8s\%-8s\%-15s\%-15s\\n per[i].nam,per[i].adr,per[i].pho,per[i].email); break;} } if(i==j)printf("\\n\\n找不到你要查看的联系人!!!"); } void czdh() { int i; char a[20]; printf("请输入你要查找的联系人的号码:"); scanf("%s",a); load(); for(i=0;i if(strcmp(per[i].pho,a)==0) {printf("\\n你要查的联系人的信息是:\\n"); printf("姓名\\工作单位\电话号码\电子邮件\\n"); printf("%-8s\%-8s\%-15s\%-15s\\n per[i].nam,per[i].adr,per[i].pho,per[i].email); break;} } if(i==j)printf("\\n\\n找不到你要查看的联系人!!!"); } void chakan() { show(); back(); } void del() { int a,l,w; printf("\\n你想删除哪个联系人?\\n\\n"); show(); printf("\\n请输入你要删除的联系人的序号:"); scanf("%d",&a); do{ if(a<0||a>j){w=0; printf("\\n你的输入有误,请重新输入:"); scanf("%d",&a); } else w=1; }while(w==0); for(l=a-1;l j=j-1; save(); printf("\\n已经删除完成并保存。"); back(); } void xiugai() { int i=0,w; show(); printf("\\n请输入你要修改的联系人的序号:"); scanf("%d",&i); do{ if(i<0||i>j){w=0; printf("\\n你的输入有误,请重新输入:"); scanf("%d",&i); } else w=1; }while(w==0); i--; printf("\\n请输入修改后的联系人的信息\\n:"); printf("姓名\\n"); scanf("%s",per[i].nam); printf("工作单位\\n"); scanf("%s",per[i].adr); printf("电话号码\\n"); scanf("%s",per[i].pho); printf("电子邮件\\n"); scanf("%s",per[i].email); save(); printf("\\n已经修改完成并保存。"); back(); } void zj() {int i,n=0; load(); printf("你想增加多少个联系人? "); scanf("%d",&n); printf("\\n 现在开始增加联系人\\n\\n"); for(i=j;i printf("\\n 输入第%d个联系人的信息\\n",i+1); printf("姓名\\n"); scanf("%s",per[i].nam); printf("工作单位\\n"); scanf("%s",per[i].adr); printf("电话号码\\n"); scanf("%s",per[i].pho); printf("电子邮件\\n"); scanf("%s",per[i].email); } j=i; save(); printf("\\n已经增加完成并保存。"); back(); } void save() {int i; FILE *fq; if((fp=fopen("15.txt { printf("打开文件出错!!\\n"); return; } for(i=0;i fclose (fp); if((fq=fopen("通讯录.txt { printf("打开文件出错!!\\n"); return; } for(i=0;i fprintf(fq,"%d\%-16s%-16s%-16s%-16s\\n i+1,per[i].nam,per[i].adr,per[i].pho,per[i].email); }fclose (fq); } void back() {int i,w; puts("\\n\\n"); printf("\\\现在你要做什么??\\n\\n\1.返回菜单\2.浏览联系人\3.退出系统\\n\\n"); printf("请你选择1-3:[ ]\\b\\b"); scanf("%d",&i); printf("\\n\\n"); do{ if(i==1){ w=1;menu();} if(i==2) {w=1;chakan();} if(i==3){w=1; printf("\\n\\\谢谢使用!\\n");exit(0);} else {w=0;printf("\\n你的输入有误,请重新输入:");scanf("%d",&i);} } while(w==0); } void show() {int i; printf("序号\姓名\\工作单位\电话号码\电子邮件\\n"); load(); for(i=0;i printf("%d\%-16s%-16s%-16s%-16s\\n i+1,per[i].nam,per[i].adr,per[i].pho,per[i].email);} } void load() {int i; if((fp=fopen("15.txt打开文件出错!!\\n"); for(i=0;!feof(fp);i++) fread(&per[i],sizeof(struct person),1,fp); fclose(fp); j=i-1; }