C语言扫雷与通讯录参考源码

引言

为方便大家调试代码,通讯录与扫雷的源码将展示在下面,欢迎大家找bug,提意见。
点我跳转到扫雷详解哦
点我跳转到通讯录详解哦

扫雷

C代码

//game.h


#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define WIN 10


#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//初始化
void init(char board[ROWS][COLS], int rows, int cols, char c);
//设置雷
void set(char board[ROWS][COLS], int row, int col);
//打印棋盘
void print(char board[ROWS][COLS], int row, int col);
//排雷
void search(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);
//计算或展开
void DisplayNum(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);
//判断是否胜利
int IsWin(char show[ROWS][COLS], int row, int col);
//game.c


#include"game.h"

void init(char board[ROWS][COLS], int rows, int cols, char c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = c;
		}
	}
}

void set(char board[ROWS][COLS], int row, int col)
{
	int n = 0;
	int x = 0;
	int y = 0;
	while (n < WIN)
	{
		x = (rand() % row) + 1;
		y = (rand() % col) + 1;
		if (board[y][x] == '0')
		{
			board[y][x] = '1';
			n++;
		}
	}
}

void print(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf(" ------ 扫 雷 ------\n"); 
	printf(" -------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf(" %d", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf(" %d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void search(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int judge = 0;
	int input = 0;
	while (1)
	{
		printf(" ----  1. find  ----\n");
		printf(" ----  2. mark  ----\n");
		printf("  请选择标雷或排雷:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			while (1)
			{
				printf("请输入坐标:");
				scanf("%d%d", &x, &y);
				if ((x<1 || x>col) || (y<1 || y>row))
				{
					printf("输入非法,请重新输入。。。\n");
				}
				else if (show[y][x]!='*')
				{
					if (show[y][x] == '?')
					{
						show[y][x] = '*';
						print(show, ROW, COL);
						break;
					}
					else
					{
						printf("该坐标已排过,请重新输入:\n");
					}
				}
				else
				{
					if (mine[y][x] == '1')
					{
						printf("恭喜你,炸到了好樊鸭。。。\n");
						show[y][x] = 'X';
						print(show, ROW, COL);
						judge = 1;
						break;
					}
					else
					{
						DisplayNum(show, mine, ROW, COL, x, y);
						print(show, ROW, COL);
						int ret=IsWin(show, ROW, COL);
						if (ret == 1)
						{
							printf("很遗憾,没有炸到好樊鸭。。。\n");
							print(show, ROW, COL);
							judge = 1;
						}
						break;
					}
				}
			}
			break;
		case 2:
			while (1)
			{
				printf("请输入坐标:");
				scanf("%d%d", &x, &y);
				if ((x<1 || x>col) || (y<1 || y>row))
				{
					printf("输入非法,请重新输入。。。\n");
				}
				else if (show[y][x] != '*')
				{
					if (show[y][x] == '?')
					{
						show[y][x] = '*';
						print(show, ROW, COL);
						break;
					}
					else
					{
						printf("该坐标已排过,请重新输入:\n");
					}
				}
				else
				{
					show[y][x] = '?';
					print(show, ROW, COL);
					break;
				}
			}
			break;
		default:
			printf("输入非法,请重新输入。。。\n");
			break;
		}
		if (judge == 1)
		{
			break;
		}
	}
}

void DisplayNum(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y)
{
	int x2 = 0;
	int y2 = 0;
	int sum = 0;
	//计算周围八个格子的雷数量
	for (y2 = y - 1; y2 < y + 2; y2++)
	{
		for (x2 = x - 1; x2 < x + 2; x2++)
		{
			if (mine[y2][x2] == '1')
			{
				sum++;
			}
		}
	}
	if (sum != 0)
	{
		show[y][x] = sum + '0';
		//print(show, ROW, COL);//调试用
	}
	//展开
	else
	{
		show[y][x] = ' ';
		for (y2 = y - 1; y2 < y + 2; y2++)
		{
			if (y2 < 1 || y2 > row)//如果y2超出限制y2++,再判断
			{
				continue;
			}
			for (x2 = x - 1; x2 < x + 2; x2++)
			{
				if (x2 < 1 || x2 > col)//如果x2超出限制x2++,再判断
				{
					continue;
				}
				else
				{
					if ((show[y2][x2] != '*') || ((x2 == x) && (y2 == y)))//遍历到已经遍历过的或与中心坐标相同就跳过
					{
						continue;
					}
					else
					{
						DisplayNum(show, mine, ROW, COL, x2, y2);
						//print(show, ROW, COL);//调试用
					}
				}
			}
		}
	}
}

int IsWin(char show[ROWS][COLS], int row, int col)
{
	int count = 0;
	int x = 0;
	int y = 0;
	for (y = 1; y <= row; y++)
	{
		for (x = 1; x <=col; x++)
		{
			if ((show[y][x] == '*') || (show[y][x] == '?'))
			{
				count++;
			}
		}
	}
	if (count == WIN)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//test.c


#include"game.h"
void menu()
{
	printf(" +----- 扫  雷 -----+\n");
	printf(" |----  1.play  ----|\n");
	printf(" |----  0.exit  ----|\n");
	printf(" +------------------+\n");
}
void game()
{
	char show[ROWS][COLS] = { 0 };
	char mine[ROWS][COLS] = { 0 };
	//初始化棋盘
	init(show, ROWS, COLS, '*');
	init(mine, ROWS, COLS, '0');
	//设置雷
	set(mine, ROW, COL);
	//打印棋盘
	print(show, ROW, COL);

	//print(mine, ROW, COL);//调试用
	//扫雷
	search(show, mine, ROW, COL);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入。。。\n");
			break;
		}
	} while (input);
	return 0;
}

运行结果

在这里插入图片描述
在这里插入图片描述

通讯录

声明: 该代码中实现了通讯录的缩容。realloc在扩容的时候会出现异地扩容的情况,不断地缩容扩容就会很影响效率,所以我删去了自动缩容的操作,改动后的源码后面的参考源码中体现。

C代码

//contact.h

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



#define INIT_VALE 3
#define ADD_VALE 2
#define NAME_MAX 20
#define SEX_MAX 7
#define ADDR_MAX 20
#define TEL_MAX 12



enum operate
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
enum change
{
	LESS,
    MORE
};
typedef struct people
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char addr[ADDR_MAX];
	char tele[TEL_MAX];
}people;
typedef struct contact
{
	int n;
	int capacity;
	people* data;
}contact;


