初始C语言|简单通讯录
通讯录程序 1.存放联系人信息
2.信息:名字+年龄+性别+电话+住址
3.增加联系人
4.删除联系人
5.查找联系人
6.修改联系人
7.排序
test.c源文件代码如下:
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu()
{ printf("#####################################\n");
printf("#####1. add2. del#####\n");
printf("#####3. search4. modify#####\n");
printf("#####5. show6. sort#####\n");
printf("#####0. exit#####\n");
printf("#####################################\n");
}//创建一个枚举类型,分别对应菜单选项
enum Option
{ EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
};
int main()
{ int input = 0;
//创建一个通讯录
struct Contact con;
//初始化通讯录
InitContact(&con);
//最多可以放3个联系人信息
//空间不够再增容 do
{menu();
//进入循环,先打印菜单
printf("请选择:>");
scanf("%d", &input);
//用户选择操作
switch (input)
{case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
SortContact(&con);
break;
case EXIT:
SaveContact(&con);
//销毁通讯录
DestroyContact(&con);
printf("退出\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
contact.c源文件代码如下:
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"//检测通讯录容量
void CheckCapacity(struct Contact* pc)
{ //断言
assert(pc);
if (pc->sz == pc->capacity)//如果有效联系人等于最大容纳量
{//增加容量
struct PeoInfo* ptr = realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
if (ptr != NULL)//如果不为空,表示增容成功
{pc->data = https://www.it610.com/article/ptr;
pc->capacity += 2;
printf("增容成功\n");
}
else
{perror("AddContact::realloc");
return;
}
}
}//加载有效联系人信息
void LoadContact(struct Contact* pc)
{ assert(pc);
struct PeoInfo tmp = {
0 };
//临时空间
FILE* pfRead = fopen("contact.txt", "rb");
//打开文件,读取数据
if (NULL == pfRead)
{perror("open file for reading");
return;
}
//加载数据
//每次读取一个联系人信息,直到frea返回值小于1,表示读取完毕,循环结束
while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))
{CheckCapacity(pc);
pc->data[pc->sz] = tmp;
pc->sz++;
} //关闭文件
fclose(pfRead);
pfRead = NULL;
//置空,防止变成野指针
}//初始化通讯录
void InitContact(struct Contact* pc)
{ assert(pc);
pc->sz = 0;
pc->capacity = DEFAULT;
pc->data = https://www.it610.com/article/(struct PeoInfo*)malloc(DEFAULT * sizeof(struct PeoInfo));
//动态申请空间
if (pc->data =https://www.it610.com/article/= NULL)
{perror("InitContact::malloc");
return;
}
LoadContact(pc);
//加载通讯录的信息
}//增加联系人
void AddContact(struct Contact* pc)
{ assert(pc);
CheckCapacity(pc);
//检查容量是否为满,是则进行增容 //输入增加指定联系人的信息
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
printf("添加成功\n");
pc->sz++;
//有效联系人加1
}//销毁通讯录
void DestroyContact(struct Contact* pc)
{ assert(pc);
free(pc->data);
//释放申请的动态内存空间
pc->data = https://www.it610.com/article/NULL;
//置为空指针
pc->capacity = 0;
//容量置0
pc->sz = 0;
//有效联系人置0
}//显示通讯录信息
void ShowContact(const struct Contact* pc)
{ assert(pc);
int i = 0;
printf("%20s\t%5s\t%10s\t%12s\t%50s\n\n", "name", "age", "sex", "tele", "addr");
for (i = 0;
i < pc->sz;
i++)
{//打印每一个数据
printf("%20s\t%5d\t%10s\t%12s\t%50s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}//查找指定联系人
int FindContactByName(const struct Contact* pc, const char* name)
{ assert(pc && name);
int i = 0;
for (i = 0;
i < pc->sz;
i++)
{if (strcmp(pc->data[i].name, name) == 0)
{return i;
}
}
//找不到
return -1;
}//删除指定联系人
void DelContact(struct Contact* pc)
{ assert(pc);
if (pc->sz == 0)
{printf("通讯录为空,无法删除\n");
return;
}
char name[NAME_MAX] = {
0 };
printf("请输入要删除联系人的名字:>");
scanf("%s", name);
//查找到删除的人
int pos = FindContactByName(pc, name);
if (pos == -1)
printf("指定联系人不存在\n");
else
{//删除
int i = 0;
for (i = pos;
i < pc->sz-1;
i++)
{pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除\n");
}
}//查找指定联系人
void SearchContact(const struct Contact* pc)
{ assert(pc);
char name[NAME_MAX] = {
0 };
if (pc->sz == 0)
{printf("通讯录为空,无法查找\n");
return;
}
printf("请输入要查找的联系人名字:>");
scanf("%s", name);
int pos = FindContactByName(pc, name);
if (-1 == pos)
printf("查无此人\n");
else
{printf("%15s\t%5s\t%8s\t%15s\t%30s\n\n", "name", "age", "sex", "tele", "addr");
printf("%15s\t%5d\t%8s\t%15s\t%30s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}//修改指定联系人
void ModifyContact(struct Contact* pc)
{ assert(pc);
char name[NAME_MAX] = {
0 };
if (pc->sz == 0)
{printf("通讯录为空,无法修改\n");
return;
}
printf("请输入要修改的联系人名字:>");
scanf("%s", name);
int pos = FindContactByName(pc, name);
if (-1 == pos)
printf("要修改的人不存在\n");
else
{printf("请输入新的名字:>");
scanf("%s", pc->data[pos].name);
printf("请输入新的年龄:>");
scanf("%d", &(pc->data[pos].age));
printf("请输入新的性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入新的电话:>");
scanf("%s", pc->data[pos].tele);
printf("请输入新的地址:>");
scanf("%s", pc->data[pos].addr);
}
}//按照名字排序->升序
int cmp_by_name(const void* e1, const void* e2)
{ return strcmp((((struct PeoInfo*)e1)->name), (((struct PeoInfo*)e2)->name));
}//按照年龄排序->升序
int cmp_by_age(const void* e1, const void* e2)
{ return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}//排序通讯录
void SortContact(struct Contact* pc)
{ assert(pc);
int input = 0;
if (pc->sz == 0)
{printf("通讯录为空,无法排序\n");
return;
}
printf("按名字排序请输入1,年龄排序请输入2:>");
scanf("%d", &input);
if (1 == input)
{//名字排序
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_name);
}
else
{//年龄排序
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_age);
}
}//保存通讯录
void SaveContact(struct Contact* pc)
{ assert(pc);
int i = 0;
FILE* pfWrite = fopen("contact.txt", "wb");
把当前程序的有效联系人写入文件
if (NULL == pfWrite)//判断是否为空指针
{perror("open file for writting");
return;
}
//写数据
for (i = 0;
i < pc->sz;
i++)
{fwrite(pc->data+i, sizeof(struct PeoInfo), 1, pfWrite);
//进行写入
} fclose(pfWrite);
//关闭文件
pfWrite = NULL;
//置为空指针
}
contact.h头文件代码如下:
#pragma once
#include
#include
#include
#include #define DEFAULT 3
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 50#define MAX 1000//描述联系人的信息
struct PeoInfo
{ char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
};
//通讯录-动态增长版本
struct Contact
{ struct PeoInfo* data;
int sz;
//通讯录中当前有效元素个数
int capacity;
//通讯录的当前最大容量
};
//增容
void CheckCapacity(struct Contact* pc);
//初始化通讯录
void InitContact(struct Contact* pc);
//销毁通讯录
void DestroyContact(struct Contact* pc);
//增加联系人
void AddContact(struct Contact* pc);
//显示通讯录
void ShowContact(const struct Contact* pc);
//删除指定联系人
void DelContact(struct Contact* pc);
//查找指定联系人
void SearchContact(const struct Contact* pc);
//修改指定联系人
void ModifyContact(struct Contact* pc);
//排序通讯录
void SortContact(struct Contact* pc);
//保存通讯录到文件
void SaveContact(struct Contact* pc);
//加载通讯录
void LoadContact(struct Contact* pc);
程序运行:
【初始C语言|简单通讯录】
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
重新运行程序并显示
之前添加的联系人会存放在指定文件中,再次运行程序会加载进去,增容成功是因为默认容纳的联系人有3位,要加载4位联系人,所以自动进行增容。
文章图片
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 科学养胃,别被忽悠,其实真的很简单
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- opencv|opencv C++模板匹配的简单实现
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 松软可口易消化,无需烤箱超简单,新手麻麻也能轻松成功~
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场