实现功能有:
1.新建,添加联系人,在达到上限时输出book full!(存储上限可以通过改变宏定义里MAXSIZE的值来实现,为了测试方便,目前的 MAXSIZE = 3)
2.查看当前通讯录内所有联系人
3.以名字为索引查找联系人
4.以名字为索引修改联系人
5.以名字为索引删除联系人
6.按名字ASCII码值从小到大排序
7.按下按键esc退出
8.十分贴心地把字体调成了红色。
不足:
1.选择功能时必须键盘输入选项然后回车才有效。预想操作应该是按下对应按键直接实现功能,不用按回车,也不会在屏幕显示按下了哪个按键。
2.没能实现在添加联系人时,和上面一样按ESC不回车不显示直接退出。
3.在打印联系人列表时用sleep()函数暂留3秒,没能实现在打印出联系人列表后按任意键退出当前画面。、
4.输入的联系人名字是中文时,不会按拼音顺序排序
5.在每个功能界面快刷新的时候输入字符会影响到下次功能选择。
6.删除功能不完善,删除后再打印联系人信息列表,信息展示不对。
7.没有输入错误反馈不完善
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#define MAXSIZE 3
#define ENTER 0x0d
#define ESC 0x1b
#define NEW '1'
#define SHOW '2'
#define FIND '3'
#define MODIFY '4'
#define DELETE '5'
#define SORT '6'
#define EXIT ESC
typedef struct
{
char name[20];
char tel[20];
}RECODER;
int person = 0;
//欢迎界面
void welcome()
{
system("clear");
printf("\n\n\n\033[1;33;40m----------------------------------------------------\n\n\n\n");
printf("%20sWelcome\n"," ");
printf("\n\n\n----------------------------------------------------\n");
sleep(2);
}
//功能菜单
void menu()
{
system("clear");
printf("\n\n\n----------------------------------------------------\n");
printf("\n%10s%-10s%10s%-10s\n"," ", "1.New"," ","2.Show");
printf("\n%10s%-10s%10s%-10s\n"," ", "3.Find"," ","4.Modify");
printf("\n%10s%-10s%10s%-10s\n"," ", "5.Delete"," ","6.Sort");
printf("%15sPress <ESC> exit\n"," ");
printf("----------------------------------------------------\n");
}
//新建、添加联系人
void AddInfo(RECODER *recoder[])
{
char ch;
if(person == MAXSIZE)
{
printf("\nBOOK FULL!\n");
sleep(1);
return;
}
printf("Please TYPE:\n");
while(1)
{
if(person == MAXSIZE)
{
printf("\nBOOK FULL!\n");
sleep(1);
break;
}
recoder[person] = (RECODER *)malloc(sizeof(RECODER));
printf(" Name: ");
scanf("%s", recoder[person]->name);
printf(" Tel : ");
scanf("%s", recoder[person]->tel);
printf("\n");
printf("Quit<ESC> Continue<ENTER> \n");
scanf("%c", &ch);
scanf("%c", &ch);
fflush(stdout);
if(ch == ESC)
{
break;
}
printf("\n");
person++;
}
}
//查询、修改、删除
/* Find: choice = 0, Modify: choice = 1, Delete: choice = 2*/
void Find_Modify_Delete(RECODER *recoder[], int choice)
{
char name[20];
int index;
int index_d;
printf("Press name:");
scanf("%s", name);
printf("Find result:\v");
for(index = 0; index < person; index++)
{
if( ! strcmp(recoder[index]->name, name) )
{
printf("%s %s\n", recoder[index]->name, recoder[index]->tel);
sleep(1);
if(choice == 1)
{
printf("Please TYPE:\n");
printf(" %s's new Tel : ", recoder[index]->name);
scanf("%s", recoder[index]->tel);
printf("\n");
}
else if(choice == 2)
{
for(index_d = index; index_d < person - 1; index_d++)
{
//strcpy(recoder[index_d]->name, recoder[index_d + 1]->name);
//strcpy(recoder[index_d]->tel, recoder[index_d + 1]->tel);
recoder[index_d] = recoder[index_d + 1];
}
free(recoder[index_d]);
recoder[index_d] = NULL;
person--;
printf("Delete success\n");
sleep(1);
}
}
}
sleep(1);
}
//打印联系人信息列表
void ShowAll(RECODER *recoder[])
{
int index;
printf("\t%-20s %-20s\n","Name", "Telphone number");
for(index = 0; index < person; index++)
{
printf("\t%-20s %-20s\n", recoder[index]->name, recoder[index]->tel);
}
sleep(3);
}
//排序
void Sort(RECODER *recoder[])
{
int index_1;
int index_2;
RECODER *tmp;
for(index_1 = 0; index_1 < person; index_1 ++)
{
for(index_2 = 0; index_2 < person - 1 - index_1; index_2++)
{
if(strcmp(recoder[index_2]->name, recoder[index_2 + 1]->name) > 0)
{
tmp = recoder[index_2];
recoder[index_2] = recoder[index_2 + 1];
recoder[index_2 + 1] = tmp;
}
}
}
printf("Sort success\n");
sleep(1);
}
int main()
{
RECODER *recoder[MAXSIZE];
char choice;
welcome();
while(1)
{
menu();
scanf("%c", &choice);
switch(choice)
{
case NEW:
AddInfo(recoder);
break;
case SHOW:
ShowAll(recoder);
break;
case FIND:
Find_Modify_Delete(recoder, 0);
break;
case MODIFY:
Find_Modify_Delete(recoder, 1);
break;
case DELETE:
Find_Modify_Delete(recoder, 2);
break;
case SORT:
Sort(recoder);
break;
case EXIT:
exit(0);
break;
}
}
return 0;
}