//初始化通讯录
void InitCon(contact* pcon);
//加载通讯录
void LoadCon(contact* pcon);
//增容/减容通讯录
int ChangeData(contact* pcon,enum change state);
//查找联系人
int SearchPeo(const char* Fpeo, const contact* pcan);
//打印指定个数联系人
void ShowNumPeo(const contact* pcon, int i, int num);
//添加联系人
void AddPeo(contact* pcon);
//删除联系人
void DelPeo(contact* pcon);
//打印查找的联系人
void ShowSearchPeo(const contact* pcon);
//打印全部联系人
void ShowAllPeo(const contact* pcon);
//修改联系人
void ModifyPeo(contact* pcon);
//排序联系人
void SortContact(contact* pcon);
//保存数据
void SaveContact(contact* pcon);
//销毁通讯录
void DestroyCon(contact* pcon);

//contact.c

#include"contact.h"

void InitCon(contact* pcon)
{
	assert(pcon);
	pcon->n = 0;
	pcon->capacity = INIT_VALE;
	people* ptr = (people*)calloc(INIT_VALE, sizeof(people));
	if (ptr == NULL)
	{
		perror("InitCon::calloc");
		return;
	}
	pcon->data = ptr;
	LoadCon(pcon);
}

void LoadCon(contact* pcon)
{
	//读数据
	//打开文件
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("LoadCon::fopen");
	}
	else
	{
		people temp = { 0 };
		int i = 0;
		while (fread(&temp, sizeof(people), 1, pf))//读取的数据不足1个时结束循环
		{
			if (pcon->n == pcon->capacity)
			{
				ChangeData(pcon, MORE);
			}
			pcon->data[i] = temp;
			pcon->n++;
			i++;
		}
		//关闭文件
		fclose(pf);
	}
}

