C语言原创实验项目简单案例三(电子通讯录管理系统)

//本程序是笔者在学习完C Primer Plus后想到的一个独立小项目;

//代码中含有大量注释方便读者阅读;

//使用的均是C标准库(可移植程序);

//可在Linux/Mac os/Windows下运行;

//未经允许严禁抄袭以及转载;

//若对您有帮助请点赞收藏或者转发;

//源代码奉上,希望能够对您有所启发;

//C语言电子通讯录管理系统.c

//注意:需要提前创建一个名为mycontacts的记事本文件;

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define TWL 10
#define LEN 12
#define MAXSIZE 100

typedef struct
{
    
    
    char num[TWL];
    char name[LEN];
    char tel[LEN];
} contacts;

int print_menu(void);
void create_maillist(contacts *p, int *n);
void save_message_to_file(contacts *p, int n);
void load_message_from_file(contacts *p, int *n);
void display_message(contacts *p, int n);
void search_person(contacts *p, int n);
void search_by_num(contacts *p, int n);
void search_by_name(contacts *p, int n);
void modify_maillist(contacts *p, int n);
void add_person(contacts *p, int *n);
void delete_person(contacts *p, int *n);
void delete_by_num(contacts *p, int *n);
void delete_by_name(contacts *p, int *n);
void sort_maillist(contacts *p, int n);
void sort_by_num(contacts *p, int n);
void sort_by_name(contacts *p, int n);
int get_first(void);
void eatline(void);
char *s_gets(char *st, int n);
bool check_is_zero(int n);

int main(void)
{
    
    
    int ch;
    int n = 0;
    bool flag = false;
    contacts people[MAXSIZE];

    load_message_from_file(people, &n);
    while (1)
    {
    
    
        ch = print_menu();
        switch (ch)
        {
    
    
        case '1':
        {
    
    
            create_maillist(people, &n);
            save_message_to_file(people, n);
            break;
        }
        case '2':
        {
    
    
            if (flag = check_is_zero(n))
            {
    
    
                break;
            }
            display_message(people, n);
            break;
        }
        case '3':
        {
    
    
            if (flag = check_is_zero(n))
            {
    
    
                break;
            }
            search_person(people, n);
            break;
        }
        case '4':
        {
    
    
            if (flag = check_is_zero(n))
            {
    
    
                break;
            }
            modify_maillist(people, n);
            break;
        }
        case '5':
        {
    
    
            if (flag = check_is_zero(n))
            {
    
    
                break;
            }
            add_person(people, &n);
            break;
        }
        case '6':
        {
    
    
            if (flag = check_is_zero(n))
            {
    
    
                break;
            }
            delete_person(people, &n);
            break;
        }
        case '7':
        {
    
    
            if (flag = check_is_zero(n))
            {
    
    
                break;
            }
            sort_maillist(people, n);
            break;
        }
        case '0':
        {
    
    
            break;
        }
        }
        if ('0' == ch)
        {
    
    
            break;
        }
        printf("请按回车键继续操作..");
        eatline();
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }
    puts("欢迎再次使用!");

    return 0;
}

int print_menu(void)
{
    
    
    int ch;

    puts("=======================================");
    puts("       欢迎进入电子通讯录管理系统");
    puts("          您可以进行如下选择:");
    puts("          1:创建新通讯录");
    puts("          2:显示通讯录中的信息");
    puts("          3:查询通讯录中的信息");
    puts("          4:修改通讯录中的信息");
    puts("          5:添加新的联系人至通讯录");
    puts("          6:删除通讯录中的信息");
    puts("          7:排序通讯录中的信息");
    puts("          0:退出当前程序");
    puts("=======================================");
    printf("请您输入选择:");
    ch = get_first();
    while (strchr("12345670", ch) == NULL)
    {
    
    
        printf("输入无效!请重新输入:");
        ch = get_first();
    }
    return ch;
}

void create_maillist(contacts *p, int *n)
{
    
    
    contacts temp;
    *n = 0;

    do
    {
    
    
        printf("请输入第%d个联系人的信息:\n", (*n) + 1);
        printf("请输入联系人的编号(按#结束输入):");
        do
        {
    
    
            s_gets(temp.num, TWL);
        } while (strcmp(temp.num, "") == 0);
        if ('#' == temp.num[0])
        {
    
    
            break;
        }
        printf("请输入联系人的姓名(按#结束输入):");
        do
        {
    
    
            s_gets(temp.name, LEN);
        } while (strcmp(temp.name, "") == 0);
        if ('#' == temp.name[0])
        {
    
    
            break;
        }
        printf("请输入联系人的电话号码(按#结束输入):");
        do
        {
    
    
            s_gets(temp.tel, LEN);
        } while (strcmp(temp.tel, "") == 0);
        if ('#' == temp.tel[0])
        {
    
    
            break;
        }
        ++(*n);
        *p = temp;
        p++;
    } while ((*n) < MAXSIZE);
}

