1、课程设计任务
1.1、题目
通讯录管理系统
1.2、要求
(1)添加联系人的信息到通讯录中,包括:姓名、性别、城市、邮编、手机号、QQ号、Email;
(2)可按姓名、手机号查询联系人信息;
(3)实现现有联系人信息的浏览、修改、删除功能。
2、总体设计
2.1、功能模块设计
根据课程设计题目的功能要求,各个功能模块的组成框图如下:
图2-1 通讯录管理系统功能组成框图
2.2、所有功能模块的流程图
图2-2 通讯录项目操作清单流程图
图2-3 添加信息功能 图2-4 插入信息功能
图2-5 删除信息功能
图2-6 修改信息功能
图2-7 查找信息功能
图2-8 显示信息功能
3、详细设计
模块功能说明:如函数功能、入口及出口参数说明,函数调用关系描述等;
3.1、程序中各变量、常量及函数说明
typedef struct //每个成员的信息
{
char name[10]; //姓名
char sex[5]; //性别
char place[10]; //地址
char num[10]; //邮编
char tel[20]; //电话
char qq[15]; //QQ
char email[20]; //Email
}Address;
typedef Address ElemType;
typedef struct //所有成员信息
{
ElemType data[MAX];
int len;
}AddressList;
程序中所用函数:
显示要操作的项目清单:void menu();
对通讯录进行初始化:AddressList *Init();
创造通讯录各个成员的信息:void Create(AddressList *L);
对通讯录插入成员的信息:int Insert(AddressList *L);
按顺序删除成员信息:int Delete(AddressList *L,int i);
选择删除方式删除成员信息:void Deleteway(AddressList *L1);
修改通讯录成员信息:void Update(AddressList *L);
对要查询的成员进行提示操作:void SearchContact(AddressList *L);
按照名字查找成员信息:int FindByname(AddressList *L,char name[]);
按照手机号查找成员信息:int FindBytel(AddressList *L,char tel[]);
显示通讯录各个成员的信息:void Output(AddressList *L);
3.2、子模块的设计与实现
1.主函数设计:根据菜单的选项调用各函数,并完成相应的功能。运用while判断用户输入的数值是为7,为7退出通讯录管理系统,然后运用switch函数进行功能的选择。
2.清单设计:显示提示选单。使用printf函数进行界面排版。
3.添加信息设计:创建新的联系人信息,其信息主要包括名字、性别、地址、邮编、电话、QQ、Email,输入一条信息后,判断是否继续输入其他数据,使用循环结构进行多次写入。
4.插入信息设计:判断插入位置是否合法,若不合法则显示位置不合法并返回菜单,若合法则再插入新的联系人信息,插入成功后,显示通讯录中所以数据,并返回菜单。
5.删除信息设计:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。根据客户输入的修改方式进入对应的删除界面,再根据输入值进行删除,最终确定客户是否删除,取消删除或删除成功后返回菜单。运用if的嵌套来判断客户想要实现的功能,再用for循环来查找数据,进行删除操作。
6.更新信息设计:修改某条记录的信息,输入想要修改的联系人信息,如果未找到要修改的记录,则提示系统中无此记录,并返回菜单。找到记录后,根据客户输入的电话进行修改,修改成功后显示修改成功并返回菜单。
7.查找信息设计:按所需查询相关信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。先判断客户要根据什么值查找,再根据输入值进行判断查找,找到就输出其他信息,没找到就返回菜单。运用和if的嵌套来判断客户想要实现的功能,再用for循环来查找数据,进行显示操作。
8.显示信息设计:显示通讯录所有联系人的信息。
4、调试与测试
4.1、调试方法与步骤
第一步:添加联系人的信息:连续输入四条联系人的信息,包括:名字、性别、地址、邮编、电话、QQ、Email信息。
第二步:插入联系人的信息:首先测试插入合法位置,插入数据后显示插入成功,同时显示插入成功及通讯录中所以的详细数据;其次在数据外的地方插入数据,数据输入之后,显示插入不成功。
第三步:更新联系人的信息:测试过程中,输入联系人电话,若存在,则更改成所需要的信息,若更改联系人的电话不存在,则显示所要修改信息不存在。
第四步:显示联系人的信息:显示通讯录中所有的联系人详细信息。
第五步:查找联系人的信息:首先按姓名查找,姓名若存在,则显示查找姓名所有的数据,若不存在,则显示空数据;其次按电话查找,电话存在,则显示该电话所对应的联系人所有信息,若查找电话不存在,则显示空数据。
第六步:删除联系人的信息:首先按顺序删除联系人信息,查看联系人所在顺序,删除所要删除的联系人,删除后显示删除成功并显示剩余数据;其次按电话删除联系人信息,输入所需删除的联系人,删除后显示删除成功并显示剩余数据。
第七步:退出通讯录管理系统。
4.2、测试结果的分析与讨论
1.测试菜单功能和主函数是否可以正常运行与显示,结果如下:
图4-1 显示需要操作的项目图
2.测试添加数据能否进行正常添加,添加四条数据:
图4-2 添加联系人信息图
3.插入数据:插入在合法位置时,插入数据后显示插入成功,同时返回通讯录中所有信息,插入不合法时,返回插入不成功,同时返回菜单界面。测试结果如下显示:
图4-3 插入数据合法图
图4-4 插入数据不合法图
4.更新数据:输入联系人电话,若存在,更改所需信息,若不存在,则返回修改信息不存在,同时返回菜单,测试结果如下:
图4-5 修改数据成功图
图4-6 修改数据不存在图
5.显示通讯录中联系人所有的信息,测试结果如下:
图4-7 显示联系人信息图
6.查找数据:按照数据的姓名和电话进行查找,姓名相同的情况下输出所有数据信息,若姓名或电话不存在,则输出空数据,测试结果如下:
图4-8 按姓名查找数据存在图
图4-9 按姓名查找数据不存在图
图4-10 按电话查找数据存在图
图4-11 按电话查找数据不存在图
7.删除数据:按照数据的顺序或者电话进行删除数据,测试结果如下:
图4-12 按顺序删除联系人信息图
图4-13 按电话删除联系人信息图
8.退出通讯录管理系统:
图4-14 退出通讯录管理系统图
5、源程序清单
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct //每个成员的信息
{
char name[10];
char sex[5];
char place[10];
char num[10];
char tel[20];
char qq[15];
char email[20];
}Address;
typedef Address ElemType;
typedef struct //所有成员信息
{
ElemType data[MAX];
int len;
}AddressList;
//实现功能
void menu();//显示要操作的项目清单
AddressList *Init();//对通讯录进行初始化
void Create(AddressList *L);//创造通讯录各个成员的信息
int Insert(AddressList *L);//对通讯录插入成员的信息
int Delete(AddressList *L,int i);//按顺序删除成员信息
void Deleteway(AddressList *L1);//选择删除方式删除成员信息
void Update(AddressList *L);//修改通讯录成员信息
void SearchContact(AddressList *L);//对要查询的成员进行提示操作
int FindByname(AddressList *L,char name[]);//按照名字查找成员信息
int FindBytel(AddressList *L,char tel[]);//按照手机号查找成员信息
void Output(AddressList *L);//显示通讯录各个成员的信息
//选择想要实现的功能
int main()
{
AddressList *L1;
menu();
printf("请选择要运行的项目:");
int a;
scanf("%d",&a);
while(a!=7){
switch(a)
{
case 1:
L1 = Init();
Create(L1);
break;
case 2:
Insert(L1);
break;
case 3:
Deleteway(L1);
break;
case 4:
Update(L1);
break;
case 5:
SearchContact(L1);
break;
case 6:
Output(L1);
break;
default:
printf("输入错误!");
}
printf("请选择要运行的项目:");
scanf("%d",&a);
}
printf("您已成功退出系统!");
return 0;
}
//显示项目操作清单
void menu()
{
printf("------------------------欢迎来到通讯录管理系统-------------------------\n");
printf(" 1.添加联系人的信息 \n");
printf(" 2.插入联系人的信息 \n");
printf(" 3.删除联系人的信息 \n");
printf(" 4.更改联系人的信息 \n");
printf(" 5.查找联系人的信息 \n");
printf(" 6.显示联系人的信息 \n");
printf(" 7.退出通讯录管理系统\n");
printf("-----------------------------------------------------------------------\n");
}
//通讯录初始化
AddressList *Init()
{
AddressList *L;
//为通讯录分配内存
L=(AddressList *)malloc(sizeof(AddressList ));
if(L==NULL)//判断内存分配是否成功
{
printf("内存分配失败,结束程序\n");
exit(0);
}
else
{
L->len=0; //将通讯录的长度设置为0
return L; //返回通讯录的地址
}
}
//创建通讯录
void Create(AddressList *L)
{
ElemType x; //用于存储顺序表数据
int i=0,flag; //用于标志
flag=1;
while(flag!=0) //判断是否输入下一个数据
{
printf("请输入姓名 :");
scanf("%s",x.name);
printf("请输入性别 :");
scanf("%s",x.sex);
printf("请输入城市 :");
scanf("%s",x.place);
printf("请输入邮编 :");
scanf("%s",x.num);
printf("请输入电话 :");
scanf("%s",x.tel);
printf("请输入Q Q :");
scanf("%s",x.qq);
printf("请输入Email:");
scanf("%s",x.email);
//将输入的数据放置在通讯录对应的位置
strcpy(L->data[i].name ,x.name );
strcpy(L->data[i].sex ,x.sex);
strcpy(L->data[i].place ,x.place);
strcpy(L->data[i].num ,x.num);
strcpy(L->data[i].tel ,x.tel);
strcpy(L->data[i].qq ,x.qq);
strcpy(L->data[i].email ,x.email);
L->len++;//增加一个数据,顺序表的长度加1
i++;
printf("是否继续输入,继续请输入1,结束请输入0,请输入:");
scanf("%d",&flag); //输入标志
getchar(); //去掉输入标志时输入的回车,为下次输入数据做好准备
}
}
//在通讯录的第i个位置插入一个联系人信息
int Insert(AddressList *L)
{
int i;
printf("您要插入在第几个:");
scanf("%d",&i);
ElemType x;
ElemType* p = &x;
printf("插入的联系人姓名为 :");
scanf("%s",p->name);
printf("插入的联系人性别为 :");
scanf("%s",p->sex);
printf("插入的联系人地址为 :");
scanf("%s",p->place);
printf("插入的联系人邮编为 :");
scanf("%s",p->num);
printf("插入的联系人电话为 :");
scanf("%s",p->tel);
printf("插入的联系人Q Q为 :");
scanf("%s",p->qq);
printf("插入的联系人的Email为:");
scanf("%s",p->email);
int j;
if(i>=1 && i<=L->len+1)//判断i的位置是否有效
{
for(j=L->len-1;j>=i-1;j--)//将原本第i个位置的数据往后移
{
strcpy(L->data[j+1].name ,L->data[j].name );
strcpy(L->data[j+1].sex ,L->data[j].sex );
strcpy(L->data[j+1].place ,L->data[j].place );
strcpy(L->data[j+1].num ,L->data[j].num );
strcpy(L->data[j+1].tel ,L->data[j].tel );
strcpy(L->data[j+1].qq ,L->data[j].qq );
strcpy(L->data[j+1].email ,L->data[j].email );
}//在第i个位置插入数据
strcpy(L->data[i-1].name ,x.name );
strcpy(L->data[i-1].sex ,x.sex );
strcpy(L->data[i-1].place ,x.place );
strcpy(L->data[i-1].num ,x.num );
strcpy(L->data[i-1].tel ,x.tel );
strcpy(L->data[i-1].qq ,x.qq );
strcpy(L->data[i-1].email ,x.email );
L->len ++; //插入新数据,线性表的长度加1
printf("插入成功,通讯录信息为:\n");
Output(L);
return 1;//插入成功返回1
}
else
{
printf("无法插入,插入的位置不合法\n");
return 0;//插入失败返回0
}
}
//在通讯录的第i个位置删除一个联系人信息
int Delete(AddressList *L,int i)
{
int j;
if(i>=1&&i<=L->len){//判断i的位置是否有效
for(j=i;j<=L->len-1;j++)
{
L->data[i-1] = L->data[j];
}
L->len--;//删除数据,线性表的长度减1
printf("已成功删除第%d个\n",i);
printf("删除成功后显示为:\n");
Output(L);
return 1;//删除成功返回1
}
return -1;
}
//删除联系人信息的方式
void Deleteway(AddressList *L1)
{
int m;
printf("删除的方式为:1、按顺序,2、按电话\n");
scanf("%d",&m);
if(m==1){
int x;
printf("请输入删除的联系人顺序:");
scanf("%d",&x);
Delete(L1,x);
}
if(m==2){
char tel[MAX];
printf("请输入删除的联系人电话:");
scanf("%s",tel);
int i = FindBytel(L1,tel)+1;
Delete(L1,i);
}
}
//更新联系人的信息
void Update(AddressList *L)
{
printf("请输入要修改的联系人电话:");
char tel[MAX];
scanf("%s", tel);
int i = FindBytel(L, tel);
if (i == -1)
{
printf("您要修改的信息不存在\n");
}
else
{
printf("请更改姓名 :");
scanf("%s", (L->data)[i].name);
printf("请更改性别 :");
scanf("%s", (L->data[i]).sex);
printf("请更改城市 :");
scanf("%s", (L->data[i]).place);
printf("请更改邮编 :");
scanf("%s", (L->data[i]).num);
printf("请更改电话 :");
scanf("%s", (L->data[i]).tel);
printf("请更改Q Q :");
scanf("%s", (L->data[i]).qq);
printf("请更改Email:");
scanf("%s", (L->data[i]).email);
printf("修改成功\n");
}
}
//查找联系人的信息
void SearchContact(AddressList *L)
{
int x;
printf("请输入查找的方式:1、按姓名 2、按电话\n");
scanf("%d",&x);
if(x==1)
{
char name[MAX];
printf("请输入查找的联系人姓名:");
scanf("%s",name);
int i = 0;
printf("你要找的人的信息为:\n");
printf("姓名\t 性别\t 城市\t 邮编\t\t 电话\t\t QQ\t\t Email\t\n");
i = FindByname(L,name);
}else if(x==2){
char tel[MAX];
printf("请输入查找的联系人电话:");
scanf("%s",tel);
int i = 0;
i = FindBytel(L,tel);
printf("你要找的人的信息为:\n");
printf("姓名\t 性别\t 城市\t 邮编\t\t 电话\t\t QQ\t\t Email\t\n");
printf("%s\t %s\t %s\t %s\t %s\t %s\t %s\t\n", L->data[i].name , L->data[i].sex , L->data[i].place , L->data[i].num , L->data[i].tel , L->data[i].qq , L->data[i].email);
}else{
printf("输入方式有误!\n");
}
}
//按姓名查找
int FindByname(AddressList *L,char name[])
{
int i;
for(i=0;i<=L->len+1;i++)
{
if(strcmp(L->data[i].name,name) == 0)//比较姓名是否相等
{
printf("%s\t %s\t %s\t %s\t %s\t %s\t %s\t\n", L->data[i].name , L->data[i].sex , L->data[i].place , L->data[i].num , L->data[i].tel , L->data[i].qq , L->data[i].email);
}
}
return -1;
}
//按电话查找
int FindBytel(AddressList *L,char name[])
{
int i;
for(i=0;i<L->len;i++)
{
if(strcmp(L->data[i].tel,name) == 0)
{
return i;
}
}
return -1;
}
//显示通讯录中联系人的所有信息
void Output(AddressList *L)
{
int i;
printf("姓名\t 性别\t 城市\t 邮编\t\t 电话\t\t QQ\t\t Email\t\n");
for(i=0;i<=L->len -1;i++)
{
printf("%s\t %s\t %s\t %s\t %s\t %s\t %s\t\n", L->data[i].name , L->data[i].sex , L->data[i].place , L->data[i].num , L->data[i].tel , L->data[i].qq , L->data[i].email);
}
}