通讯录管理系统(C语言)

需求及功能分析

本系统主要划分为8个子系统,如下图所示·。
在这里插入图片描述

  1. 增加联系人模块
  2. 删除联系人模块
  3. 查找联系人模块
  4. 插入联系人模块
  5. 保存联系人模块
  6. 加载联系人模块
  7. 显示联系人模块
  8. 退出模块

具体代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

#define MAX 40
typedef struct {
    char name[50];/*姓名*/
    char corp[50];/*工作单位*/
    char phone[15];/*联系手机*/
    char address[100];/*家庭住址*/
    char qq[15];/*联系QQ*/
    char msn[50];/*联系MSN*/
    char mail[50];/*电子邮件*/
} AddressInfo;/*通讯录结构体*/

int AddNew_AddrInfo(AddressInfo f[]);/*增加联系人*/
int Select_Menu(); /*输出主菜单*/
void Output_AddrInfo(AddressInfo addrinfo);/*输出一个联系人信息*/
int Find_AddrInfo(AddressInfo f[], int n, char *k);/*查找*/
int Delete_AddrInfo(AddressInfo f[], int countPerson);/*删除联系人*/
int Insert_AddrInfo(AddressInfo f[], int countPerson);/*插入联系人*/
void Save_AddrInfo(AddressInfo f[], int countPerson);/*保存文件*/
void Search_AddrInfo(AddressInfo f[], int countPerson);/*查找联系人*/
int Read_AddrInfo(AddressInfo f[]);/*从文件读取联系人信息*/
void DisplayAll_AddrInfo(AddressInfo f[], int countPerson);/*输出所有的联系人信息*/

/*主函数*/
int main() {
    AddressInfo addrinfo[MAX];
    int countPerson = 0;
    do {
        switch (Select_Menu()) {
            case 0:/*增加联系人*/
                countPerson = AddNew_AddrInfo(addrinfo);
                break;
            case 1:/*删除联系人*/
                countPerson = Delete_AddrInfo(addrinfo, countPerson);
                break;
            case 2:/*查找联系人*/
                Search_AddrInfo(addrinfo, countPerson);
                break;
            case 3:/*插入联系人*/
                countPerson = Insert_AddrInfo(addrinfo, countPerson);
                break;
            case 4:/*保存联系人文件*/
                Save_AddrInfo(addrinfo, countPerson);
                break;
            case 5:/*从文件加载联系人信息*/
                countPerson = Read_AddrInfo(addrinfo);
                break;
            case 6:/*显示所有联系人*/
                DisplayAll_AddrInfo(addrinfo, countPerson);
                break;
            case 7:/*退出循环*/
                exit(0);
                break;
        }
    } while (1);
}

/*增加联系人*/
int AddNew_AddrInfo(AddressInfo f[]) {
    int i = 0, n = 0;
    char *s = 0;
    printf("请输入当前增加的联系人总个数 \n");/*提示信息*/
    scanf("%d", &n); /*输入记录数*/
    printf("请输入记录 \n"); /*提示输入记录*/
    printf("姓名  工作单位  联系电话  家庭住址  联系QQ   联系MSN  电子邮件\n");
    printf("------------------------------------------------\n");
    for (i = 0; i < n; i++) {
        scanf("%s", f[i].name);
        scanf("%s", f[i].corp);
        scanf("%s", f[i].phone);
        scanf("%s", f[i].address);
        scanf("%s", f[i].qq);
        scanf("%s", f[i].msn);
        scanf("%s", f[i].mail);
        printf("----------------------------------------------\n");
    }
    return n; /*返回记录条数*/
}

/*主菜单*/
int Select_Menu() {
    char s[80];/*以一行80个字符为限,多余的部分不从键盘读取*/
    int c = 0;
    system("cls");/*清屏*/
    printf("\n");
    printf("/******************************************\\\n");
    printf("*                                          *\n");
    printf("*        通  讯  录  管  理  系  统        *\n");
    printf("*                  主菜单                  *\n");
    printf("*                                          *\n");
    printf("*             0. 增加联系人信息            *\n");
    printf("*             1. 删除联系人信息            *\n");
    printf("*             2. 查找联系人信息            *\n");
    printf("*             3. 插入联系人信息            *\n");
    printf("*             4. 保存联系人文件            *\n");
    printf("*             5. 从文件加载联系人信息      *\n");
    printf("*             6. 显示所有联系人信息        *\n");
    printf("*             7. 退出管理系统              *\n");
    printf("*                                          *\n");
    printf("\\******************************************/\n\n");
    do {
        printf("\n 请选择对应的序号(0~7):"); /*提示输入选项*/
        scanf("%s", s); /*输入选择项*/
        c = atoi(s); /*将输入的字符串转化为整型数*/
    } while (c < 0 || c > 7); /*选择项不在0~7之间重输*/
    return c; /*返回选择项,主程序根据该数调用相应的函数*/
}

