简单的通讯录(C语言实现)
通讯录实现的功能
1、添加联系人 2、删除联系人
3、查找联系人 4、修改联系人
5、显示联系人 6、清空通讯录
7、按照姓名进行排序 8、退出程序
该通讯录将联系人的信息保存在文件中
在VS2013中打开文件直接创建,创建建的文件名字是contact.dat,操作步骤如下:
使用的文件操作函数如下:
fopen
函数原型为 FILE *fopen( const char *fname, const char *mode );
打开由fname(文件名)指定的文件并返回一个关联该文件的流.如果发生错误, fopen()返回NULL.
mode(方式)是用于决定文件的用途
fwrite:
函数原型为 size_t fwrite ( const void * buffer, size_t size, size_t count, FILE * stream );
从buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流.
返回值是已写的对象的数量.
fread:
函数原型为size_t fread( void *buffer, size_t size, size_t num, FILE *stream );
读取[num]个对象(每个对象大小为size(大小)指定的字节数),
并把它们替换到由buffer(缓冲区)指定的数组
数据来自给出的输入流.
完整代码:
头文件:Addersss.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _ADDRESS_LIST_H_
#define _ADDRESS_LIST_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NAME_MAX 12
#define TEL_MAX 12
#define SEX_MAX 5
#define ADDR_MAX 20
#define INIT 4
#define SIZE 4
enum OP
{
EXIT, //退出
ADD, //添加
DEL,//删除
SEARCH, //查找
REVISE, //修改
DISPLAY, //打印
SORT, //排序
EMPTY //清空
};
typedef struct PerInfo
{
char name[NAME_MAX];//姓名
int age; // 年龄
char sex[SEX_MAX];//性别
char tel[TEL_MAX]; //电话
char address[ADDR_MAX];//地址
}PerInfo;
typedef struct Contact
{
PerInfo* data;//存储所有联系人的信息
int size;
int capacity;
}Contact, *Pcon;
void Add(Pcon Con); //添加联系人
void Delete(Pcon Con);//删除联系人
void Revise(Pcon Con);//修改联系人
void Search(Pcon Con);//查找联系人
void Display(Pcon Con);//打印联系人
void Init(Pcon Con);//初始化通讯录
void Save_Contact(Pcon Con); //存储联系人
void Load_Contact(Pcon Con);//加载联系人
void Empty(Pcon Con); //清空联系人
void Sort(Pcon Con);//对联系人进行排序
void Free(Pcon Con);//释放空间 #endif //_ADDRESS_LIST_H_
Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"AddressList.h"
void judge_full(Pcon Con) //当实际联系人个数和初始化的容量相等时用realloc增容
{
if (Con->capacity == Con->size)
{
PerInfo* tmp = (PerInfo*)realloc(Con->data, (Con->capacity + SIZE)*sizeof(PerInfo));
if (tmp == NULL)
{
printf("out of memery\n");
exit(EXIT_FAILURE);
}
else
{
Con->data = tmp;
Con->capacity += SIZE;
}
}
}
int Find(Pcon Con, char* str) //查找联系人函数
{
for (int i = ; i < Con->size; i++)
{
if (strcmp(str, Con->data[i].name) == )
{
return i;
}
}
return -;//没有找到返回 -1
}
void Add(Pcon Con) //添加
{
judge_full(Con);
printf("请输入联系人的姓名 年龄 性别 电话号码,家庭住址\n");
scanf("%s%d%s%s%s", Con->data[Con->size].name,
&Con->data[Con->size].age,
Con->data[Con->size].sex,
Con->data[Con->size].tel,
Con->data[Con->size].address);
Con->size++;
printf("添加成功\n");
return;
}
void Delete(Pcon Con)//删除联系人
{
char input[NAME_MAX];
int i = ;
printf("请输入联系人姓名:\n");
scanf("%s", input);
int ret = Find(Con, input);
if (ret != -)
{
for (i = ret; i < Con->size; i++)
{
Con->data[i] = Con->data[i + ]; //将所要删除的元素后面的元素都往前移动 }
Con->size--;
}
else
{
printf("这个联系人不存在!\n");
}
}
void Revise(Pcon Con) //修改联系人
{
char input[NAME_MAX];
printf("请输入联系人姓名:\n");
scanf("%s", input);
int ret = Find(Con, input);
if (ret != -)
{
printf("请输入修改后联系人的姓名,性别,年龄,电话号码,家庭住址\n");
scanf("%s, %s, %d, %s, %s",
Con->data[ret].name,
Con->data[ret].sex,
Con->data[ret].age,
Con->data[ret].tel,
Con->data[ret].address);
printf("修改完成\n");
}
else
{
printf("该联系人不存在\n");
}
}
void Search(Pcon Con)
{
char input[NAME_MAX];
printf("请输入联系人姓名:\n");
scanf("%s", input);
int ret = Find(Con, input);
if (ret != -)
{
printf("%s,%s,%d,%s,%s\n",
Con->data[ret].name,
Con->data[ret].sex,
Con->data[ret].age,
Con->data[ret].tel,
Con->data[ret].address);
}
else
{
printf("该联系人不存在!\n");
}
}
void Display(Pcon Con)
{
int i = ;
while (i < Con->size)
{
printf("%s,%s,%d,%s,%s\n",
Con->data[i].name,
Con->data[i].sex,
Con->data[i].age,
Con->data[i].tel,
Con->data[i].address);
i++;
}
}
void Init(Pcon Con)
{
Con->data = (PerInfo*)malloc(SIZE*sizeof(PerInfo)); //开辟空间
if (Con->data == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
Con->size = ;
Con->capacity = INIT;
Load_Contact(Con);
}
void Save_Contact(Pcon Con) //存储联系人
{
FILE* pfwrite = fopen("contact.dat", "w");
if (pfwrite == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
for (int i = ; i < Con->size; i++)
{
fwrite(&(Con->data[i]), sizeof(PerInfo), , pfwrite);
}
fclose(pfwrite);
}
void Load_Contact(Pcon Con)//加载联系人
{
FILE* pfread = fopen("contact.dat", "r");
PerInfo tmp = { };
if (pfread == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
while (fread(&tmp, , sizeof(PerInfo), pfread))
{
judge_full(Con);
Con->data[Con->size] = tmp;
Con->size++;
}
}
void Empty(Pcon Con)//清空联系人
{
Con->size = ;
return;
}
void Sort(Pcon Con) //按照联系人姓名进行排序
{
int flag = ;
for (int i = ; i < Con->size - ; i++) //需要排n-1趟
{
int flag = ;
for (int j = ; j < Con->size - - i; j++) //每趟进行n-1-i次比较
{
if (strcmp(Con->data[j].name, Con->data[j + ].name)>) //按照升序进行排序
{
flag = ;
PerInfo tmp = Con->data[j];
Con->data[j] = Con->data[j + ];
Con->data[j + ] = tmp;
}
}
if (flag == )
{
break;
}
}
}
void Free(Pcon Con)
{
free(Con->data);
Con->data = NULL; }
Test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"AddressList.h"
void Print()
{ printf("**********************************************************\n");
printf("*********1:添加联系人*****2:删除联系人********************\n");
printf("*********3:查找联系人***** 4 : 修改联系人********************\n");
printf("*********5:显示所有联系人***6:排序*************************\n");
printf("*********7:清空联系人********0:退出************************\n");
printf("**********************************************************\n");
}
int main()
{
Contact pcon;
Init(&pcon);
int input;
while ()
{
Print();
printf("选择一个操作:");
scanf("%d", &input);
switch (input)
{
case EXIT:
Save_Contact(&pcon);
Free(&pcon);
exit();
break;
case ADD:
Add(&pcon);
break;
case DEL:
Delete(&pcon);
break;
case SEARCH:
Search(&pcon);
break;
case REVISE:
Revise(&pcon);
break;
case SORT:
Sort(&pcon);
break;
case DISPLAY:
Display(&pcon);
break;
case EMPTY:
Empty(&pcon);
break;
default:
printf("选择错误,请重新选择:\n"); }
}
system("pause");
return ;
}
---恢复内容结束---
简单的通讯录(C语言实现)的更多相关文章
- Python初学者笔记(4)-简单的通讯录
要求: 编写一个简单的通讯录 1.通讯录包含至少包含姓名.电话号码.电子邮箱:2.通讯录的信息能够保存在本地磁盘:3.通讯录查找特定人员的信息:4.通讯录能够修改特定人员的信息:5.通讯录能够删除特定 ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- iOS学习之Object-C语言简单的通讯录管理系统
用这几天学的OC的知识,写了一个实现简单功能的通讯录管理系统,在这里分享给大家: 通讯录管理系统 * 需求: 1.定义联系人类Contact.实例变量:姓名(拼音,首字母大写).性别.电话号码.住址 ...
- 【Android Demo】简单手机通讯录
Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 ...
- Swift 简单的通讯录
Swift 通讯录实战 1.功能需求 整个项目由三个界面构成:首页面(全部联系人),添加联系人界面和联系人详情界面 整个项目使用纯代码编程 数据处理方面使用一个工具类,处理所有数据的增删改查. 首页由 ...
- 【C++ in Qt5】一个简单的通讯录程序,支持文件存取
https://github.com/shalliestera/AddressBook 使用Qt5完成了一些之前用DevCpp很难做到的事,比如更简单地实现“从文件读取”和“保存到文件”的功能.之前我 ...
- JSON的简单介绍以及C语言的JSON库使用
JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...
- php简单实现通讯录采集,我的第一个php,适合新手
起源于要整理通讯录,原先用的是文件调查,现在学了php,就自己试一下.程序短小精悍,适于学习.有两个文件,bj.html用于显示和采集表单信息.bj.php用于处理数据和反馈结果.突出之处在于可以上传 ...
- Android程序设计-简单手机通讯录
在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...
随机推荐
- TextArea中定位光标位置
原文:TextArea中定位光标位置 在项目中,遇到一个场景:希望能在TextArea中输入某条记录中的明细(明细较简单,没有附属信息,只用记录顺序和值即可,譬如用"+"号来作为明 ...
- 使用Scala操作Mongodb
介绍 Scala是一种功能性面向对象语言.它融汇了很多前所未有的特性.而同一时候又执行于JVM之上.随着开发人员对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件不可缺 ...
- Lightdm:奔跑吧GUI[已解决]
Fedora替换gdm为lightdm解决无法登陆问题 前两天安装Codeblocks,这货安装了很多包和依赖,直接导致我重启进步去界面,卡在fedora LOGO处,如下 实在忧伤,已经因为折腾不知 ...
- android shape总结 和控制的风格定制
1:shape总结 1):shape文件是放置在drawable文件下的.res/drawable/filename.xml. 2):shape类型:android:shape. 一共同拥有四种:re ...
- ASP.NET页面生命周期和asp.net应用程序生命周期
作为一个asp.net程序员,不了解ASP.NET页面生命周期和asp.net应用程序生命周期是绝对不行的,那永远只能是菜鸟级别.我很早就学过,可是没次还是得去翻,一些事件还是记不住,还是记在自己的b ...
- AJAX跨域调用ASP.NET MVC或者WebAPI服务
关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案 作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP. ...
- Mvc的多层架构
分享一个Mvc的多层架构,欢迎大家拍砖斧正 多层架构是什么? 多层架构是开发人员在开发过程当中面对复杂且易变的需求采取的一种以隔离控制为主的应对策略,关于多层架构的标准,我认为有一句话是比较有代表 ...
- 传说中的WCF(1):这东西难学吗?
WCF难学吗? 是啊,这问题估计很多人都会问,也包括阿拉在内,也有此深刻而严重的凝问. 也有人说:“如何某项技术可以化繁为简,学起来轻松一点就好了.”也许,人类开生就摆脱不了一种习性——懒惰:不过,也 ...
- Light, more light - PC110701
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10110.html 原创:Ligh ...
- MVC中用Jpaginate分页
MVC中用Jpaginate分页 So easy!(兼容ie家族) 看过几款分页插件,觉得Jpaginate比较简约,样式也比较容易的定制,而且体验也比较好,支持鼠标滑动效果.先上效果图: 整个过 ...