C语言 通讯录项目动态版本 容量可增加

项目在clion通过简单测试
代码在三个文件里写成

①main.c
项目大框架

#include"game.h"

//显示菜单
void Menu(){
    printf("****1.添加用户   2.删除用户****\n");
    printf("****3.查找用户   4.修改用户****\n");
    printf("****5.显示用户   6.年龄排序****\n");
    printf("****0.退出       7.记事本******\n");
}

int main(){
    //实时输出
    setbuf(stdout,NULL);

    char choice[1] ;
    struct people person;
    Peo_init(& person);//对通讯录进行初始化
    do{
        Menu();
        printf("\n输入操作的对应数字:\n");
        gets(choice);

        switch(choice[0]-'0'){

            case ex:
                Add_text(&person);
                Destroy(&person);
                printf("退出操作\n");
                break;
            case add:
                printf("选择 %d <增加> \n",choice[0]-'0');
                Add_message(&person);
                break;
            case del:
                printf("选择 %d <删除> \n",choice[0]-'0');
                Del_message(&person);
                break;
            case ser:
                printf("选择 %d <查找> \n",choice[0]-'0');
                Ser_message(&person);
                break;
            case chang:
                printf("选择 %d <修改> \n",choice[0]-'0');
                Chang_message(&person);
                break;
            case show:
                printf("选择 %d <显示> \n",choice[0]-'0');
                Peo_show(&person);
                break;
            case compare:
                printf("选择 %d <按年龄排序> \n",choice[0]-'0');
                Com_message(&person);
                break;
            case Text:
                printf("选择 %d <记事本> \n",choice[0]-'0');
                Add_text(&person);
                break;
            default:
                printf("输入无效,重新输入\n");
                break;
        }

    }while(choice[0]-'0');

    return 0;
}

②game.h
项目所需要的函数,结构体等定义

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

//#define MAX 20
#define Cap_sz 3
#define Name_max 20
#define Name_sex 10
#define Name_tel 10
#define Name_loca 10

//每个人的信息:姓名 性别 年龄 电话 住址
struct contaction{
    char name[Name_max];
    char se[Name_sex];
    int ag;
    char te[Name_tel];
    char lo[Name_loca];
};
//结构体包含通讯录 以及通讯录的的长度
struct people{
    struct contaction *peo;
    int size;
    int Cap_size;
};

enum operate{
    ex,
    add,
    del,
    ser,
    chang,
    show,
    compare,
    Text
};

void Peo_init(struct people * temp);//初始化通讯录
void Peo_show(const struct people * temp);//显示信息
void Add_message(struct people * temp);//新增信息
void Del_message(struct people * temp);//删除信息
void Ser_message(struct people * temp);//搜索信息
void Chang_message(struct people * temp);//修改信息
void Com_message(struct people * temp);//按照年龄排序
void Add_text(struct people * temp);//记事本功能
void Destroy(struct people * temp);//把malloc的内存free
void Load(struct people *temp);//将记事本的内容添加到通讯录

③game.c
项目的函数实现

#include"game.h"
void judge_cap(struct people * temp);

//初始化通讯录
void Peo_init(struct people * temp){
    printf("开始初始化!\n");
    temp->peo=(struct contaction *)malloc(Cap_sz*sizeof(struct contaction));//和realloc配套使用可实现动态增加内存
    if(temp->peo==NULL){
        printf("Inint:%s",strerror(errno));//报错提示
        return;}
    temp->size=0;
    temp->Cap_size=Cap_sz;
    //把文本存的信息加载显示出来
    Load(temp);//判断记事本有没有内容
    printf("初始化完成\n");
}
//假如目录记事本内不是空白的 就把文本的内容添加到通讯录里
void Load(struct people *temp){
    struct contaction Copy_peo={0};
    FILE*fp=fopen("E:\\des\\ext.txt", "rb");
    if(fp==NULL){
        printf("Load:%s",strerror(errno));
        return;}
//记事本有内容就通过fread函数一次读一个入通讯录中
//需要判断通讯录数量是否兼容记事本的数量 数量不够需要realloc增加
    while(fread(&Copy_peo,sizeof(struct contaction),1,fp)){
        judge_cap(temp);
        temp->peo[temp->size]=Copy_peo;
        temp->size++;}
        printf("加载成功\n");
        fclose(fp);
        fp=NULL;
}
//将信息写入到记事本功能
void Add_text(struct people * temp){

        FILE*fp=fopen("E:\\des\\ext.txt", "wb");
        if(fp==NULL){
            printf("Add_text:%s",strerror(errno));
            return;}
        for(int i=0;i<temp->size;i++){
            fwrite(&(temp->peo[i]),sizeof(struct contaction),1,fp);}

        printf("写入记事本\n");
        fclose(fp);
        fp=NULL;
}

