C语言小项目:动态通讯录和静态通讯录的实现

1.静态通讯录:

实现的功能:
①添加联系人
②删除指定联系人
③查找指定联系人
④修改联系人的信息
⑤显示所有人信息
⑥清空所有人信息
⑦保存通讯录到文件中
⑧加载通讯录
⑨以名字排序所有联系人信息
下面是实现的代码:
通讯录的.h文件

#pragma once
#include<stddef.h>
#define ADDRESS_BOOK_MAX    1000
#define ELEM_TYPE     char 
#define FILE_PATH     "book.txt"

typedef struct person{
    ELEM_TYPE name[100];
    ELEM_TYPE gender[100];
    ELEM_TYPE age[100];
    ELEM_TYPE tele_number[100];
    ELEM_TYPE address[100];
}person;

typedef struct address_book
{
    person  book[ADDRESS_BOOK_MAX];
    size_t size;
}address_book;

address_book ADDRLIST;

enum{
    ADDContact = 1,
    DELETEContact = 2,
    FINDContact = 3,
    UPDATAContact = 4,
    DISPLAYContact = 5,
    DESTROYContact = 6,
    SORTBYNAMEContact = 7,
    EXIT = 0

};
void menu();
void ADDR_BOOK_Init(address_book *ADDRLIST);
void ADD_ADDR_BOOK(address_book *ADDRLIST);
void DISPLAY_ALL_ADDRLIST_BOOK(address_book *ADDRLIST);
void ERASE_ADDRLIST_BOOK(address_book *ADDRLIST);
void SAVE_ADDRLIST_BOOK(address_book *ADDRLIST);
void LOAD_ADDRLIST_BOOK(address_book *ADDRLIST);
void FIND_ADDRLIST_BOOK(address_book *ADDRLIST);
void UPDATA_ADDRLIST_BOOK(address_book *ADDRLIST);
void DESTROY_ADDRLIST_BOOK(address_book *ADDRLIST);
void BUBBLE_SORT_ADDRLIST_BOOK(address_book *ADDRLIST);
void swap(person* x,person* y);

.c文件

#include"address_book.h"
#include<stdio.h>
#include<string.h>
#include<assert.h>

