用C语言实现一个简易通讯录

通讯录

实现通讯录,是基于c语言的IO文件操作、数据结构里面的顺序表实现。

具体功能

实现了

  1. 信息的添加
  2. 信息的显示
  3. 信息的修改(修改单一属性)
  4. 将内存中的信息保存到文件中去
  5. 将文件中的信息加载到内存中(每次程序运行数据就会丢失)
  6. 信息的删除
  7. 信息的查找(按照各自的属性查找)
  8. 给每一条信息设置了唯一的标识id
  9. 通讯录的销毁

头文件中的声明

在c语言中我们采用结构体来记录每一个人的具体信息
用顺序表的数据结构来来对数据的操作

#ifndef __ADDRESSBOOK_H__
#define __ADDRESSBOOK_H__

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

#define NAME_MAX 200 //名字
#define GENDER_MAX 100 // 性别
#define ADDRESS_MAX 200 // 地址
#define NUMBER_MAX 200 // 电话
#define SEQLIST_MAX 1000 // 存储的最大信息数量
#define FILE_PATH "address_book.txt" // 写入文件的位置

typedef struct person_inf
{   
    char name[NAME_MAX];
    char gender[GENDER_MAX];
    char number[NUMBER_MAX];
    char address[ADDRESS_MAX];
}person_inf;

typedef struct address_book
{
    size_t size;
    person_inf data[SEQLIST_MAX];
}address_book;

//初始化通讯录
void address_book_init(address_book *book);

//添加信息
void address_book_add(address_book *book);

//显示信息
void address_book_display(address_book *book);

//删除所有信息
void address_book_delete_all(address_book *book);

//保存信息
void address_book_save(address_book *book);

//加载信息
void address_book_load(address_book *book);

//修改信息
void address_book_update(address_book *book);

//删除信息
void address_book_delete(address_book *book);

//查找信息
void address_book_find(address_book *book);

//销毁通讯录
void adderss_book_destory(address_book *book);

#endif

函数的定义

在这里我们实现了,基本的增删查改,保存信息加载信息。


#define _CRT_SECURE_NO_WARNINGS

#include "AddressBook.h"

//初始化通讯录
void address_book_init(address_book *book)
{
    if(book == NULL)
    {
        return ;
    }
    book->size = 0;
}

//添加信息
void address_book_add(address_book *book)
{
    size_t cur = 0;
    if(book == NULL)
    {
        printf("book is NULL\n");
        return ;
    }
    cur = book->size;
    ++book->size;
    printf("添加信息\n");
    printf("请输入要添加的姓名\n");
    scanf("%s",book->data[cur].name);
    printf("请输入要添加的性别\n");
    scanf("%s",book->data[cur].gender);
    printf("请输入要添加的电话\n");
    scanf("%s",book->data[cur].number);
    printf("请输入要添加的地址\n");
    scanf("%s",book->data[cur].address);
    printf("添加成功\n");
    return;
}

//显示信息
void address_book_display(address_book *book)
{
    size_t j = 0;
    if(book == NULL)
    {
        return ;
    }
    printf("序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
    for(j=0; j< book->size; j++)
    {
        printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",j,book->data[j].name,
        book->data[j].gender,book->data[j].number,
        book->data[j].address);
    }
}

//保存信息
void address_book_save(address_book *book)
{
    size_t i = 0;
    FILE *fp = fopen(FILE_PATH,"w");
    if(book == NULL)
    {
        return ;
    }
    if(fp == NULL)
    {
        printf("打开文件失败\n");
        return ;
    }
    //fprintf(fp,"序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
    for(i=0; i< book->size; i++)
    {
        fprintf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
        book->data[i].gender,book->data[i].number,
        book->data[i].address);
    }
    fclose(fp);
}

//加载信息
void address_book_load(address_book *book)
{
    size_t len = 0;
    size_t i = 0;
    FILE *fp = fopen(FILE_PATH,"r");

    if(book == NULL)
    {
        return ;
    }
    if(fp == NULL)
    {
        printf("打开文件失败\n");
        return ;
    }
    // 把光标移动到文件末尾
    fseek(fp,0,SEEK_END);
    // 从光标到文件首偏移的字节数
    len = ftell(fp);
    if(len == 0)
    {
        printf("通讯录为空\n\n");
        return ;
    }
    // rewind函数是将fp指针指向文件的开始
    rewind(fp);
    while(!feof(fp))
    {
        fscanf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",&i,book->data[book->size].name,//name是数组,在调用数组名时候降级为指针
            book->data[i].gender,book->data[book->size].number,
            book->data[book->size].address);
        i++;
        ++book->size;
    }
    fclose(fp);
}