//显示函数
void Peo_show(const struct people * temp){

    if(0==temp->size){
        printf("列表为空\n");
    }
    else{
        printf("姓名        性别        年龄        电话        住址\n");
        for(int i=0;i<temp->size;i++) {
            printf("%-8s\t", temp->peo[i].name);
            printf("%-10s\t", temp->peo[i].se);
            printf("%-10d\t", temp->peo[i].ag);
            printf("%-10s\t", temp->peo[i].te);
            printf("%-10s\t\n", temp->peo[i].lo);
        }
    }
}
//判断通讯录容量 通讯录以空白状态初始化时 容量为3 容量不够一次性增容+2
void judge_cap(struct people * temp){
    struct contaction *Ad_peo;
    if((temp->size)==(temp->Cap_size)){
        Ad_peo=realloc(temp->peo,(temp->Cap_size+2)*sizeof(struct contaction));
        if(Ad_peo!=NULL){
        temp->peo=Ad_peo;
        temp->Cap_size+=2;
        printf("增容成功!\n");
    }
        else
            printf("增容失败!\n");
}

}
//新增函数
void Add_message(struct people * temp){

    judge_cap(temp);

    printf("以下开始输入添加人信息:\n");
    printf("输入姓名:\n");
    gets(temp->peo[temp->size].name);
    printf("输入性别:\n");
    gets(temp->peo[temp->size].se);
    printf("输入年龄:\n");
    scanf("%d",&temp->peo[temp->size].ag);
    getchar();
    printf("输入手机号:\n");
    gets(temp->peo[temp->size].te);
    printf("输入住址:\n");
    gets(temp->peo[temp->size].lo);

    temp->size++;
    printf("添加完成\n");
}

//根据姓名在通讯录里查找 返回下标值
static int  position(char *Name,struct people * temp){
    int i;
    for(i=0;i<temp->size;i++) {
        if(0==strcmp(Name,temp->peo[i].name)){
            printf("%-8s\t", temp->peo[i].name);
            break;}
    }
    if(i==temp->size)
        return -1;
    else
        return i;

}

//删除函数 找到指定删除人的名字 用后续信息覆盖删除人信息 再将列表数-1
void Del_message(struct people * temp){
    printf("输入删除人姓名:\n");
    char person_name[Name_max];
    gets(person_name);
    int pos=position(person_name,temp);
    if(-1==pos)
    {
        printf("列表不存在此人\n");
    }
    else {
        for (int i = pos; i < (temp->size) - 1; i++) {

            strcpy(temp->peo[i].name, temp->peo[i + 1].name);
            strcpy(temp->peo[i].se, temp->peo[i + 1].se);
            temp->peo[i].ag = temp->peo[i + 1].ag;
            strcpy(temp->peo[i].te, temp->peo[i + 1].te);
            strcpy(temp->peo[i].lo, temp->peo[i + 1].lo);
        }
        printf("\n删除成功\n");
        (temp->size)--;
    }

}

//查找函数 找到指定人后显示信息
void Ser_message(struct people * temp){
    printf("输入查找人姓名:\n");
    char person_name[Name_max];
    gets(person_name);
    int pos=position(person_name,temp);
    if(-1==pos)
    {
        printf("列表不存在此人\n");
    }
    else {
        printf("\n姓名        性别        年龄        电话        住址\n");
        printf("%-8s\t", temp->peo[pos].name);
        printf("%-10s\t", temp->peo[pos].se);
        printf("%-10d\t", temp->peo[pos].ag);
        printf("%-10s\t", temp->peo[pos].te);
        printf("%-10s\t\n", temp->peo[pos].lo);

        printf("查找成功\n");
    }
}

//修改函数 找到指定人后修改信息
void Chang_message(struct people * temp){
    printf("输入修改人姓名:\n");
    char person_name[Name_max];
    gets(person_name);
    int pos=position(person_name,temp);
    if(-1==pos)
    {
        printf("列表不存在此人\n");
    }
    else {
        printf("\n姓名        性别        年龄        电话        住址\n");
        printf("输入姓名:\n");
        gets(temp->peo[pos].name);
        printf("输入性别:\n");
        gets(temp->peo[pos].se);
        printf("输入年龄:\n");
        scanf("%d",&temp->peo[pos].ag);
        getchar();
        printf("输入手机号:\n");
        gets(temp->peo[pos].te);
        printf("输入住址:\n");
        gets(temp->peo[pos].lo);
        printf("修改成功\n");
    }
}

//年龄选择排序
void Com_message(struct people * temp){
    int m ,n ,k ,x;
    char name_copy[20]="0";

    for(m=0; m<(temp->size)-1; m++)
    {
        k=m;
        for(n=m+1; n<(temp->size);n++) {
            if (temp->peo[n].ag < temp->peo[k].ag) {
                k = n;
                //printf("最小值下标 %d\n", k);
            }
        }

        strcpy(name_copy, temp->peo[m].name);
        strcpy(temp->peo[m].name, temp->peo[k].name);
        strcpy(temp->peo[k].name, name_copy);

        strcpy(name_copy, temp->peo[m].se);
        strcpy(temp->peo[m].se, temp->peo[k].se);
        strcpy(temp->peo[k].se, name_copy);

        x=temp->peo[m].ag;
        temp->peo[m].ag=temp->peo[k].ag;
        temp->peo[k].ag=x;

        strcpy(name_copy, temp->peo[m].te);
        strcpy(temp->peo[m].te, temp->peo[k].te);
        strcpy(temp->peo[k].te, name_copy);

        strcpy(name_copy, temp->peo[m].lo);
        strcpy(temp->peo[m].lo, temp->peo[k].lo);
        strcpy(temp->peo[k].lo, name_copy);

    }
    printf("按照从小到大的年龄排序成功!\n");
}
//malloc的内存需要free
void Destroy(struct people * temp){
    free(temp->peo);
    temp->peo=NULL;
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值