通讯录在满足以上题目的要求上还对排序方式进行了拓展,若对qsort快速排序函数感兴趣的话可以深入了解。
test.c文件中的代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu(void)
{
char menu[] = {
"欢迎来到我们的通讯系统!!!\n 制作人:王晓峰\n"
};
int i = 0;
for (i = 0; menu[i] != '\0'; i++)
{
Sleep(30);//控制该程序停止30ms,需要引用头文件#include<windows.h>
printf("%c", menu[i]);
}
printf("************************************************\n");
printf("******** My Contact *********\n");
printf("******** 1. add 2. del *********\n");
printf("******** 3. search 4. show *********\n");
printf("******** 5. modify 6. sort *********\n");
printf("******** 0. exit *********\n");
printf("************************************************\n");
}
int main()
{
int input = 0;
int num = 0;
Contact Con; //创建通讯录结构体与结构体指针
Contact* pc = &Con;//指针就是用来存放地址的,这样做我们才能传递地址。
Init_Con(pc); //初始化结构体
do
{
system("cls");
menu();
printf("请输入数字(注意是数字,不然程序会崩掉有Bug):");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(pc);
Sleep(2000);
break;
case 2:
DelContact(pc);
Sleep(2000);
break;
case 3:
SearchContact(pc);
printf("按0退出:");
scanf("%d", &num);
while (num)
{
printf("输入无效\n");
}
break;
case 4:
ShowContact(pc);
printf("按0退出:");
scanf("%d", &num);
while (num)
{
printf("输入无效\n");
}
break;
case 5:
ModifyContact(pc);
Sleep(2000);
break;
case 6:
SortContact(pc);
Sleep(2000);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入有误,重新输入\n");
break;
}
} while (input);
return 0;
}
contact.c中的代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化通讯录结构体
void Init_Con(Contact* pc)
{
pc->sz = 0;//
memset(pc->data, 0, sizeof(pc->data));
}
//增加通讯录联系人
void AddContact(Contact* pc)
{
assert(pc);
printf("请输入联系人姓名:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入联系人性别:");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入联系人编号(英文) :");
scanf("%s", &pc->data[pc->sz].num);
printf("请输入联系人地址:");
scanf("%s", pc->data[pc->sz].addr);
printf("请输入联系人电话:");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入联系人与您的关系:");
scanf("%s", pc->data[pc->sz].relation);
printf("请输入联系人的邮编:");
scanf("%s", pc->data[pc->sz].mail);
printf("输入成功,添加信息如下:\n");
printf("名字:%-3s\t 性别:%-3s\t 编号:%-3s\t 地址:%-3s\t 电话:%-3s 关系:%-3s\t 邮编:%-3s \n",
pc->data[pc->sz].name,
pc->data[pc->sz].sex,
pc->data[pc->sz].num,
pc->data[pc->sz].addr,
pc->data[pc->sz].tele,
pc->data[pc->sz].relation,
pc->data[pc->sz].mail
);
pc->sz++;
}
//输入编号查找联系人
int FindByName(const Contact* pc, char* num)
{
assert(pc && num);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].num, num) == 0)//参考我博客中对strcmp
return i;
}
return -1;
}
//删除通讯录联系人
void DelContact(Contact* pc)
{
assert(pc);
char num[NAME_MAX] = { 0 };
printf("请输入联系人编号:");
scanf("%s", num);
int pos = FindByName(pc, num);
if (pos == -1)
{
printf("要删除的人不存在\n");
return;
}
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("已删除成功\n");
}
//查找指定联系人
void SearchContact(const Contact* pc)
{
assert(pc);
char num[NAME_MAX] = { 0 };
printf("请输入联系人编号:");
scanf("%s", num);
int pos = FindByName(pc, num);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
printf("该联系人的信息为:\n");
printf("名字:%-3s\t 性别:%-3s\t 编号:%-3s\t 地址:%-3s\t 电话:%-3s 关系:%-3s\t 邮编:%-3s \n",
pc->data[pos].name,
pc->data[pos].sex,
pc->data[pos].num,
pc->data[pos].addr,
pc->data[pos].tele,
pc->data[pos].relation,
pc->data[pos].mail
);
}
//显示通讯录所有人的信息
void ShowContact(const Contact* pc)
{
assert(pc);
printf("当前所有联系人的信息为:\n");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("名字:%-3s\t 性别:%-3s\t 编号:%-3s\t 地址:%-3s\t 电话:%-3s 关系:%-3s\t 邮编:%-3s \n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].num,
pc->data[i].addr,
pc->data[i].tele,
pc->data[i].relation,
pc->data[i].mail);
}
}
//对于排序标准的界定
int CmpStandard(const char* StdNeed)
{
assert(StdNeed);
char* standard[STANDARD_NUM] = { "NAME","SEX","ADDRESS","TELENUMBER" };
int sz = sizeof(standard) / sizeof(standard[0]);//参考我博客中数组元素的求法
int i = 0;
for (i = 0; i < sz; i++)
{
if (strcmp(standard[i], StdNeed) == 0)
{
return i;
}
}
return -1;
}
//qsort排序姓名
int cmp_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//qsort对性别排序
int cmp_sex(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->sex, ((PeoInfo*)e2)->sex);
}
//qsort排序地址
int cmp_addr(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->addr, ((PeoInfo*)e2)->addr);
}
//qsort排序电话
int cmp_tele(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->tele, ((PeoInfo*)e2)->tele);
}
//按照规则排序联系人
void SortContact(const Contact* pc)
{
assert(pc);
char StdNeed[NAME_MAX] = { 0 };
printf("请输入排序的标准(NAME/SEX/ADDRESS/TELENUMBER):");
scanf("%s", StdNeed);
int ret = CmpStandard(StdNeed);
switch (ret)
{
case 0:
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
break;
case 1:
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_sex);
break;
case 2:
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_addr);
break;
case 3:
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_tele);
break;
}
printf("已排序完成\n");
}
//修改通讯录联系人
void ModifyContact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入要修改的联系人编号、:");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
printf("请输入联系人姓名:");
scanf("%s", pc->data[pos].name);
printf("请输入联系人性别:");
scanf("%s", pc->data[pos].sex);
printf("请输入联系人编号(英文) :");
scanf("%s", &pc->data[pos].num);
printf("请输入联系人地址:");
scanf("%s", pc->data[pos].addr);
printf("请输入联系人电话:");
scanf("%s", pc->data[pos].tele);
printf("请输入联系人与您的关系:");
scanf("%s", pc->data[pos].relation);
printf("请输入联系人的邮编:");
scanf("%s", pc->data[pos].mail);
printf("已经修改成功\n");
}
contact.h中的代码
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <windows.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 20
#define TELE_MAX 20
#define PEO_MAX 100
#define STANDARD_NUM 5
#define NUM 10
#define RELATION 20
#define MAIL 20
//人员结构体
typedef struct PeoInfo
{
char name;
char sex[SEX_MAX];
char num[NUM];
char relation[RELATION];
char mail[MAIL];
char addr[ADDR_MAX];
char tele[TELE_MAX];//创建一个名为PeoInfo的结构体。typedef实现了对结构体的重命名此时PeoInfo== struct PeoInfo
}PeoInfo;
//通讯录结构体
typedef struct Contact
{
PeoInfo data[PEO_MAX];//相当于创建了一个数组
int sz;
}Contact;//这个结构体相当于是双层的。需要分清内外关系,在操作时先操作谁后操作谁。
//初始化通讯录结构体
void Init_Con(Contact* pc);
//增加通讯录联系人
void AddContact(Contact* pc);
//输入姓名查找联系人
int FindByName(const Contact* pc, char* num);
//删除通讯录联系人
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//显示通讯录所有人的信息
void ShowContact(const Contact* pc);
//对于排序标准的界定
int CmpStandard(const char* standard);
//按照规则排序联系人
void SortContact(const Contact* pc);
//修改通讯录联系人
void ModifyContact(Contact* pc
运行成功的图这里就省略了。