C语言课程设计通讯录管理系统文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)***科技大学本科生课程设计说明书题目:C语言课程设计——通讯录管理系统学生姓名:**学号:***专业:软件工程班级:1指导教师:**内蒙古科技大学课程设计任务书一、教学要求1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力二、设计资料及参数每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
通讯录管理系统现有一批通讯录的数椐,要求输入计算机并存放在内存中,然后增加若干个新通讯录的记录,并可输出通讯录清单,实现文件存盘和读入文件进行修改的功能。
通讯录的基本信息包括编号,姓名,电话号码,QQ号码,电子邮件,通讯地址。
要求设计菜单来调用其各功能模块:新建文件、打开文件、保存信息到文件输入记录、输出记录查询记录(至少具有两种查询方式,例如以姓名查询和以电话号码查询)修改、插入和删除记录三、设计要求及成果1. 分析课程设计题目的功能需求(可选用数组或链表实现,可多人(最多3人)协作完成一个题目)2. 写出详细设计说明(至少包括功能实现分析和模块流程图)3. 编写程序代码,调试程序使其能正确运行(代码书写要规范,标示符要见名知意,要有必要的注释,每人至少3个函数,每人至少200行代码,不包括注释和花括号)4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告(请严格按照模板进行排版)四、进度安排第一天? 选择课程设计题目,分析课题的要求第二天? 编程第三天? 编程及调试第四天? 写课程设计报告目录第一章需求分析1.1引言通过程序设计,达到理论与实际应用相结合,提高对信息管理系统的分析能力,能够根据实际应用,初步实现系统功能模块及算法的设计,通过编程基本实现信息管理系统。
1.2任务概述1.采用结构体的形式对数据进行输入输出。
2.可以对通讯录进行简单的排序,筛选,删除。
3.可以对任意信息就行修改。
4.可以把数据已文件的形式输入输出。
5.任意浏览信息。
1.3数据描述以所示的文本数据位初始数据进行简单操作,也可另行添加。
1.4功能需求实现以上功能需求。
1.5性能需求1.能够进行简单的数据处理。
2.具有对新信息处理打印打能力。
1.6运行需求1.输入个人信息时以例如按照“编号、姓名、年龄、电话号码、通讯地址、电子邮箱”的顺序输入。
2.输入时编号年龄、电话号码、通讯地址、电子邮箱以数字格式输入,输入姓名以文字输入。
3.以(Y/N)形式判断时,仅限N或者n为否,其他字符真。
4.进入排序功能后,要想见排序信息,到主菜单下见浏览信息功能。
1.7任务计划1.样例输入和输出2.本通讯录管理程序,可以对数据进行输入输出,集排序,修改,打印,删除等功能。
下面以上述数据描述的数据为测试数据进行简单输入输出。
——1.未排序前的信息4).删除界面:删除后,通讯录里的显示记录:5).查询界面:以姓名查询方式为例:6).修改界面:修改后,通讯录里的显示记录:7).保存界面:文件截图:第二章概要设计2.1总体设计添加:可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱后,会提示是否继续添加。
显示:可以以表格形式输出所有通讯录里的记录删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容查询:可以选择用姓名、电话、地址三种方式查询修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改保存:,输入文件名(带后缀名)后,即可将通讯录信息保存到文件2.2数据类型设计(或数据结构设计)typedef struct{char score; /*编号*/char name[10]; /*姓名*/char num[15]; /*号码*/char email[20]; /*邮箱*/char age[8]; /*年龄*/char adds[20]; /*住址*/ }Person;以结构体数组类型输入数据。
2.3接口设计表:函数列表2.4运行界面设计void main() /*主函数*/ {int n=0;for(;;){switch(menu_select()){case 1:printf("\n\t添加记录到通讯录\n"); /*添加记录*/n=Input(pe,n);break;case 2:printf("\n\t\t\t 通讯录记录表\n"); /*显示记录*/Display(pe,n);break;case 3:printf("\n\t从通讯录中删除记录\n");n=Delete_a_record(pe,n);/*删除记录*/printf("\t");system("pause");break;case 4:printf("\n\t在通讯录中查找记录\n"); Query_a_record(pe,n);/*查找记录*/printf("\t");system("pause");break;case 5:printf("\n\t修改通讯录中的记录\n"); Change(pe,n);/*修改数据*/printf("\t");system("pause");break;case 6:printf("\n\t保存功能\n"); WritetoText(pe,n);/*保存数据*/printf("\t");system("pause");break;case 0:printf("\n\t\t谢谢使用,再见!\n");/*结束程序*/printf("\n\t\t");system("pause");exit(0);}}}以switch为关键控制选着要调用函数的开关,然后以主菜单为主界面,其他功能为扩展界面来运行通讯录管理系统。
主菜单代码为:int menu_select(){char c;do{system("cls");printf("\t\t *****通讯录***** \n");printf("\t\t |----------------------------------|\n");printf("\t\t│ 1. 添加记录│\n");printf("\t\t│ 2. 显示记录│\n");printf("\t\t│ 3. 删除记录│\n");printf("\t\t│ 4. 查询记录│\n");printf("\t\t│ 5. 修改记录│\n");printf("\t\t│ 6. 保存记录│\n");printf("\t\t│ 0. 退出程序│\n");printf("\t\t\|----------------------------------|n");printf("\t\t请您选择(0-6):");c=getchar();}while(c<'0'||c>'6');return(c-'0');}如图所示为主要运行界面:第三章详细设计3.1输入模块设计int Input(Person per[],int n){int i=0;char sign,x[10];while(sign!='n'&&sign!='N'){printf("\t编号:");scanf("\t%d",&per[n+i].score);printf("\t姓名:");scanf("\t%s",per[n+i].name);printf("\t年龄:");scanf("\t%s",per[n+i].age);printf("\t电话号码:");scanf("\t%s",per[n+i].num);printf("\t通讯住址:");scanf("\t%s",per[n+i].adds);printf("\t电子邮箱:");scanf("\t%s",per[n+i].email);gets(x);printf("\n\t是否继续添加?(Y/N)");scanf("\t%c",&sign);i++;}return(n+i);}3.2输出模块设计void Display(Person per[],int n){int i;printf("----------------------------------------------------------------------\n"); /*格式*/printf("编号姓名年龄电话号码通讯地址电子邮箱\n");printf("----------------------------------------------------------------------\n");for(i=1;i<n+1;i++) {printf("%-5d%-8s%-6s%-13s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].adds,per[i-1].email);if(i>1&&i%10==0){printf("\t-----------------------------------\n");printf("\t");system("pause");printf("\t-----------------------------------\n");}}printf("----------------------------------------------------------------------\n");system("pause");}3.3查找模块设计void Query_a_record(Person per[],int n){int m;printf("\t\n请选择查询方式:\n");printf("\t┌──────┐\n");printf("\t│1------姓名│\n");printf("\t│2------电话│\n");printf("\t│3------地址│\n");printf("\t│4------返回│\n");printf("\t└──────┘\n");printf("请选择:");scanf("%d",&m);while(m!=1&&m!=2&&m!=3&&m!=4){printf("输入错误,请重新选择:");scanf("%d",&m);}if(m==1){char s[20];int i=0;printf("\t请输入想查询的姓名:");scanf("\t%s",s);while(strcmp(per[i].name,s)!=0&&i<n) i++;if(i==n){printf("\t通讯录中没有此人!\n");return;}printf("\t此人编号: %d\n",per[i].score);printf("\t此人年龄: %s\n",per[i].age);printf("\t电话号码: %s\n",per[i].num);printf("\t通讯地址: %s\n",per[i].adds);printf("\t电子邮箱: %s\n",per[i].email); } ;if(m==2){char s[20];int i=0;printf("\t请输入想查询的电话:");scanf("\t%s",s);while(strcmp(per[i].num,s)!=0&&i<n) i++;if(i==n){printf("\t通讯录中没有此人!\n");return;}printf("\t此人编号: %d\n",per[i].score);printf("\t此人姓名: %s\n",per[i].name);printf("\t此人年龄: %s\n",per[i].age);printf("\t通讯地址: %s\n",per[i].adds);printf("\t电子邮箱: %s\n",per[i].email); } ;if(m==3){char s[20];int i=0;printf("\t请输入想查询的地址:");scanf("\t%s",s);while(strcmp(per[i].adds,s)!=0&&i<n) i++;if(i==n){printf("\t通讯录中没有此人!\n");return;}printf("\t此人编号: %d\n",per[i].score);printf("\t此人姓名: %s\n",per[i].name);printf("\t此人年龄: %s\n",per[i].age);printf("\t电话号码: %s\n",per[i].num);printf("\t电子邮箱: %s\n",per[i].email);} ;}3.4删除模块设计int Delete_a_record(Person per[],int n){char s[20];int i=0,j;printf("\t请输入想删除记录中的名字:");scanf("%s",s);while(strcmp(per[i].name,s)!=0&&i<n) i++;if(i==n){printf("\t通讯录中没有此人!\n");return(n);}for(j=i;j<n-1;j++){strcpy(per[j].num,per[j+1].num);strcpy(per[j].name,per[j+1].name);strcpy(per[j].age,per[j+1].age);strcpy(per[j].adds,per[j+1].adds);strcpy(per[j].email,per[j+1].email);per[j].score=per[j+1].score;}printf("\t\t\t已经成功删除!\n");return(n-1);}3.5更改模块设计void Change(Person per[],int n){char s[20];int i=0;printf("\t请输入想修改的记录中的名字:");scanf("%s",s);while(strcmp(per[i].name,s)!=0&&i<n) i++;if(i==n){printf("\t通讯录中没有此人!\n");return;}printf("\t编号:");scanf("\t%d",&per[i].score);printf("\t姓名:");scanf("\t%s",per[i].name);printf("\t年龄:");scanf("\t%s",per[i].age);printf("\t电话号码:");scanf("\t%s",per[i].num);printf("\t通讯住址:");scanf("\t%s",per[i].adds);printf("\t电子邮箱:");scanf("\t%s",per[i].email);printf("\t修改成功!");}保存模块设计void WritetoText(Person per[],int n){int i=0;FILE *fp; /*定义文件指针*/char filename[20]; /*定义文件名*/printf("\t保存到文件\n"); /*输入文件名*/printf("\t请输入所保存的文件名:");scanf("\t%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("\t无法打开文件\n");system("pause");return;}fprintf(fp,"******************************************通讯录******************************************\n");fprintf(fp,"编号姓名年龄电话号码通讯地址电子邮箱\n");fprintf(fp,"------------------------------------------------------------------------------------------\n");while(i<n){fprintf(fp,"%-3d\t%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",per[i].score,per[i].name,per[i].age,per[i].num,per[i].ad ds,per[i].email);i++;}fprintf(fp,"------------------------------------------------------------------------------------------\n");fprintf(fp,"***************************************共有%d 条记录****************************************\n",n);fclose(fp); /*关闭文件*/printf("保存成功!\n");}void main() /*主函数*/{int n=0;for(;;){switch(menu_select()){case 1:printf("\n\t添加记录到通讯录\n"); /*添加记录*/n=Input(pe,n);break;case 2:printf("\n\t\t\t 通讯录记录表\n"); /*显示记录*/Display(pe,n);break;case 3:printf("\n\t从通讯录中删除记录\n");n=Delete_a_record(pe,n);/*删除记录*/printf("\t");system("pause");break;case 4:printf("\n\t在通讯录中查找记录\n"); Query_a_record(pe,n);/*查找记录*/printf("\t");system("pause");break;case 5:printf("\n\t修改通讯录中的记录\n"); Change(pe,n);/*修改数据*/printf("\t");system("pause");break;case 6:printf("\n\t保存功能\n"); WritetoText(pe,n);/*保存数据*/printf("\t");system("pause");break;case 0:printf("\n\t\t谢谢使用,再见!\n"); /*结束程序*/printf("\n\t\t");system("pause");exit(0);}}}第四章测试分析4.1测试程序执行情况1).显示的主菜单界面2).添加界面:3).显示界面:4).删除界面:删除后,通讯录里的显示记录:5).查询界面:以姓名查询方式为例:6).修改界面:修改后,通讯录里的显示记录:7).保存界面:大部分功能以按上面图文描述,有不足的地方请老师批评指正。