c语言实现简单的通讯录功能

c语言实现的简单的通讯录功能

利用结构体实现了简单的通讯录功能
//通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
//提供方法:
//添加联系人信息
//删除指定联系人信息
//查找指定联系人信息
//修改指定联系人信息
//显示所有联系人信息
//清空所有联系人
//以名字排序所有联系人

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <Windows.h>
typedef struct Personinfo {
	char name[2048];
	char num[2048];
	char sex[2048];
	char age[2048];
	char home[2048];
}Personinfo;

typedef struct Addressbook {
	Personinfo persons[1024];
	int size;
}Addressbook;
Addressbook addressbook;//全局变量
void init(Addressbook* addressbook) {//初始化通讯录
	addressbook->size = 0;
}
void Add(Addressbook* addressbook) {
	assert(addressbook != NULL);
	printf("添加联系人\n");
	Personinfo person = { 0 };
	printf("请输入联系人的姓名、性别、年龄、电话、住址:\n");
	scanf("%s %s %s %s %s", person.name, person.sex, person.age, person.num, person.home);
	addressbook->persons[addressbook->size] = person;//把person结构体放到Addressbook中,数组为空的时候size为0,将新增元素放到下表为size的地方即可
	addressbook->size++;//size++之后下次插入仍然是把新增元素放到下标为size的地方
	printf("新增联系人成功\n");
}
void Del(Addressbook* addressbook) {
	printf("删除联系人\n");
	printf("请输入要删除的联系人的序号\n");
	int id = 0;
	scanf("%d", &id);
	if (id < 0 || id >= addressbook->size) {
		printf("输入有误\n");
		return;
	}
	if (id == addressbook->size - 1) {
		addressbook->size--;
		return;
	}
	Personinfo* lastperson = &addressbook->persons[addressbook->size - 1];
	addressbook->persons[id] = *lastperson;
	addressbook->size--;
	printf("删除完成\n");
}
void Find(Addressbook* addressbook) {
	printf("查找联系人\n");
	int id;
	printf("请输入要查找的联系人序号\n");
	scanf("%d", &id);
	if (id < 0 || id >= addressbook->size) {
		printf("输入有误\n");
		return;
	}
	for (int i = 0; i < addressbook->size; i++) {
		if (i == id) {
			Personinfo* p = &addressbook->persons[i];
			printf("(%d) %s %s %s %s %s\n", i, p->name, p->sex, p->age, p->num, p->home);
			break;
		}
	}
	printf("查找完成\n");
}
void Update(Addressbook* addressbook) {
	printf("修改联系人\n");
	printf("请输入要修改的联系人序号:");
	int id;
	scanf("%d", &id);
	if (id < 0 || id >= addressbook->size) {
		printf("您输入的id有误,修改失败");
		return;
	}
	Personinfo* p = &addressbook->persons[id];
	char name[2048] = { 0 };
	char num[2048] = { 0 };
	char sex[2048] = { 0 };
	char age[2048] = { 0 };
	char home[2048] = { 0 };
	printf("输入*表示该选项不可修改\n");
	printf("请输入新的姓名、性别、年龄、电话、住址\n");
	scanf("%s %s %s %s %s", name, sex, age, num, home);
	if (strcmp(name, "*") != 0) {
		strcpy(p->name, name);

	}
	if (strcmp(sex, "*") != 0) {
		strcpy(p->sex, sex);

	}
	if (strcmp(age, "*") != 0) {
		strcpy(p->age, age);

	}
	if (strcmp(num, "*") != 0) {
		strcpy(p->num, num);
	}
	if (strcmp(home, "*") != 0) {
		strcpy(p->home, home);

	}
	printf("修改成功!\n");
}
void Show(Addressbook* addressbook) {
	printf("查看所有联系人\n");
	int i;
	for ( i = 0; i < addressbook->size; i++) {
		Personinfo* p = &addressbook->persons[i];
		printf("(%d) %s %s %s %s %s\n",i,p->name,p->sex,p->age,p->num,p->home);
	}
	printf("查看联系人完成,共有%d个联系人\n", i);
}
void Clean(Addressbook* addressbook) {
	printf("清空所有联系人\n");
	addressbook->size = 0;
	printf("清空完成\n");
}
int cmp(const void* a, const void* b) {//按字典qsort
	return strcmp((char*)a, (char*)b);
}
void Sort(Addressbook* addressbook) {
	printf("以名字排序所有联系人\n");
	qsort(&addressbook->persons[0], addressbook->size, sizeof( addressbook->persons[0]),cmp );
	printf("排序完成\n");
}
int Menu() {
	int choice;
	printf("+--------------------------------------------------+\n");
	printf("|                     通讯录                       |\n");
	printf("|                 1.添加联系人                     |\n");
	printf("|                 2.删除联系人                     |\n");
	printf("|                 3.查找联系人                     |\n");
	printf("|                 4.修改联系人                     |\n");
	printf("|                 5.查看所有联系人                 |\n");
	printf("|                 6.清空所有联系人                 |\n");
	printf("|                 7.以名字排序所有联系人           |\n");
	printf("|                 0.退出通讯录                     |\n");
	printf("+--------------------------------------------------+\n");
	scanf("%d", &choice);
	return choice;
}
typedef void(*Func)(Addressbook*);//
int main() {
	init(&addressbook);//初始化
	Func func[] = {
	NULL,
	Add,
	Del,
	Find,
	Update,
	Show,
	Clean,
	Sort
	};
	while (1) {
		int choice = Menu();
		if (choice < 0 || choice >= sizeof(func) / sizeof(func[0])) {
			printf("输入错误");
			break;
		}
		if (choice == 0) {
			printf("感谢使用");
			break;
		}
		func[choice](&addressbook);
		Sleep(1000);
		system("cls");
		
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值