实现一个简单通讯录(增加、删除、修改、查找、打印、清空、排序、写入文件、读入内存)C语言

通讯录可以用来存储1000个人的信息,每个人的信息包括: 
姓名、性别、年龄、电话、住址 

提供方法: 
1. 添加联系人信息 
2. 删除指定联系人信息 
3. 查找指定联系人信息 
4. 修改指定联系人信息 
5. 显示所有联系人信息 
6. 清空所有联系人 
7. 以名字排序所有联系人 
8. 保存联系人到文件 
9. 加载联系人 
 

test.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>

#define FILE_PATH "C:/Users/LM/Desktop/test1"  //保存文件的路径

#pragma once

#define MAX_name 20  //姓名长度
#define MAX_sex 10   
#define MAX_phone 20
#define MAX_adress 30
#define MAX_company 20

//存入单个联系人信息的结构体
typedef struct PersonInfo
{
	char name[MAX_name];  //姓名
	char sex[MAX_sex];    //性别
	char phone[MAX_phone];  //电话
	char adress[MAX_adress];  //地址
	char company[MAX_company]; //公司
}PersonInfo;

#define MAX_SIZE 5

//通讯录结构体
typedef struct AddressBook
{
	int size;   //联系人数量
	PersonInfo* people;  //指向单个联系人结构体
}AddressBook;

AddressBook g_addr;

//通讯录菜单
int Menu();

//初始化通讯录
void InitContacts(AddressBook* addr);

//增加联系人
void AddContacts(AddressBook* addr);

//删除联系人
void DelContacts(AddressBook* addr);

//显示所有联系人
void PrintContacts(AddressBook* addr);

//查找联系人
int FindContacts(AddressBook* addr);

//更改联系人
void ModifyContacts(AddressBook* addr);

//排序联系人
void SortContacts(AddressBook* addr);

//清空通讯录
void ClearallContacts(AddressBook* addr);

//写入文件
void WriteoutContacts(AddressBook* addr);

//写入内存
void ReadinContacts(AddressBook* addr);

test.c

#include "test.h"


int Menu()
{
	int choice = 0;
	printf("======================\n");
	printf("1.添加联系人\n");
	printf("2.删除联系人\n");
	printf("3.打印联系人\n");
	printf("4.查找联系人\n");
	printf("5.修改联系人\n");
	printf("6.排序联系人\n");
	printf("7.清除所有\n");
	printf("8.写入文件\n");
	printf("9.读入内存\n");
	printf("0.退出\n");
	printf("======================\n");
	printf("请输入你的选择:");
	scanf("%d", &choice);
	return choice;
}

void InitContacts(AddressBook* addr)
{
	memset(addr->people , 0, sizeof(addr->people) * MAX_SIZE);
}


void AddContacts(AddressBook* addr)
{
	assert(addr != NULL);
	
	//CheckCapacity(&g_addr);

	printf("请输入联系人信息:\n");

	printf("姓名:");
	scanf("%s", addr->people->name);

	printf("性别:");
	scanf("%s", addr->people->sex);

	printf("电话:");
	scanf("%s", addr->people->phone);

	printf("地址:");
	scanf("%s", addr->people->adress);

	printf("公司:");
	scanf("%s", addr->people->company);

	addr->size++;
	printf("联系人个数为:%d\n", addr->size );
	printf("\n");
}

void DelContacts(AddressBook* addr)
{
	int ret = 0;
	assert(addr != NULL);
	if(addr->size  == 0)
	{
		printf("没有联系人!\n");
		return;
	}
	ret = FindContacts(&g_addr);
	if(ret != -1)
	{
		int i = ret;
		addr->people[i] = addr->people[i + 1];
		addr->size--;
		printf("删除成功!\n");
		printf("此时联系人个数为:%d\n", addr->size);
	}
	else
	{
		printf("没有找到此联系人!\n");
		return;
	}
}

void PrintContacts(AddressBook* addr)
{
	int i;
	assert(addr != NULL);
	if(addr->size  == 0)
	{
		printf("没有联系人!\n");
		return;
	}
	for(i = 0; i <= addr->size - 1; i++)
	{
		printf("姓名:%s\t", addr->people[i].name);
		printf("性别:%s\t", addr->people[i].sex);
		printf("电话:%s\t", addr->people[i].phone);
		printf("地址:%s\t", addr->people[i].adress);
		printf("公司:%s\n", addr->people[i].company);
	}
	printf("联系人总数:%d\n", i);
	printf("\n");
}

