简单通讯录c语言程序注释,C语言实现简单通讯录

本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下

一、概述

通讯录的实现其中包括了指针、结构体、动态内存管理、文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子;

通讯录功能如下:

添加联系人

删除联系人

查找联系人

修改联系人

显示所有联系人

加载联系人

保存联系人

联系人排序

二、代码如下

contact.h

#ifndef CONTACT_H

#define CONTACT_H

#define NAME_MAX 20

#define SEX_MAX 10

#define TEL_MAX 12

#define ADDR_MAX 20

#define MEMBER_MAX 1

typedef struct info

{

char name[NAME_MAX];

char sex[SEX_MAX];

int age;

char tele[TEL_MAX];

char addr[ADDR_MAX];

}info;

typedef struct contact

{

info *data;

int size;

int capacity;

}contact, *pcontact;

//初始化通讯录

void InitContact(pcontact list);

//添加联系人

void AddContact(pcontact list);

//删除联系人

void DellContact(pcontact list);

//查找联系人

void FindContact(pcontact list);

//修改联系人

void ModContact(pcontact list);

//显示所有联系人

void ShowContact(pcontact list);

//联系人排序(选择法)

void SortContact(pcontact list);

//检查容量

int CheckSize(pcontact list);

//查找联系人在数组data第几个位置

int FindContactAddr(pcontact list);

//从文件中加载联系人到内存

void LoadContact(pcontact list);

//将联系人从内从中保存到文件

void SaveContact(pcontact list);

#endif

contact.c

#include

#include

#include

#include "contact.h"

//初始化通讯录

void InitContact(pcontact list)

{

list->data = (info *)malloc(sizeof(info)* MEMBER_MAX);

list->size = 0;

list->capacity = MEMBER_MAX;

//每次初始化是加载一遍文件,防止最新录入的在保存在文件时覆盖上次

//打开程序时保存的信息

LoadContact(list);

}

//添加联系人

void AddContact(pcontact list)

{

info tmp_member;

if (CheckCapacity(list) == 0)

{

printf("成员已满,添加失败!");

return;

}

printf("请输入姓名:");

scanf("%s", tmp_member.name);

printf("请输入性别:");

scanf("%s", tmp_member.sex);

printf("请输入年龄:");

scanf("%d", &tmp_member.age);

printf("请输入电话:");

scanf("%s", tmp_member.tele);

printf("请输入地址:");

scanf("%s", tmp_member.addr);

list->data[list->size] = tmp_member;

printf("添加成功!\n");

list->size++;

}

//删除联系人

void DellContact(pcontact list)

{

char tmp_name[NAME_MAX] = { 0 };

int ret = 0;

printf("请输入姓名:");

scanf("%s", tmp_name);

ret = FindContactAddr(list, tmp_name);

if (ret == -1)

{

printf("无此联系人!\n");

return;

}

for (ret; ret < list->size - 1; ret++)

{

list->data[ret] = list->data[ret + 1];

}

printf("删除成功!\n");

list->size--;

}

//查找联系人

void FindContact(pcontact list)

{

char tmp_name[NAME_MAX] = { 0 };

printf("请输入姓名:");

scanf("%s", tmp_name);

for (int i = 0; i < list->size; i++)

{

if (strcmp(tmp_name, list->data[i].name) == 0)

{

printf("===============================\n");

printf("姓名:%s\n", list->data[i].name);

printf("性别:%s\n", list->data[i].sex);

printf("年龄:%d\n", list->data[i].age);

printf("电话:%s\n", list->data[i].tele);

printf("地址:%s\n", list->data[i].addr);

printf("===============================\n");

return;

}

}

printf("无此联系人!\n");

}

//查找联系人在数组data第几个位置

int FindContactAddr(pcontact list, char *tmp_name)

{

for (int i = 0; i < list->size; i++)

{

if (strcmp(tmp_name, list->data[i].name) == 0)

return i;

}

return -1;

}

//修改联系人

void ModContact(pcontact list)

{

info tmp_member;

int ret = 0;

printf("请输入姓名:");

scanf("%s", tmp_member.name);

ret = FindContactAddr(list, tmp_member.name);

if (ret == -1)

{

printf("无此联系人!\n");

return;

}

printf("请输入性别:");

scanf("%s", tmp_member.sex);

printf("请输入年龄:");

scanf("%s", &tmp_member.age);

printf("请输入电话:");

scanf("%s", tmp_member.tele);

printf("请输入地址:");

scanf("%s", tmp_member.addr);

list->data[ret] = tmp_member;

printf("修改成功!\n");

}

//联系人排序(选择法)

void SortContact(pcontact list)

{

info tmp_member;

for (int i = 0; i < list->size - 2; i++)

{

for (int j = 1; j < list->size - 1; j++)

{

if (strcmp(list->data[i].name, list->data[j].name) > 0)

{

tmp_member = list->data[i];

list->data[i] = list->data[j];

list->data[j] = tmp_member;

}

}

}

}

//检查上次动态开辟的空间是否够用,不够时继续开辟

