#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. Ajax 学习总结

    Ajax 技术在 JavaWeb 应用中随处可见,比如购物车中根据商品数量及时更新等应用,那么我们今天就来说说 Ajax 的一些小应用! Ajax 技术也就是允许浏览器与服务器通信而无需刷新当前页面, ...

  2. 自学Zabbix3.5-监控项item

    itemItems是从主机里面获取的所有数据.通常情况下item为监控项,一般网络设备.服务器加入了zabbix监控,就需要监控它的cpu负载,那么实现这个方法的东西就叫item. 1. item构成 ...

  3. Asp.Net Web API(三)

    Routing Tables路由表 在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action.当Web API接 ...

  4. loadrunner设置分压机 压力测试

    压力机设置分压机使用场景: 当本地主机内存较小,运行速度较慢,压力较大等多种需求场景下,可以使用分压机. 一.将另一台机器设置为压力机 1,开始菜单找到HP LoadRunner-->Advan ...

  5. Java.util.Map排序输出

    在java的众多Map实现中,Map基本上是不能保证顺序的(LinkedHashMap可以保证插入顺序或者访问顺序,TreeMap默认按照key升序但可以自定义Comparator),在开发过程中当数 ...

  6. MySQL sql语句获取当前日期|时间|时间戳

    1.1 获得当前日期+时间(date + time)函数:now() mysql> select now();+———————+| now() |+———————+| 2013-04-08 20 ...

  7. 树形dp系列

    1.火车站开饭店 最大独立集裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include< ...

  8. mysql case when group by实例

    mysql 中类似php switch case 的语句. select xx字段, case 字段 when 条件1 then 值1 when 条件2 then 值2 else 其他值 END 别名 ...

  9. Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. vi 和vim 的区别

    它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.vim的这些优势主要体现在以下几个方面:1.多级撤消我们知道在vi里,按 u只能撤消上次命 ...