int FindContacts(AddressBook* addr)
{
	char Name[20];
	int i;
	assert(addr != NULL);
	printf("请输入要查找联系人的姓名:");
	scanf("%s", Name);
	for(i = 0; i <= addr->size - 1; i++)
	{
		if(strcmp(Name, addr->people[i].name) == 0)
		{
			printf("此联系人信息如下:\n");
			printf("姓名:%s\t", addr->people[i].name);
			printf("性别:%s\t", addr->people[i].sex);
			printf("电话:%s\t", addr->people[i].phone);
			printf("地址:%s\t", addr->people[i].adress);
			printf("公司:%s\n", addr->people[i].company);
			printf("\n");
			return i;
		}
	}
	printf("没找到此联系人!\n");
	return -1;
}

void ModifyContacts(AddressBook* addr)
{
	int ret = 0;
	assert(addr != NULL);
	if(addr->size  == 0)
	{
		printf("没有联系人!\n");
		return;
	}
	ret = FindContacts(&g_addr);
	if(ret != -1)
	{
		int i = ret;

		printf("重新输入该联系人信息!\n");

		printf("姓名:");
	    scanf("%s", addr->people[i].name);

	    printf("性别:");
	    scanf("%s", addr->people[i].sex);

	    printf("电话:");
	    scanf("%s", addr->people[i].phone);

	    printf("地址:");
	    scanf("%s", addr->people[i].adress);

	    printf("公司:");
	    scanf("%s", addr->people[i].company);
	}
	else
	{
	    printf("没有找到此联系人!\n");
		return;
	}
}

void SortContacts(AddressBook* addr)
{
	int i;
	if(addr == NULL)
	{
		printf("通讯录无联系人!\n");
		return;
	}
	for(i = 0; i < addr->size - 1; i++)
	{
		if(strcmp(addr->people[i].name, addr->people[i + 1].name) > 0)
		{
			char tem1[1024];
			char tem2[1024];
			char tem3[1024];
			char tem4[1024];
			char tem5[1024];

			strcpy(tem1, addr->people[i].name);
			strcpy(addr->people[i].name, addr->people[i + 1].name);
			strcpy(addr->people[i + 1].name, tem1);

			strcpy(tem2, addr->people[i].sex);
			strcpy(addr->people[i].sex, addr->people[i + 1].sex);
			strcpy(addr->people[i + 1].sex, tem2);

			strcpy(tem3, addr->people[i].phone );
			strcpy(addr->people[i].phone , addr->people[i + 1].phone );
			strcpy(addr->people[i + 1].phone , tem3);

			strcpy(tem4, addr->people[i].adress );
			strcpy(addr->people[i].adress , addr->people[i + 1].adress );
			strcpy(addr->people[i + 1].adress , tem4);

			strcpy(tem5, addr->people[i].company );
			strcpy(addr->people[i].company , addr->people[i + 1].company );
			strcpy(addr->people[i + 1].company , tem5);
		}
	}
}

void ClearallContacts(AddressBook* addr)
{
	assert(addr != NULL);

	free(addr->people);
	addr->people = NULL;
	addr->size = 0;
	addr->capacity = 0;
	printf("清除联系人成功!\n");
}

void WriteoutContacts(AddressBook* addr)
{
	int i;
	FILE* fp = fopen(FILE_PATH, "w");
	if(fp == NULL)
	{
		perror("error");
		return;
	}
	for(i = 0; i <= addr->size - 1 ; i++)
	{
		fwrite(&(addr->people[i]), sizeof(PersonInfo), 1, fp);
	}
	fclose(fp);
}

void ReadinContacts(AddressBook* addr)
{
	int i = 0;
	PersonInfo contact = {0};
	FILE* fp = fopen(FILE_PATH, "r");
	if(fp == NULL)
	{
		perror("error");
		return;
	}
	while(fread(&contact, sizeof(PersonInfo), 1, fp))
	{
		addr->people[i] = contact;

		//printf("此联系人信息如下:\n");
		//printf("姓名:%s\t", addr->people[i].name);
		//printf("性别:%s\t", addr->people[i].sex);
		//printf("电话:%s\t", addr->people[i].phone);
		//printf("地址:%s\t", addr->people[i].adress);
		//printf("公司:%s\n", addr->people[i].company);
		i++;
		addr->size++;
	}

	fclose(fp);
}

main.c

#include "test.h"




int main()
{
	typedef void(*pfunc_t)(AddressBook*);
	pfunc_t pfunc_table[] = {      //表驱动
		AddContacts,
		DelContacts,
		PrintContacts,
		FindContacts,
		ModifyContacts,
		SortContacts,
		ClearallContacts,
		WriteoutContacts,
		ReadinContacts
	};
	InitContacts(&g_addr);
	while(1)
	{
		int choice = Menu();
		if(choice < 0 || choice > 9)
		{
			printf("您的输入不合法,请重新输入\n");
			continue;
		}
		if(choice == 0)
		{
			printf("GOOD BYE!\n");
			break;
		}
		pfunc_table[choice - 1](&g_addr);
	}
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值