简易 (I/O)版本通讯录
#include <stdio.h>
#include<assert.h>
//#include<malloc.h>
#include<string.h>
#include<windows.h> #define MailSize 100
#define MaxName 10
#define MaxAdress 20
#define MaxPhone 20 struct Person{
char name[MaxName];
int age;
char sex;
char adress[MaxAdress];
char phone[MaxPhone];
};
typedef struct Mail{
int ExistNum;
//int MaxNum;
struct Person peo[MailSize];
}ML,*MailList; enum mem_infor{
Name=,
Age,
Sex,
Adress,
Phone,
};
void Show_member(MailList s){
int i=;
if( == s->ExistNum){
printf("Mail is Null!");
return ;
}
printf("-------------------------------------------------\n");
printf("|Name | Age| Sex |Adress | Phone | \n"); while(i<s->ExistNum){
printf("%-10s",s->peo[i].name);
printf("%-5d",s->peo[i].age);
printf("%-5c",s->peo[i].sex);
printf("%-20s",s->peo[i].adress);
printf("%-20s",s->peo[i].phone);
printf("\n");
i++;
} }
void Add_member(MailList s,int num){
char na[],sex,adr[],pho[];
int a;
printf("\nInput: Name + Age + Sex(M/W) + Adress + Phone:>\n");
for(int i=s->ExistNum;i<s->ExistNum+num;++i){
scanf("%s %d %c %s %s",na,&a,&sex,adr,pho);
strcpy(s->peo[i].name,na);
s->peo[i].age=a;
s->peo[i].sex=sex;
strcpy(s->peo[i].adress,adr);
strcpy(s->peo[i].phone,pho);
}
s->ExistNum+=num;
printf("\nAdd Successful!\n");
}
int Research_member(const MailList s,char *na){
assert(na);
assert(s);
for(int i=;i<s->ExistNum;++i){
if(!strcmp(s->peo[i].name,na) )
return i;
}
return -;
}
void Delet_member(MailList s,char *na){
assert(s);
assert(na);
int locate=Research_member(s,na);
if(locate<) {
printf("\nDelet failed !");
return ;
}
for(int i=locate;i<s->ExistNum;++i){
s->peo[i]=s->peo[i+];
}
s->ExistNum--;
printf("Delet Successful!\n");
}
void swap(struct Person* p1,struct Person* p2){
struct Person tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
void Sort_member(MailList s){
assert(s);
MailList ret=s;
for(int i=;i<s->ExistNum-;++i){
for(int j=i;j<s->ExistNum;++j){
if(strcmp(ret->peo[i].name,ret->peo[j].name)> )
swap(&ret->peo[i],&ret->peo[j]); //交换两个结构体
}
}
printf("\nSort Successful !");
} void Clear_member(MailList s){
s->ExistNum=;
printf("\nClear.....");
Sleep();
printf("\nClear finished!");
}
void Modify_member(MailList s){
assert(s);
char na[],sex,adr[],pho[];
int a,option,locate;
if(s->ExistNum <= ){
printf("通讯录为空,无法修改!");
return;
}
printf("\n选择修改位置:");
scanf("%d",&locate);
if(locate < s->ExistNum && locate>=){
printf("******************************\n");
printf("* 1--姓名 2--年龄 3--性别 *\n");
printf("* 4--住址 5--电话 *\n");
printf("******************************\n");
choose:
printf("\n请选择修改:>");
scanf("%d",&option);
switch(option){
case Name:{
printf("\n姓名修改为:");
scanf("%s",na);
strcpy(s->peo[locate].name,na);
break;
}
case Age:{
printf("年龄修改为:");
scanf("%d",&a);
s->peo[locate].age=a;
break;
}
case Sex:{
printf("性别修改为:");
scanf("%c",&sex);
s->peo[locate].sex=sex;
break;
}
case Adress:{
printf("住址修改为:");
scanf("%s",adr);
strcpy(s->peo[locate].adress,adr);
break;
}
case Phone:{
printf("\n电话修改为:");
scanf("%s",pho);
strcpy(s->peo[locate].phone,pho);
break;
}
default:
printf("\n选择错误!");
goto choose ;
}
printf("\nSuccessful !");
}
else{
printf("\n无法修改!");
}
}
void LoadFile(MailList s){
int i=;
FILE *rfp=fopen("MailList.bin","rb"); //读取二进制文件
if(rfp == NULL){
perror("open faild");
exit();
}
struct Person tmp = {};
while(fread(&tmp,sizeof(struct Person),,rfp)){
s->peo[i] = tmp;
i++;
}
if( == i){
printf("空文件!");
}
else{
s->ExistNum = i;
Show_member(s);
}
fclose(rfp);
}
void SaveToFile(MailList s){
FILE *wfp=fopen("MailList.bin","wb"); //为文件写入二进制流
if(wfp == NULL){
perror("NULL ");
exit();
}
for(int i=;i<s->ExistNum;++i){
fwrite(&s->peo[i],sizeof(struct Person),,wfp);
}
printf("Save Success!");
fclose(wfp);
}
int main(){ ML mail;
mail.ExistNum = ; //初始化为0
int option;
printf(" \t****************** MailList **********************\n");
printf(" \t* 1--Input Information 2--Delet Information * \n");
printf(" \t* 3--Search Information 4--Show Information *\n");
printf(" \t* 5--Sort 6--Clear Information *\n");
printf(" \t* 7--Modify Information 8--Save *\n");
printf(" \t* 9--Load Information 0--Eixt *\n");
printf(" \t**************************************************\n");
while(){
printf("\nPlease Choose:");
scanf("%d",&option);
switch(option){
case :
{
int num;
printf("\n录入人数:");scanf("%d",&num);
Add_member(&mail,num);
}
break;
case :{
char na[];
printf("\n输入删除人名:");
scanf("%s",na);
Delet_member(&mail,na);
break;
}
case :{
char na[];
printf("\n输入查找人名:");
scanf("%s",na);
int ret=Research_member(&mail,na);
if(ret<)
printf("\n没找到!");
else
printf("\n找到了!位置在:%d",ret);
break;
}
case :
Show_member(&mail);
break;
case :
Sort_member(&mail);
break;
case :
Clear_member(&mail);
break;
case :
Modify_member(&mail);
break;
case :
SaveToFile(&mail);
break;
case :
LoadFile(&mail);
break;
case :
exit();
break;
default:
break ;
}
}
return ;
}
比较挫版本。
简易 (I/O)版本通讯录的更多相关文章
- 简易付XP版本无法获取server.xml配置文件处理方案
博客地址:https://blog.csdn.net/zdw_wym/article/details/40892535 把它添加到C:/WINDOWS/Microsoft.NET/Framework/ ...
- C语言之通讯录的模拟实现
C语言之通讯录的模拟实现 在C语言学习结束之际,谨以此篇文章来对C语言的学习告一段落. 纲要: 通讯录的静态版本 通讯录的动态版本 通讯录的带文件版本 因为三种实现方法除了储存形式不同,其他都基本相同 ...
- WebSocket实现简易的FTP客户端
WebScoket的简单应用,实现一个简易的FTP,即文件上传下载,可以查看上传人,下载次数,打开多个Web可以多人上传. 说在前面的话 文件传输协议(File Transfer Protocol,F ...
- C#代码
http://www.cnblogs.com/zjfree/category/269738.html 超简易静态Web服务器 C# 生成不重复随机字符串 (1秒内生成1000000个) C# 读写IN ...
- Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(安装方面)
前言:第一次接触数据库,想下载个oracle试玩下(虽然听说一般大企业才用),到 官网下载 了个简易版 XE 版本,安装时要注意记住自己输入的数据库密码(口令) 还有安装路径不能含有空格(Do no ...
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
一.移除性算法 (remove) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- ES6数组扩展
前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...
- 利用ADO让普通人用excel读取oracle数据库表的通用办法
Ref:http://blog.csdn.net/iamlaosong/article/details/8465177 Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的 ...
- ES6 数组的扩展
1. Array.from() Array.from()将类数组(array-like)对象与可遍历的对象转化为数组并返回. 下面是一个类数组 let arr = { '0':'a', '1':'b' ...
随机推荐
- 机器学习——深度学习(Deep Learning)
Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,近期研究了机器学习中一些深度学习的相关知识,本文给出一些非常实用的资料和心得. Key W ...
- System.out.println()的解释
上周面试的时候,面试官让我解释一下输出语句每一个单词是什么意思.当是有点蒙,后来想想这不就是考察对java中常用的的包,类和其中的方法的熟悉程度吗? 我们首先来看看System:这是一个类名,存在于j ...
- ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...
- 【转载】Java系列笔记(3) - Java 内存区域和GC机制
Java系列笔记(3) - Java 内存区域和GC机制 转载:原文地址http://www.cnblogs.com/zhguang/p/3257367.html 目录 Java垃圾回收概况 Java ...
- div元素宽度不定的情况下如何居中显示
最近由于工作的原因碰到一个问题,就是在一个弹窗宽度不定的情况下还能是该弹窗居中显示,思考许久未找到合适办法,于是在网上找到一些办法在此总结记录下来方便以后的学习. 方法一:兼容IE67 <div ...
- mysql还原数据库时,提示ERROR 1046 (3D000) No database selected 的解决方法
使用mysql数据库的朋友, 经常会使用mysqldump备案数据库, 然后到新服务器还原, 这个过程中, 有朋友会遇到ERROR 1046 (3D000) No database selected ...
- 第五章 使用 SqlSession
第五章 使用 SqlSession 原文链接; http://www.mybatis.org/spring/zh/sqlsession.html 在 MyBatis 中,你可以使用 SqlSessio ...
- jar包后台启动--nohup篇
直接java -jar TestHttps-0.0.1-SNAPSHOT.jar的话是前段启动,但是窗口关闭之类的程序也就关闭了 我们可以nohup java -jar TestHttps-0.0.1 ...
- Linux配置文件注释注意:行首注释,不要行中注释
正确注释: # 注释语句 错误注释:这种注释可能导致文件读取异常或报错 有效语句 # 注释语句 # 注释语句
- 关于llvm kaleidoscope: 记一次Debug血泪之路
简而言之,慎(bu)用(yong)全局变量! 这次debug基本上花了我一周的时间,我基本上是晚上9点30下自习回然后调试到11点30,如此反复一周直到今天周五终于解决了,,以前都听说前辈们 说尽量不 ...