1、 C程序课程设计报告 --手机通讯录管理系统 组长:曾闯 学院:电子信息工程 学号:10071050 班级:电二 成员:晶,鄂跃宇,金迪 景飞,兴 一 课程设计目的和容概述 1.目的:加深对《C语言》课程所学知识的理解,进一步巩固C语言编程方法。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力,加强动手能力。 2.容:设计一个简易的手机通讯录管理系统。该题目要求在熟练掌握C语言的基本知识:数据类型(整形、实型、
2、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、、绘图函数,以与文件的读写操作等。 其中结构体,函数的调用,算法的设计是尤为重要的。 二 题目 手机通讯录管理系统。 [问题描述] 该系统模拟手机通讯录管理系统,实现对手机中的通讯录进行管理 [基本要求] 要能提供以下几种功能: (1)查看功能:选择此功能时,列出下列三类选择: A:办公类 B:个人类 C:商务类 (2)当选中某类时,显示出此类所有数
3、据中的和 (3)添加数据功能:能录入新数据,每个结点包括:,,分类(可能选项有:w为办公类 p为个人类 b为商务类),电子。 例如: 春 商务类 chuny126. 当录入重复的和时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。 (4)修改功能:选中某个人的时,可对此人的相应数据进行修改。 (5)删除功能:选中某个人的时,可对此人的相应数据进行删除,并自动调整后续条目的编号。 三 程序设计 1.总体设计 首先,因为每个个体有多种信息,所以要建立结构体来储存和整合各个信息。
4、然后利用模块来分别实现程序的各个功能。各个模块用函数来实现。在通过通过主函数来判断输入字母,从而调动函数,实现所需功能。最后将输入的文件保存在文件里,以便重复使用。 2.详细设计 根据功能需要建立显示,添加,查看,删除,修改,保存五个模块。在模块过调用各个函数来实现功能。详细设计如下: (1)构建结构体,写入文件 FILE *fp; int i; struct address { char a[40]; //email地址 }; struct ffriend { int num;
5、char name[20]; char kind[20]; long telephone; struct address address; } friends[50]; void Load() { int j,k; fp=fopen("friend.txt","a+"); if(fp!=NULL) { for(k=0;k<50;k++) {
6、j=fgetc(fp); if(j==EOF) { i=k-1; return; } fseek(fp,k*sizeof(struct ffriend),SEEK_SET); fread(&friends[k],sizeof(struct ffriend),1,fp); } } else { fp=fopen("friend.txt","w");
7、 i=1; } system("cls"); } (2)构造函数与模块 构造显示模块,增加模块,删除模块,修改模块,查询模块。程序如下: void Show(int j) { system("cls"); //实现分屏操作的函数 printf("\n\n\t编号-Nnumber: %3d",friends[j].num); printf("\n\t-Name:%-20s",friends[j].name); printf("\n\t性别-kind:%s",friends[j].kind); pri
8、ntf("\n\t联系-Telephone:%-13ld",friends[j].telephone); printf("\n\temail-address:%-40s",friends[j].address.a); } void Append(int j) { system("cls"); friends[j].num=j; printf("\n\t\t\t序号-Number : %d",j); printf("\n\t\t\t-Name : "); scanf("%s",friends[j].name); pr
9、intf("\t\t\t类别-kind : "); scanf("%s",&friends[j].kind); printf("\t\t\t联系-telephone : "); scanf("%ld",&friends[j].telephone); while(friends[j].telephone<0||friends[j].telephone>) { printf("不合法!请重新输入 : "); scanf("%ld",&friends[j].telephone); } printf("\t\t\te
10、mail-Address : "); scanf("%s",friends[j].address.a); getchar(); } void Delete() { int k;int j; system("cls"); printf("\n\tDelete 序号-Number : "); scanf("%d",&k); if(k-1<=i) { for(j=k-1;j
11、 strcpy(friends[j].name,friends[j+1].name); /*交换元素容*/ strcpy(friends[j].kind,friends[j+1].kind); friends[j].telephone=friends[j+1].telephone; strcpy(friends[j].address.a,friends[j+1].address.a); } i--; } else {
12、 printf("输入的序号太大!"); } } void Modify(int j) { system("cls"); Append(j); } void Save() { int k,j; system("cls"); printf("\n\n\t\t请耐心等待,信息正在保存!\n"); printf("\n\n\n\n\t\t\tSaving"); for(k=0;k<20;k++) { Sleep(300); printf(".");
13、} printf("\n\n信息已经保存成功!\n"); fp=fopen("friend.txt","w"); for(j=0;j<=i;j++) { fwrite(&friends[0],sizeof(struct ffriend),1,fp); } fclose(fp); } (3)主函数调用各个模块 用switch语句判断输入者要使用的功能,然后调用函数,模块实现功能。程序如下: void main() { int j;char a;char x; char grade;
14、 char searchkind[20]; char searchname[20]; load(); system("cls"); do { printf("\n\n\t\t\t=========================================\n"); printf("\t\t\t\t手机通讯录 \n"); printf("\t\t\t\t功能选择 \n"); //输出主界面 printf("\t\t\t=======
15、\n"); printf("\t\t\t A.查看 *\n"); printf("\t\t\t B.增添 *\n"); printf("\t\t\t C.删除 *\n"); printf("\t\t\t D.查询 *\n"); printf("\t\t\t E.修改
16、 *\n"); printf("\t\t\t F.保存 *\n"); printf("\t\t\t=========================================\n"); printf("\t\t\n请选择(Choice)\n\n\t\t注:输入a~h或A~H的字母:"); scanf("%c",&grade); switch(grade) //用switch判断使用者要选择的功能 {
17、 case 'a': case 'A': j=0; while(getchar()!=0x1b&&j<=i) { Show(j++); printf("\n\n请按回车键继续!"); } while(getchar()==0x1b||j>i) { if(j==
18、0)printf("\n\t空文档,无任何记录-Empty Note\n"); else printf("\n\t记录已全部显示\n"); printf("\n\n请按回车键继续!"); getchar(); break; } printf("\n\t\t\t\t\t\t\t此次操作结束"); printf("\n\t--------------------------------------
19、\t\t\n"); break; case 'b': case 'B': while(i<50) { i++; Append(i); printf("\t是否继续增加?(y/n)"); a=getchar();
20、 if(a=='n') break; } if(i==50) printf("\n\t文档已满,无法增加记录-note full"); printf("\n\t\t\t\t\t\t\t此次操作结束"); printf("\n\t-----------------------------------------
21、\t\t\n"); getchar(); break; case 'c': case 'C': Delete(); if(i<1) printf("\n没有记录-No records\n"); printf("\n\n请按回车键继续!"); getchar();
22、 getchar(); printf("\n\t\t\t\t\t\t\t此次操作结束"); printf("\n\t------------------------------------------------------------\t\t\n"); break; case 'd': case 'D': system("cls"); printf("\n\t请输入要查询记录的相关类别: p.个
23、人类 b.商务类 w.办公类"); scanf("%s",searchkind); for(j=0;j<=i;j++) { if(strcmp(searchkind,friends[j].kind)==0) { Show(j); getchar(); } } break; case 'e': case 'E
24、': printf("\n\t请输入要修改记录的相关:"); gets(searchname); scanf("%s",searchname); for(j=0;j<=i;j++) { if(strcmp(searchname,friends[j].name)==0) { Modify(j);
25、 } } if(i<1) { printf("\n 没有您所要修改的记录-No records"); printf("\n 请按回车键继续!"); getchar(); getchar(); } printf("\n\t\t\t\t\t\t\t此次操作结束"); prin
26、tf("\n\t------------------------------------------------------------\t\t\n"); break; case 'f': case 'F': system("cls"); Save(); getchar(); printf("\n\t\t\t\t\t\t\t此次操作结束");
27、 printf("\n\t------------------------------------------------------------\t\t\n"); break; default: printf("\n\t输入有误,请输入正确的序列号!"); printf("\n请按回车键继续!"); getchar(); printf("\n\t\t\t\t\t\t
28、\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
}
}while(1);
}
上述三部分实现整个程序的功能。
四 程序源代码
#include
29、 *fp; int i; struct address { char a[40]; }; struct ffriend { int num; char name[20]; char kind[20]; long telephone; struct address address; } friends[50]; void Load() { int j,k;
30、 fp=fopen("friend.txt","a+"); if(fp!=NULL) { for(k=0;k<50;k++) { j=fgetc(fp); if(j==EOF) { i=k-1; return; } fseek(fp,k*sizeof(struct ffriend),SEEK_SET); fread(&friends[
31、k],sizeof(struct ffriend),1,fp); } } else { fp=fopen("friend.txt","w"); i=1; } system("cls"); } void Show(int j) { system("cls"); printf("\n\n\t编号-Nnumber: %3d",friends[j].num); printf("\n\t-Name:%-20s",friends[j].na
32、me); printf("\n\t性别-kind:%s",friends[j].kind); printf("\n\t联系-Telephone:%-13ld",friends[j].telephone); printf("\n\temail-address:%-40s",friends[j].address.a); } void Append(int j) { system("cls"); friends[j].num=j+1; printf("\n\t\t\t类别:p.个人类 b.商务类 w.办公类"); printf(
33、"\n\t\t\t序号-Number : %d",j+1); printf("\n\t\t\t-Name : "); scanf("%s",friends[j].name); printf("\t\t\t类别-kind : "); scanf("%s",&friends[j].kind); printf("\t\t\t联系-telephone : "); scanf("%ld",&friends[j].telephone); while(friends[j].telephone<0||friends[j].teleph
34、one>) { printf("不合法!请重新输入 : "); scanf("%ld",&friends[j].telephone); } printf("\t\t\temail-Address : "); scanf("%s",friends[j].address.a); getchar(); } void Delete() { int k;int j; system("cls"); printf("\n\tDelete 序号-Number : ");
35、 scanf("%d",&k); if((k-1)<=i) { for(j=k-1;j
36、dress.a); } i--; } else { printf("输入的序号太大!"); } } void Modify(int j) { system("cls"); Append(j); } void Save() { int k,j; system("cls"); printf("\n\n\t\t请耐心等待,信息正在保存!\n"); printf("\n\n\n\n\t\t\tSaving");
37、 for(k=0;k<20;k++) { Sleep(300); printf("."); } printf("\n\n信息已经保存成功!\n"); fp=fopen("friend.txt","w"); for(j=0;j<=i;j++) { fwrite(&friends[j],sizeof(struct ffriend),1,fp); } fclose(fp); } void main() { int j;char a;char x
38、 char grade; char searchkind[20]; char searchname[20]; Load(); system("cls"); do { printf("\n\n\t\t\t=========================================\n"); printf("\t\t\t\t手机通讯录 \n"); printf("\t\t\t\t功能选择 \n"); print
39、f("\t\t\t=========================================\n"); printf("\t\t\t A.查看 *\n"); printf("\t\t\t B.增添 *\n"); printf("\t\t\t C.删除 *\n"); printf("\t\t\t D.查询 *\n"); printf("\
40、t\t\t E.修改 *\n"); printf("\t\t\t F.保存 *\n"); printf("\t\t\t g.推出 *\n"); printf("\t\t\t=========================================\n"); printf("\t\t\n请选择(Choice)\n\n\t\t注:输入a~h或A~H的字母:"); scanf("%c",&grad
41、e); switch(grade) { case 'a': case 'A': j=0; while(getchar()!=0x1b&&j<=i) { Show(j++); printf("\n\n请按回车键继续!"); } while(getchar()==0x1b|
42、j>i) { if(j==0)printf("\n\t空文档,无任何记录-Empty Note\n"); else printf("\n\t记录已全部显示\n"); printf("\n\n请按回车键继续!"); getchar(); break; } printf("\n\t\t\t\t\t\t\t此次操作结束"); prin
43、tf("\n\t------------------------------------------------------------\t\t\n"); break; case 'b': case 'B': while(i<50) { i++; Append(i); printf("\t是否继续增加?(y/n)")
44、 a=getchar(); if(a=='n') break; } if(i==50) printf("\n\t文档已满,无法增加记录-note full"); printf("\n\t\t\t\t\t\t\t此次操作结束"); printf("\n\t-------
45、\t\t\n"); getchar(); break; case 'c': case 'C': Delete(); if(i<0) printf("\n没有记录-No records\n"); printf("\n\n请按回车键继续!")
46、 getchar(); getchar(); printf("\n\t\t\t\t\t\t\t此次操作结束"); printf("\n\t------------------------------------------------------------\t\t\n"); break; case 'd': case 'D': system("cls");
47、 printf("\n\t请输入要查询记录的相关类别: p.个人类 b.商务类 w.办公类"); scanf("%s",searchkind); getchar(); for(j=0;j<=i;j++) { if(strcmp(searchkind,friends[j].kind)==0) { Show(j); printf("\n\t按回车请继
48、续"); getchar(); } } break; case 'e': case 'E': printf("\n\t请输入要修改记录的相关:"); gets(searchname); scanf("%s",searchname); for(j=0;j<=i;j++) { if(strcmp
49、searchname,friends[j].name)==0) { Modify(j); } } if(i<0) { printf("\n 没有您所要修改的记录-No records"); printf("\n 请按回车键继续!"); getchar();
50、 getchar(); } printf("\n\t\t\t\t\t\t\t此次操作结束"); printf("\n\t------------------------------------------------------------\t\t\n"); break; case 'f': case 'F': system("cls"); Save();