int ChangeData(contact* pcon,enum change state)
{
	//state不等于0时扩容,等于0时减容
	people* ptr = NULL;
	if (state)
	{
		ptr = (people*)realloc(pcon->data, (pcon->capacity + ADD_VALE)*sizeof(people));
		if (ptr == NULL)
		{
			perror("ChangeData::more::realloc");
			return 0;
		}
		else
		{
			pcon->data = ptr;
			pcon->capacity += ADD_VALE;
			return 1;
		}
	}
	else
	{
		ptr = (people*)realloc(pcon->data, (pcon->capacity - ADD_VALE)*sizeof(people));
		if (ptr == NULL)
		{
			perror("ChangeData::less::realloc");
			return 0;
		}
		else
		{
			pcon->data = ptr;
			pcon->capacity -= ADD_VALE;
			return 1;
		}
	}
}
int SearchPeo(const char* Fpeo,const contact* pcon)
{
	assert(Fpeo&&pcon);
	int i = 0;
	for (i = 0; i < pcon->n; i++)
	{
		int j = strcmp(pcon->data[i].name, Fpeo);
		if (j == 0)
		{
			return i;
		}
	}
	return -1;
}

void ShowNumPeo(const contact* pcon, int i, int num)
{
	assert(pcon);
	int k = 0;//用于循环
	//打印表头
	printf("%-2s\t%-10s\t%-7s\t%-10s\t%-20s\t%-12s\n", "  ", "姓名", "性别", "年龄", "地址", "电话");
	//打印数据
	for (k = 0; k < num; k++)
	{
		printf("%-2d\t%-10s\t%-7s\t%-10d\t%-20s\t%-12s\n", i + 1, (pcon->data[i]).name,
			(pcon->data[i]).sex,
			(pcon->data[i]).age,
			(pcon->data[i]).addr,
			(pcon->data[i]).tele);
		i++;
	}
}

void AddPeo(contact* pcon)
{
	int i = 0;
	assert(pcon);
	if (pcon->n == pcon->capacity)
	{
		i = ChangeData(pcon, MORE);
		if (i)
		{
			printf("增容成功\n");
		}
		else
		{
			printf("增容失败。。。\n");
		}
	}
	printf("请输入姓名:");
	scanf("%s", (pcon->data[pcon->n]).name);
	printf("请输入性别:");
	scanf("%s", (pcon->data[pcon->n]).sex);
	printf("请输入年龄:");
	scanf("%d", &((pcon->data[pcon->n]).age));
	printf("请输入地址:");
	scanf("%s", (pcon->data[pcon->n]).addr);
	printf("请输入联系方式:");
	scanf("%s", (pcon->data[pcon->n]).tele);
	//存入数据后,要加一
	(pcon->n)++;
	printf("添加成功\n");
}

void DelPeo(contact* pcon)
{
	assert(pcon);
	//若pcon->n为0则通讯录为空
	if (pcon->n == 0)
	{
		printf("通讯录为空,无法删除。。。\n");
		return;
	}
	int i = 0;
	char Fpeo[NAME_MAX] = { 0 };
	printf("请输入要删除的人的姓名\n");
	scanf("%s", Fpeo);
	i = SearchPeo(Fpeo, pcon);
	if (i != -1)
	{
		while (i < (pcon->n) - 1)
		{
			pcon->data[i] = pcon->data[i + 1];
			i++;
		}
		//删除数据后,要减一
		(pcon->n)--;
		printf("删除成功\n");
	}
	else
	{
		printf("查无此人。。。\n");
	}
	if ((pcon->capacity) - (pcon->n) > ADD_VALE)
	{
		i = ChangeData(pcon, LESS);
		if (i)
		{
			printf("减容成功\n");
		}
		else
		{
			printf("减容失败。。。\n");
		}
	}
}

