项目在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;
}