通讯录(静态版)-C语言


前言

这是一个可以存储信息的通讯录,信息包括姓名、年龄、性别、电话、地址,使用到了结构体,枚举等C语言中的知识点。


提示:以下是本篇文章正文内容,下面案例可供参考

一、思路及功能

1、思路:

(1)创键一个结构体PeoInfo,存储一个人的信息;
(2)再创键一个嵌套结构体Contact,存储PeoIfno[MAX_DATA]以及通讯录中已经存储的人数sz;
(3)初始化通讯录Contact,将其中的值置为0;
(4)实现以下功能。

2、功能

(1)添加联系人信息:AddContact()
a.首先判断通讯录中已存储人数是否已满,即(sz=MAX_DATA);
b.如果没有满则可以添加。

(2)删除指定联系人信息:DelContact()
a.按姓名到通讯录中查找是否有此人,即int srt = findByName();
b.如果未找到返回-1(srt==-1),否则返回该人的下标;
c.通过下标删除时,需要遍历将后一个的信息赋给前一个人,最后sz–。

(3)查找指定联系人信息:SearchContact()
a.直接使用findByName查找此人。

(4)修改指定联系人信息:UpdateContact()
a.使用findByName查找到此人,通过返回的下标依次修改此人的信息。
(5)显示所有联系人信息:PrintContact()
a.通过遍历输出所有人的信息。

(6)排序所有联系人信息
a.可以通过姓名、性别、年龄、电话、地址对通讯录中的信息进行排序。

(7)清空所有联系人:ClearContact()
a.直接再次初始化通讯录中的信息。

二、实现

1.通讯录接口

通讯录中需要用到的接口。
contact.h:

#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX_DATA 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TET 12
#define MAX_ADDR 30

//把功能一一列举出来
enum FUNCTION {
	exit,
	Add,
	Del,
	Search,
	Update,
	Sort,
	Print,
	Clear
};
enum ORDER {
	name=1,
	sex,
	age,
	tele,
	addr
};
//通讯录中人的信息
typedef struct PeoInfo {
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TET];
	char addr[MAX_ADDR];
}PeoInfo;

//通讯录
typedef struct Contact {
	PeoInfo data[MAX_DATA];//可以存放1000个人的信息
	int sz;//已经存放的人的个数
}Contact;

//初始化通讯录
void InitContact(Contact* pc);

//添加
void AddContact(Contact* pc);

//删除
void DelContact(Contact* pc);

//查找
void SearchContact(Contact* pc);

//修改
void UndateContact(Contact* pc);

//排序
void SortContact(Contact* pc);

//清空
void ClearContact(Contact* pc);

//打印
void PrintContact(Contact* pc);

2.接口的实现

contact.c:

#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc) {
	assert(pc);
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//添加
void AddContact(Contact* pc) {
	assert(pc);
	if (pc->sz == MAX_DATA) {
		printf("通讯录已满,不能再添加了\n");
		return;
	}
	printf("请输入姓名-:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别-:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄-:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入电话-:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址-:>");
	scanf("%s", pc->data[pc->sz].addr);
	printf("添加成功\n");
	pc->sz++;//已经存放的人数+1
}

//查找到姓名返回下标
//未查找到返回-1
int findByName(Contact* pc, char* str) {
	assert(pc);
	for (int i = 0; i < pc->sz; i++) {
		if (0 == strcmp(pc->data[i].name, str)) {
			return i;
		}
	}
	return -1;
}
//删除
void DelContact(Contact* pc) {
	assert(pc);
	char str[MAX_NAME];
	printf("请输入要查找人的姓名-:>");
	scanf("%s", str);
	int srt = findByName(pc, str);
	if (srt == -1) {
		printf("没有找到~~~\n");
		return;
	}
	printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[srt].name, pc->data[srt].sex, pc->data[srt].age, pc->data[srt].tele, pc->data[srt].addr);
	for (int i = 0; i < pc->sz - 1; i++) {
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找
void SearchContact(Contact* pc) {
	assert(pc);
	char str[MAX_NAME];
	printf("请输入要删除的人的姓名-:>");
	scanf("%s", str);
	int srt = findByName(pc, str);
	if (srt == -1) {
		printf("没有找到此人~~~\n");
		return;
	}
	printf("找到了:\n");
	printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[srt].name, pc->data[srt].sex, pc->data[srt].age, pc->data[srt].tele, pc->data[srt].addr);
}