void ShowSearchPeo(const contact* pcon)
{
	assert(pcon);
	//若pcon->n为0则通讯录为空
	if (pcon->n == 0)
	{
		printf("通讯录为空,无法查询。。。\n");
		return;
	}
	char Fpeo[NAME_MAX] = { 0 };
	int i = 0;
	printf("请输入要查询的人的姓名:\n");
	scanf("%s", Fpeo);
	i = SearchPeo(Fpeo, pcon);
	if (i != -1)
	{
		//用ShowNumPeo函数打印
		ShowNumPeo(pcon, i, 1);
	}
	else
	{
		printf("查无此人。。。\n");
	}
}

void ShowAllPeo(const contact* pcon)
{
	assert(pcon);
	//用ShowNumPeo函数打印
	ShowNumPeo(pcon, 0, pcon->n);
}

void ModifyPeo(contact* pcon)
{
	assert(pcon);
	if (pcon->n == 0)
	{
		printf("通讯录为空,无法修改。。。\n");
		return;
	}
	int i = 0;
	char Fpeo[NAME_MAX] = { 0 };
	printf("请输入要修改的人的姓名:\n");
	scanf("%s", Fpeo);
	i = SearchPeo(Fpeo, pcon);
	if (i != -1)
	{
		printf("请输入修改后姓名:\n");
		scanf("%s", ((pcon->data)[i]).name);
		printf("请输入修改后性别:\n");
		scanf("%s", ((pcon->data)[i]).sex);
		printf("请输入修改后年龄\n");
		scanf("%d", &(((pcon->data)[i]).age));
		printf("请输入修改后地址\n");
		scanf("%s", ((pcon->data)[i]).addr);
		printf("请输入修改后联系方式:\n");
		scanf("%s", ((pcon->data)[i]).tele);
		printf("修改完成\n");
	}
	else
	{
		printf("查无此人。。。\n");
	}
}
int cmp_name(const void* e1, const void* e2)
{
	return memcmp(((people*)e1)->name, ((people*)e2)->name, NAME_MAX);
}
int cmp_sex(const void* e1, const void* e2)
{
	return memcmp(((people*)e1)->sex, ((people*)e2)->sex, SEX_MAX);
}
int cmp_age(const void* e1, const void* e2)
{
	return ((people*)e1)->age - ((people*)e2)->age;
}
int cmp_addr(const void* e1, const void* e2)
{
	return memcmp(((people*)e1)->addr, ((people*)e2)->addr, ADDR_MAX);
}

void SortContact(contact* pcon)
{
	assert(pcon);
	int i = 0;
	int(*cmp[4])(const void*, const void*) = { cmp_name, cmp_sex, cmp_age, cmp_addr };
	do
	{
		printf("请选择排序依据:\n");
		printf("----------------\n");
		printf("---- 1.姓名 ----\n");
		printf("---- 2.性别 ----\n");
		printf("---- 3.年龄 ----\n");
		printf("---- 4.地址 ----\n");
		printf("----------------\n");
		scanf("%d", &i);
		if (i > 4 || i < 1)
		{
			printf("非法选择,请重新输入:\n");
		}
		else
		{
			qsort(pcon->data, pcon->n, sizeof(pcon->data[0]), cmp[i - 1]);
			printf("排序完成\n");
			i = 0;
			break;
		}

	} while (i);
}

void SaveContact(contact* pcon)
{
	//写数据
	//打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("SaveContact");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pcon->n; i++)
		{
			fwrite(pcon->data + i, sizeof(people), 1, pf);
		}
		//关闭文件
		fclose(pf);
		pf = NULL;
		printf("保存成功\n");
	}
}

void DestroyCon(contact* pcon)
{
	pcon->capacity = 0;
	pcon->n = 0;
    free(pcon->data);
	pcon->data = NULL;
	pcon = NULL;
}