void menu()
{
    printf("----------------------------------------\n");
    printf("1.添加联系人信息\n");
    printf("2.删除指定联系人信息\n");
    printf("3.查找指定联系人信息\n");
    printf("4.修改指定联系人信息\n");
    printf("5.显示所有人信息\n");
    printf("6.清空所有人信息\n");
    printf("7.以名字排序所有联系人信息\n");
    printf("0.退出\n");
    printf("----------------------------------------\n");
}
//初始化
void ADDR_BOOK_Init(address_book *ADDRLIST)
{
    ADDRLIST->size = 0;
}
//添加
void ADD_ADDR_BOOK(address_book *ADDRLIST)
{
    assert(ADDRLIST);
    if(ADDRLIST->size > ADDRESS_BOOK_MAX)
    {
        printf("通讯录已满,不可再添加联系人\n");
        return;
    }
    printf("开始添加\n");
    printf("请输入姓名\n");
    scanf("%s",ADDRLIST->book[ADDRLIST->size ].name);
    printf("请输入性别\n");
    scanf("%s",ADDRLIST->book[ADDRLIST->size ].gender);
    printf("请输入年龄\n");
    scanf("%s",ADDRLIST->book[ADDRLIST->size ].age);
    printf("请输入电话号码\n");
    scanf("%s",ADDRLIST->book[ADDRLIST->size ].tele_number);
    printf("请输入地址\n");
    scanf("%s",ADDRLIST->book[ADDRLIST->size ].address );
    printf("添加成功\n");
    ADDRLIST->size ++;
}
//显示
void DISPLAY_ALL_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    size_t i = 0;
    assert(ADDRLIST);
    if(ADDRLIST->size == 0)
    {
        printf("通讯录为空。\n");
        return;
    }
    printf("|姓名|\t\t|性别|\t\t|年龄|\t\t|电话|\t\t\t|地址|\n");
    for(i=0;i<ADDRLIST->size;i++)
    {
        printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n"
            ,ADDRLIST->book[i].name
            ,ADDRLIST->book[i].gender 
            ,ADDRLIST->book[i].age 
            ,ADDRLIST->book[i].tele_number 
            ,ADDRLIST->book[i].address);
    }
}
//删除指定联系人
void ERASE_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    size_t i = 0,j = 0;
    int flag = 0;
    ELEM_TYPE deleted[100];
    assert(ADDRLIST);
    if(ADDRLIST->size <=0)
    {
        printf("通讯录为空\n");
        return ;
    }
    printf("请输入要删除的姓名:");
    scanf("%s",deleted);
    for(i=0;i <= ADDRLIST->size;i++)
    {
        if(strcmp(ADDRLIST->book [i].name ,deleted) == 0)
        {
            for(j=i;j < ADDRLIST->size;j++)
            {
                ADDRLIST->book[j] = ADDRLIST->book [j+1];
            }
            flag = 1;
            ADDRLIST->size --;
            printf("删除成功。\n");
            return;
        }
    }
    if(flag == 0)
    {
        printf("通讯录中没有此人.\n");
        return;
    }
}
//查找通讯录
void FIND_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    size_t i =0;
    ELEM_TYPE find[100];
    int flag = 0;
    assert(ADDRLIST);
    if(ADDRLIST->size == 0)
    {
        printf("通讯录为空。\n");
    }
    printf("请输入要查找的姓名:");
    scanf("%s",find);
    for(i=0;i<ADDRLIST->size ;i++)
    {
        if(strcmp(ADDRLIST->book [i].name ,find) == 0)
        {
            flag = 1;
            printf("|姓名|\t\t|性别|\t\t|年龄|\t\t|电话|\t\t\t|地址|\n");
            printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n"
            ,ADDRLIST->book[i].name
            ,ADDRLIST->book[i].gender 
            ,ADDRLIST->book[i].age 
            ,ADDRLIST->book[i].tele_number 
            ,ADDRLIST->book[i].address);
            return;
        }
    }
    if(flag == 0)
    {
        printf("通讯录中没有这个人。\n");
    }
}
//修改指定人的信息
void UPDATA_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    size_t i = 0;
    ELEM_TYPE updata[200];
    assert(ADDRLIST);
    if(ADDRLIST->size == 0)
    {
        printf("通讯录为空。\n");
        return;
    }
    printf("输入需要修改的人的名字:");
    scanf("%s",updata);
    for(i=0;i<ADDRLIST->size ;i++)
    {
        if(strcmp(ADDRLIST->book [i].name ,updata) == 0)
        {
            printf("请重新输入姓名\n");
            scanf("%s",ADDRLIST->book[i].name);
            printf("请重新输入性别\n");
            scanf("%s",ADDRLIST->book[i].gender);
            printf("请重新输入年龄\n");
            scanf("%s",ADDRLIST->book[i].age);
            printf("请重新输入电话号码\n");
            scanf("%s",ADDRLIST->book[i].tele_number);
            printf("请重新输入地址\n");
            scanf("%s",ADDRLIST->book[i].address );
            return;
        }
    }
}
//清空通讯录
void DESTROY_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    assert(ADDRLIST);
    ADDRLIST->size = 0;
}
//通讯录按名称排序
void swap(person* x,person* y)
{
     person  temp = *x;
              *x = *y;
              *y = temp;
}
void BUBBLE_SORT_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    size_t i = 0,j = 0;
    assert(ADDRLIST);
    if(ADDRLIST->size == 0)
    {
        printf("通讯录为空。\n");
        return;
    }
    for(i=0;i<ADDRLIST->size-1;i++)
    {
        for(j=0;j<ADDRLIST->size-i-1;j++)
        {
            if(strcmp(ADDRLIST->book [j].name,ADDRLIST->book [j+1].name )>0)
            {
                swap(&ADDRLIST->book [j],&ADDRLIST->book [j+1]);
            }
        }
    }
}
//保存信息
void SAVE_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    FILE* write = fopen(FILE_PATH,"w");
    size_t i = 0;
    assert(ADDRLIST);
    if(write == NULL)
    {
        printf("文件打开失败!%s\n",FILE_PATH);                                    //FILE_PATH
        return;
    }
    for(i=0;i<ADDRLIST->size ;i++)
    {
        fprintf(write,"%s\t%s\t%s\t%s\t%s\n"
            ,ADDRLIST->book [i].name 
            ,ADDRLIST->book[i].gender 
            ,ADDRLIST->book [i].age 
            ,ADDRLIST->book [i].tele_number 
            ,ADDRLIST->book [i].address );
    }
    fclose(write);
}
//加载通讯录
void LOAD_ADDRLIST_BOOK(address_book *ADDRLIST)
{
    FILE* read = fopen(FILE_PATH,"r");
    assert(ADDRLIST);
    if(read == NULL)
    {
        printf("文件打开失败。%s\n",FILE_PATH);                                    //FILE_PATH
        return;
    }
    while(feof(read)==0)
    {
        fscanf(read,"%s\t%s\t%s\t%s\t%s\n"
            ,ADDRLIST->book [ADDRLIST->size ].name 
            ,ADDRLIST->book[ADDRLIST->size].gender 
            ,ADDRLIST->book [ADDRLIST->size].age 
            ,ADDRLIST->book [ADDRLIST->size].tele_number 
            ,ADDRLIST->book [ADDRLIST->size].address );
            ++ADDRLIST->size ;
    }
    fclose(read);
}

