通讯录完善版

历时几天的通讯录总算是告一段落了,可能有些地方没有达到最好的效果,不过逻辑还算完整,基本不会出现什么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;
}

猜你喜欢

转载自blog.csdn.net/LX370ZZZ/article/details/81366628