c语言通讯录

2288a619b553498194dee9707f3d06d1.jpeg

 通讯录在满足以上题目的要求上还对排序方式进行了拓展,若对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

运行成功的图这里就省略了。 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值