通讯录——C语言小项目

通讯录

项目要求:
1,实现一个通讯录,可以存储一个人的名字,性别,年龄,电话,地址。
2,可以实现对现有通讯录已有联系人的增删查改。
3,可以定义已有联系人按照年龄排序,可以实现联系人的清空。
4,可以动态开辟内存,储存来联系人的信息。
5,可以实现联系人信息的动态加载。

contact.h

#ifndef _CONTACT_H_
#define _CONTACT_H_

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

#define name_max 20
#define sex_max 5
#define tele_max 12
#define addr_max 30
#define default_sz 3

typedef struct peo_info
{
    char name[name_max];
    int age;
    char sex[sex_max];
    char tele[tele_max];
    char addr[addr_max];
}peo_info;

typedef struct contact
{
    peo_info* data;//存放数据
    int sz;//当前已有信息个数
    int capacity;//当前最大容量
}contact,*pcontact;

void init_contact(pcontact pc);//初始化通讯录
void add_contact(pcontact pc);//增加通讯录成员
void show_contact(pcontact pc);//显示当前通讯录已有成员
void del_contact(pcontact pc);//删除通讯录指定成员
void search_contact(pcontact pc);//查找通讯录指定成员
void modify_contact(pcontact pc);//修改通讯录指定成员
void sort_contact(pcontact pc);//按照年龄对当前通讯录成员分类
void empty_contact(pcontact pc);//清空通讯录所有成员
void destroy_contact(pcontact pc);//销毁通讯录
void save_contact(pcontact pc);//保存通讯录
void load_contact(pcontact pc);//加载信息

#endif //_CONTACT_H_

test.c

#include "contact.h"

void menu()
{
    printf("*****  contact  *********\n");
    printf("****1.add     2.del******\n");
    printf("****3.search  4.modify***\n");
    printf("****5.show    6.sort*****\n");
    printf("****7.empty   0.exit*****\n");
    printf("*************************\n");

}

enum option
{
    EXIT,
    add,
    del,
    search,
    modify,
    show,
    sort,
    empty
};
void test()
{
    int input = 0;
    contact con;
    init_contact(&con);
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch(input)
        {
        case add:
            add_contact(&con);
            break;
        case del:
            del_contact(&con);
            break;
        case search:
            search_contact(&con);
            break;
        case modify:
            modify_contact(&con);
            break;
        case show:
            show_contact(&con);
            break;
        case sort:
            sort_contact(&con);
            break;
        case empty:
            empty_contact(&con);
            break;
        case EXIT:
            printf("推出通讯录\n");
            save_contact(&con);
            destroy_contact(&con);
            break;
        default:
            printf("选择错误\n");
            break;
        }
    }while(input);
}
int main()
{
    test();
    return 0;
}

contact.c

#include "contact.h"

void load_contact(pcontact pc)
{
    peo_info tmp = {0};
    FILE* pf = fopen("contact.dat","rb");
    {
        if(pf == NULL)
        {
            perror("open file for read");
            exit(EXIT_FAILURE);
        }
        //读信息,加载内存
        while(fread(&tmp, sizeof(peo_info), 1, pf))
        {
        //动态开辟内存,加载联系人信息
            if(pc->sz == pc->capacity)
    {
        peo_info *tmp = realloc(pc->data, (pc->capacity+2)*sizeof(peo_info));
        if(tmp != NULL)
        {
            pc->data = tmp;
            pc->capacity += 2;
        }
        else
        {
            return;
        }
    }
            pc->data[pc->sz] = tmp;
            pc->sz++;
        }

        fclose(pf);
        pf = NULL;
    }
}
void init_contact(pcontact pc)
{
    pc->sz = 0;
    pc->data = (peo_info*)malloc(default_sz*sizeof(peo_info));
    pc->capacity = default_sz;
    load_contact(pc);//加载文件信息
}


void add_contact(pcontact pc)
{
    if(pc->sz == pc->capacity)
    {
        peo_info *tmp = realloc(pc->data, (pc->capacity+2)*sizeof(peo_info));
        if(tmp != NULL)
        {
            pc->data = tmp;
            pc->capacity += 2;
        }
        else
        {
            return;
        }
    }


    //添加
    printf("请输入名字:>");
    scanf("%s",pc->data[pc->sz].name);
    printf("请输入年龄:>");
    scanf("%d",&(pc->data[pc->sz].age));
    printf("请输入性别:>");
    scanf("%s",pc->data[pc->sz].sex);
    printf("请输入电话号码:>");
    scanf("%s",pc->data[pc->sz].tele);
    printf("请输入地址:>");
    scanf("%s",pc->data[pc->sz].addr);
    pc->sz++;
}