int CheckCapacity(pcontact list)

{

if (list->size == list->capacity)

{

info *tmp = (info *)malloc(sizeof(info)* (list->capacity + 10));

if (tmp == NULL)

return 0;

memcpy(tmp, list->data, sizeof(info) * list->size);

free(list->data);

list->data = tmp;

list->capacity += 10;

}

return 1;

}

//显示所有联系人

void ShowContact(pcontact list)

{

for (int i = 0; i < list->size; i++)

{

printf("============第%d位==============\n", i + 1);

printf("姓名:%s\n", list->data[i].name);

printf("性别:%s\n", list->data[i].sex);

printf("年龄:%d\n", list->data[i].age);

printf("电话:%s\n", list->data[i].tele);

printf("地址:%s\n", list->data[i].addr);

printf("===============================\n");

}

}

//从文件中加载联系人到内存

void LoadContact(pcontact list)

{

info tmp_member;

FILE *pf = NULL;

pf = fopen("./contatc.dat", "rb");

if (pf == NULL)

perror("fopen error");

//按照内存块读取,一次读1块,1块大小是sizeof(info)

while (fread(&tmp_member, sizeof(info), 1, pf))

{

if (CheckCapacity(list))

{

list->data[list->size] = tmp_member;

list->size++;

}

}

if (pf != NULL)

{

fclose(pf);

pf = NULL;

printf("加载成功!\n");

}

}

//将联系人从内从中保存到文件

void SaveContact(pcontact list)

{

FILE *pf = NULL;

pf = fopen("./contatc.dat", "wb");

if (pf == NULL)

perror("fopen error");

for (int i = 0; i < list->size; i++)

{

//按照内存块写入,一次写1块,1块大小是sizeof(info)

fwrite(list->data + i, sizeof(info), 1, pf);

}

if (pf != NULL)

{

fclose(pf);

pf = NULL;

printf("保存成功!\n");

}

}

test.c

#define _CRT_SECURE_NO_WARNINGS

#include

#include "contact.h"

enum opt

{

Exit,

Add,

Dell,

Find,

Mod,

Show,

Load,

Save,

Sort,

};

void menu(void)

{

printf("/*========================通讯录======================*/\n");

printf("/*= 0.退出通讯录 1.添加联系人 =*/\n");

printf("/*= 2.删除联系人 3.查找联系人 =*/\n");

printf("/*= 4.修改联系人 5.显示所有联系人 =*/\n");

printf("/*= 6.加载联系人 7.保存联系人 =*/\n");

printf("/*= 8.联系人排序 =*/\n");

printf("/*====================================================*/\n");

}

void TestContact(void)

{

contact pc;

InitContact(&pc);

int opt = 0;

do

{

menu();

printf("请选择:>");

scanf("%d", &opt);

switch (opt)

{

case Exit:

printf("退出系统...\n");

break;

case Add:

AddContact(&pc);

break;

case Dell:

DellContact(&pc);

break;

case Find:

FindContact(&pc);

break;

case Mod:

ModContact(&pc);

break;

case Show:

ShowContact(&pc);

break;

case Load:

LoadContact(&pc);

break;

case Save:

SaveContact(&pc);

break;

case Sort:

SortContact(&pc);

break;

default:

printf("输入选项有误,重新输入!\n");

break;

}

} while (opt);

}

int main(void)

{

TestContact();

printf("\n");

system("pause");

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

设计一个《学生通讯录管理系统》,在动态链表程序的基础上,设计要求如下 (必须使用结构体和链表等数据结构) 1建立文件 存储文件使用指定文件名或默认文件名; 可以不保存输入记录,但需要确认是否保存输入记录 如果已有文件,只能在其后追加; 新增记录可以不存入原文件中,以可以用原来的文件覆盖内存的内容; 可以将多个个文件记录合并到一个文件中; 2文件的存取和显示 可以单独存取文件; 可以随时显示内存中记录的全部内容; 可以直接存取默认文件或指定文件; 3删除记录 可以按“姓名”或“电话”方式删除记录并更新内存链表内容; 能给出被删除的信息,输出没有找到的信息; 如果已经是空表,上出时应给出信息并返回主菜单; 如果没有要删除的信息,输出没有找到的信息; 删除操作仅限于内存,只有执行记录时,才能覆盖原记录; 4查询记录 可以按“姓名”或“电话”或“宿舍”方式查询记录 能给出查询记录的信息; 如果查询的信息不存在,输出没有找到的信息; 5 整体功能 a可以随时检索、删除、或增加新记录,保存或取消新的记录 b使姓名可由16位字符和数字的混合编码组成 c使电话号码可由18位字符和数字组成 d将输出信息加上输出信息信息栏,例如 姓名 电话 性别 年龄 生日 宿舍 李四 1234 男 21 7月1日 东二333 e使用菜单实现功能的正确的选择 f 所有节点信息都是动态生成。 6测试程序 应列出测试大纲对程序进行测试; 应保证测试用例测试到程序的各种边缘情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值