//test.c

#include"contact.h"
void menu()
{
	printf("******************\n");
	printf("****  通讯录  ****\n"); 
	printf("****  1. add  ****\n");
	printf("****  2. del  ****\n");
	printf("**** 3.search ****\n");
	printf("**** 4.modify ****\n");
	printf("****  5.show  ****\n");
	printf("****  6.sort  ****\n");
	printf("****  0.exit  ****\n");
	printf("******************\n");
}
int main()
{
	int input = 0;
	contact con;
	InitCon(&con);
	do
	{
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddPeo(&con);
			break;
		case DEL:
			DelPeo(&con);
			break;
		case SEARCH:
			ShowSearchPeo(&con);
			break;
		case MODIFY:
			ModifyPeo(&con);
			break;
		case SHOW:
			ShowAllPeo(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			//保存通讯录信息到文件中
			SaveContact(&con);
			//释放
			DestroyCon(&con);
			printf("退出通讯录。\n");
			break;
		default:
			printf("选择非法,请重新输入。。。\n");
			break;
		}
	} while (input);
	
	return 0;
}

运行结果

增加联系人(空间不足时会增容):

在这里插入图片描述
查找联系人:

在这里插入图片描述
修改联系人:
在这里插入图片描述
打印联系人:
在这里插入图片描述
排序联系人:
在这里插入图片描述
删除联系人:
在这里插入图片描述
退出并保存:
在这里插入图片描述
再次打开时会导入已保存的联系人数据:
在这里插入图片描述

通讯录(删除了自动缩容)

C代码

//contact.h

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

#define INIT_VALE 3
#define ADD_VALE 2
#define NAME_MAX 20
#define SEX_MAX 7
#define ADDR_MAX 20
#define TEL_MAX 12

enum operate
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

typedef struct people      //联系人
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char addr[ADDR_MAX];
	char tele[TEL_MAX];
}people;

typedef struct contact         //通讯录
{
	int n;
	int capacity;
	people* data;
	char username[NAME_MAX];
}contact;


//初始化通讯录
void InitCon(contact* pcon);
//加载通讯录
void LoadCon(contact* pcon);
//增容通讯录
int ChangeData(contact* pcon);
//查找联系人
int SearchPeo(const char* Fpeo, const contact* pcan);
//打印指定个数联系人
void ShowNumPeo(const contact* pcon, int i, int num);
//添加联系人
void AddPeo(contact* pcon);
//删除联系人
void DelPeo(contact* pcon);
//打印查找的联系人
void ShowSearchPeo(const contact* pcon);
//打印全部联系人
void ShowAllPeo(const contact* pcon);
//修改联系人
void ModifyPeo(contact* pcon);
//排序联系人
void SortContact(contact* pcon);
//保存数据
void SaveContact(contact* pcon);
//销毁通讯录
void DestroyCon(contact* pcon);
//concat.c
#include"contact.h"

void InitCon(contact* pcon)
{
	assert(pcon);
	pcon->n = 0;
	pcon->capacity = INIT_VALE;
	people* ptr = (people*)calloc(INIT_VALE, sizeof(people));
	if (ptr == NULL)
	{
		perror("InitCon::calloc");
		return;
	}
	pcon->data = ptr;
	LoadCon(pcon);
}

void LoadCon(contact* pcon)
{
	//读数据
	//打开文件
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("LoadCon::fopen");
	}
	else
	{
		people temp = { 0 };
		int i = 0;
		while (fread(&temp, sizeof(people), 1, pf))//读取的数据不足1个时结束循环
		{
			if (pcon->n == pcon->capacity)
			{
				ChangeData(pcon);
			}
			pcon->data[i] = temp;
			pcon->n++;
			i++;
		}
		//关闭文件
		fclose(pf);
	}
}