void show_contact(pcontact pc)
{
    int i = 0;
    printf("%10s\t%4s\t%5s\t%12s\t%20s\n","name","age","sex","tele","addr");
    for(i=0; i<pc->sz; i++)
    {
        printf("%10s\t%4d\t%5s\t%12s\t%20s\n",
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tele,
            pc->data[i].addr);
    }
}

static int find_entry(pcontact pc,char name[])//查找函数
{
    int i = 0;
    for(i=0; i<pc->sz; i++)
    {
        if(strcmp(pc->data[i].name,name)==0)
        {
            return i;
        }
    }
    return -1;//没找到
}

void del_contact(pcontact pc)
{
    int j = 0;
    int pos = 0;
    char name[name_max] = {0};
    if(pc->sz == 0)
    {
        printf("通讯录已空,无法删除\n");
        return;
    }
    //查找
    printf("请输入要删除人的名字\n");
    scanf("%s",name);
    pos = find_entry(pc,name);
    //删除
    if(pos != -1)
    {
        for(j=pos;j<pc->sz-1;j++)
    {
        pc->data[j] = pc->data[j+1];
    }
    pc->sz--;
    printf("删除成功\n");
    }
    else
    {
        printf("要删除的人没找到\n");
    }

}

void search_contact(pcontact pc)
{
    int pos = 0;
    char name[name_max] = {0};
    printf("请输入要查找人的名字:>");
    scanf("%s",name);
    pos = find_entry(pc,name);
    if(pos == -1)
    {
        printf("要查找的人不存在\n");
    }
    else
    {
    printf("%10s\t%4s\t%5s\t%12s\t%20s\n","name","age","sex","tele","addr");
    printf("%10s\t%4d\t%5s\t%12s\t%20s\n",
            pc->data[pos].name,
            pc->data[pos].age,
            pc->data[pos].sex,
            pc->data[pos].tele,
            pc->data[pos].addr);
    }


}

void modify_contact(pcontact pc)
{
    int pos = 0;
    char name[name_max] = {0};
    printf("请输入要修改人的名字:>");
    scanf("%s",name);
    pos = find_entry(pc,name);
    if(pos == -1)
    {
        printf("要修改的人不存在\n");
    }
    else
    {
    printf("请输入名字:>");
    scanf("%s",pc->data[pos].name);
    printf("请输入年龄:>");
    scanf("%d",&(pc->data[pos].age));
    printf("请输入性别:>");
    scanf("%s",pc->data[pos].sex);
    printf("请输入电话号码:>");
    scanf("%s",pc->data[pos].tele);
    printf("请输入地址:>");
    scanf("%s",pc->data[pos].addr);
    }
}

void sort_contact(pcontact pc)
{
    int i = 0;
    int j = 0;
    printf("该通讯录是按照年龄排序的\n");
    for(i=0; i<pc->sz-1; i++)
    {
        int flag = 0;
        for(j=0; j<pc->sz-1-i; j++)
        {
            if(pc->data[j].age > pc->data[j+1].age)
            {
                peo_info tmp = pc->data[j];
                pc->data[j] = pc->data[j+1];
                pc->data[j+1] = tmp;
                flag = 1;
            }
        }
        if(flag == 0)
        break;
    }
}

void empty_contact(pcontact pc)
{
    pc->sz = 0;
    printf("通讯录已清空\n");
}

void destroy_contact(pcontact pc)
{
    free(pc->data);
    pc->data = NULL;
    pc->capacity = 0;
    pc->sz = 0;
}

void save_contact(pcontact pc)
{
    int i = 0;
    FILE* pf = fopen("contact.dat", "wb");
    if(pf ==NULL)
    {
        perror("open file for write");
        exit(EXIT_FAILURE);
    }
    //写文件
    for(i=0; i<pc->sz; i++)
    {
        fwrite(pc->data+i, sizeof(peo_info), 1, pf);
    }
    fclose(pf);
    pf = NULL;
}

猜你喜欢

转载自blog.csdn.net/aixintianshideshouhu/article/details/81807447