写一个通讯录管理系统并给出完整代码,要求: 具体功能包括 1. 添加联系人 2. 显示联系人 3. 删除联系人 4. 查找联系人 5. 修改联系人 6. 清空联系人 7. 退出通讯录 同时将联系人信息保存至文件中,当再次启动程序时,自动读取联系人数据。 另外1. 需要用结构体定义管理系统的基本元素,如联系人,不能够使用类 2. 需要有增删改查的操作,可以使用数组存储、链表存储,或指针结构体等
时间: 2024-03-24 16:37:03 浏览: 48
基于C++语言和单链表数据结构实现的通讯录管理系统,包含文件读取、文件保存、增删改查、排序、清空等功能.zip
5星 · 资源好评率100%
好的,以下是一个使用结构体和指针的通讯录管理系统的完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_PHONE_LEN 15
#define MAX_EMAIL_LEN 30
#define MAX_CONTACTS 100
// 定义联系人结构体
typedef struct {
char name[MAX_NAME_LEN];
char phone[MAX_PHONE_LEN];
char email[MAX_EMAIL_LEN];
} Contact;
// 初始化通讯录
void init(Contact *contacts, int *size) {
FILE *fp;
int i = 0;
fp = fopen("contacts.dat", "rb");
if (fp != NULL) {
// 从文件中读取联系人数据
while (fread(&contacts[i], sizeof(Contact), 1, fp) == 1) {
i++;
}
fclose(fp);
}
*size = i;
}
// 添加联系人
void add(Contact *contacts, int *size) {
Contact newContact;
printf("请输入联系人姓名:");
scanf("%s", newContact.name);
printf("请输入联系人电话:");
scanf("%s", newContact.phone);
printf("请输入联系人邮箱:");
scanf("%s", newContact.email);
contacts[*size] = newContact;
(*size)++;
printf("添加成功!\n");
}
// 显示联系人
void show(Contact *contacts, int size) {
int i;
printf("姓名\t电话\t\t邮箱\n");
for (i = 0; i < size; i++) {
printf("%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);
}
}
// 删除联系人
void del(Contact *contacts, int *size) {
int i, j;
char name[MAX_NAME_LEN];
printf("请输入要删除的联系人姓名:");
scanf("%s", name);
for (i = 0; i < *size; i++) {
if (strcmp(contacts[i].name, name) == 0) {
// 将后面的联系人往前移动一个位置
for (j = i; j < *size - 1; j++) {
contacts[j] = contacts[j+1];
}
(*size)--;
printf("删除成功!\n");
return;
}
}
printf("未找到该联系人!\n");
}
// 查找联系人
void search(Contact *contacts, int size) {
int i;
char name[MAX_NAME_LEN];
printf("请输入要查找的联系人姓名:");
scanf("%s", name);
printf("姓名\t电话\t\t邮箱\n");
for (i = 0; i < size; i++) {
if (strcmp(contacts[i].name, name) == 0) {
printf("%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].email);
return;
}
}
printf("未找到该联系人!\n");
}
// 修改联系人
void modify(Contact *contacts, int size) {
int i;
char name[MAX_NAME_LEN];
printf("请输入要修改的联系人姓名:");
scanf("%s", name);
for (i = 0; i < size; i++) {
if (strcmp(contacts[i].name, name) == 0) {
printf("请输入联系人电话:");
scanf("%s", contacts[i].phone);
printf("请输入联系人邮箱:");
scanf("%s", contacts[i].email);
printf("修改成功!\n");
return;
}
}
printf("未找到该联系人!\n");
}
// 清空联系人
void clear(Contact *contacts, int *size) {
*size = 0;
printf("通讯录已清空!\n");
}
// 保存联系人数据到文件中
void save(Contact *contacts, int size) {
FILE *fp;
fp = fopen("contacts.dat", "wb");
if (fp != NULL) {
fwrite(contacts, sizeof(Contact), size, fp);
fclose(fp);
}
}
int main() {
Contact contacts[MAX_CONTACTS];
int size = 0;
int choice;
init(contacts, &size);
while (1) {
printf("\n");
printf("1. 添加联系人\n");
printf("2. 显示联系人\n");
printf("3. 删除联系人\n");
printf("4. 查找联系人\n");
printf("5. 修改联系人\n");
printf("6. 清空联系人\n");
printf("7. 退出\n");
printf("请选择操作(1-7):");
scanf("%d", &choice);
switch (choice) {
case 1:
add(contacts, &size);
break;
case 2:
show(contacts, size);
break;
case 3:
del(contacts, &size);
break;
case 4:
search(contacts, size);
break;
case 5:
modify(contacts, size);
break;
case 6:
clear(contacts, &size);
break;
case 7:
save(contacts, size);
printf("谢谢使用,再见!\n");
exit(0);
default:
printf("输入有误,请重新输入!\n");
break;
}
}
return 0;
}
```
这个程序使用了一个 Contact 结构体来表示一个联系人,然后使用一个 Contact 数组来存储所有联系人的信息。通讯录的各种操作都是通过调用不同的函数来实现的,每个函数都对 Contact 数组进行相应的操作。
在程序初始化时,会尝试从文件 `contacts.dat` 中读取联系人数据,这样就可以实现联系人数据的持久化。在退出程序时,会自动将联系人数据保存到文件中。
这个程序使用了指针来传递 Contact 数组和 size 变量,这样可以在调用函数时修改它们的值。
阅读全文