int ChangeData(contact* pcon)
{
	//扩容
	people* ptr = NULL;

	ptr = (people*)realloc(pcon->data, (pcon->capacity + ADD_VALE) * sizeof(people));
	if (ptr == NULL)
	{
		perror("ChangeData::more::realloc");
		return 0;
	}
	else
	{
		pcon->data = ptr;
		pcon->capacity += ADD_VALE;
		return 1;
	}
}
int SearchPeo(const char* Fpeo, const contact* pcon)
{
	assert(Fpeo && pcon);
	int i = 0;
	for (i = 0; i < pcon->n; i++)
	{
		int j = strcmp(pcon->data[i].name, Fpeo);
		if (j == 0)
		{
			return i;
		}
	}
	return -1;
}

void ShowNumPeo(const contact* pcon, int i, int num)
{
	assert(pcon);
	int k = 0;//用于循环
	//打印表头
	printf("%-2s\t%-10s\t%-7s\t%-10s\t%-20s\t%-12s\n", "  ", "姓名", "性别", "年龄", "地址", "电话");
	//打印数据
	for (k = 0; k < num; k++)
	{
		printf("%-2d\t%-10s\t%-7s\t%-10d\t%-20s\t%-12s\n", i + 1, (pcon->data[i]).name,
			(pcon->data[i]).sex,
			(pcon->data[i]).age,
			(pcon->data[i]).addr,
			(pcon->data[i]).tele);
		i++;
	}
}

void AddPeo(contact* pcon)
{
	int i = 0;
	assert(pcon);
	if (pcon->n == pcon->capacity)
	{
		i = ChangeData(pcon);
		if (i)
		{
			printf("增容成功\n");
		}
		else
		{
			printf("增容失败。。。\n");
		}
	}
	printf("请输入姓名:");
	scanf("%s", (pcon->data[pcon->n]).name);
	printf("请输入性别:");
	scanf("%s", (pcon->data[pcon->n]).sex);
	printf("请输入年龄:");
	scanf("%d", &((pcon->data[pcon->n]).age));
	printf("请输入地址:");
	scanf("%s", (pcon->data[pcon->n]).addr);
	printf("请输入联系方式:");
	scanf("%s", (pcon->data[pcon->n]).tele);
	//存入数据后,要加一
	(pcon->n)++;
	printf("添加成功\n");
}

void DelPeo(contact* pcon)
{
	assert(pcon);
	//若pcon->n为0则通讯录为空
	if (pcon->n == 0)
	{
		printf("通讯录为空,无法删除。。。\n");
		return;
	}
	int i = 0;
	char Fpeo[NAME_MAX] = { 0 };
	printf("请输入要删除的人的姓名\n");
	scanf("%s", Fpeo);
	i = SearchPeo(Fpeo, pcon);
	if (i != -1)
	{
		while (i < (pcon->n) - 1)
		{
			pcon->data[i] = pcon->data[i + 1];
			i++;
		}
		//删除数据后,要减一
		(pcon->n)--;
		printf("删除成功\n");
	}
	else
	{
		printf("查无此人。。。\n");
	}
}

void ShowSearchPeo(const contact* pcon)
{
	assert(pcon);
	//若pcon->n为0则通讯录为空
	if (pcon->n == 0)
	{
		printf("通讯录为空,无法查询。。。\n");
		return;
	}
	char Fpeo[NAME_MAX] = { 0 };
	int i = 0;
	printf("请输入要查询的人的姓名:\n");
	scanf("%s", Fpeo);
	i = SearchPeo(Fpeo, pcon);
	if (i != -1)
	{
		//用ShowNumPeo函数打印
		ShowNumPeo(pcon, i, 1);
	}
	else
	{
		printf("查无此人。。。\n");
	}
}

void ShowAllPeo(const contact* pcon)
{
	assert(pcon);
	//用ShowNumPeo函数打印
	ShowNumPeo(pcon, 0, pcon->n);
}