/*删除联系人*/
int Delete_AddrInfo(AddressInfo f[], int countPerson) {
    char k[50];/*要删除的联系人的姓名*/
    int i, j;
    int ch = 0;
    printf("请输入要删除的联系人的姓名:\n"); /*提示信息*/
    scanf("%s", k);/*从键盘取得输入的姓名*/
    i = Find_AddrInfo(f, countPerson, k); /*调用Find_AddrInfo查询*/
    if (i > countPerson - 1) /*如果i>n-1超过了数组的长度*/
        printf("没找到要删除的联系人\n"); /*显示没找到要删除的记录*/
    else {
        Output_AddrInfo(f[i]); /*调用输出函数显示该条记录信息*/
        printf("输入1确认删除,输入0不删除(1/0)。\n"); /*确认是否要删除*/
        scanf("%d", &ch); /*输入一个整数0或1*/
        if (ch == 1) /*如果确认删除整数为1*/
        {
            for (j = i + 1; j < countPerson; j++) /*删除该记录,实际后续记录前移*/
            {
                memcpy(&(f[j - 1]), &(f[j]), sizeof(AddressInfo));
            }
            countPerson--; /*记录数减1*/
        }
    }
    return countPerson; /*返回记录数*/
}

/*查找记录*/
void Search_AddrInfo(AddressInfo f[], int countPerson) {
    int i = 0;    /*保存查找到节点序号*/
    char k[50]; /*记录要查找的联系人姓名*/
    printf("请输入要查找的联系人姓名:\n");
    scanf("%s", k); /*输入要查找的联系人姓名*/
    i = Find_AddrInfo(f, countPerson, k);/*调用find函数,得到一个整数*/
    if ((i + 1) > countPerson)/*如果整数i值大于n-1,说明没找到*/
        printf("未找到,请确认有此用户存在!\n");
    else
        Output_AddrInfo(f[i]); /*找到,调用显示函数显示记录*/
}

/*显示指定的联系人信息*/
void Output_AddrInfo(AddressInfo addrinfo) {
    printf("\n\n************************************\n");
    printf("姓名  工作单位  联系电话  家庭住址  联系QQ   联系MSN  电子邮件\n");
    printf("------------------------------------------------\n");
    printf("%-6s%-10s%-10s%-10s%-10s%-10s%-10s\n", addrinfo.name, addrinfo.corp, addrinfo.phone, addrinfo.address,
           addrinfo.qq, addrinfo.msn, addrinfo.mail);
    printf("****************************************\n");
    printf("按任意键继续!");
    getch();
}

/*查找联系人*/
int Find_AddrInfo(AddressInfo f[], int n, char *k) {
    int i;
    for (i = 0; i < n; i++)/*从第一条记录开始,直到最后一条*/
    {
        if (strcmp(k, f[i].name) == 0) /*记录中的姓名和待比较的姓名是否相等*/
            return i; /*相等,则返回该记录的下标号,程序提前结结束*/
    }
    return i; /*返回i值*/
}

/*插入联系人*/
int Insert_AddrInfo(AddressInfo f[], int countPerson)/*插入联系人*/
{
    int i, j;
    char s[50]; /*确定插入在哪个记录之前*/
    AddressInfo tempInfo; /*新插入记录信息*/
    memset(&tempInfo, 0, sizeof(AddressInfo));
    printf("请输入以下信息的值\n");
    printf("*****************************************\n");
    printf("姓名  工作单位  联系电话  家庭住址  联系QQ   联系MSN  电子邮件\n");
    printf("------------------------------------------------\n");
    scanf("%s", tempInfo.name);
    scanf("%s", tempInfo.corp);
    scanf("%s", tempInfo.phone);
    scanf("%s", tempInfo.address);
    scanf("%s", tempInfo.qq);
    scanf("%s", tempInfo.msn);
    scanf("%s", tempInfo.mail);
    printf("----------------------------------------\n");
    printf("请问您要在哪个联系人的信息前面插入,请输入该联系人的姓名:\n");
    scanf("%s", s); /*输入插入位置的姓名*/
    i = Find_AddrInfo(f, countPerson, s); /*调用find,确定插入位置*/
    for (j = countPerson - 1; j >= i; j--) /*从最后一个结点开始向后移动一条*/
    {
        memcpy(&(f[j + 1]), &(f[j]), sizeof(AddressInfo));
    }
    memcpy(&(f[i]), &(tempInfo), sizeof(AddressInfo));
    countPerson++; /*记录数加1*/
    return countPerson; /*返回记录数*/

}