下面是测试代码:

#include<stdio.h>
#include"address_book.h"
int main()
{
    int input = 0;
    ADDR_BOOK_Init(&ADDRLIST);
    LOAD_ADDRLIST_BOOK(&ADDRLIST);
    do
    {
        menu();
        printf("请选择你的需求:");
        scanf("%d",&input);
        switch(input)
        {
        case ADDContact:
            {
                ADD_ADDR_BOOK(&ADDRLIST);
                SAVE_ADDRLIST_BOOK(&ADDRLIST);
            }
            break;
        case DELETEContact:
            ERASE_ADDRLIST_BOOK(&ADDRLIST);
            SAVE_ADDRLIST_BOOK(&ADDRLIST);
            break;
        case FINDContact:
            FIND_ADDRLIST_BOOK(&ADDRLIST);
            break;
        case UPDATAContact:
            UPDATA_ADDRLIST_BOOK(&ADDRLIST);
            SAVE_ADDRLIST_BOOK(&ADDRLIST);
            break;
        case DISPLAYContact:
            DISPLAY_ALL_ADDRLIST_BOOK(&ADDRLIST);
            break;
        case DESTROYContact:
            DESTROY_ADDRLIST_BOOK(&ADDRLIST);
            SAVE_ADDRLIST_BOOK(&ADDRLIST);
            break;
        case SORTBYNAMEContact:
            BUBBLE_SORT_ADDRLIST_BOOK(&ADDRLIST);
            SAVE_ADDRLIST_BOOK(&ADDRLIST);
            break;
        case EXIT:
            break;
        default:
            printf("输入非法,请重新输入:\n");
            break;
        }
    }while(input);
    return 0;
}

2.动态通讯录

实现的功能和静态通讯录有相同的功能,不同的地方就是动态通讯的联系人保存在堆上。其代码的实现如下:

#pragma once

#define NAME_SIZE  100
#define TEL_SIZE  100
#define ADD_SIZE  200
#define TEXTHEADER  printf("\n---------------------%s--------------------\n",__FUNCTION__)
#define FILE_PATH "Dbook.txt"
enum{
    DISPLAY = 1, 
    ADD = 2, 
    ERASE = 3, 
    FIND = 4, 
    INSERT = 5,
    DESTROY = 6,
    EXIT = 0 
};
typedef struct PersonInfo{
    char name[NAME_SIZE];
    char tel[TEL_SIZE];
    char add[ADD_SIZE];
}PersonInfo;
typedef struct AddrBook{
    PersonInfo* data;
    size_t size;
    size_t capacity;
}AddrBook;

AddrBook addr_book;
void InitAddressBook(AddrBook* addr_book);
void DisplayAddressBook(AddrBook* addr_book);
void AddAddressBook(AddrBook* addr_book);
void MallocPersonInfo(AddrBook* addr_book);
void SaveAddrBook(AddrBook* addr_book);
void LoadAddrBook(AddrBook* addr_book);
void EraseAddrBook(AddrBook* addr_book);
void FindAddrBook(AddrBook* addr_book);
void InsertAddrBook(AddrBook* addr_book); 
void DestroyAddrBook(AddrBook* addr_book); 