//修改
void UndateContact(Contact* pc) {
	assert(pc);
	char str[MAX_NAME];
	printf("请输入要修改信息人的姓名-:>");
	scanf("%s", str);
	int srt = findByName(pc, str);
	if (srt == -1) {
		printf("没有找到此人~~~\n");
		return;
	}
	printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[srt].name, pc->data[srt].sex, pc->data[srt].age, pc->data[srt].tele, pc->data[srt].addr);
	printf("请输入将%s修改后的姓名-:>", pc->data[srt].name);
	scanf("%s", pc->data[srt].name);
	printf("修改后的性别-:>");
	scanf("%s", pc->data[srt].sex);
	printf("修改后的年龄-:>");
	scanf("%d", &pc->data[srt].age);
	printf("修改后的电话-:>");
	scanf("%s", pc->data[srt].tele);
	printf("修改后的地址-:>");
	scanf("%s", pc->data[srt].addr);
	printf("修改成功\n");
}

void menu2() {
	printf("**********************************\n");
	printf("*********1.姓名    2.性别  *******\n");
	printf("*********3.年龄    4.电话  *******\n");
	printf("*********5.地址            *******\n");
	printf("**********************************\n");
}
void sortByName(Contact* pc) {
	assert(pc);
	PeoInfo tmp;
	for (int i = 0; i < pc->sz - 1; i++) {
		for (int j = 0; j < pc->sz - i - 1; j++) {
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) {
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}
void sortBySex(Contact* pc) {
	assert(pc);
	PeoInfo tmp;
	for (int i = 0; i < pc->sz - 1; i++) {
		for (int j = 0; j < pc->sz - i - 1; j++) {
			if (strcmp(pc->data[j].sex, pc->data[j + 1].sex) > 0) {
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}
void sortByAge(Contact* pc) {
	assert(pc);
	PeoInfo tmp;
	for (int i = 0; i < pc->sz - 1; i++) {
		for (int j = 0; j < pc->sz - i - 1; j++) {
			if (pc->data[j].age > pc->data[j + 1].age) {
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}
void sortByTele(Contact* pc) {
	assert(pc);
	PeoInfo tmp;
	for (int i = 0; i < pc->sz - 1; i++) {
		for (int j = 0; j < pc->sz - i - 1; j++) {
			if (strcmp(pc->data[j].tele, pc->data[j + 1].tele) > 0) {
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}
void sortByAddr(Contact* pc) {
	assert(pc);
	PeoInfo tmp;
	for (int i = 0; i < pc->sz - 1; i++) {
		for (int j = 0; j < pc->sz - i - 1; j++) {
			if (strcmp(pc->data[j].addr, pc->data[j + 1].addr) > 0) {
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}
//排序
void SortContact(Contact* pc) {
	assert(pc);
	int input = 0;
	do {
		menu2();
		printf("请选择要排序的方式-:>");
		scanf("%d", &input);
		switch (input) {
		case name:
			sortByName(pc);
			return;
		case sex:
			sortBySex(pc);
			return;
		case age:
			sortByAge(pc);
			return;
		case tele:
			sortByTele(pc);
			return;
		case addr:
			sortByAddr(pc);
			return;
		default:
			return;
		}
	} while (input);
}

//清空
void ClearContact(Contact* pc) {
	assert(pc);
	InitContact(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
	printf("清空成功\n");
}

//打印
void PrintContact(Contact* pc) {
	assert(pc);
	printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < pc->sz; i++) {
		printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
}

3.测试通讯录的功能

代码如下(示例):

#include "contact.h"

void menu() {
	printf("**********************************\n");
	printf("*********1.Add    2.Del   ********\n");
	printf("*********3.Search 4.Update********\n");
	printf("*********5.Sort   6.Print ********\n");
	printf("*********7.Clear  0.exit  ********\n");
	printf("**********************************\n");
}
int main() {
	int input = 0;
	//创建一个通讯录
	Contact con;
	//初始化
	InitContact(&con);
	do {
		menu();
		printf("请选择-:>");
		scanf("%d", &input);
		switch (input) {
		case Add:
			AddContact(&con);//添加
			break;
		case Del:
			DelContact(&con);//删除
			break;
		case Search:
			SearchContact(&con);//查找
			break;
		case Update:
			UndateContact(&con);//修改
			break;
		case Sort:
			SortContact(&con);//排序
			break;
		case Print:
			PrintContact(&con);//打印信息
			break;
		case Clear:
			ClearContact(&con);//清空
			break;
		case exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误\n");
			break;
		}
	} while (input);
	return 0;
}



三、展示

在这里插入图片描述
在这里插入图片描述
别的就不展示了。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值