项目在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");}elseprintf("增容失败!\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;elsereturn 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;
}