void save_message_to_file(contacts *p, int n)
{
    
    
    FILE *fp;
    contacts *temp;

    if ((fp = fopen("mycontacts.txt", "a")) == NULL)
    {
    
    
        fprintf(stderr, "无法添加信息至联系人目录文件!退出本程序!\n");
        exit(EXIT_FAILURE);
    }
    for (temp = p; temp < p + n; temp++)
    {
    
    
        fprintf(fp, "%10s %12s %12s\n", temp->num, temp->name, temp->tel);
    }
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", "mycontacts.txt");
    }
    return;
}

void load_message_from_file(contacts *p, int *n)
{
    
    
    FILE *fp;
    contacts *temp;

    if ((fp = fopen("mycontacts.txt", "r")) == NULL)
    {
    
    
        fprintf(stderr, "无法打开%s文件!\n", "mycontacts.txt");
        exit(EXIT_FAILURE);
    }
    temp = p;
    *n = 0;
    while ((*n) < MAXSIZE)
    {
    
    
        if (fscanf(fp, "%9s %11s %11s", &temp->num, &temp->name, &temp->tel) == EOF)
        {
    
    
            break;
        }
        temp++;
        ++(*n);
    }
    if (fclose(fp) != 0)
    {
    
    
        fprintf(stderr, "关闭%s文件失败!\n", "mycontacts.txt");
    }
    return;
}

void display_message(contacts *p, int n)
{
    
    
    contacts *temp;

    puts("通讯录中信息如下:");
    printf("编号       姓名         电话号码\n");
    for (temp = p; temp < p + n; temp++)
    {
    
    
        printf("%-10s %-12s %-12s\n", temp->num, temp->name, temp->tel);
    }
    return;
}

void search_person(contacts *p, int n)
{
    
    
    int ch;

    printf("请您选择按照编号查询(h)还是按照姓名查询(m):");
    ch = get_first();
    while (ch != 'h' && ch != 'm')
    {
    
    
        printf("输入无效!请输入h或者m:");
        ch = get_first();
    }
    if ('h' == ch)
    {
    
    
        search_by_num(p, n);
    }
    else
    {
    
    
        search_by_name(p, n);
    }
    return;
}

void search_by_num(contacts *p, int n)
{
    
    
    contacts *temp;
    char tempnum[TWL];
    bool flag = false;

    printf("请您输入需要查询联系人的编号:");
    do
    {
    
    
        s_gets(tempnum, TWL);
    } while (strcmp(tempnum, "") == 0);
    for (temp = p; temp < p + n; temp++)
    {
    
    
        if (strcmp(tempnum, temp->num) == 0)
        {
    
    
            if (!flag)
            {
    
    
                printf("此人的信息是:\n");
                printf("编号       姓名         电话号码\n");
                printf("%-10s %-12s %-12s\n", temp->num, temp->name, temp->tel);
                flag = true;
            }
        }
    }
    if (!flag)
    {
    
    
        printf("通讯录中未找到此人!\n");
    }
    return;
}

void search_by_name(contacts *p, int n)
{
    
    
    contacts *temp;
    char tempname[TWL];
    bool flag = false;

    printf("请您输入需要查询联系人的姓名:");
    do
    {
    
    
        s_gets(tempname, TWL);
    } while (strcmp(tempname, "") == 0);
    for (temp = p; temp < p + n; temp++)
    {
    
    
        if (strcmp(tempname, temp->name) == 0)
        {
    
    
            if (!flag)
            {
    
    
                printf("此人的信息是:\n");
                printf("编号       姓名         电话号码\n");
                printf("%-10s %-12s %-12s\n", temp->num, temp->name, temp->tel);
                flag = true;
            }
        }
    }
    if (!flag)
    {
    
    
        printf("通讯录中未找到此人!\n");
    }
    return;
}

