#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)版本通讯录的更多相关文章

  1. 简易付XP版本无法获取server.xml配置文件处理方案

    博客地址:https://blog.csdn.net/zdw_wym/article/details/40892535 把它添加到C:/WINDOWS/Microsoft.NET/Framework/ ...

  2. C语言之通讯录的模拟实现

    C语言之通讯录的模拟实现 在C语言学习结束之际,谨以此篇文章来对C语言的学习告一段落. 纲要: 通讯录的静态版本 通讯录的动态版本 通讯录的带文件版本 因为三种实现方法除了储存形式不同,其他都基本相同 ...

  3. WebSocket实现简易的FTP客户端

    WebScoket的简单应用,实现一个简易的FTP,即文件上传下载,可以查看上传人,下载次数,打开多个Web可以多人上传. 说在前面的话 文件传输协议(File Transfer Protocol,F ...

  4. C#代码

    http://www.cnblogs.com/zjfree/category/269738.html 超简易静态Web服务器 C# 生成不重复随机字符串 (1秒内生成1000000个) C# 读写IN ...

  5. Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(安装方面)

    前言:第一次接触数据库,想下载个oracle试玩下(虽然听说一般大企业才用),到 官网下载 了个简易版 XE 版本,安装时要注意记住自己输入的数据库密码(口令)  还有安装路径不能含有空格(Do no ...

  6. 从零开始学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 ...

  7. ES6数组扩展

    前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...

  8. 利用ADO让普通人用excel读取oracle数据库表的通用办法

    Ref:http://blog.csdn.net/iamlaosong/article/details/8465177 Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的 ...

  9. ES6 数组的扩展

    1. Array.from() Array.from()将类数组(array-like)对象与可遍历的对象转化为数组并返回. 下面是一个类数组 let arr = { '0':'a', '1':'b' ...

随机推荐

  1. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...

  2. vim 命令整理(自己经常使用)

    vimm(vimsual)是Linux/UNIX系列OS中通用的全屏编辑器. vimm分为两种状态,即命令状态和编辑状态.在命令状态下.所键入的字符系统均作命令来处理.如:q代表退出,而编辑状态则是用 ...

  3. 掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明

    作者:陈希章 发表于 2017年7月12日 引子 这是一篇计划外的文章.我们都知道要进行Microsoft Graph的开发的话,需要进行应用程序注册.这个在此前我已经有专门的文章写过了.但这里存在一 ...

  4. 在用python操作mysql时报错:ModuleNotFoundError: No module named 'MySQLdb'

    用Flask+python+mysql写一个小项目 系统 win10 py版本:3.6.1 在配置数据库时报错ModuleNotFoundError: No module named 'MySQLdb ...

  5. Springboot-添加对jsp支持

    1,在项目的配置文件加入以下依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>j ...

  6. Can't update: no tracked branch No tracked branch configured for branch dev.

    1.git pull 命令出现以下错误 $ git pull There is no tracking information for the current branch. Please speci ...

  7. 在jQuery中使用canvas时遇到的问题

    正常的情况下一般在JavaScript中使用canvas,会用到如下代码: var canvas=document.getElementById("canvas"); var co ...

  8. OC学习14——谓词

    一.谓词的基本概念与使用 1.谓词(NSPredicate)用于定义一个逻辑条件,通过该条件可执行搜索或内存中的过滤操作.上一篇文章中介绍的集合都提供了使用谓词对集合进行过滤的方法.OC中的谓词操作是 ...

  9. phpexcel用法(转)

    .php导出excel(多种方法) (2013-03-23 15:44:02) 转载▼   分类: php 基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只 ...

  10. JAVA NIO学习二:通道(Channel)与缓冲区(Buffer)

    今天是2018年的第三天,真是时光飞逝,2017年的学习计划还没有学习完成,因此继续开始研究学习,那么上一节我们了解了NIO,那么这一节我们进一步来学习NIO相关的知识.那就是通道和缓冲区.Java ...