【C语言】通讯录

Contact.h

#define _CRT_SECURE_NO_WARNINGS 0

#ifndef __CONTACT_H__
#define __CONTACT_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define MAX_NAME 20
#define MAX_SRX 5
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX_PEO 1000
#define INIT_NUM 2
enum OP
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	CLEAR,
	SORT
};

typedef struct Per
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SRX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}Per;

typedef struct Contact
{
	struct Per* contact;
	int size;//实际个数
	int capacity;//容量
}Contact, *Pcon;


void print_menu();
void init_contact(Pcon pcon);
void add_contact(Pcon pcon);
void del_contact(Pcon pcon);
void search_contact(Pcon pcon);
void modify_contact(Pcon pcon);
void clear_contat(Pcon pcon);
void sort_contact(Pcon pcon);
void show_contact(Contact con);

#endif //__CONTACT_H__

Contact.c

#include "contact.h"

void print_menu()
{
	printf("******************************\n");
	printf("*****  1.add      2.del ******\n");
	printf("*****  3.search   4.modify ***\n");
	printf("*****  5.show     6.clr ******\n");
	printf("*****  7.sort     0.exit *****\n");
	printf("******************************\n");
}


void check_capacity(Pcon pcon)
{
	if (pcon->size == pcon->capacity)
	{
		pcon->contact = (Per *)realloc(pcon->contact, pcon->capacity += 2);
	}
}

void _add(Pcon pcon, Per *p)
{
	assert(pcon);
	check_capacity(pcon);
	pcon->contact[pcon->size] = *p;
	pcon->size++;
}

void load_data(Pcon pcon)
{
	Per per;
	FILE *pFread = fopen("contact.dat","r");
	if(pFread == NULL)
	{
		perror("open file contact.dat for read error");
		exit(EXIT_FAILURE);
	}
	while(fread(&per, sizeof(Per), 1, pFread))
	{
		_add(pcon, &per);
	}
}
void save_data(Pcon pcon)
{
	int i = 0;
	FILE *pFWrite = fopen("contact.dat","w");
	if(pFWrite == NULL)
	{
		perror("open file contact.dat for write error");
		exit(EXIT_FAILURE);
	}
	for(i = 0; i<pcon->size; i++)
	{
		fwrite(&(pcon->contact[i]), sizeof(Per), 1, pFWrite);
	}
}
void init_contact(Pcon pcon)
{
	pcon->size = 0;
	pcon->contact = (Per *)malloc(sizeof(Per)*INIT_NUM);
	memset(pcon->contact, 0, INIT_NUM * sizeof(Per));
	pcon->capacity = INIT_NUM;
	load_data(pcon);
}


void add_contact(Pcon pcon)
{
	assert(pcon);
	check_capacity(pcon);

	printf("请输入名字:>");
	scanf("%s",pcon->contact[pcon->size].name);
	printf("请输入性别:>");
	scanf("%s",pcon->contact[pcon->size].sex);
	printf("请输入年龄:>");
	scanf("%d",&(pcon->contact[pcon->size].age));
	printf("请输入电话:>");
	scanf("%s",pcon->contact[pcon->size].tele);
	printf("请输入地址:>");
	scanf("%s",pcon->contact[pcon->size].addr);
	pcon->size++;
	printf("插入成功\n");
}

static int find_entry(Pcon pcon, const char *name)
{
	int i = 0;
	for(i = 0; i<pcon->size; i++)
	{
		if(strcmp(pcon->contact[i].name,name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void del_contact(Pcon pcon)
{
	char find_name[MAX_NAME];
	int index = 0;
	int start = 0;
	if(pcon->size == 0)
	{
		printf("电话本已空,不能删除\n");
		return;
	}
	printf("请输入删除人的名字:>");
	scanf("%s",find_name);
	index = find_entry(pcon, find_name);
	if(index == -1)
	{
		printf("制定删除的人不存在\n");
		return;
	}
	for(start = index; start <pcon->size-1;start++)
	{
		pcon->contact[start] = pcon->contact[start+1];
	}
	pcon->size--;
	printf("删除成功\n");
}
void show_contact(Contact con)
{
	int i = 0;
	printf("%10s\t%5s\t%5s\t%5s\t%10s\n",
		"name", "age","sex", "tele","addr");
	for(i = 0;i<con.size;i++)
	{
		printf("%10s\t%5d\t%5s\t%5s\t%10s\n",
			con.contact[i].name,
			con.contact[i].age,
			con.contact[i].sex,
			con.contact[i].tele,
			con.contact[i].addr);
	}
}

void search_contact(Pcon pcon)
{
	int index = 0;
	char find_name[MAX_NAME];
	printf("请输入查找人的姓名:>");
	scanf("%s",find_name);
	index = find_entry(pcon, find_name);
	if(index == -1)
	{
		printf("制定删除的人不存在\n");
		return;
	}
	printf("%10s\t%5s\t%5s\t%5s\t%10s\n",
		"name", "age","sex", "tele","addr");
	printf("%10s\t%5d\t%5s\t%5s\t%10s\n",
		pcon->contact[index].name,
		pcon->contact[index].age,
		pcon->contact[index].sex,
		pcon->contact[index].tele,
		pcon->contact[index].addr);
}

static void Swap(Per* per1, Per* per2)
{
	Per tmp;
	tmp = *per1;
	*per1 = *per2;
	*per2 = tmp;
}

void modify_contact(Pcon pcon)
{
	int index = 0;
	char find_name[MAX_NAME];
	printf("请输入要改的人的姓名:>");
	scanf("%s",find_name);
	index = find_entry(pcon, find_name);
	if(index == -1)
	{
		printf("指定修改的人不存在\n");
		return;
	}
	printf("请输入名字:>");
	scanf("%s",pcon->contact[index].name);
	printf("请输入性别:>");
	scanf("%s",pcon->contact[index].sex);
	printf("请输入年龄:>");
	scanf("%d",&(pcon->contact[index].age));
	printf("请输入电话:>");
	scanf("%s",pcon->contact[index].tele);
	printf("请输入地址:>");
	scanf("%s",pcon->contact[index].addr);
	printf("修改成功\n");
}
void clear_contat(Pcon pcon)
{
	pcon->size = 0;
}
void sort_contact(Pcon pcon)
{
	int i = 0;
	int j = 0;
	for(i = 0;i<pcon->size-1;i++)
	{
		for(j = 0; j<pcon->size-1-i; j++)
		{
			if(strcmp(pcon->contact[j].name,pcon->contact[j+1].name) > 0)
			{
				Swap(&(pcon->contact[j]), &(pcon->contact[j+1]));
			}
		}
	}
	printf("排序成功\n");
}

ContactTest.c

#include "contact.h"

void Test()
{
	int input = 1;
	struct Contact  my_con;
	init_contact(&my_con);
	
	while(input)
	{
		print_menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch(input)
		{
		case ADD:
			add_contact(&my_con);
			break;
		case DEL:
			del_contact(&my_con);
			break;
		case SEARCH:
			search_contact(&my_con);
			break;
		case MODIFY:
			modify_contact(&my_con);
			break;
		case SHOW:
			show_contact(my_con);
			break;
		case CLEAR:
			clear_contat(&my_con);
			break;
		case SORT:
			sort_contact(&my_con);
			break;
		case EXIT:
			save_data(&my_con);
			break;
		}
	}
}
int main()
{
	Test();
	system("pause");
	//getchar();
	return 0;
}




你可能感兴趣的:(C语言)