void modify_maillist(contacts *p, int n)
{
    
    
    int ch;
    contacts *q, *find, temp;

    printf("请输入您将要修改的通讯录中的联系人的原编号:");
    do
    {
    
    
        s_gets(temp.num, TWL);
    } while (strcmp(temp.num, "") == 0);
    for (q = p; q < p + n; q++)
    {
    
    
        if (strcmp(temp.num, q->num) == 0)
        {
    
    
            find = q;
            break;
        }
    }
    if (p + n == q)
    {
    
    
        printf("通讯录中未找到此人!\n");
    }
    else
    {
    
    
        do
        {
    
    
            printf("请输入修改的编号:");
            do
            {
    
    
                s_gets(temp.num, TWL);
            } while (strcmp(temp.num, "") == 0);
            printf("请输入修改的姓名:");
            do
            {
    
    
                s_gets(temp.name, LEN);
            } while (strcmp(temp.name, "") == 0);
            printf("请输入替换的电话号码:");
            do
            {
    
    
                s_gets(temp.tel, LEN);
            } while (strcmp(temp.tel, "") == 0);
            for (p = q; q < p + n; q++)
            {
    
    
                if ((strcmp(temp.num, q->num) == 0) && (q != find))
                {
    
    
                    printf("您输入的编号与其他联系人重复!\n");
                    printf("需要重新输入吗?(y/n):");
                    ch = get_first();
                    while (ch != 'y' && ch != 'n')
                    {
    
    
                        printf("输入有误!请输入y或者n:");
                        ch = get_first();
                    }
                    putchar('\n');
                    break;
                }
            }
            if (p + n == q)
            {
    
    
                *find = temp;
                break;
            }
        } while (ch == 'y');
    }
    return;
}

void add_person(contacts *p, int *n)
{
    
    
    int ch;
    contacts *q, temp;

    do
    {
    
    
        while (1)
        {
    
    
            printf("请输入新添加至通讯录的编号:");
            do
            {
    
    
                s_gets(temp.num, TWL);
            } while (strcmp(temp.num, "") == 0);
            for (q = p; q < p + (*n); q++)
            {
    
    
                if (strcmp(temp.num, q->num) == 0)
                {
    
    
                    break;
                }
            }
            if (q < p + (*n))
            {
    
    
                printf("此编号已存在!请重新输入:");
            }
            else
            {
    
    
                break;
            }
        }
        printf("请输入新联系人的姓名:");
        do
        {
    
    
            s_gets(temp.name, LEN);
        } while (strcmp(temp.name, "") == 0);
        printf("请输入新联系人的电话号码:");
        do
        {
    
    
            s_gets(temp.tel, LEN);
        } while (strcmp(temp.tel, "") == 0);
        *q = temp;
        ++(*n);
        printf("您还想继续添加新联系人吗?(y/n):");
        ch = get_first();
        while (ch != 'y' && ch != 'n')
        {
    
    
            printf("输入无效!请重新输入:");
            ch = get_first();
        }
    } while (ch == 'y');
    return;
}

void delete_person(contacts *p, int *n)
{
    
    
    int ch;

    printf("您想选择查询编号(h)还是查询姓名(m)删除联系人?\n");
    printf("请您输入选择:");
    ch = get_first();
    while (ch != 'h' && ch != 'm')
    {
    
    
        printf("输入无效!请输入h或者m:");
        ch = get_first();
    }
    if ('h' == ch)
    {
    
    
        delete_by_num(p, n);
    }
    else
    {
    
    
        delete_by_name(p, n);
    }
    return;
}

void delete_by_num(contacts *p, int *n)
{
    
    
    contacts *q, *k;
    char tempnum[TWL];

    printf("请输入需要删除的联系人的编号:");
    do
    {
    
    
        s_gets(tempnum, TWL);
    } while (strcmp(tempnum, "") == 0);
    for (k = p; k < p + (*n); k++)
    {
    
    
        if (strcmp(tempnum, k->num) == 0)
        {
    
    
            break;
        }
        if (k < p + (*n))
        {
    
    
            for (q = k; q < k + (*n) - 1; q++)
            {
    
    
                *q = *(q + 1);
            }
            --(*n);
        }
        else
        {
    
    
            printf("通讯录中未找到此人!\n");
        }
    }
    return;
}

void delete_by_name(contacts *p, int *n)
{
    
    
    contacts *q, *k;
    char tempname[TWL];

    printf("请输入需要删除的联系人的姓名:");
    do
    {
    
    
        s_gets(tempname, TWL);
    } while (strcmp(tempname, "") == 0);
    for (k = p; k < p + (*n); k++)
    {
    
    
        if (strcmp(tempname, k->name) == 0)
        {
    
    
            break;
        }
        if (k < p + (*n))
        {
    
    
            for (q = k; q < k + (*n) - 1; q++)
            {
    
    
                *q = *(q + 1);
            }
            --(*n);
        }
        else
        {
    
    
            printf("通讯录中未找到此人!\n");
        }
    }
    return;
}

