简单的通讯录(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实现这个功能 首先我们看一下效果图 ...
随机推荐
- 1.2 如何使用LINQ
LINQ作为一种数据查询编码方式,它本身不是独立的开发语言,也不能进行应用程序开发.但是在.NET 4.5中,可以在C#中集成LINQ查询代码. 在任何源代码文件中,要使用LINQ查询功能,必须引用S ...
- 从实例谈OOP、工厂模式和重构
有了翅膀才能飞, 欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光, 让僵冷的翅膀重新飞起来. 结合实例, 通过应用OOP.设计模式和重构,你会看到代码 ...
- javascript 正则介绍
1.正则直接量字符 \o NUL字符(\u000)\t 制表符\n 换行符(\u000A)\v 垂直制表符\f 换页符\xnn 由16进制nn指定的拉丁字符\uXXXX 由16进制XXXX指定的unc ...
- leetcode[164] Maximum Gap
梅西刚梅开二度,我也记一题. 在一个没排序的数组里,找出排序后的相邻数字的最大差值. 要求用线性时间和空间. 如果用nlgn的话,直接排序然后判断就可以了.so easy class Solution ...
- Reporting Service部署之访问权限
原文:Reporting Service部署之访问权限 SQL Server Reporting Services 并非专门设计用于 Internet 报表部署方案,但是您可以成功地将 Reporti ...
- .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)
原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...
- SDUTOJ 2054 双向链表
#include<iostream> #include<stdlib.h> using namespace std; typedef int ElemType; typedef ...
- Js Date泣血整理
原文:Js Date泣血整理 JS Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值. ...
- Linux内核策略介绍
Linux内核策略介绍学习笔记 主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...
- ASP.NET MVC之单元测试
ASP.NET MVC之单元测试分分钟的事2014-07-15 13:05 by 书洞里的猫, 550 阅读, 4 评论, 收藏, 编辑 一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在 ...