设计一个完整的通讯录管理系统。信息至少包含编号、姓名、年龄、电话、籍贯、单位等。
功能要求如下:
1.管理员功能
(1)建立通讯录信息;(通讯录信息利用文件存储)
(2)能够提供添加、删除和修改通讯录信息的功能;
(3)能够按表格方式输出通讯录信息;
(4)按籍贯或单位统计通讯录人员信息。
2.普通用户功能
(1)按姓名或单位查询;
(2)实现电话的模糊查询(即输入电话的前几位即可查询);
(3)根据您输入单位自动生成某单位的内部通讯录(按照年龄从大到小保存在一个新的文件中);
(4)输出某单位的内部通讯录信息。
本通讯录管理系统具有两个用户状态下的模式,可以通过用户账号进行登录,也可通过管理员账号进行登录;具体如下图所示。
定义一个结构体类型list,包括姓名、年龄、编号、电话、籍贯、单位,共6个结构体成员;使用define定义结构体的长度LEN。
#define LEN sizeof(struct list) //宏定义结构体长度
struct list
{
char name[30]; //名字
char age[30]; //年龄
int number; //编号 自动生成
char handset[30]; //电话
char address[30]; //籍贯
char unit[30];//单位
};
函数名 | 功能说明 |
---|---|
void admin | 管理员界面 |
void user | 用户界面 |
void exit | 退出 |
void admin_est | 建立通讯录 |
void est_add | 添加通讯录 |
void est_delet | 删除通讯录 |
void est_renew | 修改通讯录 |
void admin_print_all | 输出通讯录全部信息 |
void admin_tongji | 统计通讯录信息 |
void user_jqcx | 精确查找 |
void user_mhcx | 模糊查找 |
void user_save | 保存通讯录到文件 |
sort_computer | 按计算机成绩排序 |
void user_paixu | 按姓名字母排序 |
void user_print | 输出单位通讯录 |
注意!这里的文件不能忘记了登录系统时所必须的!文件与CPP程序在同一个目录下,也可以根据个人需要更改位置,但对应的源程序文件读写位置也应做相应的更改。
本系统使用两个磁盘文件:
(1)存放通讯录联系人信息的文件(test.txt)
(2)存放成绩单信息的文件(安工.dat)
(3)存放管理员与用户进入系统密码的文件(num_key.txt)
主界面显示本系统名称及制作者学号和姓名。在本界面中显示两个用户,分别为管理员和用户。选择1管理员,进入管理员模块,需要输入管理员密码;选2用户,进入用户模块,需要输入用户密码;选择3退出系统,离开该系统。
此模块主函数**main()**代码如下:
void main() //主函数 主界面
{
printf(">>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf("< 程序作者:Mye_Strive >\n");
printf("< 班级:计算机 >\n");
printf("< 学号:123456 >\n");
printf("<<<<<<<<<<<<<<<<<<<<<<<<<\n");
printf("\n");
while(1)
{
char num[10];
printf(" ┌─────────┐\n");
printf(" │ 主界面 │\n");
printf(" └─────────┘\n");
printf(" ┌─────────────┐\n");
printf(" │ 1 管理员系统│\n");
printf(" │ 2 用户系统 │\n");
printf(" │ 3 退出 │\n");
printf(" └─────────────┘\n");
printf("\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf(" 请输入您的操作\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(num);
printf("\n");
if(strlen(num)>1)
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
continue;
}
switch(*num)
{
case '1':
{
admin();
}
break;
case '2':
{
user();
}
break;
case '3':
{
exit();
return ;
}break;
default :
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
}
break;
}
}
}
该模块主要由三大模块组成:建立通讯录信息模块、输出通讯录信息模块、统计通讯录信息模块。各模块的主要功能如下:
建立通讯录信息模块:此模块下包括添加、删除、修改操作。
此模块函数void admin_est() 代码如下:
void admin_est() //建立通讯录 管理
{
while(1)
{
char num[10];
printf(" ┌─────────────┐\n");
printf(" │ 1 添加通讯录│\n");
printf(" │ 2 删除通讯录│\n");
printf(" │ 3 修改通讯录│\n");
printf(" │ 4 退出 │\n");
printf(" └─────────────┘\n");
printf("\n");
printf(" =*=*=*=*=*=*=*=\n");
printf(" 请输入您的操作\n");
printf(" =*=*=*=*=*=*=*=\n");
printf("\n");
gets(num);
printf("\n");
if(strlen(num)>1)
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
continue;
}
switch(*num)
{
case '1':
{
est_add();
}
break;
case '2':
{
est_delet();
}
break;
case '3':
{
est_renew();
}
break;
case '4':return ;break;
default :
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
}break;
}
}
}
输出通讯录信息模块:按表格的方式输出通讯录内所有联系人的信息,让使用者更加清晰直观地了解通讯录内部的所有信息。
此模块函数void admin_print_all()代码如下:
void admin_print_all() //输出通讯录全部信息 管理
{
FILE *fp;
struct list *p;
int i=0;
p=(struct list *)malloc(LEN);
fp=fopen("test.txt","r");
if(fp==NULL)
{
printf(" =*=*=*=*=*=*=*=*=*=*=\n");
printf(" can not open file !\n");
printf(" =*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
return ;
}
while(fread(p,LEN,1,fp))
{
i++;
}
rewind(fp);
if(i==0)
{
fclose(fp);
printf(" =*=*=*=*=*=*=*=*=*=*=\n");
printf(" 通讯录为空!无法输出!\n");
printf(" =*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
return ;
}
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf(" 该通讯录共有%d人\n",i);
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf("\n");
i=0;
while(fread(p,LEN,1,fp))
{
i++;
if(i==1)
{
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
}
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
}
printf("=======================================================================\n");
fclose(fp);
}
统计通讯录信息模块:提示用户选择籍贯或者单位方式统计相关联系人的信息,并按表格方式输出。
此模块函数void admin_tongji()代码如下:
void admin_tongji() //统计通讯录信息 管理
{
while(1)
{
FILE *fp;
struct list *p;
char num[10];
p=(struct list *)malloc(LEN);
fp=fopen("test.txt","r");
if(fp==NULL)
{
printf("can not open file !\n");
return ;
}
printf(" ┌─────────────┐\n");
printf(" │ 1 按籍贯统计│\n");
printf(" │ 2 按单位统计│\n");
printf(" │ 3 退出 │\n");
printf(" └─────────────┘\n");
printf("\n");
printf(" =*=*=*=*=*=*=*=\n");
printf(" 请输入您的操作\n");
printf(" =*=*=*=*=*=*=*=\n");
printf("\n");
gets(num);
printf("\n");
if(strlen(num)>1)
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
continue;
}
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
case '2':
{
char str[30];
int flag=0,i=0;
printf(" =*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 请输入统计的单位名称\n");
printf(" =*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(str);
printf("\n");
while(fread(p,LEN,1,fp))
{
if(strcmp(p->unit,str)==0)
{
flag=1;
break;
}
}
rewind(fp);
if(flag==0)
{
printf(" =*=*=*=*=*=*=*=\n");
printf(" 此单位不存在!\n");
printf(" =*=*=*=*=*=*=*=\n");
printf("\n");
fclose(fp);
return ;
}
while(fread(p,LEN,1,fp))
{
if(strcmp(p->unit,str)==0)
{
i++;
if(i==1)
{
printf(" =*=*=*=*=*=*=\n");
printf(" 查询结果如下\n");
printf(" =*=*=*=*=*=*=\n");
printf("\n");
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
}
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
}
}
printf("=======================================================================\n");
printf("\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf(" 该单位共有%d人\n",i);
printf(" =*=*=*=*=*=*=*=*=\n");
printf("\n");
fclose(fp);
return ;
}
break;
case '3':
{
fclose(fp);
return ;
}
break;
default :
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
fclose(fp);
}break;
}
}
}
主要由六大模块组成:精确查询模块、模糊查询模块、保存到文件模块、姓名排序后输出模块、输出单位通讯录信息模块。各模块的主要功能如下:
精确查找模块:引导使用者输入要在其中查找需要查找类型的信息,从而找到该人的完整信息,并输出。
此模块函数void user_jqcx()代码如下:
void user_jqcx() //精确查找 用户
{
while(1)
{
FILE *fp;
struct list *p;
char num[10];
p=(struct list *)malloc(LEN);
printf(" ┌───────────────┐\n");
printf(" │ 1 姓名精确查找│\n");
printf(" │ 2 电话精确查找│\n");
printf(" │ 3 退出 │\n");
printf(" └───────────────┘\n");
printf("\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf(" 请输入您的操作\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(num);
printf("\n");
if(strlen(num)>1)
{
printf("操作错误!\n");
continue;
}
switch(*num)
{
case '1':
{
char str[30];
printf(" =*=*=*=*=*=*=\n");
printf(" 请输入姓名\n");
printf(" =*=*=*=*=*=*=\n");
printf("\n");
gets(str);
printf("\n");
fp=fopen("test.txt","r"); //打开文件
if(fp==NULL)
{
printf("can not open file !\n");
return ;
}
while(fread(p,LEN,1,fp))
{
if(strcmp(p->name,str)==0) //判断名字是否相同
{
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf(" 查询到此人信息如下\n");
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf("\n");
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
printf("=======================================================================\n");
fclose(fp);//关闭文件
break;
}
}
}
break;
case '2':
{
char str[30];
printf(" =*=*=*=*=*=*=\n");
printf(" 请输入电话\n");
printf(" =*=*=*=*=*=*=\n");
printf("\n");
gets(str);
printf("\n");
fp=fopen("test.txt","r");//打开文件
if(fp==NULL)
{
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf(" can not open file !\n");
printf(" =*=*=*=*=*=*=*=*=*=\n");
return ;
}
while(fread(p,LEN,1,fp))
{
if(strcmp(p->handset,str)==0) //判断电话是否相同
{
printf("查询到此人信息如下:\n");
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
printf("=======================================================================\n");
fclose(fp);//关闭文件
break;
}
}
}
break;
case '3':
{
return ;
}
break;
default :
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
}break;
}
}
}
模糊查找模块:引导使用者输入要在其中查找需要查找类型的信息,从而找到该人的完整信息,并输出。
此模块函数void user_mhcx()代码如下:
void user_mhcx() ///模糊查找 用户
{
while(1)
{
FILE *fp;
struct list *p;
char num[10];
fp=fopen("test.txt","r");
if(fp==NULL)
{
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf(" can not open file !\n");
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf("\n");
return ;
}
p=(struct list *)malloc(LEN);
printf(" ┌───────────────┐\n");
printf(" │ 1 姓名模糊查找│\n");
printf(" │ 2 电话模糊查找│\n");
printf(" │ 3 退出 │\n");
printf(" └───────────────┘\n");
printf("\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf(" 请输入您的操作\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(num);
printf("\n");
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
printf("=======================================================================\n");
printf("\n");
break;
}
k++;
}
if(B==strlen(str)-1)
break;
}
}
if(flag==0)
{
printf(" =*=*=*=*=*=*=*=\n");
printf(" 未查询到此人!\n");
printf(" =*=*=*=*=*=*=*=\n");
printf("\n");
}
fclose(fp); //case 2-2 关闭
//------------------------------------------
}
break;
case '3':
{
return ;
}
break;
default :
{
printf(" =*=*=*=*=*=\n");
printf(" 操作错误!\n");
printf(" =*=*=*=*=*=\n");
printf("\n");
}break;
}
}
}
保存通讯录到文件模块:输入需要保存通讯录的单位名称后,系统会生成以该单位名命名的磁盘文件。
此模块函数void user_save()代码如下:
void user_save() //保存单位通讯录到文件 用户
{
struct stu
{
char name[30];
char age[30];
int number;
char handset[30];
char address[30];
char unit[30];
};
struct stu s[1000],temp;
int i,j,k;
//------------------------------
while(1)
{
FILE *fp,*fp1;
struct list *p;
char str[30];
int flag=0;
p=(struct list *)malloc(LEN);
fp=fopen("test.txt","r"); //只读方式打开文件到fp
if(fp==NULL)
{
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf(" can not open file !\n");
printf(" =*=*=*=*=*=*=*=*=*=\n");
return ;
}
printf(" =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 请输入待保存通讯录的单位名称(此名称将作为保存后的文件名)\n");
printf(" =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(str);
printf("\n");
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
for(j=0;jname,s[j].name);
strcpy(p->age,s[j].age);
p->number=s[j].number;
strcpy(p->handset,s[j].handset);
strcpy(p->address,s[j].address);
strcpy(p->unit,s[j].unit);
fwrite(p,LEN,1,fp1);
}
//-----------------------
fclose(fp); //关闭fp
fclose(fp1); //关闭fp1
//-----------------------
printf(" =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 保存成功!保存的文件名为:%s\n",str);
printf(" =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
return ;
}
}
姓名排序输出模块:系统自动对通讯录内联系人姓名进行首字母排序,并输出排序后的通讯录信息。
此模块函数void user_paixu()代码如下:
void user_paixu() //姓名字母排序 用户
{
//----------------------------
struct list1
{
char name[30]; //名字
char age[30]; //年龄
int number; //编号 自动生成
char handset[30]; //电话
char address[30]; //籍贯
char unit[30];//单位
};
FILE *fp;
struct list *p;
struct list1 s[1000],temp;
int i=0,j,z;
p=(struct list *)malloc(LEN);
fp=fopen("test.txt","r");
if(fp==NULL)
{
printf(" =*=*=*=*=*=*=*=*=*=\n");
printf(" can not open file !\n");
printf(" =*=*=*=*=*=*=*=*=*=\n");
return ;
}
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
代码过多,这里省略部分代码...
fclose(fp);
printf(" =*=*=*=*=*=*=*=*=\n");
printf(" 排序后信息如下\n");
printf(" =*=*=*=*=*=*=*=*=\n");
printf("\n");
fp=fopen("test.txt","r");
i=0;
while(fread(p,LEN,1,fp))
{
i++;
if(i==1)
{
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
}
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
}
if(i!=0)
printf("=======================================================================\n");
else
{
printf(" =*=*=*=*=*=*=\n");
printf(" 通讯录为空!\n");
printf(" =*=*=*=*=*=*=\n");
printf("\n");
}
fclose(fp);
}
输出单位通讯录信息模块:用户按着系统提示,手动输入待输出单位的名称后,系统自动搜索该单位的所有联系人并输出。
此模块函数void user_print()代码如下:
void user_print() //输出单位通讯录 用户
{
while(1)
{
FILE *fp;
struct list *p;
char str[30];
int flag=0,i=0;
p=(struct list *)malloc(LEN);
fp=fopen("test.txt","r");
printf(" =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 请输入待显示通讯录的单位名称\n");
printf(" =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(str);
printf("\n");
if(fp==NULL)
{
printf("can not open file !\n");
return ;
}
while(fread(p,LEN,1,fp))
{
if(strcmp(p->unit,str)==0)
{
flag=1;
break;
}
}
if(flag==0)
{
printf(" =*=*=*=*=*=*=\n");
printf(" 此单位不存在!\n");
printf(" =*=*=*=*=*=*=\n");
printf("\n");
fclose(fp);
continue;
}
rewind(fp);
while(fread(p,LEN,1,fp))
{
if(strcmp(p->unit,str)==0)
{
i++;
if(i==1)
{
printf("=======================================================================\n");
printf("|姓名 |编号 |年龄 |电话 |籍贯 |单位 |\n");
}
printf("-----------------------------------------------------------------------\n");
printf("|%-12s|%-7d|%-6s|%-13s|%-12s|%-14s|\n",p->name,p->number,p->age,p->handset,p->address,p->unit);
}
}
fclose(fp);
if(i!=0)
printf("=======================================================================\n");
return ;
}
}
运行本程序首先要确认与源程序同级的目录下有三个文件;存放通讯录联系人信息的文件(test.txt),存放成绩单信息的文件(安工.dat),存放管理员与用户进入系统密码的文件(num_key.txt)。这里我们需要特别介绍的是num_key.txt文件,因为这个文件是我们登陆进入系统所要用到的,在该文件中,有两串字符,第一串字符为管理员的登陆密码,第二串字符是用户的登陆密码,如下图所示。这里我们的管理员密码为1234,用户密码为4321。
需要特别强调的是,在我们这个系统中并没有登陆和注册管理员、用户名的功能,但可以修改这个最初始的密码。
这里我们输入1按enter键选择管理员系统后,输入刚刚在num_key.txt文件中的第一串字符,即“1234”即可进入管理员系统,如下图所示。可以看到,管理员系统有如下的功能,建立通讯录信息,即新建联系人,输出通讯录信息,统计通讯录信息,统计通讯录信息可以按多种方式统计,修改管理员密码四个主要功能。
这里我们接着刚刚的步骤,输入5退出到最初的界面,然后输入2选择进入用户系统,然后将刚刚在num_key.txt文件中看到的第二串字符,即“4321”作为密码输入,就可以进入用户系统了,结果如下图所示。可以看到,用户系统下的操作有精确查询、模糊查询、保存通讯录到文件、按姓名排序输出通讯录信息、输出单位通讯录信息、修改用户密码六个主要功能。
最后,我们还是返回到最开始的界面,来进行退出程序的测试,如下图所示系统已经提示退出了,无法再进行任何操作。
由于系统功能过于繁多,在这里博主就不全部展示了,只是将其中的部分界面一遍,同学们可以自己在下面测试操作哦。