void sort_maillist(contacts *p, int n)
{
    
    
    int ch;

    printf("联系人按照编号排序(h)还是按照姓名排序(m)?\n");
    printf("请您输入选择:");
    ch = get_first();
    while (ch != 'h' && ch != 'm')
    {
    
    
        printf("输入无效!请输入h或者m:");
        ch = get_first();
    }
    if ('h' == ch)
    {
    
    
        sort_by_num(p, n);
    }
    else
    {
    
    
        sort_by_name(p, n);
    }
    return;
}

void sort_by_num(contacts *p, int n)
{
    
    
    contacts temp;
    int i, j, k, ch;

    printf("您想按照升序(s)还是按照降序(j)排序?\n");
    printf("请您输入选择:");
    ch = get_first();
    while (ch != 's' && ch != 'j')
    {
    
    
        printf("输入无效!请输入s或者j:");
        ch = get_first();
    }
    if ('s' == ch)
    {
    
    
        for (i = 0; i < n - 1; i++)
        {
    
    
            k = i;
            for (j = i + 1; j < n; j++)
            {
    
    
                if (strcmp((p + k)->name, (p + j)->name) > 0)
                {
    
    
                    k = j;
                }
                if (k != i)
                {
    
    
                    temp = *(p + k);
                    *(p + k) = *(p + i);
                    *(p + i) = temp;
                }
            }
        }
    }
    else
    {
    
    
        for (i = 0; i < n - 1; i++)
        {
    
    
            k = i;
            for (j = i + 1; j < n; j++)
            {
    
    
                if (strcmp((p + k)->name, (p + j)->name) < 0)
                {
    
    
                    k = j;
                }
                if (k != i)
                {
    
    
                    temp = *(p + k);
                    *(p + k) = *(p + i);
                    *(p + i) = temp;
                }
            }
        }
    }
    return;
}

void sort_by_name(contacts *p, int n)
{
    
    
    contacts temp;
    int i, j, k, ch;

    printf("您想按照升序(s)还是按照降序(j)排序?\n");
    printf("请您输入选择:");
    ch = get_first();
    while (ch != 's' && ch != 'j')
    {
    
    
        printf("输入无效!请输入s或者j:");
        ch = get_first();
    }
    if ('s' == ch)
    {
    
    
        for (i = 0; i < n - 1; i++)
        {
    
    
            k = i;
            for (j = i + 1; j < n; j++)
            {
    
    
                if (strcmp((p + k)->num, (p + j)->num) > 0)
                {
    
    
                    k = j;
                }
                if (k != i)
                {
    
    
                    temp = *(p + k);
                    *(p + k) = *(p + i);
                    *(p + i) = temp;
                }
            }
        }
    }
    else
    {
    
    
        for (i = 0; i < n - 1; i++)
        {
    
    
            k = i;
            for (j = i + 1; j < n; j++)
            {
    
    
                if (strcmp((p + k)->num, (p + j)->num) < 0)
                {
    
    
                    k = j;
                }
                if (k != i)
                {
    
    
                    temp = *(p + k);
                    *(p + k) = *(p + i);
                    *(p + i) = temp;
                }
            }
        }
    }
    return;
}

int get_first(void)
{
    
    
    int ch;

    do
    {
    
    
        ch = towlower(getchar());
    } while (isspace(ch));
    eatline();
    return ch;
}

void eatline(void)
{
    
    
    while (getchar() != '\n')
        continue;
    return;
}

char *s_gets(char *st, int n)
{
    
    
    char *find;
    char *ret_val;

    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
    
    
        find = strchr(st, '\n');
        if (find)
        {
    
    
            *find = '\0';
        }
        else
        {
    
    
            while (getchar() != '\n')
                continue;
        }
    }
    return ret_val;
}

bool check_is_zero(int n)
{
    
    
    bool flag = false;

    if (0 == n)
    {
    
    
        printf("通讯录无信息!请先添加联系人的信息!\n");
        flag = true;
    }
    return flag;
}

//-------------

//----------------------------2020年8月19日 -------------------------------

猜你喜欢

转载自blog.csdn.net/m0_46181359/article/details/108111837