该系统是在linux系统下编写的,所以在windows下无法运行。但是编程的思想完全一样。读者可以深深体会。同事希望相互相互学习,共同进步。
#include<stdio.h>
#include<string.h>
#include"conio.h"
//========================================
//宏定义
//========================================
#define PEOPLE_MAX_NUM 300
#define STRING_LEN 60
#define MENU_PEOPLE_NUM 6 //搜索联系人,添加联系人,修改联系人,删除联系人,导出文件,导入文件
#define ADD_PEOPLE_NUM 4 //姓名,电话,地址,备注(增加)
#define REVISE_PEOPLE_NUM 4 //姓名,电话,地址,备注(修改)
//============================================
//定义结构体数组
//============================================
struct PEOPLE
{
char name[STRING_LEN];
char tel[STRING_LEN];
char address[STRING_LEN];
char remarks[STRING_LEN];
char flag;
};
struct MENU
{
char menu_line[STRING_LEN];
char menu_num[STRING_LEN];
};
struct MENU menu[MENU_PEOPLE_NUM]; //菜单信息
struct PEOPLE people[PEOPLE_MAX_NUM]; //联系人存储结构体数组
struct PEOPLE search[PEOPLE_MAX_NUM]; //搜索联系人存储结构体数组
//===============================================
//定义全局变量
//===============================================
int PAGE_NUM=0; //记录当前所在的页数
int SEARCH_PAGE_NUM=0; //记录模糊搜索所在页
int PAGE_PEOPLE_NUM=7; //每一页的联系人显示数
int SOUSIR=0; //当前光标所在的位置
int PEOPLE_NUM=0; //通讯录的总人数
int SEARCH_PEOPLE_NUM=0; //模糊搜索联系人总人数
char FILE_NAME[STRING_LEN]={"3.txt"};
char STRING_NAME[STRING_LEN]={"0"}; //接收搜索的名字
int flag=1; //模糊查询标记点
int GuiGu=0; //如果用户在没有修改,或者新增人员时,无需提示是否保存文件。用于标志
int MENU_SOUSIR=0; //菜单界面游标
int REVISE_SEARCH_SOUSIR; //修改联系人界面游标
int ADD_SEARCH_SOUSIR=0; //增加联系人界面游标
int SEARCH_SOUSIR=0; //模糊搜索游标
char Add_People_ShuXin1[][STRING_LEN]=
{
"姓名:",
"电话:",
"地址:",
"备份:"
};
char Add_People_ShuXin2[][STRING_LEN]=
{
" ",
" ",
" ",
" "
};
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2
//===============================================
//名称: Delete_Renovate_File
//功能: 刷新删除后的文件
//参数: void
//返回值 void
//===============================================
void Delete_Renovate_File(void)
{
FILE *qf;
int i;
qf=fopen(FILE_NAME,"wb+"); //往文件写入数据用于显示
for(i=0;i<PEOPLE_NUM;i++)
{
if(people[i].flag!=0)
{
fprintf(qf,"%s\t",people[i].name);
fprintf(qf,"%s\t",people[i].tel);
fprintf(qf,"%s\t",people[i].address);
fprintf(qf,"%s\n",people[i].remarks);
}
}
fclose(qf);
}
//===============================================
//名称: Renovate_File()
//功能: 刷新添加后的文件,用于显示
//参数: void
//返回值 void
//===============================================
void Renovate_File(void)
{
int i;
FILE *pf;
pf=fopen(FILE_NAME,"rb"); //从文件中读取数据用于显示
for(i=0;i<PEOPLE_NUM;i++)
{
if(feof(pf))
{
break;
}
fscanf(pf,"%s",people[i].name);
fscanf(pf,"%s",people[i].tel);
fscanf(pf,"%s",people[i].address);
fscanf(pf,"%s",people[i].remarks);
}
fclose(pf);
}
//===============================================
//名称: initial_struct
//功能: 读取文件,为结构体数组赋初值
//参数: void
//返回值 void
//===============================================
void initial_struct(void)
{
FILE *pf;
pf=fopen(FILE_NAME,"rb"); //从文件中读取数据用于显示
int i;
for(i=0;i<PEOPLE_MAX_NUM;i++)
{
if(feof(pf))
{
break;
}
PEOPLE_NUM++;
fscanf(pf,"%s",people[i].name);
fscanf(pf,"%s",people[i].tel);
fscanf(pf,"%s",people[i].address);
fscanf(pf,"%s",people[i].remarks);
people[i].flag=1;
}
PEOPLE_NUM--;
fclose(pf);
}
//===============================================
//名称: Save_File
//功能: 保存文件
//参数: void
//返回值 void
//===============================================
void Save_File()
{
int i;
int key;
FILE *fp;
fp=fopen(FILE_NAME,"ab+");
while(1)
{
system("clear");
ADD_SEARCH_SOUSIR=0; //让游标指到首位置
if(GuiGu==0) //用户没有编辑任何信息,则直接退出,无需提示是否保存
{
return ;
}
printf("===================================\n");
printf(" 是否保存新增联系人至文件? \n ");
printf("【是(Y,y)】 【否(N,n)】\n");
printf("===================================\n");
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
if(key==89||key==121) //保存新增联系人至文件
{
PEOPLE_NUM++;
for(i=0;i<ADD_PEOPLE_NUM;i++)
{
if(strcmp(Add_People_ShuXin2[i]," ")==0)
{
strcpy(Add_People_ShuXin2[i],"$");
}
}
strcpy(people[PEOPLE_NUM].name,Add_People_ShuXin2[0]);
strcpy(people[PEOPLE_NUM].tel,Add_People_ShuXin2[1]);
strcpy(people[PEOPLE_NUM].address,Add_People_ShuXin2[2]);
strcpy(people[PEOPLE_NUM].remarks,Add_People_ShuXin2[3]);
people[PEOPLE_NUM].flag=1;
fprintf(fp,"%s\t\t%s\t\t%s\t\t%s\n",
people[PEOPLE_NUM].name,people[PEOPLE_NUM].tel,people[PEOPLE_NUM].address,people[PEOPLE_NUM].remarks);
system(1);
printf("已保存!!!\n");
sleep(1);
}
if(key==78||key==110) //取消保存联系人
{
system("clear");
printf("未保存!!!\n");
sleep(1);
}
for(i=0;i<ADD_PEOPLE_NUM;i++)
{
strcpy(Add_People_ShuXin2[i]," ");
}
}
GuiGu=0;
fclose(fp);
Renovate_File();
return;
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//导入导出文件
//===============================================
//名称: Leading_Out
//功能: 导出联系人信息
//参数: void
//返回值 void
//===============================================
void Leading_Out(void)
{
FILE *fp,*fq;
char ch;
char Leading_Out_File_Name[STRING_LEN];
fp=fopen(FILE_NAME,"rb");
fq=fopen(Leading_Out_File_Name,"wb+");
system("clear");
printf("请输入保存导出文件的文件名:\n");
gets(Leading_Out_File_Name);
if(strcmp(Leading_Out_File_Name,FILE_NAME)==0)
{
printf("你输入的文件名不能被覆盖!!!\n");
sleep(1);
return ;
}
if(fp==NULL)
{
printf("文件为空!!!\n");
sleep(1);
return ;
}
while(1)
{
fread(&ch,1,1,fp);
if(feof(fp))
{
break;
}
fwrite(&ch,1,1,fq);
}
printf("文件导出成功!!!\n");
sleep(1);
fclose(fp);
fclose(fq);
}
//===============================================
//名称: Leading_In
//功能: 导入联系人信息
//参数: void
//返回值 void
//================================================
void Leading_In(void)
{
FILE *fp;
system("clear");
char Leading_In_File_Name[STRING_LEN];
printf("请输入你要导入的文件名:\n");
gets(Leading_In_File_Name);
fp=fopen(Leading_In_File_Name,"rb");
if(fp==NULL)
{
printf("你导入的文件为空!!!\n");
sleep(1);
return;
}
strcpy(FILE_NAME,Leading_In_File_Name);
printf("导入成功!!!\n");
sleep(1);
// Delete_Renovate_File();
Renovate_File(); //刷新文件
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//修改联系人
//===============================================
//名称: UpKey_Revise_People
//功能: 修改联系人信息向上游动游标
//参数: void
//返回值 void
//===============================================
void UpKey_Revise_People(void)
{
if(REVISE_SEARCH_SOUSIR<=0)
{
REVISE_SEARCH_SOUSIR=REVISE_PEOPLE_NUM-1;
}
else
{
REVISE_SEARCH_SOUSIR--;
}
}
//===============================================
//名称: DownKey_Revise_People
//功能: 修改联系人信息向下游动游标
//参数: void
//返回值 void
//===============================================
void DownKey_Revise_People(void)
{
if(REVISE_SEARCH_SOUSIR>=REVISE_PEOPLE_NUM-1)
{
REVISE_SEARCH_SOUSIR=0;
}
else
{
REVISE_SEARCH_SOUSIR++;
}
}
//===============================================
//名称: Edit_Revise_People
//功能: 修改联系人
//参数: void
//返回值 void
//===============================================
void Edit_Revise_People(void)
{
GuiGu=1;
scanf("%s",Add_People_ShuXin2[REVISE_SEARCH_SOUSIR]);
}
//===============================================
//名称: Revise_People_Save_File
//功能: 保存修改联系人
//参数: void
//返回值 void
//===============================================
void Revise_People_Save_File(void)
{
int key;
system("clear");
REVISE_SEARCH_SOUSIR=0; //让游标指到首位置
if(GuiGu==0) //用户没有编辑任何信息,则直接退出,无需提示是否保存
{
return ;
}
printf("===================================\n");
printf(" 是否保存修改信息? \n ");
printf("【是(Y,y)】 【否(N,n)】\n");
printf("===================================\n");
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
if(key==89||key==121) //保存新增联系人至文件
{
strcpy(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].name,Add_People_ShuXin2[0]);
strcpy(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel,Add_People_ShuXin2[1]);
strcpy(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].address,Add_People_ShuXin2[2]);
strcpy(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].remarks,Add_People_ShuXin2[3]);
Delete_Renovate_File(); //将修改后的结构体数组写回文件
Renovate_File(); //再次读取文件,用于显示
}
if(key==78||key==110)
{
system("clear");
printf("未保存!!!\n");
sleep(1);
}
GuiGu=0;
}
}
//==============================================
//名称: Revise_People_Display
//功能: 显示修改联系人信息
//参数: void
//返回值 void
//===============================================
void Revise_People_Display(void)
{
int i;
printf("==========================================\n");
printf("=>>>>>>>>>>>>修改联系人详细信息<<<<<<<<<<=\n");
printf("==========================================\n");
for(i=0;i<REVISE_PEOPLE_NUM;i++)
{
if(REVISE_SEARCH_SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
printf("%s\t",Add_People_ShuXin1[i]);
if(strcmp(Add_People_ShuXin2[i],"$")==0)
{
printf("\t\n");
}
else
{
printf("%s\n",Add_People_ShuXin2[i]);
}
}
printf("==========================================\n");
printf("【编辑(W)】 【保存(Backspace)】\n");
}
//===============================================
//名称: Revise_People
//功能: 修改联系人信息
//参数: void
//返回值 void
//===============================================
void Revise_People(void)
{
int key;
strcpy(Add_People_ShuXin2[0],people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].name);
strcpy(Add_People_ShuXin2[1],people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel);
strcpy(Add_People_ShuXin2[2],people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].address);
strcpy(Add_People_ShuXin2[3],people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].remarks);
while(1)
{
system("clear");
Revise_People_Display(); //显示修改联系人信息
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
switch(key)
{
case 65: //向上移动游标
UpKey_Revise_People();
break;
case 66:
DownKey_Revise_People(); //向下游动游标
break;
case 87:
Edit_Revise_People(); //编辑修改人的信息(W键)
break;
case 127:
Revise_People_Save_File(); //保存文件
return;
break;
default :
break;
}
}
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//搜索
//===============================================
//名称: Search_Struct
//功能: 初始化搜索结构体数组
//参数: void
//返回值 void
//===============================================
void Search_Struct(void)
{
int i,j=0;
char *p,*q,*top;
q=STRING_NAME;
for(i=0;i<PEOPLE_NUM;i++)
{
p=people[i].name;
top=strstr(p,q);
if(top==NULL)
{
;
}
else
{
SEARCH_PEOPLE_NUM++;
strcpy(search[j].name,people[i].name);
strcpy(search[j].tel,people[i].tel);
strcpy(search[j].address,people[i].address);
strcpy(search[j].remarks,people[i].remarks);
j++;
}
}
}
//===============================================
//名称: Zero_Search_Struct
//功能: 搜索结构体数组清零
//参数: void
//返回值 void
//===============================================
void Zero_Search_Struct(void)
{
memset(search,0,sizeof(struct PEOPLE)*PEOPLE_MAX_NUM);
}
//===============================================
//名称: Search_Display
//功能: 显示搜索联系人信息
//参数: void
//返回值 void
//===============================================
void Search_Display(void)
{
int i;
char str[STRING_LEN]={"\t"};
if((SEARCH_PAGE_NUM+1)*PAGE_PEOPLE_NUM>SEARCH_PEOPLE_NUM)
{
printf("==========================================\n");
printf("=>>>>>>>>>>>>搜索联系人详细信息<<<<<<<<<<=\n");
printf("==========================================\n");
printf("| 姓名 电话 |\n");
printf("==========================================\n");
for(i=0;i<SEARCH_PEOPLE_NUM-(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM);i++)
{
if(SEARCH_SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
//显示查找到的名字:
if(strcmp(search[i].name,"$")==0)
{
printf("%-20s\t",str);
}
else
{
printf("%-20s\t",search[i].name);
}
//显示查找到的电话
if(strcmp(search[i].tel,"$")==0)
{
printf("%-20s\t \n",str);
}
else
{
printf("%-20s\t \n",search[i].tel);
}
}
for(i=0;i<(SEARCH_PAGE_NUM+1)*PAGE_PEOPLE_NUM-SEARCH_PEOPLE_NUM;i++)
{
printf(" \n ");
}
printf("==========================================\n");
printf("【查看(W) 【编辑(g)】【返回(backspace)】\n");
}
else
{
printf("==========================================\n");
printf("=>>>>>>>>>>>>搜索联系人详细信息<<<<<<<<<<=\n");
printf("==========================================\n");
printf("| 姓名 电话 |\n");
printf("==========================================\n");
for(i=0;i<PAGE_PEOPLE_NUM;i++)
{
if(SEARCH_SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
//显示查找到的名字:
if(strcmp(search[i].name,"$")==0)
{
printf("%-20s\t",str);
}
else
{
printf("%-20s\t",search[i].name);
}
//显示查找到的电话
if(strcmp(search[i].tel,"$")==0)
{
printf("%-20s\t \n",str);
}
else
{
printf("%-20s\t \n",search[i].tel);
}
}
printf("==========================================\n");
printf("【查看(W) 【编辑(g)】【返回(backspace)】\n");
}
Zero_Search_Struct();
if(flag==1)
{
gets(STRING_NAME);
flag=0;
}
}
//===============================================
//名称: Search_Up_Key
//功能: 搜索游标上移一行
//参数: void
//返回值 void
//===============================================
void Search_Up_Key(void)
{
if(SEARCH_SOUSIR<=0)
{
if(SEARCH_PAGE_NUM>0)
{
SEARCH_PAGE_NUM--;
SEARCH_SOUSIR=PAGE_PEOPLE_NUM-1;
}
else
{
SEARCH_PAGE_NUM=0;
SEARCH_SOUSIR=0;
}
}
else
{
SEARCH_SOUSIR--;
}
}
//===============================================
//名称: Search_Down_Key
//功能: 搜索游标下移一行
//参数: void
//返回值 void
//===============================================
void Search_Down_Key(void)
{
if((SEARCH_PAGE_NUM+1)*PAGE_PEOPLE_NUM>SEARCH_PEOPLE_NUM) //处在最后一页
{
if(SEARCH_SOUSIR>=SEARCH_PEOPLE_NUM-SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM-1)
{
;
}
else
{
SEARCH_SOUSIR++;
}
}
else
{
if(SEARCH_SOUSIR>=PAGE_PEOPLE_NUM-1)
{
SEARCH_PAGE_NUM++;
SEARCH_SOUSIR=0;
}
else
{
SEARCH_SOUSIR++;
}
}
}
//===============================================
//名称: Search_Down_Page
//功能: 搜索显示界面下翻一页
//参数: void
//返回值 void
//===============================================
void Search_Down_Page(void)
{
SEARCH_SOUSIR=0;
if((SEARCH_PAGE_NUM+1)*PAGE_PEOPLE_NUM>SEARCH_PEOPLE_NUM)
{
; //如果到最后一页,将不再下翻
}
else
{
SEARCH_PAGE_NUM++;
}
}
//===============================================
//名称: Search_Up_Page
//功能: 搜索显示界面上翻一页
//参数: void
//返回值 void
//===============================================
void Search_Up_Page(void)
{
SEARCH_SOUSIR=PAGE_PEOPLE_NUM-1;
if(SEARCH_PAGE_NUM<=0)
{
SEARCH_PAGE_NUM=0;
}
else
{
SEARCH_PAGE_NUM--;
}
}
//==============================================
//名称: Search_Display_Key
//功能: 显示查询人详细信息
//参数: void
//返回值 void
//===============================================
void Search_Display_Key(void)
{
int i;
char str[STRING_LEN]={"\t"};
system("clear");
printf("==========================================\n");
printf("=>>>>>>>>>>>> 联系人详细信息<<<<<<<<<<<<=\n");
printf("==========================================\n");
printf(" 姓名: \t");
if(strcmp(search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].name,"$")==0)
{
printf("%-20s\t \n",str);
}
else
{
printf("%-20s\t \n",search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].name);
}
printf(" 电话号码:\t");
if(strcmp(search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].tel,"$")==0)
{
printf("%-20s\t \n",str);
}
else
{
printf("%-20s\t \n",search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].tel);
}
printf(" 地址: \t");
if(strcmp(search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].address,"$")==0)
{
printf("%-20s \n",str);
}
else
{
printf("%-20s\t \n",search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].address);
}
printf(" 备注: \t");
if(strcmp(search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].remarks,"$")==0)
{
printf("%-20s \n",str);
}
else
{
printf("%-20s\t \n",search[SEARCH_SOUSIR+(SEARCH_PAGE_NUM*PAGE_PEOPLE_NUM)].remarks);
}
for(i=0;i<4;i++)
{
printf(" \n");
}
printf("==========================================\n");
}
//===============================================
//名称: Search_People
//功能: 搜索联系人信息
//参数: void
//返回值 void
//===============================================
void Search_People(void)
{
int key;
int i;
char ch;
while(1)
{
system("clear"); //清屏
Search_Display(); //显示搜索界面
Search_Struct(); //初始化搜索结构体数组
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
switch(key)
{
case 103: //按‘g’键,继续输入查找名字
flag=1;
break;
case 87:
Search_Display_Key(); //查看搜索人详细信息
sleep(2);
break;
case 65:
Search_Up_Key(); //向上移动一行
break;
case 66:
Search_Down_Key(); //向下移动一行
break;
case 67:
Search_Down_Page(); //向下翻一页
break;
case 68:
Search_Up_Page(); //向下翻一页
break;
case 127: //返回
return;
break;
default :
break;
}
}
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//===============================================
//名称: Delete
//功能: 删除联系人
//参数: void
//返回值 void
//===============================================
void Delete(void)
{
char str[STRING_LEN];
int i;
char ch;
printf("请输入你要删除的人的姓名:\n");
gets(str);
for(i=0;i<PEOPLE_NUM;i++)
{
if(strcmp(people[i].name,str)==0)
{
people[i].flag=0;
break;
}
}
if(i>=PEOPLE_NUM)
{
printf("你要删除的人不存在,请重新输入!!!\n");
sleep(1); //没有搜索到联系人,等待一会再跳到菜单
return ;
}
Delete_Renovate_File();
Renovate_File();
PEOPLE_NUM--;
printf("删除成功!!!\n");
sleep(1);
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//==============================================
//名称: Add_Display
//功能: 显示增加联系人信息
//参数: void
//返回值 void
//===============================================
void Add_Display(void)
{
int i;
printf("==========================================\n");
printf("=>>>>>>>>>>>>增加联系人详细信息<<<<<<<<<<=\n");
printf("==========================================\n");
for(i=0;i<ADD_PEOPLE_NUM;i++)
{
if(ADD_SEARCH_SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
printf("%s\t",Add_People_ShuXin1[i]);
printf("%s\n",Add_People_ShuXin2[i]);
}
printf("==========================================\n");
printf("【编辑(W)】 【保存(Backspace)】\n");
}
//===============================================
//名称: UpKey_Add_People
//功能: 增加联系人信息向上移动游标
//参数: void
//返回值 void
//===============================================
void UpKey_Add_People(void)
{
if(ADD_SEARCH_SOUSIR<=0)
{
ADD_SEARCH_SOUSIR=ADD_PEOPLE_NUM-1;
}
else
{
ADD_SEARCH_SOUSIR--;
}
}
//===============================================
//名称: DownKey_Add_People
//功能: 增加联系人信息向下游动游标
//参数: void
//返回值 void
//===============================================
void DownKey_Add_People(void)
{
if(ADD_SEARCH_SOUSIR>=ADD_PEOPLE_NUM-1)
{
ADD_SEARCH_SOUSIR=0;
}
else
{
ADD_SEARCH_SOUSIR++;
}
}
//===============================================
//名称: Edit_Add_People
//功能: 编辑联系人
//参数: void
//返回值 void
//===============================================
void Edit_Add_People(void)
{
GuiGu=1;
scanf("%s",Add_People_ShuXin2[ADD_SEARCH_SOUSIR]);
}
//===============================================
//名称: Add_People
//功能: 向电话本中添加联系人
//参数: void
//返回值 void
//===============================================
void Add_People(void)
{
int key;
int i;
for(i=0;i<ADD_PEOPLE_NUM;i++) //结构体数组初始化
{
strcpy(Add_People_ShuXin2[i]," ");
}
while(1)
{
system("clear");
Add_Display(); //显示增加联系人信息
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
switch(key)
{
case 65: //向上移动游标
UpKey_Add_People();
break;
case 66:
DownKey_Add_People(); //向下游动游标
break;
case 87:
Edit_Add_People(); //编辑增加人的信息(W键)
break;
case 127:
Save_File(); //保存文件
return;
break;
default :
break;
}
}
}
}
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//#################################################################################################################################
//===============================================
//名称: DetailInfo
//功能: 查看联系人详细信息
//参数: void
//返回值 void
//===============================================
void DetailInfo(void)
{
int i;
int key;
char str[STRING_LEN]={"\t"};
system("clear");
printf("==========================================\n");
printf("=>>>>>>>>>>>> 联系人详细信息<<<<<<<<<<<<=\n");
printf("=========================================\n");
printf(" 姓名: \t");
if(strcmp(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].name,"$")==0)
{
printf("%-20s\t \n",str);
}
else
{
printf("%-20s\t \n",people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].name);
}
printf(" 电话号码:\t");
if(strcmp(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel,"$")==0)
{
printf("%-20s\t \n",str);
}
else
{
printf("%-20s\t \n",people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel);
}
printf(" 地址: \t");
if(strcmp(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].address,"$")==0)
{
printf("%-20s \n",str);
}
else
{
printf("%-20s\t \n",people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].address);
}
printf(" 备注: \t");
if(strcmp(people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].remarks,"$")==0)
{
printf("%-20s \n",str);
}
else
{
printf("%-20s\t \n",people[SOUSIR+(PAGE_NUM*PAGE_PEOPLE_NUM)].remarks);
}
for(i=0;i<4;i++)
{
printf(" \n");
}
printf("=========================================\n");
printf("修改(W) ");
printf(" 返回(Backspace)\n");
while(1)
{
key=getch();
if(key==127)
{
return;
}
if(key==87)
{
Revise_People();
break;
}
}
}
//===============================================
//名称: MainDisplay
//功能: 主界面
//参数: void
//返回值 void
//===============================================
void MainDisplay(void)
{
int i;
char str[STRING_LEN]={"\t"};
if((PAGE_NUM+1)*PAGE_PEOPLE_NUM>PEOPLE_NUM) //如果已经下翻到最后一页了,则显示最后一页部分信息
{
printf("*************************************\n");
printf("*>>>>>>>>>>> 通讯录<<<<<<<<<<<<<<<<<*\n");
printf("*************************************\n");
printf(" 姓名 联系人\n");
printf("=====================================\n");
for(i=0;i<PEOPLE_NUM-PAGE_NUM*PAGE_PEOPLE_NUM;i++)
{
if(SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
if(strcmp(people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].name,"$")==0)
{
printf("%-20s\t",str);
}
else
{
printf("%-20s\t",people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].name);
}
if(strcmp(people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel,"$")==0)
{
printf("%-20s\n",str);
}
else
{
printf("%-20s\n",people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel);
}
}
for(i=0;i<(PAGE_NUM+1)*PAGE_PEOPLE_NUM-PEOPLE_NUM;i++)
{
printf("\n");
}
printf("=====================================\n");
printf("【菜单[W]】 【退出(Backspace)】\n");
}
else
{
printf("*************************************\n");
printf("*>>>>>>>>>>> 通讯录<<<<<<<<<<<<<<<<<*\n");
printf("*************************************\n");
printf(" 姓名 联系人\n");
printf("=====================================\n");
for(i=0;i<PAGE_PEOPLE_NUM;i++)
{
if(SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
if(strcmp(people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].name,"$")==0)
{
printf("%-20s\t",str);
}
else
{
printf("%-20s\t",people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].name);
}
if(strcmp(people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel,"$")==0)
{
printf("%-20s\n",str);
}
else
{
printf("%-20s\n",people[i+(PAGE_NUM*PAGE_PEOPLE_NUM)].tel);
}
}
printf("=====================================\n");
printf("【菜单[W]】 【退出(Backspace)】\n");
}
}
//===============================================
//名称: UpKey
//功能: 游标向上移动一行,直到首行
//参数: void
//返回值 void
//===============================================
void UpKey(void)
{
if(SOUSIR<=0) //如果向上移动到了最上,那么游标将不再减1
{
if(PAGE_NUM>0)
{
PAGE_NUM--;
SOUSIR=PAGE_PEOPLE_NUM-1;
}
else
{
PAGE_NUM=0;
SOUSIR=0;
}
}
else
{
SOUSIR--;
}
// printf("你输入的是向上键!!!\n");
}
//===============================================
//名称: DownKey
//功能: 游标向下移动一行,直到文尾
//参数: void
//返回值 void
//===============================================
void DownKey(void)
{
if((PAGE_NUM+1)*PAGE_PEOPLE_NUM>PEOPLE_NUM)
{
if(SOUSIR>=PEOPLE_NUM-PAGE_NUM*PAGE_PEOPLE_NUM-1)
{
;
}
else
{
SOUSIR++;
}
}
else
{
if(SOUSIR>=PAGE_PEOPLE_NUM-1) //如果游标到了最后一行
//(注意最后一行是人数减1,因为是从0开始计数)
{
PAGE_NUM++;
SOUSIR=0;
}
else
{
SOUSIR++;
}
}
// printf("你输入的是是向下键!!!\n");
}
//===============================================
//名称: DownPage
//功能: 下翻一页,直到尾页
//参数: void
//返回值 void
//===============================================
void DownPage(void)
{
SOUSIR=0; //向下翻页将游标移到下一页开头位置
if((PAGE_NUM+1)*PAGE_PEOPLE_NUM>PEOPLE_NUM)//如果没有可以在显示的联系人了,那么就不能够再去翻页。
{
;
}
else
{
PAGE_NUM++;
}
// printf("你输入的是是向右键!!!\n");
}
//===============================================
//名称: UpPage
//功能: 上翻一页,直到首页
//参数: void
//返回值 void
//===============================================
void UpPage(void)
{
SOUSIR=PAGE_PEOPLE_NUM-1; //向上翻页将游标移到上一页末尾位置
PAGE_NUM--;
if(PAGE_NUM<=0) //如果上翻到第一页就不能再往上翻页
{
PAGE_NUM=0;
}
// printf("你输入的是是向左键!!!\n");
}
//##############################################################################################################################
//===============================================
//名称: menu_initial_struct
//功能: 读取文件,为结构体数组赋初值
//参数: void
//返回值 void
//===============================================
void Menu_initial_struct(void)
{
int i;
FILE *fp;
fp=fopen("menu.txt","rb"); //从文件中读取数据用于显示
for(i=0;i<MENU_PEOPLE_NUM;i++)
{
if(feof(fp))
{
break;
}
fscanf(fp,"%s",menu[i].menu_num);
fscanf(fp,"%s",menu[i].menu_line);
}
fclose(fp);
}
//===============================================
//名称: Menu_MainDisplay
//功能: 显示选择菜单界面
//参数: void
//返回值 void
//===============================================
void Menu_MainDisplay(void)
{
int i;
printf("**************************************\n");
printf("*>>>>>>>>>>>>>> 菜单<<<<<<<<<<<<<<<<<*\n");
printf("**************************************\n");
printf(" 菜单项 菜单 \n");
printf("======================================\n");
for(i=0;i<MENU_PEOPLE_NUM;i++)
{
if(MENU_SOUSIR==i)
{
printf("==>");
}
else
{
printf(" ");
}
printf("%-20s\t",menu[i].menu_num);
printf("%-s\n",menu[i].menu_line);
}
printf("======================================\n");
printf("确定【Enter】 返回【backspace】\n");
}
//===============================================
//名称: Menu_UpKey
//功能: 在菜单栏上游标向上移动一行
//参数: void
//返回值: void
//===============================================
void Menu_UpKey(void)
{
if(MENU_SOUSIR<=0)
{
MENU_SOUSIR=MENU_PEOPLE_NUM-1;
}
else
{
MENU_SOUSIR--;
}
}
//===============================================
//名称: Menu_DownKey
//功能: 在菜单栏上游标向下移动一行
//参数: void
//返回值: void
//===============================================
void Menu_DownKey(void)
{
if(MENU_SOUSIR>=MENU_PEOPLE_NUM-1)
{
MENU_SOUSIR=0;
}
else
{
MENU_SOUSIR++;
}
}
//==============================================
//名称: Menu_DetailInfo
//功能: 菜单功能
//参数: void
//返回值 void
//===============================================
void Menu_DetailInfo(void)
{
int key;
key=MENU_SOUSIR;
switch(key)
{
case 0:
Search_People(); //搜索联系人
MENU_SOUSIR=0;
break;
case 1:
Add_People(); //增加联系人
MENU_SOUSIR=0;
break;
case 2:
Revise_People(); //修改联系人
MENU_SOUSIR=0;
break;
case 3:
Delete(); //删除联系人
MENU_SOUSIR=0;
break;
case 4:
Leading_Out(); //导出联系人
MENU_SOUSIR=0;
break;
case 5:
Leading_In(); //导入联系人
break;
}
}
//===============================================
//名称: Menu
//功能: 菜单
//参数: void
//返回值 void
//===============================================
void Menu(void)
{
char key;
Menu_initial_struct();
while(1)
{
system("clear");
Menu_MainDisplay();
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
switch(key)
{
case 10:
Menu_DetailInfo(); //显示联系人详细信息
break;
case 65:
Menu_UpKey(); //向上移动一行
break;
case 66:
Menu_DownKey(); //向下移动一行
break;
case 127: //Backspace
return;
break; //返回
default :
break;
}
}
}
}
//===============================================
//名称: KeyIn
//功能: 从键盘获取信息
//参数: void
//返回值 void
//===============================================
void KeyIn(void)
{
initial_struct(); //初始化结构体数组
char key;
while(1)
{
system("clear");
MainDisplay(); //显示部分联系人信息
key=getch();
if(key==27||key==91)
{
key=getch();
}
else
{
switch(key)
{
case 10:
DetailInfo(); //显示联系人详细信息
case 65:
UpKey(); //向上移动一行
break;
case 66:
DownKey(); //向下移动一行
break;
case 67:
DownPage(); //向下翻一页
break;
case 68:
UpPage(); //向下翻一页
break;
case 87:
Menu(); //菜单
break;
case 127:
return; //退出系统
break;
default :
break;
}
}
}
}
//===============================================
//名称: main
//功能: 程序入口
//参数: void
//返回值 void
//===============================================
void main(void)
{
KeyIn();
}
{
key=getch();
}
else
{
switch(key)
{
case 10:
DetailInfo(); //鏄剧ず鑱旂郴浜鸿缁嗕俊鎭? case 65:
UpKey(); //鍚戜笂绉诲姩涓€琛? break;
case 66:
DownKey(); //鍚戜笅绉诲姩涓€琛? break;
case 67:
DownPage(); //鍚戜笅缈讳竴椤? break;
case 68:
UpPage(); //鍚戜笅缈讳竴椤? break;
case 87:
Menu(); //鑿滃崟
break;
case 127:
return; //閫€鍑虹郴缁? break;
default :
break;
}
}
}
}
//===============================================
//鍚嶇О锛? main
//鍔熻兘锛? 绋嬪簭鍏ュ彛
//鍙傛暟锛? void
//杩斿洖鍊? void
//===============================================
void main(void)
{
KeyIn();
}