简易 (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' ...
随机推荐
- Ajax 学习总结
Ajax 技术在 JavaWeb 应用中随处可见,比如购物车中根据商品数量及时更新等应用,那么我们今天就来说说 Ajax 的一些小应用! Ajax 技术也就是允许浏览器与服务器通信而无需刷新当前页面, ...
- 自学Zabbix3.5-监控项item
itemItems是从主机里面获取的所有数据.通常情况下item为监控项,一般网络设备.服务器加入了zabbix监控,就需要监控它的cpu负载,那么实现这个方法的东西就叫item. 1. item构成 ...
- Asp.Net Web API(三)
Routing Tables路由表 在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action.当Web API接 ...
- loadrunner设置分压机 压力测试
压力机设置分压机使用场景: 当本地主机内存较小,运行速度较慢,压力较大等多种需求场景下,可以使用分压机. 一.将另一台机器设置为压力机 1,开始菜单找到HP LoadRunner-->Advan ...
- Java.util.Map排序输出
在java的众多Map实现中,Map基本上是不能保证顺序的(LinkedHashMap可以保证插入顺序或者访问顺序,TreeMap默认按照key升序但可以自定义Comparator),在开发过程中当数 ...
- MySQL sql语句获取当前日期|时间|时间戳
1.1 获得当前日期+时间(date + time)函数:now() mysql> select now();+———————+| now() |+———————+| 2013-04-08 20 ...
- 树形dp系列
1.火车站开饭店 最大独立集裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include< ...
- mysql case when group by实例
mysql 中类似php switch case 的语句. select xx字段, case 字段 when 条件1 then 值1 when 条件2 then 值2 else 其他值 END 别名 ...
- Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- vi 和vim 的区别
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.vim的这些优势主要体现在以下几个方面:1.多级撤消我们知道在vi里,按 u只能撤消上次命 ...