引言
为方便大家调试代码,通讯录与扫雷的源码将展示在下面,欢迎大家找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;
}
总结
以上就是全部的源码了
如果在调试或运行过程中出现问题,欢迎在评论区指出
如果本文对你有帮助,希望一键三连哦
希望与大家共同进步哦