.c文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"AddressBook.h"

//初始化通讯录
void InitAddressBook(AddrBook* addr_book)
{
    addr_book->size =0;
    addr_book->capacity =1;
    addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
    if(addr_book->data == NULL)
    {
        printf("空间开辟失败.\n");
        return;
    }
}
//打印通讯录
void DisplayAddressBook(AddrBook* addr_book)
{
    size_t i =0;
    if(addr_book == NULL)
    {
        return;
    }
    if(addr_book->size == 0)
    {
        printf("通讯录为空.%s\n",FILE_PATH);
        return;
    }
    printf("【姓 名】\t\t【电 话】\t\t【地 址】\n");
    for(i=0;i < addr_book->size ;i++)
    {
        printf("%s\t\t%s\t\t%s\n",addr_book->data[i].name ,
                                  addr_book->data[i].tel ,
                                  addr_book->data[i].add);
    }
    printf("\n");
}
void MallocPersonInfo(AddrBook* addr_book)
{
    size_t i =0;
    PersonInfo* new_book = NULL;
    if(addr_book == NULL)
    {
        return;
    }
    addr_book->capacity = 2*addr_book->capacity +1;
    new_book = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
    for(i=0;i<addr_book->size ;i++)
    {
        new_book[i] = addr_book->data [i]; 
    }
    free(addr_book->data);
    addr_book->data = new_book; 
}
//添加通讯录
void AddAddressBook(AddrBook* addr_book)
{
    if(addr_book->size >= addr_book->capacity )
    {
        MallocPersonInfo(addr_book);
    }
    printf("开始添加通讯录\n");
    printf("请输入姓名:\n");
    scanf("%s",addr_book->data[addr_book->size ].name );
    printf("请输入电话:\n");
    scanf("%s",addr_book->data[addr_book->size ].tel  );
    printf("请输入地址:\n");
    scanf("%s",addr_book->data[addr_book->size ].add  );
    printf("添加成功\n");
    ++addr_book->size ;
}
//保存通讯录
void SaveAddrBook(AddrBook* addr_book)
{
    FILE* fw = fopen(FILE_PATH,"w");
    size_t i = 0;
    if(addr_book == NULL)
    {
        return;
    }
    if(fw == NULL)
    {
        printf("打开文件失败.%s\n",FILE_PATH);
        return;
    }
    for(i=0;i<addr_book->size ;i++)
    {
        fprintf(fw,"%s\t\t%s\t\t%s\n",addr_book->data[i].name,
                                      addr_book->data[i].tel,
                                      addr_book->data[i].add);
    }
    fclose(fw);
}
//加载通讯录
void LoadAddrBook(AddrBook* addr_book)
{
    FILE* fr = fopen(FILE_PATH,"r");
    if(addr_book->size == 0 )
    {
        return;
    }
    if(fr == NULL)
    {
        printf("打开通讯录失败,%s\n",FILE_PATH);
        return;
    }
    while(feof(fr) == 0)                          //文件结束,返回非零值;否则返回0
    {
        fscanf(fr,"%s\t\t%s\t\t%s\n",addr_book->data[addr_book->size ].name ,
                                     addr_book->data[addr_book->size ].tel ,
                                     addr_book->data[addr_book->size ].add);
        ++addr_book->size ;
        addr_book->capacity+=addr_book->size  ;
    }
    fclose(fr);
}
//删除通讯录中的指定条目
void EraseAddrBook(AddrBook* addr_book)
{
    size_t i = 0;
    size_t j = 0;int flag = 0;
    char to_deleted[NAME_SIZE];
    if(addr_book == NULL)
    {
        return;
    }
    if(addr_book->size == 0)
    {
        printf("通讯录为空.%s\n",FILE_PATH);
        return;
    }
    printf("请输入需要删除的人的姓名:");
    scanf("%s",to_deleted);
    for(i=0;i<addr_book->size ;i++)
    {
        if(strcmp(addr_book->data [i].name ,to_deleted)==0)
        {
            for(j=i;j< addr_book->size-1;j++)
            {
                addr_book->data [j] = addr_book->data [j+1];
            }
            --addr_book->size;
            printf("删除成功.\n");
            flag = 1;
            return;
        }
    }
    if(flag == 0)
    {
        printf("通讯录中没有此人.\n");
        return;
    }
}
//查找通讯录
void FindAddrBook(AddrBook* addr_book)
{
    int flag = 0;
    size_t i = 0;
    char to_find[NAME_SIZE];
    if(addr_book == NULL)
    {
        return;
    }
    if(addr_book->size == 0)
    {
        printf("通讯录为空.%s\n",FILE_PATH);
        return;
    }
    printf("请输入想要查找的人的姓名:");
    scanf("%s",to_find);
    for(i=0;i<addr_book->size;i++)
    {
        if(strcmp(addr_book->data[i].name,to_find)==0)
        {
            printf("%s\t\t%s\t\t%s\n",addr_book->data[i].name ,
                                  addr_book->data[i].tel ,
                                  addr_book->data[i].add);
            printf("查找成功.\n");
            flag = 1;
            return;
        }
    }
    if(flag == 0)
    {
        printf("通讯录中没有此人.\n");
        return;
    }
}
//修改通讯录信息
void InsertAddrBook(AddrBook* addr_book)
{
    int flag = 0;
    size_t i = 0;
    char to_insert[NAME_SIZE];
    if(addr_book == NULL)
    {
        return;
    }
    if(addr_book->size == 0)
    {
        printf("通讯录为空.%s\n",FILE_PATH);
        return;
    }
    printf("请输入想要修改的人的姓名:");
    scanf("%s",to_insert);
    for(i=0;i<addr_book->size ;i++)
    {
        if(strcmp(addr_book->data[i].name,to_insert)==0)
        {
            printf("请重新输入姓名:\n");
            scanf("%s",addr_book->data[i].name );
            printf("请重新电话:\n");
            scanf("%s",addr_book->data[i].tel  );
            printf("请重新输入地址:\n");
            scanf("%s",addr_book->data[i].add  );
            printf("修改成功\n");
            flag = 1;
            return;
        }
    }
    if(flag == 0)
    {
        printf("通讯录中没有此人.\n");
        return;
    }   
}
//销毁通讯录
void DestroyAddrBook(AddrBook* addr_book)
{
    if(addr_book == NULL)
    {
        return;
    }
    addr_book->size = 0;
    addr_book->capacity =0;
    free(addr_book->data );
    addr_book->data = NULL;
}

