Bootstrap

数据结构课程设计(通讯录管理系统)

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);
	}
}

;