C语言通讯录管理系统程序代码.docx
C语言通讯录管理系统程序代码-计科1001 赖祥燃 一、 课程设计题目及要求 题目 通讯录管理系统 任务:自学C语言中相关知识,设计出通讯录管理系统。要求如下所述: u 建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等; u 能够提供添加、删除和修改通讯录信息的功能; u 能够提供按姓名或电话等查询; u 将通讯录保存在文件中; u 能够按表格方式输出通讯录信息。 二、系统设计方案 总体框架图: 通讯录管理系统:1、录入通讯录信息 2、修改通讯录信息 3、查询通讯录信息 4、浏览通讯录信息 5、增加通讯录信息 6、推出系通讯录统 模块设计 模块一:头文件,变量定义,函数的声明 对系统所使用的变量进行定义,对函数进行声明 模块二:录入通讯录信息 声明函数void readfile,说明一个文件指针FILE *fp 打开文件"student.txt" 模块三:通讯录信息的查找 声明void seek为查找函数,通过switch(item)设定用学号查找,用姓名查找两个分支 模块四:通讯录信息的修改 第 1 页 -计科1001 赖祥燃 声明void modify为学生信息修改函数,通过switch(item)设定所要修改的项目 模块五:通讯录信息按学号排序 声明void sort将录入通讯录信息系按升序排列,用的是“冒泡排序法”实现排序 模块六:加通讯录信息 声明void insert插入通讯录信息,先通过判断通讯录是否存在,若否则继续输入,若是跳出,重新循环 模块七:通讯录信息 声明void del实现通讯录信息删除,通过学号对比确定要删除的信息,然后用后一个替换掉。 模块八:示学生信息 通过display函数输出通讯录信息 模块九;存信息 通过fp=fopen("student.txt","w");写入信息 模块十:界面菜单 通过switch(num)调用,以上各函数,实现功能 三、设计详情 1. 主函数 主函数设计要求简洁,只提供部分提示语和函数的调用 开始 显示一系列功能选项 N 输入n,判断n是否是18 ? 根据n的值调用各功能模块函数 结束 第 2 页 -计科1001 赖祥燃 图1. 主函数流程图 void menu/* 界面 */ int num; printf(" nn 自动化0901通讯录管理系统 nn"); printf(" * nn"); printf(" * 制作人:翁行兴 * n n"); printf(" * nn"); printf("*系统功能菜单* printf(" - - n"); printf(" * 1.刷新学生信息 * * 2.查询学生信息 * n"); printf(" * 3.修改学生信息 * * 4.增加学生信息 * n"); printf(" * 5.按学号删除信息 * * 6.显示当前信息 * n"); printf(" * 7.保存当前学生信息 * * 8.退出系统 * n"); printf(" - - printf("请选择菜单编号:"); scanf("%d",&num); switch(num) case 1:readfile;break; case 2:seek;break; case 3:modify;break; case 4:insert;break; case 5:del;break; case 6:display;break; case 7:save;break; case 8:k=0;break; default:printf("请在1-8之间选择n"); 第 3 页 n"); n"); -计科1001 赖祥燃 四、源代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #define BUFLEN 100 #define LEN 15 #define N 100 struct record /*结构体*/ char codeLEN+1; /* 学号 */ char nameLEN+1; /* 姓名 */ int age; /* 年龄 */ char sex3; /* 性别 */ char timeLEN+1; /* 出生年月 */ char add30; /* 家庭地址 */ char telLEN+1; /* 电话号码 */ char mail30; /* 电子邮件地址 */ stuN; int k=1,n,m; /* 定义全局变量 */ void readfile;/* 函数声明 */ void seek; void modify; void insert; void del; void display; void save; void menu; int main 第 4 页 -计科1001 赖祥燃 while(k) menu; system("pause"); return 0; void readfile/* 建立信息 */ char *p="student.txt" FILE *fp; int i=0; if (fp=fopen("student.txt","r")=NULL) printf("Open file %s error! Strike any key to exit!",p); system("pause"); exit(0); while(fscanf(fp,"%s %s%d%s %s %s %s %s",stui.code,stui.name,&stui.age, stui.sex,stui.time,stui.add,stui.tel,stui.mail)=8) i+; i=i; fclose(fp); n=i; printf("录入完毕!n"); void seek /*查找*/ int i,item,flag; char s121; /* 以姓名和学号最长长度+1为准 */ printf("-n"); 第 5 页 -计科1001 赖祥燃 printf("-1.按学号查询-n"); printf("-2.按姓名查询-n"); printf("-3.退出本菜单-n"); printf("-n"); while(1) printf("请选择子菜单编号:"); scanf("%d",&item); flag=0; switch(item) case 1: printf("请输入要查询的学生的学号:n"); scanf("%s",s1); for(i=0;i<n;i+) if(strcmp(stui.code,s1)=0) flag=1; printf("学号 姓名 年龄 性别 出生年月 地址 电话 E-mailn"); printf("-n"); printf("%6s %7s %6d %5s %9s %8s %10s %14sn",stui.code,stui.name,stui.age, stui.sex,stui.time,stui.add,stui.tel,stui.mail); if(flag=0) printf("该学号不存在!n"); break; case 2: printf("请输入要查询的学生的姓名:n"); scanf("%s",s1); for(i=0;i<n;i+) if(strcmp(stui.name,s1)=0) 第 6 页 -计科1001 赖祥燃 flag=1; printf(" 学号 姓名 年龄 性别 出生年月 地址 电话 E-mailn"); printf("-n"); printf("%6s %7s %6d %5s %9s %8s %10s %14sn",stui.code,stui.name,stui.age, stui.sex,stui.time,stui.add,stui.tel,stui.mail); if(flag=0) printf("该姓名不存在!n"); break; case 3:return; default:printf("请在1-3之间选择n"); void modify /*修改信息*/ int i,item,num; char sex13,s1LEN+1,s2LEN+1; /* 以姓名和学号最长长度+1为准 */ printf("请输入要要修改的学生的学号:n"); scanf("%s",s1); for(i=0;i<n;i+) if(strcmp(stui.code,s1)=0) /*比较字符串是否相等*/ num=i; printf("-n"); printf("1.修改姓名n"); printf("2.修改年龄n"); printf("3.修改性别n"); printf("4.修改出生年月n"); printf("5.修改地址n"); printf("6.修改电话号码n"); printf("7.修改E-mail地址n"); 第 7 页 -计科1001 赖祥燃 printf("8.退出本菜单n"); printf("-n"); while(1) printf("请选择子菜单编号:"); scanf("%d",&item); switch(item) case 1: printf("请输入新的姓名:n"); scanf("%s",s2); strcpy(stunum.name,s2); break; case 2: printf("请输入新的年龄:n"); scanf("%d",&stunum.age);break; case 3: printf("请输入新的性别:n"); scanf("%s",sex1); strcpy(stunum.sex,sex1); break; case 4: printf("请输入新的出生年月:n"); scanf("%s",s2); strcpy(stunum.time,s2); break; case 5: printf("请输入新的地址:n"); scanf("%s",s2); strcpy(stunum.add,s2); break; case 6: printf("请输入新的电话号码:n"); scanf("%s",s2); 第 8 页 -计科1001 赖祥燃 strcpy(stunum.tel,s2); break; case 7: printf("请输入新的E-mail地址:n"); scanf("%s",s2); strcpy(stunum.mail,s2); break; case 8:return; default:printf("请在1-8之间选择n"); void sort/*按学号排序*/ int i,j,*p,*q,s; char temp10; for(i=0;i<n-1;i+) for(j=n-1;j>i;j-) if(strcmp(stuj-1.code,stuj.code)>0) strcpy(temp,stuj-1.code); strcpy(stuj-1.code,stuj.code); strcpy(stuj.code,temp); strcpy(temp,stuj-1.name); strcpy(stuj-1.name,stuj.name); strcpy(stuj.name,temp); strcpy(temp,stuj-1.sex); strcpy(stuj-1.sex,stuj.sex); strcpy(stuj.sex,temp); strcpy(temp,stuj-1.time); strcpy(stuj-1.time,stuj.time); 第 9 页 -计科1001 赖祥燃 strcpy(stuj.time,temp); strcpy(temp,stuj-1.add); strcpy(stuj-1.add,stuj.add); strcpy(stuj.add,temp); strcpy(temp,stuj-1.tel); strcpy(stuj-1.tel,stuj.tel); strcpy(stuj.tel,temp); strcpy(temp,stuj-1.mail); strcpy(stuj-1.mail,stuj.mail); strcpy(stuj.mail,temp); p=&stuj-1.age; q=&stuj.age; s=*q; *q=*p; *p=s; void insert /*插入函数*/ int i=n,j,flag; printf("请输入待增加的学生数:n"); scanf("%d",&m); do flag=1; while(flag) flag=0; printf("请输入第 %d 个学生的学号:n",i+1); 第 10 页 -计科1001 赖祥燃 scanf("%s",stui.code); for(j=0;j<i;j+) if(strcmp(stui.code,stuj.code)=0) printf("已有该学号,请检查后重新录入!n"); flag=1; break; /*如有重复立即退出该层循环,提高判断速度*/ printf("请输入第 %d 个学生的姓名:n",i+1); scanf("%s",stui.name); printf("请输入第 %d 个学生的年龄:n",i+1); scanf("%d",&stui.age); printf("请输入第 %d 个学生的性别:n",i+1); scanf("%s",stui.sex); printf("请输入第 %d 个学生的出生年月:(格式:年.月)n",i+1); scanf("%s",stui.time); printf("请输入第 %d 个学生的地址:n",i+1); scanf("%s",stui.add); printf("请输入第 %d 个学生的电话:n",i+1); scanf("%s",stui.tel); printf("请输入第 %d 个学生的E-mail:n",i+1); scanf("%s",stui.mail); if(flag=0) i=i; i+; while(i<n+m); 第 11 页 -计科1001 赖祥燃 n+=m; printf("录入完毕!nn"); sort; void del int i,j,flag=0; char s1LEN+1; printf("请输入要删除学生的学号:n"); scanf("%s",s1); for(i=0;i<n;i+) if(strcmp(stui.code,s1)=0) flag=1; for(j=i;j<n-1;j+) stuj=stuj+1; if(flag=0) printf("该学号不存在!n"); if(flag=1) printf("删除成功,显示结果请选择菜单6n"); n-; void display int i; printf("所有学生的信息为:n"); printf("学号 姓名 年龄 性别 出生年月 地址 电话 第 12 页 E-mailn"); -计科1001 赖祥燃 printf("-n"); for(i=0;i<n;i+) printf("%6s %7s %5d %5s %9s %8s %10s %14sn",stui.code,stui.name,stui.age, stui.sex,stui.time,stui.add,stui.tel,stui.mail); void save int i; FILE *fp; fp=fopen("student.txt","w"); /*写入*/ for(i=0;i<n;i+) fprintf(fp,"%s %s %d %s %s %s %s %sn",stui.code,stui.name,stui.age, stui.sex,stui.time,stui.add,stui.tel,stui.mail); fclose(fp); void menu/* 界面 */ int num; printf(" nn 自动化0901学生信息管理系统 nn"); printf(" * nn"); printf(" * 制作人:翁行兴 * n n"); printf(" * nn"); printf("*系统功能菜单* printf(" - - n"); printf(" * 1.刷新学生信息 * * 2.查询学生信息 * n"); printf(" * 3.修改学生信息 * * 4.增加学生信息 * n"); 第 13 页 n"); -计科1001 赖祥燃 printf(" * 5.按学号删除信息 * * 6.显示当前信息 * n"); printf(" * 7.保存当前学生信息 * * 8.退出系统 * n"); printf(" - - n"); printf("请选择菜单编号:"); scanf("%d",&num); switch(num) case 1:readfile;break; case 2:seek;break; case 3:modify;break; case 4:insert;break; case 5:del;break; case 6:display;break; case 7:save;break; case 8:k=0;break; default:printf("请在1-8之间选择n"); 五调试过程 一主界面 第 14 页 -计科1001 赖祥燃 二测试数据 当选择4增加学生信息时,出现对话框,先输入增加的数量。再按要求依次输入,如图 输入两组数据,按6查询。如图 第 15 页 -计科1001 赖祥燃 按3修改信息,如图,输入要修改学生的学号 然后选择要修改的选项,例如修改姓名,如图 然后再按6查询,如图 修改成功! 删除信息,先选择5,按学号删除,如图 再依据提示按6查询剩余的通讯录,如图 第 16 页 -计科1001 赖祥燃 学号为03的已经成功删除! 三依然存在的问题 1,第一次输入的数据到了第二次就不能够保存,可能是编写保存的函数没有编到位 2,对于显示时不能每一次操作之后都换一个屏,使得众多的操作都集中在一个屏上,显得不美观。 六课程设计总结 通过C课程设计这门课,使我对C语言这门课程有了更深一步的了解。它是计算机程序设计的重要理论技术基础,在我们信息科学与工程学院自动化专业的学习中占据着十分重要的地位。同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。在遇到不懂的时候,要善于请教他认,不要认为自己什么都懂,这种想法是极其错误的,只有不断吸收他人好的方面,充实自己,自己才能不断的进步。 第 17 页