C语言之通讯录的实现

C语言之通讯录的实现_第1张图片

通讯录实现所需头文件和源文件

Contact.h的功能

声明函数和创建结构体变量

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_PHONE 12
#define MAX_ADDRESS 30
#define DEFAULT_SZ 3
#define INTC_SZ 2
typedef struct PeoInform
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char phone[MAX_PHONE];
    char address[MAX_ADDRESS];
}PeoInform;


//静态
//typedef struct Contact
//{
//    PeoInform data[MAX];
//    int size;
//    
//}Contact;


typedef struct Contact
{
	PeoInform* data;
	int size;
    int capacity;
}Contact;


void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact(const Contact* pc);
void MoidfyContact(Contact* pc);
void SortContact(Contact* pc);
void  DerstoryContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadCntact(Contact* pc);

Contact.c

设定通讯录所需的功能和函数的定义

void InitContact(Contact* pc);//初始化函数
void AddContact(Contact* pc);//增加用户
void ShowContact(const Contact* pc);//显示通讯录信息·
void DelContact(Contact* pc);//删除用户信息
void SearchContact(const Contact* pc);//搜索通讯录
void MoidfyContact(Contact* pc);//修改用户信息
void SortContact(Contact* pc);//排序通讯录
void DerstoryContact(Contact* pc);//因动态申请内存所以释放内存
void SaveContact(Contact* pc);//通讯录信息保存到文件
void LoadCntact(Contact* pc);//把文件保存到通讯录中

void InitContact(Contact* pc);

void InitContact(Contact* pc)
{
	//动态版
	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
	pc->size = 0;
	pc->capacity = DEFAULT_SZ;
	PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	//加载文件信息到通讯录
	//LoadContact(pc);
}

void AddContact(Contact* pc);

void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		pc->size++;
		printf("添加成功\n");
}

``

void ShowContact(const Contact* pc);

	void ShowContact(const Contact * pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录为空\n");
		}

		else
		{
			int i = 0;
			
			printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
			
			for (i = 0; i < pc->size; i++)
			{
				printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
					pc->data[i].name,
					pc->data[i].age,
					pc->data[i].sex,
					pc->data[i].phone,
					pc->data[i].address);
			}
		}

	}

void DelContact(Contact* pc);

static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{
	int i = 0;
	for (int i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

void DelContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要删除人的名字>");
	scanf("%s", name);

	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("查询不到联系人\n");
	}
	else
	{
		int j = 0;
		for (j = pos; j < pc->size; j++);
	}
}

void SearchContact(const Contact* pc);

static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{
	int i = 0;
	for (int i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
void SearchContact(const Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入查找人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找人不存在\n");
	}
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].phone,
			pc->data[pos].address);
		
	}
}

void MoidfyContact(Contact* pc);

void MoidfyContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入修改联系人的名字>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改人的名字");
	}
	else
	{
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		printf("修改完成\n");
	}
}

void SortContact(Contact* pc);

	void SortContact(Contact* pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录没有联系人,请添加\n");
		}

		for (int i = 0; i < pc->size-1; i++)
		{
			for (int j = 0; j < pc->size - 1 - i; j++)
			{
				if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0)
				{
					    PeoInform tmp;
					    tmp = pc->data[j];
						pc -> data[j] = pc->data[j+1];
						pc->data[j+1] = tmp;
				}
			
			}
			printf("排序成功\n");
		}
	}

void DerstoryContact(Contact* pc);

void  DerstoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->size = 0;
	pc = NULL;
}

void SaveContact(Contact* pc);

void SaveContact(Contact* pc)//保存文件信息
	{
	    FILE * pf = fopen("contact.txt", "wb");// 为了输出数据,打开一个二进制文件
		if (NULL == pf)
		{
			perror("SaveContact");//打开失败就不用关闭文件了
		}
		else
		{
			int i = 0;
			for (i = 0; i < pc->size; i++)
			{/
				fwrite(pc->data + i, sizeof(PeoInform), 1, pf);//1.结构体地址,一个元素占多少字节,多少个元素,写到pf这个文件
			}//一次写一个到pf所指文件
			fclose(pf);
			pf = NULL;
			printf("保存成功\n");
		}

	}

void LoadCntact(Contact* pc);

	void LoadContact(Contact* pc)
	{
		//把文件的内容放在通讯录中
		FILE* pf = fopen("contact.txt","rb"); //为了输入数据,打开一个二进制文件
		if (pf == NULL)
		{
			perror("LoadContact");
		}
		else//读数据
		{
			PeoInform tmp = { 0 };
			int i = 0;
			//正常读到1返回1 没读到返0
			while (fread(&tmp, sizeof(PeoInform), 1, pf))//
			{
				check_capacity(pc);
				pc->data[i] = tmp;
				pc->size++;
				i++;
			}
		}
		fclose(pf);
		pf = NULL;
	}

contact.c的综合实现