//修改信息
void address_book_update(address_book *book)
{
    size_t i = 0;
    if(book == NULL)
    {
        return ;
    }
    printf("请输入要修改的编号\n");
    scanf("%u",&i);
    if(i > book->size || i < 0)
    {
        printf("输入为非法值\n");
        return ;
    }
    printf("修改信息\n");
    printf("姓名修改为\n");
    scanf("%s",book->data[i].name);
    printf("性别修改为\n");
    scanf("%s",book->data[i].gender);
    printf("修改电话为\n");
    scanf("%s",book->data[i].number);
    printf("地址修改为\n");
    scanf("%s",book->data[i].address);
    printf("修改成功\n");
    return ;
}


//删除信息
void address_book_delete(address_book *book)
{
    size_t i = 0;
    if(book == NULL)
    {
        return ;
    }
    printf("请输入要删除的编号\n");
    scanf("%u",&i);
    if(i > book->size)
    {
        printf("输入为非法值\n");
        return ;
    }
    while(i < book->size)
    {
        book->data[i] = book->data[i+1];
        i++;
    }
    book->size--;
    printf("删除成功\n");
    return;
}

//删除所有信息
void address_book_delete_all(address_book *book)
{
    if(book == NULL)
    {
        return ;
    }
    book->size = 0;
}

//查找信息
void address_book_find(address_book *book)
{
    int flag = 0;
    size_t i = 0;
    int choice = 0;
    char f_name[50];
    char f_number[50];
    if(book == NULL)
    {
        //book为空指针;
        return ;
    }
    printf("请输入要查找的方式\n");
    printf("************************\n");
    printf("*1.姓名查找 2.电话号查找\n");
    printf("************************\n");
    scanf("%d",&choice);
    if (choice == 1)
    {
        //姓名查找
        printf("请输入查找的姓名或者关键字\n");
        scanf("%s",f_name);
        printf("序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
        while(i < book->size)
        {
            if(strstr(book->data[i].name,f_name)) //用strstr函数来查关键字
            {
                flag = 1;
                printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
                book->data[i].gender,book->data[i].number,
                book->data[i].address);
            }
            i++;
        }
        if(flag == 0)
        printf("未查找到\n");
    }
    else if (choice == 2)
    {
        //电话号码查找
        printf("请输入查找的电话号或者关键号码\n");
        scanf("%s",f_number);
        printf("序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
        while(i < book->size)
        {
            if(strstr(book->data[i].number,f_number))
            {
                flag = 1;
                printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
                book->data[i].gender,book->data[i].number,
                book->data[i].address);
            }
            i++;
        }
        if(flag == 0)
        {
            printf("未查找到\n");
        }
    }
    else
    {
        printf("选择错误\n");
    }
}

/*fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;
fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。

ftell(fp);利用函数 ftell() 也能方便地知道一个文件的长。
如以下语句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp)+1; 
首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前
位置相对于文件首的位移,该位移值等于文件所含字节数。
*/

//销毁通讯录
void adderss_book_destory(address_book *book)
{
    FILE *fp = fopen(FILE_PATH,"w");
    if(book == NULL)
    {
        return ;
    }
    if(fp == NULL)
    {
        printf("打开文件失败\n");
        return ;
    }
    fseek(fp,0,SEEK_SET);
    rewind(fp);
    fclose(fp);
    printf("销毁成功\n");
}

主函数的实现(主要的框架)

实现是采用枚举来标识要使用哪种功能,其中要注意的是,我们在将程序运行起来时候就需要加载我们的以前文件中的信息。还有就是我们要在每次添加一条信息,或者删除,修改都需要保存,既内存中和IO文件中保存写入一次

enum
{
    EXIT,
    DISPLAY,
    ADD,
    UPDATE,
    Y_DELETE,
    FIND,
    DESTORY
};

//菜单
void menu()
{
    int choice = 0;
    address_book book;
    address_book_init(&book);
    address_book_load(&book);
    while(1)
    {
        printf("===============================\n");
        printf("1.显示通讯录\n");
        printf("2.添加\n");
        printf("3.修改\n");
        printf("4.删除\n");
        printf("5.查找\n");
        printf("6.销毁\n");
        printf("0.退出\n");
        printf("===============================\n");
        scanf("%d",&choice);
        system("cls");
        switch (choice)
        {
            case DISPLAY:
                address_book_display(&book);
                break;
            case ADD:
                address_book_add(&book);
                address_book_save(&book);
                break;
            case UPDATE:
                address_book_update(&book);
                address_book_save(&book);
                break;
            case Y_DELETE:
                address_book_delete(&book);
                address_book_save(&book);
                break;
            case FIND:
                address_book_find(&book);
                break;
            case DESTORY:
                adderss_book_destory(&book);
                address_book_delete_all(&book);
                break;
            case EXIT:
                return ;
                break;
            default:
                printf("输入值非法\n");
                break;
        }
    }

}

int main()
{
    menu();
    return 0;
}

如有错误,多多指正,谢谢!

发布了74 篇原创文章 · 获赞 35 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章