历时几天的通讯录总算是告一段落了,可能有些地方没有达到最好的效果,不过逻辑还算完整,基本不会出现什么bug;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLACK "\e[0;30m"
#define L_BLACK "\e[1;30m"
#define RED "\e[0;31m"
#define L_RED "\e[1;31m"
#define GREEN "\e[0;32m"
#define L_GREEN "\e[1;32m"
#define BROWN "\e[0;33m"
#define YELLOW "\e[1;33m"
#define BLUE "\e[0;34m"
#define L_BLUE "\e[1;34m"
#define PURPLE "\e[0;35m"
#define L_PURPLE "\e[1;35m"
#define CYAN "\e[0;36m"
#define L_CYAN "\e[1;36m"
#define GRAY "\e[0;37m"
#define WHITE "\e[1;37m"
#define NONE "\e[0m"
# define size 1000
int count = 0;
int number = -1;
struct person
{
int no;
char name[20];
int age;
char sex[10];
char tel[20];
};
void CutInfo(struct person *ps[])
{
int i, j;
char quit = 'a',C_flag;
char name[20];
aa: printf("按任意键继续删除操作,按0结束\n");
scanf(" %c",&quit);
system("clear");
while(quit != '0')
{
if(count == 0)
{
printf("您还没有联系人快去添加吧!");
goto aa;
}
else if(count == 1)
{
printf("\n您只有一位联系人\n");
printf("姓名:%s 年龄:%d 性别:%s 联系方式:%s\n",
ps[0]->name,ps[0]->age,ps[0]->sex,ps[0]->tel);
bb: printf("确定删除吗?确定请按1,返回请按0;\n");
scanf(" %c",&C_flag);
if(C_flag == '1')
{
free(ps[0]);
ps[0] = NULL;
count--;
printf("已删除!\n");
goto aa;
}
else if(C_flag == '0')
goto aa;
else
{
printf("输入有误,请尝试重新输入\n");
goto bb;
}
}
else
{
system("clear");
printf("\n请输入要删除的联系人姓名:\n");
scanf("%s",name);
for(i = 0; i < count; i++)
{
if(strcmp(ps[i]->name,name) == 0)
{
cc: printf("确定要删除序号:%d 姓名:%s 年龄:%d 性别:%s 电话号码:%s\n",
ps[i]->no,ps[i]->name,ps[i]->age,ps[i]->sex,ps[i]->tel);
printf("确认请按1,返回请按0\n");
scanf(" %c",&C_flag);
if(C_flag == '0')
goto aa;
else if(C_flag == '1')
{
for(j = i; j < count - 1; j++)
{
*ps[j] = *ps[j+1];
}
free(ps[j]);
printf("删除成功!\n");
count--;
//Display(ps);
goto aa;
}
else
{
printf("请检查输入是否有误\n");
goto cc;
}
}
}
if(i == count)
{
printf("没有找到相关联系人,请检查输入是否有误\n");
goto aa;
}
}
}
}
void hello()
{
system("clear");
printf(RED"\n********************************************"NONE);
printf(L_BLUE"\n 欢迎进入通讯录"NONE);
printf(RED"\n********************************************\n");
printf("请选择功能>> \n\n");
printf(L_BLUE"* 1、添加联系人 * 2、删除联系人 \n"NONE);
printf(L_BLUE"* 3、显示联系人 * 4、修改信息 \n"NONE);
printf(L_BLUE"* 5、排序选择 * 6、查找联系人 \n"NONE);
printf(L_BLUE"* 7、退出\n"NONE);
printf(RED"\n********************************************\n"NONE);
sleep(0.5);
}
void AddInfo(struct person *ps[])
{
int i, clear = 0;
char A_flag = 'a', flag;
system("clear");
A: printf("如需退出清按0,任意键继续\n");
sleep(1);
scanf(" %c",&A_flag);
while(A_flag != '0')
{
printf(BLUE"\n\n*****************************请输入联系人********************************\n\n"NONE);
for(i = count; i < 1000; i++)
{
printf(BLUE"请按照:姓名、年龄、性别、电话号码的顺序来输入中间输入空格或回车\n"NONE);
ps[i] = (struct person*)malloc(sizeof(struct person));
scanf("%s%d %s%s",ps[i]->name,
&ps[i]->age,ps[i]->sex,ps[i]->tel);
ps[i]->no = i+1;
printf(BLUE"序号为:%d\t姓名为:%s\t年龄为:%d\n性别为: %s\t联系方式为:%s\n\n"NONE,
ps[i]->no,ps[i]->name,ps[i]->age,ps[i]->sex,ps[i]->tel);
count++;
clear++;
printf(BLUE"是否需要继续输入?任意键继续,退出请按0\n\n"NONE);
scanf(" %c",&flag);
if(flag == '0')
goto A;
if(clear == 3)
{
system("clear");
clear = 0;
}
}
}
}
void Display(struct person *ps[])
{
system("clear");
printf("\n\n");
int i;
char flag = 'a';
while(flag != '0')
{
if(count == 0)
{
printf(L_BLUE"联系人为空,快去添加吧 \n"NONE);
goto D;
}
else
{
for(i = 0; i < count; i++)
{
printf(L_BLUE"序号为:%d\t姓名为:%s\t\t 年龄为:%d\n\t\t性别为: %s\t联系方式为:%s\n\n"NONE,
ps[i]->no,ps[i]->name,ps[i]->age,ps[i]->sex,ps[i]->tel);
}
}
D: printf(L_BLUE"返回上一级请按0\n"NONE);
scanf(" %c",&flag);
}
}
void Sort(struct person *ps[])
{
int i, j;
char S_flag = 'a', way;
struct person tmp = {0};
system("clear");
S: printf(RED"退出请按0,任意键继续\n"NONE);
scanf(" %c",&S_flag);
if(count == 0)
{
printf(RED"联系人为空,快去添加吧!\n"NONE);
sleep(2);
S_flag = '0';
}
while(S_flag != '0')
{
printf(RED"请选择排序方式:1、按姓名(升序) 2、按姓名(降序) \n"NONE);
scanf(" %c",&way);
if(way == '1')
{
for(i = 0; i < count - 1; i++)
{
for(j = 0; j < count - 1 - i; j++)
{
if(strcmp(ps[j]->name, ps[j+1]->name) > 0)
{
tmp = *ps[j+1];
*ps[j+1] = *ps[j];
*ps[j] = tmp;
}
}
}
for(i = 0; i < count; i++)
{
ps[i]->no = i+1;
}
Display(ps);
goto S;
}
else if(way == '2')
{
for(i = 1; i < count - 1; i++)
{
for(j = 1; j < count - 1 - i; j++)
{
if(strcmp(ps[j]->name, ps[j+1]->name) < 0)
{
tmp = *ps[j+1];
*ps[j+1] = *ps[j];
*ps[j] = tmp;
}
}
}
for(i = 0; i < count; i++)
{
ps[i]->no = i+1;
}
Display(ps);
goto S;
}
else
{
printf(RED"请检查输入是否有误(目前仅支持前两种排序方式)\n"NONE);
goto S;
}
}
}
void FindInfo(struct person *ps[])
{
char name[20];
int i;
char F_flag = 'a';
Display(ps);
dd: printf(L_PURPLE"退出查找请按0,任意键继续\n"NONE);
scanf(" %c",&F_flag);
system("clear");
if(count == 0)
F_flag = '0';
while(F_flag != '0')
{
printf(L_PURPLE"请输入要查找的联系人姓名:\n"NONE);
scanf("%s",name);
for(i = 0; i < count; i++)
{
if(strcmp(ps[i]->name,name) == 0)
{
printf(L_PURPLE"已找到!\n"NONE);
printf(L_PURPLE"编号:%d 姓名:%s 年龄:%d 性别:%s 联系方式:%s\n"NONE,
ps[i]->no,ps[i]->name,ps[i]->age,ps[i]->sex,ps[i]->tel);
number = i;
goto dd;
}
}
if(i == count)
{
printf(L_PURPLE"没有相关联系人,请检查输入是否有误\n"NONE);
goto dd;
}
}
}
void Modify(struct person *ps[])
{
char c;
char M_flag = 'a';
if(count == 0)
{
system("clear");
printf("\n\n还没有联系人,快去添加吧!\n");
M_flag = '0';
}
M2: printf("如需退出修改请按0,任意键继续\n");
scanf(" %c",&M_flag);
while(M_flag != '0')
{
FindInfo(ps);
if(number != -1)
{
M1: system("clear");
printf("序号为:%d\t姓名为:%s\t\t 年龄为:%d\n\t\t\t性别为: %s\t联系方式为:%s\n",
ps[number]->no,ps[number]->name,ps[number]->age,ps[number]->sex,ps[number]->tel);
printf("请选择需要修改项:1、姓名 2、年龄 3、性别 4、联系方式\t 按0键返回\n");
scanf(" %c",&c);
if(c == '1')
{
printf("请输入姓名:\n");
scanf("%s",ps[number]->name);
printf("修改成功!");
goto M1;
}
else if(c == '2')
{
printf("请输入年龄:\n");
scanf("%d",&ps[number]->age);
printf("修改成功!\n");
goto M1;
}
else if(c == '3')
{
printf("请输入性别:\n");
scanf("%s",ps[number]->sex);
printf("修改成功!\n");
goto M1;
}
else if(c == '4')
{
printf("请输入联系号码:\n");
scanf("%s",ps[number]->tel);
printf("修改成功!\n");
goto M1;
}
else if(c == '0')
{
goto M2;
}
else
{
printf("输入不符合规范请重试\n");
goto M1;
}
}
if(number == -1)
{
printf("没有相关联系人\n");
goto M2;
}
}
}
int main()
{
char choice;
struct person *ps[size] = {0};
while(1)
{
hello();
printf("请输入你的选择:\n");
scanf(" %c",&choice);
switch (choice)
{
case '1' :
AddInfo(ps);
break;
case '2':
CutInfo(ps);
break;
case '3':
Display(ps);
break;
case '4':
Modify(ps);
break;
case '5':
Sort(ps);
break;
case '6':
FindInfo(ps);
break;
case '7':
system("clear");
exit (0);
break;
default:
printf("输入有误,重新输入!\n");
break;
}
}
return 0;
}