/*保存函数*/
void Save_AddrInfo(AddressInfo f[], int countPerson) {
    int i;
    FILE *fp; /*指向文件的指针*/
    if ((fp = fopen("AddrInfo.txt", "wb")) == NULL) /*打开文件,并判断打开是否正常*/
    {
        printf("不能打开文件:AddrInfo.txt\n");/*没打开*/
        exit(1); /*退出*/
    }
    printf("\n************开始保存文件.************\n"); /*输出提示信息*/
    fprintf(fp, "%d", countPerson); /*将记录数写入文件*/
    fprintf(fp, "\r\n"); /*将换行符号写入文件*/
    for (i = 0; i < countPerson; i++) {
        fprintf(fp, "%-6s%-10s%-10s%-10s%-10s%-10s%-10s\n", f[i].name, f[i].corp,
                f[i].phone, f[i].address, f[i].qq, f[i].msn, f[i].mail);
        fprintf(fp, "\r\n"); /*记录每行的一个回车换行符*/
    }
    fclose(fp);/*关闭文件*/
    printf("****************保存成功***************\n"); /*显示保存成功*/
    printf("按任意键继续!");
    getch();

}

/*读入函数*/
int Read_AddrInfo(AddressInfo f[]) {
    FILE *fp = NULL; /*指向文件的指针*/
    int i = 0, countPerson = 0;
    if ((fp = fopen("AddrInfo.txt", "rb")) == NULL)/*打开文件*/
    {
        printf("不能打开文件:AddrInfo.txt\n"); /*不能打开*/
        exit(1); /*退出*/
    }
    fscanf(fp, "%d", &countPerson); /*从文件读取联系人总个数*/
    printf("\n************开始读取文件.************\n"); /*输出提示信息*/
    for (i = 0; i < countPerson; i++)
        fscanf(fp, "%6s%10s%10s%10s%10s%10s%10s\n", f[i].name, f[i].corp,
               f[i].phone, f[i].address, f[i].qq, f[i].msn, f[i].mail);
    fclose(fp); /*关闭文件*/
    printf("****************读取成功***************\n"); /*显示保存成功*/
    return countPerson; /*返回记录数*/
}

/*显示记录函数*/
void DisplayAll_AddrInfo(AddressInfo f[], int countPerson) {
    int i;
    for (i = 0; i < countPerson; i++) {
        Output_AddrInfo(f[i]); /*调用输出函数显示该记录*/
        printf("\r\n");
    }
}

相关推荐

  1. C++】通讯录管理系统

    2024-07-22 17:42:02       32 阅读
  2. 简易通讯录管理系统C语言实现及代码详解

    2024-07-22 17:42:02       28 阅读
  3. C++项目(通讯录管理系统

    2024-07-22 17:42:02       22 阅读
  4. c++手机通讯录管理系统280

    2024-07-22 17:42:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 17:42:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 17:42:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 17:42:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 17:42:02       55 阅读

热门阅读

  1. Github订阅地址

    2024-07-22 17:42:02       15 阅读
  2. Qt:愚蠢的qmake

    2024-07-22 17:42:02       21 阅读
  3. 《设计模式之美》读书笔记2

    2024-07-22 17:42:02       16 阅读
  4. Seata 面试题及答案整理,最新面试题

    2024-07-22 17:42:02       19 阅读
  5. Linux 防火墙配置【iptable,firewalld,ufw】

    2024-07-22 17:42:02       17 阅读
  6. Redisson内置延迟队列RDelayedQueue

    2024-07-22 17:42:02       17 阅读
  7. MYSQL设计和开发规范(简易版)

    2024-07-22 17:42:02       18 阅读
  8. 解决MySQL中LIMIT大偏移量加载慢的问题

    2024-07-22 17:42:02       15 阅读
  9. 【算法】Python中常见的三种优化算法介绍及使用

    2024-07-22 17:42:02       17 阅读
  10. C++版OpenCV_03_图像增强

    2024-07-22 17:42:02       18 阅读