void ModifyPeo(contact* pcon)
{
	assert(pcon);
	if (pcon->n == 0)
	{
		printf("通讯录为空,无法修改。。。\n");
		return;
	}
	int i = 0;
	char Fpeo[NAME_MAX] = { 0 };
	printf("请输入要修改的人的姓名:\n");
	scanf("%s", Fpeo);
	i = SearchPeo(Fpeo, pcon);
	if (i != -1)
	{
		printf("请输入修改后姓名:\n");
		scanf("%s", ((pcon->data)[i]).name);
		printf("请输入修改后性别:\n");
		scanf("%s", ((pcon->data)[i]).sex);
		printf("请输入修改后年龄\n");
		scanf("%d", &(((pcon->data)[i]).age));
		printf("请输入修改后地址\n");
		scanf("%s", ((pcon->data)[i]).addr);
		printf("请输入修改后联系方式:\n");
		scanf("%s", ((pcon->data)[i]).tele);
		printf("修改完成\n");
	}
	else
	{
		printf("查无此人。。。\n");
	}
}
int cmp_name(const void* e1, const void* e2)
{
	return memcmp(((people*)e1)->name, ((people*)e2)->name, NAME_MAX);
}
int cmp_sex(const void* e1, const void* e2)
{
	return memcmp(((people*)e1)->sex, ((people*)e2)->sex, SEX_MAX);
}
int cmp_age(const void* e1, const void* e2)
{
	return ((people*)e1)->age - ((people*)e2)->age;
}
int cmp_addr(const void* e1, const void* e2)
{
	return memcmp(((people*)e1)->addr, ((people*)e2)->addr, ADDR_MAX);
}

void SortContact(contact* pcon)
{
	assert(pcon);
	int i = 0;
	int(*cmp[4])(const void*, const void*) = { cmp_name, cmp_sex, cmp_age, cmp_addr };
	do
	{
		printf("请选择排序依据:\n");
		printf("----------------\n");
		printf("---- 1.姓名 ----\n");
		printf("---- 2.性别 ----\n");
		printf("---- 3.年龄 ----\n");
		printf("---- 4.地址 ----\n");
		printf("----------------\n");
		scanf("%d", &i);
		if (i > 4 || i < 1)
		{
			printf("非法选择,请重新输入:\n");
		}
		else
		{
			qsort(pcon->data, pcon->n, sizeof(pcon->data[0]), cmp[i - 1]);
			printf("排序完成\n");
			i = 0;
			break;
		}

	} while (i);
}

void SaveContact(contact* pcon)
{
	//写数据 
	//打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("SaveContact");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pcon->n; i++)
		{
			fwrite(pcon->data + i, sizeof(people), 1, pf);
		}
		//关闭文件
		fclose(pf);
		pf = NULL;
		printf("保存成功\n");
	}
}

void DestroyCon(contact* pcon)
{
	pcon->capacity = 0;
	pcon->n = 0;
	free(pcon->data);
	pcon->data = NULL;
	pcon = NULL;
}
//test.c


#include"contact.h"
void menu()
{
	printf("******************\n");
	printf("****  通讯录  ****\n");
	printf("****  1. add  ****\n");
	printf("****  2. del  ****\n");
	printf("**** 3.search ****\n");
	printf("**** 4.modify ****\n");
	printf("****  5.show  ****\n");
	printf("****  6.sort  ****\n");
	printf("****  0.exit  ****\n");
	printf("******************\n");
}
int main()
{
	int input = 0;
	contact con;
	InitCon(&con);
	do
	{
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddPeo(&con);
			break;
		case DEL:
			DelPeo(&con);
			break;
		case SEARCH:
			ShowSearchPeo(&con);
			break;
		case MODIFY:
			ModifyPeo(&con);
			break;
		case SHOW:
			ShowAllPeo(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			//保存通讯录信息到文件中
			SaveContact(&con);
			//释放
			DestroyCon(&con);
			printf("退出通讯录。\n");
			break;
		default:
			printf("选择非法,请重新输入。。。\n");
			break;
		}
	} while (input);

	return 0;
}

总结

以上就是全部的源码了

如果在调试或运行过程中出现问题,欢迎在评论区指出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿qiu不熬夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值