#include "Contact.h"
void check_capacity(Contact* pc)
{
	if (pc->size = pc->capacity)
	{
		PeoInform* str = (PeoInform*)realloc(pc->data, (pc->capacity + INTC_SZ) * sizeof(PeoInform));

		if (str == NULL)
		{
			perror("check_capacity::realloc");
			return;
		}
		pc->data = str;
		pc->capacity += INTC_SZ;
		printf("增容成功");
	}
}


//静态
//void InitContact(Contact* pc)
//{
//	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
//	pc->size = 0;
//}


//动态
void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
	pc->size = 0;
	pc->capacity = DEFAULT_SZ;
	PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	


	//加载文件信息到通讯录
	//LoadContact(pc);
}



void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		pc->size++;
		printf("添加成功\n");
}




static int FindByName(const Contact* pc, char name[MAX_NAME])
{
	int i = 0;
	for (int i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}




void DelContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入要删除人的名字>");
	scanf("%s", name);

	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("查询不到联系人\n");
	}
	else
	{
		int j = 0;
		for (j = pos; j < pc->size; j++);
	}
}



void SearchContact(const Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入查找人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找人不存在\n");
	}
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].phone,
			pc->data[pos].address);
		
	}
}




void MoidfyContact(Contact* pc)
{
	char name[MAX_NAME];
	printf("请输入修改联系人的名字>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改人的名字");
	}
	else
	{
		printf("请输入名字\n");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入年龄\n");
		scanf("%d", &(pc->data[pc->size].age));
		printf("请输入性别\n");
		scanf("%s", pc->data[pc->size].sex);
		printf("请输入电话\n");
		scanf("%s", pc->data[pc->size].phone);
		printf("请输入地址\n");
		scanf("%s", pc->data[pc->size].address);
		printf("修改完成\n");
	}
}
	void ShowContact(const Contact * pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录为空\n");
		}

		else
		{
			int i = 0;
			
			printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
			
			for (i = 0; i < pc->size; i++)
			{
				printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
					pc->data[i].name,
					pc->data[i].age,
					pc->data[i].sex,
					pc->data[i].phone,
					pc->data[i].address);
			}
		}

	}

	void SortContact(Contact* pc)
	{
		if (pc->size == 0)
		{
			printf("通讯录没有联系人,请添加\n");
		}

		for (int i = 0; i < pc->size-1; i++)
		{
			for (int j = 0; j < pc->size - 1 - i; j++)
			{
				if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0)
				{
					    PeoInform tmp;
					    tmp = pc->data[j];
						pc -> data[j] = pc->data[j+1];
						pc->data[j+1] = tmp;
				}
			
			}
			printf("排序成功\n");
		}
	}

	void  DerstoryContact(Contact* pc)
	{
		free(pc->data);
		pc->data = NULL;
		pc->capacity = 0;
		pc->size = 0;
		pc = NULL;
	}




	void SaveContact(Contact* pc)
	{
		
		FILE * pf = fopen("contact.txt", "wb");
		if (NULL == pf)
		{
			perror("SaveContact");
		}
		else
		{
			int i = 0;
			for (i = 0; i < pc->size; i++)
			{
				fwrite(pc->data + i, sizeof(PeoInform), 1, pf);
			}
			fclose(pf);
			pf = NULL;
			printf("保存成功\n");
		}

	}



	void LoadContact(Contact* pc)
	{
		
		FILE* pf = fopen("contact.txt","rb"); 
		if (pf == NULL)
		{
			perror("LoadContact");
		}
		else
		{
			PeoInform tmp = { 0 };
			int i = 0;
			
			while (fread(&tmp, sizeof(PeoInform), 1, pf))
			{
				check_capacity(pc);
				pc->data[i] = tmp;
				pc->size++;
				i++;
			}
		}
		fclose(pf);
		pf = NULL;
	}

test.h

#include "Contact.h"


void menu()
{
    printf("*********************************\n");
    printf("**      1. 添加联系人          **\n");
    printf("**      2. 删除联系人          **\n");
    printf("**      3. 查找联系人          **\n");
    printf("**      4. 修改联系人          **\n");
    printf("**      5. 显示所有联系人      **\n");
    printf("**      6. 按姓名排序联系人    **\n");
    printf("**      0. exit                **\n");
    printf("*********************************\n");
}
void test()
{

    int input = 0;
      
    Contact con;
    InitContact(&con);
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            AddContact(&con);
            break;
        case 2: 
            DelContact(&con);
            break;
        case 3:
            SearchContact(&con);
            break;
        case 4:
            MoidfyContact(&con);
            break;
        case 5:
            ShowContact(&con);
            break;
        case 6:
            SortContact(&con);
            break;
        case 0:
            DerstoryContact(&con);
            printf("退出通讯录\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
}
int main()
{
    test();
    return 0;
}

C语言之通讯录的实现_第2张图片

你可能感兴趣的:(c语言,c++)