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;
}