下面是动态通讯录的测试代码:

#include<stdio.h>
#include"AddressBook.h"

void menu(){
    printf("\n○○○○○○○○○○○○○○○○○○○○○○○○○○○○○\n");
    printf("\n            1.打印通讯录            \n");
    printf("\n            2.添加通讯录            \n");
    printf("\n            3.删除通讯录            \n");
    printf("\n            4.查找通讯录            \n");
    printf("\n            5.修改通讯录            \n");
    printf("\n            6.销毁通讯录            \n");
    printf("\n            0.退出通讯录            \n");
    printf("\n○○○○○○○○○○○○○○○○○○○○○○○○○○○○○\n");
}
int main(){
    int input = 0;
    InitAddressBook(&addr_book);
    LoadAddrBook(&addr_book);
    do
    {
        menu();
        printf("亲,请输入您的需求:");
        scanf("%d",&input);
        switch(input)
        {
        case DISPLAY:DisplayAddressBook(&addr_book);
            break;
        case ADD: AddAddressBook(&addr_book);
                  SaveAddrBook(&addr_book);
            break;
        case ERASE:EraseAddrBook(&addr_book);
                   SaveAddrBook(&addr_book);
            break;
        case FIND:FindAddrBook(&addr_book);
            break;
        case INSERT:InsertAddrBook(&addr_book);
                    SaveAddrBook(&addr_book);
            break;
        case DESTROY:DestroyAddrBook(&addr_book);
                     SaveAddrBook(&addr_book);
            break;
        case EXIT:
            break;
        default:
            printf("输入错误,请重新输入.");
            break;
        }
    }while(input);
    return 0;
}

以上的代码都是在VS2008上面。。。。

猜你喜欢

转载自blog.csdn.net/yinghuhu333333/article/details/79734594