【C 项目】「通讯录」

目录

效果展示

实现代码

        contact.h

        contact.c

        test.c


效果展示

实现代码

        contact.h

需包含的头文件及函数声明

#pragma once
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<stdlib.h>
#include<search.h>

enum option//选项
{
	EXIT,
	ADD,
	SHOW,
	DEL,
	MOD,
	SEARCH,
	SORT
};

typedef struct people//联系人
{
	char name[10];//姓名
	short age;//年龄
	char tel[12];//电话
	char addr[12];//住址
}people;

typedef struct contact//通讯录
{
	people* data;//存放联系人
	int count;//记录当人联系人个数
	int capa;//记录当前通讯录容量
}contact;

void init(contact* con);
void add(contact* con);
void show(contact* con);
void del(contact* con);
void mod(contact* con);
void search(contact* con);
void sort(contact* con);
void save(contact* con);

        contact.c

函数实现

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"

void add_capa(contact* con)//扩容通讯录
{
	if (con->count != con->capa)//通讯录是否已满
		return;
	people* p = (people*)realloc(con->data, (con->capa + 2) * sizeof(people));//扩容2个联系人
	if (p == NULL)//是否扩容失败
	{
		perror("add_capa");
		return;
	}
	con->data = p;//更新指向空间
	con->capa += 2;//容量+2
}

void load(contact* con)
{
	people tmp = { 0 };//存放获取到数据的变量
	FILE* p = fopen("contact.txt", "r");//打开存放联系人的文件
	if (!p)//是否打开失败
	{
		perror("load");//打印错误信息
		return;//返回
	}
	while (fread(&tmp, sizeof(people), 1, p))//读取文件内数据放入tmp
	{
		add_capa(con);//查看通讯录容量
		con->data[con->count] = tmp;//将tmp中的数据放入通讯录
		con->count++;//联系人+1
	}
	fclose(p);//关闭文件
	p = NULL;//文件指针置空
}

void init(contact* con)
{
	con->data = (people*)malloc(2 * sizeof(people));//初始情况下可存放两个联系人
	con->count = 0;//初始情况下无联系人
	con->capa = 2;//通讯录容量为2
	load(con);//将以前的数据写入通讯录
}

int find(contact* con)//查找联系人
{
	char name[12] = { 0 };//接收输入的姓名
	scanf("%s", name);
	for (int i = 0; i < con->count; i++)//查找
	{
		if (!strcmp(con->data[i].name, name))//是否相同
			return i;//返回下标
	}
	return -1;//返回不存在的下标
}



void add(contact* con)//添加联系人
{
	add_capa(con);//查看通讯录容量
	printf("请输入姓名:");
	scanf("%s", con->data[con->count].name);
	printf("请输入年龄:");
	scanf("%hd", &(con->data[con->count].age));
	printf("请输入电话:");
	scanf("%s", con->data[con->count].tel);
	printf("请输入住址:");
	scanf("%s", con->data[con->count].addr);
	con->count++;//联系人+1
	printf("添加成功!\n");
}

void show(contact* con)//显示联系人
{
	if (!con->count)//判断通讯录是否为空
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("%-12s%-12s%-12s%-12s\n", "姓名", "年龄", "电话", "住址");//左对齐打印标题
	for (int i = 0; i < con->count; i++)//左对齐遍历联系人
	{
		printf("%-12s", con->data[i].name);
		printf("%-12hd", con->data[i].age);
		printf("%-12s", con->data[i].tel);
		printf("%-12s\n", con->data[i].addr);
	}
}

void del(contact* con)//删除联系人
{
	if (!con->count)
	{
		printf("通讯录为空!\n");
		return;
	}
	int ret = 0;
	printf("请输入要删除的联系人姓名:");
	ret = find(con);//查找联系人
	if (ret == -1)//联系人是否存在
	{
		printf("联系人不存在!\n");
		return;
	}
	for (int i = 0; i < con->count - 1; i++)//将该下标后的联系人向前覆盖
		con->data[i] = con->data[i + 1];
	con->count--;//联系人-1
	printf("删除成功!\n");
}

void mod(contact* con)//修改联系人
{
	if (!con->count)
	{
		printf("通讯录为空!\n");
		return;
	}
	int ret = 0;
	printf("请输入要修改的联系人姓名:");
	ret = find(con);
	if (ret == -1)
	{
		printf("联系人不存在!\n");
		return;
	}
	printf("请输入新姓名:");
	scanf("%s", con->data[ret].name);
	printf("请输入新年龄:");
	scanf("%hd", &(con->data[ret].age));
	printf("请输入新电话:");
	scanf("%s", con->data[ret].tel);
	printf("请输入新住址:");
	scanf("%s", con->data[ret].addr);
	printf("修改成功!\n");
}

void search(contact* con)//查找联系人
{
	if (!con->count)
	{
		printf("通讯录为空!\n");
		return;
	}
	int ret = 0;
	printf("请输入要查找的联系人姓名:");
	ret = find(con);
	if (ret == -1)
	{
		printf("联系人不存在!\n");
		return;
	}
	printf("%-12s%-12s%-12s%-12s\n", "姓名", "年龄", "电话", "住址");
	printf("%-12s", con->data[ret].name);
	printf("%-12hd", con->data[ret].age);
	printf("%-12s", con->data[ret].tel);
	printf("%-12s\n", con->data[ret].addr);
}

int cmp(void* e1, void* e2)//qsort参数
{
	return strcmp(((people*)e1)->name, ((people*)e2)->name);//返回比较结果
}

void sort(contact* con)//排序
{
	if (!con->count)
	{
		printf("通讯录为空!\n");
		return;
	}
	qsort(con->data, con->count, sizeof(people), cmp);//排序
	printf("排序成功!\n");
}

void save(contact* con)//保存
{
	FILE* p = fopen("contact.txt", "w");
	if (!p)
	{
		perror("save");
		return;
	}
	for (int i = 0; i < con->count; i++)
	{
		fwrite(con->data + i, sizeof(people), 1, p);//将联系人写入文件
	}
	fclose(p);
	p = NULL;
}

        test.c

测试

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"

void menu()//打印菜单
{
	printf("1.ADD      2.SHOW\n");
	printf("3.DEL      4.MOD\n");
	printf("5.SERACH   6.SORT\n");
	printf("0.EXIT\n");
}
int main()
{
	short input = 0;//存放用户选择的变量
	contact con;//创建通讯录
	init(&con);//初始化通讯录
	do
	{
		system("pause");//按任意键继续
		system("cls");//清空屏幕
		menu();//打印菜单
		scanf("%hd", &input);//输入选择
		switch (input)
		{
		case ADD:
			add(&con);//添加联系人
			break;
		case SHOW:
			show(&con);//显示联系人
			break;
		case DEL:
			del(&con);//删除联系人
			break;
		case MOD:
			mod(&con);//修改联系人
			break;
		case SEARCH:
			search(&con);//查找联系人
			break;
		case SORT:
			sort(&con);//排序
			break;
		case EXIT:
			save(&con);//保存通讯录
			printf("退出程序\n");
			return;
			break;
		default:
			printf("输入有误\n");
			break;
		}
	} while (input);//判断用户是否选择退出

	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值