编写一个通讯录,功能与以前的诺基亚手机一样,可以通过键盘进行箭头的移动,回车进入选项,用“W”键代表手机手机左键,“backspace”键代表返回上一级。能够实现基本的人性化的增删改查及文件的导入导出
2014-08-03 20:36
1471 查看
该系统是在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(); }
相关文章推荐
- Mouse without Borders是微软的一个软件实验项目,这款软件可让鼠标自由在局域网中的多台电脑间移动,键盘输入实现无缝切换,还可以直接用鼠标相互拖拽文件。 如果经常需要同时使用两台以
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
- 编写一个电话簿,可以实现增删查找的功能
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
- 基本字符串压缩 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
- C# 实现完整功能的截图控件(1)-实现绘图工具栏控件 控件实现了截图、绘制矩形、圆形、箭头、线条、文字,还需要可以撤销绘制步骤、保存图形等功能,基本实现了跟QQ2008截图一样的功能,还可以更
- 今天无意中发现JavaBean类基本都要求实现了Serializable接口,以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取,但不知道为什么需要序列化,今天总结一下
- 基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个stri
- JAVA编写的浏览器,在别人的基础上做了些许修改,实现了前进,后退,刷新功能,添加了一个搜索框,具体情况在运行结果中的文件-->注意中
- 继续在该类中编写一下方法,名称为Reconvert,参数一个,但可以是字符串、整数、单精度、双精度,方法功能返回参数的逆序。如Reconvert(6221982)返回值为2891226。
- Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)
- c#--编写一个名称为MyClass一个类,在该类中编写一个方法,名称为CountChar,返回值为整型,参数两个,第一个参数可以是字符串、整数、单精度、双精度,第二个参数为字符,方法功能返回第二个参
- 编写一个类,该类具有统计文件长度,实现文件复制的函数。 其中复制功能函数如: void copy(string srcFileName,string targetFileName);
- 编写一个类,该类具有统计文件长度,实现文件复制的函数。 其中复制功能函数如: void copy(string srcFileName,string targetFileName);
- Online Coding开发模式 (通过在线配置实现一个表模型的增删改查功能,无需写任何代码)
- ”黑马程序员“编写一个可以获取文件扩展名的函数,形参接收一个文件名字符串,返回一个扩展名字符串。
- C#--2.继续在该类中编写一下方法,名称为Reconvert,参数一个,但可以是字符串、整数、单精度、双精度,方法功能返回参数的逆序。
- 实现一个配置简单功能强大的excel工具类搞定excel导入导出(二)
- BuguMongo通过BuguFS类来操作GridFS文件系统,能够实现对文件的保存、获取、删除、重命名、移动等操作,而且能够按文件夹组织文件。