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");}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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

diffusion model (扩散模型)原理

扩散模型分为正向过程和反向过程。 正向过程为一点点在图片上添加噪声的过程&#xff0c;反向过程为去噪声的过程。 图片的生成就是反向过程&#xff0c;给一张高斯噪声图片&#xff0c;逐步去噪生成图片。 扩散模型和VAE的区别&#xff0c; VAE是一步到位的&#xff08;通过…

一个基于差异同步数据库结构的工具 - Skeema

本文是 GO 三方库推荐的第 5 篇&#xff0c;继续介绍数据库 schema 同步工具&#xff0c;我前面已经写了两篇这个主题的文章。系列查看&#xff1a;Golang 三方库。 今天&#xff0c;推荐是的一个基于差异实现数据库 schema 迁移的工具库 - skeema&#xff0c;同样由 Go 实现。…

数字孪生10个技术栈:数据采集的八种方式

大家好&#xff0c;我是贝格前端工场&#xff0c;上期讲了数字孪生10个技术栈&#xff08;总括&#xff09;:概念扫盲和总体介绍&#xff0c;获得了大家的热捧&#xff0c;本期继续分享技术栈&#xff0c;大家如有数字孪生或者数据可视化的需求&#xff0c;可以联络我们。 一、…

迁移数据库

如果您需要快速迁移数据库到另一台服务器上&#xff0c;并且考虑到大型数据库的情况&#xff0c;以下是一些建议&#xff1a; 使用 mysqldump 导出并通过管道传输&#xff1a; 在导出时通过管道直接传输数据到新服务器&#xff0c;可以避免在中间产生大型的备份文件。这可以通过…

【好书推荐-第九期】Sora核心技术相关书籍《扩散模型:从原理到实战》与《GPT 图解:大模型是怎样构建的》:Sora的两大核心技术,都藏在这两本书里!

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

微信小程序开发常用的布局

在微信小程序开发中&#xff0c;常用的布局主要包括以下几种&#xff1a; Flex 布局&#xff1a;Flex 布局是一种弹性盒子布局&#xff0c;通过设置容器的属性来实现灵活的布局方式。它可以在水平或垂直方向上对子元素进行对齐、排列和分布。Flex 布局非常适用于创建响应式布局…

图片切换特效

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>05 图片切换</title><style type"text/css">*{padding: 0;margin: 0;}#box{border: 1px solid #ccc;width: 430px;height: 70px…

进程间通信---管道题目练习

实现AB进程对话。 A进程发送一句话后&#xff0c;B进程接收到打印。然后B进程发送一句话&#xff0c;A进程接收后打印 重复上述步骤。直到AB接收或者发送完quit后&#xff0c;结束AB进程 A进程 #include <stdio.h> #include <sys/types.h> #include <sys/stat.…

解决DBeaver执行脚本报错No active connection

解决DBeaver执行脚本报错No active connection 1、报错问腿 2、问题解决 2.1、右键点击该数据库&#xff0c;选择SQL编辑器&#xff0c;选择新建SQL编辑器&#xff0c;然后将sql语句复制过去。 或者左击选中数据库后直接使用快捷键 Ctrl] 2.2、在Project-General中找到Scr…

k8s运维问题整理

1.宕机或异常重启导致etcd启动失败 服务器非正常关机&#xff08;意外掉电、强制拔电&#xff09;后 etcd 数据损坏。 查看apiserver日志发现出现报错Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused&#xff0c;2379是etcd的端口&#xff0c;那么a…

mybatis 数据库缓存的原理

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它封装了 JDBC&#xff0c;使数据库交互变得更简单、直观。MyBatis 支持两级缓存&#xff1a;一级缓存&#xff08;Local Cache&#xff09;和二级缓存&#xff08;Global Cache&#xff09;&#xff0c;通过这两级缓存可以有…

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter测试的详细解析

3.2.4.3 自定义starter测试 阿里云OSS的starter我们刚才已经定义好了&#xff0c;接下来我们就来做一个测试。 今天的课程资料当中&#xff0c;提供了一个自定义starter的测试工程。我们直接打开文件夹&#xff0c;里面有一个测试工程。测试工程就是springboot-autoconfigurat…

常见排序算法解析

芝兰生于深林&#xff0c;不以无人而不芳&#xff1b;君子修道立德&#xff0c;不为穷困而改节 文章目录 插入排序直接插入排序希尔排序 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序优化挖坑法前后指针法非递归版 归并排序递归非递归 总结 插入排序 插入排序&#…

Nginx使用—基础应用

Nginx日志配置 1.mkdir /etc/nginx/logs2.server{listen 80;server_name nrj.test.com;access_log logs/acess-test.log; #正确日志error_log logs/error-test.log; #错误日志root /www;index index.html; } Nginx目录索引 语法&#xff1a;autoindex on | off 默认&#x…

【编程小记】在Windows下使用C/C++代码判断一个文件是否被其他进程占用

在Windows下使用C/C代码判断文件是否被占用 一、原理二、函数简单介绍三、实例代码 一、原理 在Windows下有一个Windows API叫做CreateFile&#xff0c;通过这个接口我们可以创建或打开文件&#xff0c;我们打开文件时可以采用独占模式进行打开&#xff0c;如果能够打开文件说…

Word Game

题目链接&#xff1a;Problem - C - Codeforces 解题思路&#xff1a; 用map存字母和出现的次数&#xff0c;然后遍历三个字母数组&#xff0c;如果map值为1&#xff0c;则加三分&#xff0c;为2加1分&#xff0c;否则不加分。 下面是c代码&#xff1a; #include<iostrea…

第41期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Linux学习-二级指针的使用

目录 ###指针传参时要用二级指针 ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的地址) ###指针传参时要用二级指针 char *str[5]; int Fun(char **ppstr,int len); ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的…

#微信小程序创建(获取onenet平台数据)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a;创建一个小程序&#xff08;http get获取onenet平台数据&#xff09; 3.记录&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1eOd-2EnilnhPWoGUMj0fzw 提取码: 2023 &#xff08;1&#xff09;新建一个工…

【C++STL详解 —— string类】

【CSTL详解 —— string类】 CSTL详解 —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、…