一、通讯录
通讯录可以用来存储1024个人的信息,每个人的信息包括:姓名丶性别丶年龄丶电话丶地址。
功能:
- 添加一个联系人信息
- 删除指定联系人信息
- 修改指定联系人信息
- 查看指定联系人信息
- 显示所有联系人信息
- 清空所有联系人信息
- 以名字排序所有联系人
这是一个简单的通讯录,实现方案是初级版。
只能在程序运行期间存在(没有写入文件)。
二、菜单实现和用户交互
菜单实现和用户的交互
- 添加一个联系人信息
- 删除指定联系人信息
- 修改指定联系人信息
- 查看指定联系人信息
- 显示所有联系人信息
- 清空所有联系人信息
- 以名字排序所有联系人
- 0.退出
int menu() {
printf("+--------------------------------------+ n");
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");
printf("请输入你要进行的操作:");
int choice = 0;
(void)scanf("%d", &choice);
return choice;
}
三、主函数
1.转移表
使用转移表的方式来简化代码。
定义函数指针Func,参数类型是结构体指针。
typedef void(*Func)(AddressBook*addressBook);
2.choice判断
选择为0,打印GoodBye!!!。
选择不在0-7范围内时,提示输入错误,重新输入选择。
选择在0-7范围内时,使用转移表调用函数。
int main() {
//1.进行初始化
init(&addressBook);
//2.与用户进行交互
Func funcs[] = {
NULL,//纯属为了占位
insert,
drop,
update,
search,
show,
empty,
nameSort
};
while (1) {
int choice = menu();
if (choice < 0 || choice > sizeof(funcs) / sizeof(funcs[0])) {
printf("您的输入有误!n");
continue;
}
if (choice == 0) {
printf("GOODBYE!n");
break;
}
funcs[choice](&addressBook);
system("pause");
system("cls");
}
return 0;
}
选择为0,打印GoodBye!!!。
选择不在0-7范围内时,提示输入错误,重新输入选择。
选择在0-7范围内时,使用转移表调用函数。
四、定义联系人和通讯录 1.定义联系人结构体
表示一个联系人,包含联系人姓名,性别,年龄,电话,地址.
typedef struct personInfo {
char name[1024];
char sex[5];
char age[100];
char telphone[1024];
char address[100];
}personInfo;
2.定义通讯录结构体
表示整个通讯录,管理所有联系人,包含联系人。
通讯录刚开始是空着的,每次新增联系人,才会增加一个元素。
定义size用来控制当前通讯录中有多少个人。
typedef struct AddressBook {
personInfo persons[1024];
int size;
}AddressBook;
3.定义结构体变量
表示整个通讯录,管理所有联系人,包含联系人。
通讯录刚开始是空着的,每次新增联系人,才会增加一个元素。
定义size用来控制当前通讯录中有多少个人。
全局变量addressBook,因为addressBook是整个程序都要用到的
AddressBook addressBook;五、通讯录初始化
void init(AddressBook* addressBook) {
addressBook -> size = 0;
//可以不用加这个memset
memset(addressBook->persons, 0, sizeof(addressBook->persons));
}
六、新增联系人
首先,判断通讯录是不是满了,满了给出提示,没满让用户输入联系人的信息。
void insert(AddressBook* addressBook) {
printf("新增联系人!n");
assert(addressBook != NULL);
//数组的最大元素为1024,如果超过这个范围,就提示新增联系人失败.
if (addressBook->size >= 1024) {
printf("新增联系人失败!");
return;
}
personInfo person = { 0 };
printf("请输入新增联系人的姓名:");
scanf("%s", person.name);
printf("请输入新增联系人的性别:");
scanf("%s", person.sex);
printf("请输入新增联系人的年龄:");
scanf("%s", person.age);
printf("请输入新增联系人的电话:");
scanf("%s", person.telphone);
printf("请输入新增联系人的地址:");
scanf("%s", person.address);
//把 person 结构体放到 addressBookzhong!
//例如.当数组位空的时候,size就是0.此时新增的元素就放到下标位0的位置即可.
//插入完毕之后,就可以把size++ => 1
//下一次再插入的时候,此时size为1,就可以把新的元素放到size的位置.
addressBook->persons[addressBook->size] = person;
addressBook->size++;
printf("新增联系人成功!n");
}
七、删除指定联系人
用户输入联系人的编号来进行删除(数组下标),删除下标为 id 的元素。
首先判断用户的输入是否合法.
如果 id 对应的元素就是最后一个,直接 size--。
如果 id 对应的元素是中间元素,和最后一个元素替换,然后再size--。
void drop(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--;
printf("删除成功!");
return;
}
if (0 < id && id < addressBook->size) {
personInfo* lastperson = addressBook->size - 1;
addressBook->persons[id] = *lastperson;
addressBook->size--;
printf("删除成功!n");
}
}
八、修改指定联系人
用户输入联系人的编号来进行修改,更改下标为 id 的元素。
void update(AddressBook* addressBook) {
printf("修改联系人!n");
printf("请输入你要修改的联系人的序号:");
int id = 0;
scanf("%d", &id);
if (id < 0 || id > addressBook->size) {
printf("您的输入有误!修改失败!n");
return;
}
personInfo* p = &addressBook->persons[id];
char name[1024] = { 0 };
char sex[5] = {0};
char age[100] = { 0 };
char telphone[1024] = { 0 };
char address[100] = { 0 };
printf("输入 * 表示该选项不修改!n");
printf("请输入新的用户名字(旧的用户名字为 %s):", p->name);
scanf("%s", name);
if (strcmp(name,"*") != 0) {
strcpy(p->name, name);
}
printf("请输入新的用户性别(旧的用户性别为 %s):", p->sex);
scanf("%s", sex);
if (strcmp(sex, "*") != 0) {
strcpy(p->sex, sex);
}
printf("请输入新的用户年龄(旧的用户年龄为 %s):", p->age);
scanf("%s", age);
if (strcmp(age, "*") != 0) {
strcpy(p->age, age);
}
printf("请输入新的用户电话(旧的用户电话为 %s):", p->telphone);
scanf("%s", telphone);
if (strcmp(telphone, "*") != 0) {
strcpy(p->telphone,telphone);
}
printf("请输入新的用户地址(旧的用户地址为 %s):", p->address);
scanf("%s", address);
if (strcmp(address, "*") != 0) {
strcpy(p->address, address);
}
}
九、查看指定联系人
采用按照序号查找的方法。
用户输入序号后查找,输出联系人信息。
void search(AddressBook* addressBook) {
printf("查找指定联系人!");
printf("请输入你要查找的联系人的序号:");
int id = 0;
scanf("%d", &id);
if (id < 0 || id > addressBook->size) {
printf("您的输入有误!查找失败!n");
return;
}
personInfo* p = &addressBook->persons[id];
printf(" %st%st%st%st%sn",p->name, p->sex, p->age, p->telphone, p->address);
printf("查找联系人成功n");
}
十、显示所有联系人
void show(AddressBook* addressBook) {
printf("查看联系人!n");
//遍历数组
for (int i = 0; i < addressBook->size; i++) {
personInfo* p = &addressBook->persons[i];
printf("[%d] %st%st%st%st%sn", i, p->name,p->sex,p->age,p->telphone,p->address);
}
printf("查看联系人完毕!一共有%d个联系人n",addressBook->size);
}
十一、清空所有联系人
void empty(AddressBook* addressBook) {
printf("清空所有联系人!n");
for (int i = 0; i <= addressBook->size; i++) {
addressBook->size=0;
}
printf("已清空所有联系人n");
}
十二、按名字排序联系人
使用strcmp比较姓名,然后进行交换排序。
void nameSort(AddressBook* addressBook) {
printf("按名字排序!n");
int ret = 0;
for ( int i = 0; i < addressBook->size - 1; i++) {
for (int j = 0; j < addressBook->size - 1-i; j++) {
ret = strcmp(addressBook->persons[j].name, addressBook->persons[j + 1].name);
if (ret == 1) {
personInfo temp = addressBook->persons[j];
addressBook->persons[j] = addressBook->persons[j + 1];
addressBook->persons[j + 1] = temp;
}
}
}
for (int i = 0; i < addressBook->size; i++) {
printf("%sn", addressBook->persons[i].name);
}
printf("排序成功!n");
}
十三、运行结果演示
1.新增联系人
2.删除联系人
3.修改联系人
4.查看联系人
5.显示联系人
6.清空联系人
7.按名字排序
十四、完整代码#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include typedef struct personInfo { char name[1024]; char sex[5]; char age[100]; char telphone[1024]; char address[100]; }personInfo; typedef struct AddressBook { personInfo persons[1024]; int size; }AddressBook; AddressBook addressBook; void init(AddressBook* addressBook) { addressBook -> size = 0; memset(addressBook->persons, 0, sizeof(addressBook->persons)); } int menu() { printf("+--------------------------------------+ n"); 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"); printf("请输入你要进行的操作:"); int choice = 0; (void)scanf("%d", &choice); return choice; } void insert(AddressBook* addressBook) { printf("新增联系人!n"); assert(addressBook != NULL); //数组的最大元素为1024,如果超过这个范围,就提示新增联系人失败. if (addressBook->size >= 1024) { printf("新增联系人失败!"); return; } personInfo person = { 0 }; printf("请输入新增联系人的姓名:"); scanf("%s", person.name); printf("请输入新增联系人的性别:"); scanf("%s", person.sex); printf("请输入新增联系人的年龄:"); scanf("%s", person.age); printf("请输入新增联系人的电话:"); scanf("%s", person.telphone); printf("请输入新增联系人的地址:"); scanf("%s", person.address); //把 person 结构体放到 addressBookzhong! //例如.当数组位空的时候,size就是0.此时新增的元素就放到下标位0的位置即可. //插入完毕之后,就可以把size++ => 1 //下一次再插入的时候,此时size为1,就可以把新的元素放到size的位置. addressBook->persons[addressBook->size] = person; addressBook->size++; printf("新增联系人成功!n"); } void drop(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--; printf("删除成功!"); return; } if (0 < id && id < addressBook->size) { personInfo* lastperson = addressBook->size - 1; addressBook->persons[id] = *lastperson; addressBook->size--; printf("删除成功!n"); } } void search(AddressBook* addressBook) { printf("查找指定联系人!"); printf("请输入你要查找的联系人的序号:"); int id = 0; scanf("%d", &id); if (id < 0 || id > addressBook->size) { printf("您的输入有误!查找失败!n"); return; } personInfo* p = &addressBook->persons[id]; printf(" %st%st%st%st%sn",p->name, p->sex, p->age, p->telphone, p->address); printf("查找联系人成功n"); } void update(AddressBook* addressBook) { printf("修改联系人!n"); printf("请输入你要修改的联系人的序号:"); int id = 0; scanf("%d", &id); if (id < 0 || id > addressBook->size) { printf("您的输入有误!修改失败!n"); return; } personInfo* p = &addressBook->persons[id]; char name[1024] = { 0 }; char sex[5] = {0}; char age[100] = { 0 }; char telphone[1024] = { 0 }; char address[100] = { 0 }; printf("输入 * 表示该选项不修改!n"); printf("请输入新的用户名字(旧的用户名字为 %s):", p->name); scanf("%s", name); if (strcmp(name,"*") != 0) { strcpy(p->name, name); } printf("请输入新的用户性别(旧的用户性别为 %s):", p->sex); scanf("%s", sex); if (strcmp(sex, "*") != 0) { strcpy(p->sex, sex); } printf("请输入新的用户年龄(旧的用户年龄为 %s):", p->age); scanf("%s", age); if (strcmp(age, "*") != 0) { strcpy(p->age, age); } printf("请输入新的用户电话(旧的用户电话为 %s):", p->telphone); scanf("%s", telphone); if (strcmp(telphone, "*") != 0) { strcpy(p->telphone,telphone); } printf("请输入新的用户地址(旧的用户地址为 %s):", p->address); scanf("%s", address); if (strcmp(address, "*") != 0) { strcpy(p->address, address); } } void show(AddressBook* addressBook) { printf("查看联系人!n"); //遍历数组 for (int i = 0; i < addressBook->size; i++) { personInfo* p = &addressBook->persons[i]; printf("[%d] %st%st%st%st%sn", i, p->name,p->sex,p->age,p->telphone,p->address); } printf("查看联系人完毕!一共有%d个联系人n",addressBook->size); } void empty(AddressBook* addressBook) { printf("清空所有联系人!n"); for (int i = 0; i <= addressBook->size; i++) { addressBook->size=0; } printf("已清空所有联系人n"); } void nameSort(AddressBook* addressBook) { printf("按名字排序!n"); int ret = 0; for ( int i = 0; i < addressBook->size - 1; i++) { for (int j = 0; j < addressBook->size - 1-i; j++) { ret = strcmp(addressBook->persons[j].name, addressBook->persons[j + 1].name); if (ret == 1) { personInfo temp = addressBook->persons[j]; addressBook->persons[j] = addressBook->persons[j + 1]; addressBook->persons[j + 1] = temp; } } } for (int i = 0; i < addressBook->size; i++) { printf("%sn", addressBook->persons[i].name); } printf("排序成功!n"); } typedef void(*Func)(AddressBook*addressBook); int main() { //1.进行初始化 init(&addressBook); //2.与用户进行交互 Func funcs[] = { NULL,//纯属为了占位 insert, drop, update, search, show, empty, nameSort }; while (1) { int choice = menu(); if (choice < 0 || choice > sizeof(funcs) / sizeof(funcs[0])) { printf("您的输入有误!n"); continue; } if (choice == 0) { printf("GOODBYE!n"); break; } funcs[choice](&addressBook); system("pause"); system("cls"); } return 0; }



