用c语言写一个个人通讯录管理系统:在磁盘上建立1个 communication . txt 文件,作为读取和存储的通讯录,该系统运行时在控制台中显示菜单界面进行键盘输入操作,模拟通讯录的操作过程。 系统功能包括以下方面: A 通讯录的每位联系人信息有姓名单位固定电话移动手机、分类(如同事、朋友、同学、家人等)、 EMAIL 、 QQ 等。 B 、输入、查找、删除、修改联系人信息功能。 C 、显示功能:能够显示所有联系人信息(大于10条的分屏显示),或按分类进行显示。 D 、分类操作:可以按分类信息进行同一类的联系人操作,比如显示、删除和查找操作?
时间: 2023-07-10 14:07:07 浏览: 97
C++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能)
5星 · 资源好评率100%
实现这个通讯录管理系统需要用到文件操作和数据结构。我们可以用结构体来存储每个联系人的信息,然后将所有联系人存储到一个文件中。以下是一个简单的实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CONTACTS 100 // 最多存储100个联系人
#define MAX_NAME_LEN 50 // 姓名最长50个字符
#define MAX_COMPANY_LEN 50 // 单位最长50个字符
#define MAX_PHONE_LEN 20 // 电话最长20个字符
#define MAX_EMAIL_LEN 50 // 邮箱最长50个字符
#define MAX_QQ_LEN 20 // QQ最长20个字符
struct Contact {
char name[MAX_NAME_LEN];
char company[MAX_COMPANY_LEN];
char phone[MAX_PHONE_LEN];
char mobile[MAX_PHONE_LEN];
char email[MAX_EMAIL_LEN];
char qq[MAX_QQ_LEN];
char category[20];
};
void add_contact(struct Contact *contacts, int *num_contacts) {
if (*num_contacts >= MAX_CONTACTS) {
printf("通讯录已满,无法添加新联系人。\n");
return;
}
struct Contact c;
printf("请输入联系人信息:\n");
printf("姓名:");
scanf("%s", c.name);
printf("单位:");
scanf("%s", c.company);
printf("固定电话:");
scanf("%s", c.phone);
printf("移动电话:");
scanf("%s", c.mobile);
printf("邮箱:");
scanf("%s", c.email);
printf("QQ:");
scanf("%s", c.qq);
printf("分类:");
scanf("%s", c.category);
contacts[*num_contacts] = c;
(*num_contacts)++;
printf("联系人已添加。\n");
}
void find_contact(struct Contact *contacts, int num_contacts) {
char name[MAX_NAME_LEN];
printf("请输入要查找的联系人姓名:");
scanf("%s", name);
for (int i = 0; i < num_contacts; i++) {
if (strcmp(contacts[i].name, name) == 0) {
printf("姓名:%s\n", contacts[i].name);
printf("单位:%s\n", contacts[i].company);
printf("固定电话:%s\n", contacts[i].phone);
printf("移动电话:%s\n", contacts[i].mobile);
printf("邮箱:%s\n", contacts[i].email);
printf("QQ:%s\n", contacts[i].qq);
printf("分类:%s\n", contacts[i].category);
return;
}
}
printf("未找到联系人。\n");
}
void delete_contact(struct Contact *contacts, int *num_contacts) {
char name[MAX_NAME_LEN];
printf("请输入要删除的联系人姓名:");
scanf("%s", name);
for (int i = 0; i < *num_contacts; i++) {
if (strcmp(contacts[i].name, name) == 0) {
for (int j = i; j < *num_contacts - 1; j++) {
contacts[j] = contacts[j + 1];
}
(*num_contacts)--;
printf("联系人已删除。\n");
return;
}
}
printf("未找到联系人。\n");
}
void modify_contact(struct Contact *contacts, int num_contacts) {
char name[MAX_NAME_LEN];
printf("请输入要修改的联系人姓名:");
scanf("%s", name);
for (int i = 0; i < num_contacts; i++) {
if (strcmp(contacts[i].name, name) == 0) {
struct Contact c;
printf("请输入新的联系人信息:\n");
printf("姓名:");
scanf("%s", c.name);
printf("单位:");
scanf("%s", c.company);
printf("固定电话:");
scanf("%s", c.phone);
printf("移动电话:");
scanf("%s", c.mobile);
printf("邮箱:");
scanf("%s", c.email);
printf("QQ:");
scanf("%s", c.qq);
printf("分类:");
scanf("%s", c.category);
contacts[i] = c;
printf("联系人已修改。\n");
return;
}
}
printf("未找到联系人。\n");
}
void display_contacts(struct Contact *contacts, int num_contacts) {
printf("所有联系人:\n");
for (int i = 0; i < num_contacts; i++) {
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n", contacts[i].name, contacts[i].company, contacts[i].phone, contacts[i].mobile, contacts[i].email, contacts[i].qq, contacts[i].category);
if (i % 10 == 9) {
printf("按 Enter 继续...");
getchar();
}
}
if (num_contacts == 0) {
printf("通讯录为空。\n");
}
}
void display_by_category(struct Contact *contacts, int num_contacts) {
char category[20];
printf("请输入要显示的分类:");
scanf("%s", category);
printf("分类为 %s 的联系人:\n", category);
for (int i = 0; i < num_contacts; i++) {
if (strcmp(contacts[i].category, category) == 0) {
printf("%s\t%s\t%s\t%s\t%s\t%s\n", contacts[i].name, contacts[i].phone, contacts[i].mobile, contacts[i].email, contacts[i].qq, contacts[i].category);
}
}
}
void save_contacts(struct Contact *contacts, int num_contacts) {
FILE *fp = fopen("communication.txt", "w");
if (fp == NULL) {
printf("无法打开文件。\n");
return;
}
for (int i = 0; i < num_contacts; i++) {
fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", contacts[i].name, contacts[i].company, contacts[i].phone, contacts[i].mobile, contacts[i].email, contacts[i].qq, contacts[i].category);
}
fclose(fp);
printf("通讯录已保存到文件 communication.txt。\n");
}
void load_contacts(struct Contact *contacts, int *num_contacts) {
FILE *fp = fopen("communication.txt", "r");
if (fp == NULL) {
printf("无法打开文件。\n");
return;
}
*num_contacts = 0;
while (*num_contacts < MAX_CONTACTS && fscanf(fp, "%s%s%s%s%s%s%s", contacts[*num_contacts].name, contacts[*num_contacts].company, contacts[*num_contacts].phone, contacts[*num_contacts].mobile, contacts[*num_contacts].email, contacts[*num_contacts].qq, contacts[*num_contacts].category) == 7) {
(*num_contacts)++;
}
fclose(fp);
printf("已从文件 communication.txt 中读取 %d 个联系人。\n", *num_contacts);
}
int main() {
struct Contact contacts[MAX_CONTACTS];
int num_contacts = 0;
load_contacts(contacts, &num_contacts);
while (1) {
printf("\n请选择操作:\n");
printf("1. 添加联系人\n");
printf("2. 查找联系人\n");
printf("3. 删除联系人\n");
printf("4. 修改联系人\n");
printf("5. 显示所有联系人\n");
printf("6. 按分类显示联系人\n");
printf("7. 保存通讯录到文件\n");
printf("8. 退出\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
add_contact(contacts, &num_contacts);
break;
case 2:
find_contact(contacts, num_contacts);
break;
case 3:
delete_contact(contacts, &num_contacts);
break;
case 4:
modify_contact(contacts, num_contacts);
break;
case 5:
display_contacts(contacts, num_contacts);
break;
case 6:
display_by_category(contacts, num_contacts);
break;
case 7:
save_contacts(contacts, num_contacts);
break;
case 8:
save_contacts(contacts, num_contacts);
printf("已退出通讯录管理系统。\n");
return 0;
default:
printf("无效的选择。\n");
break;
}
}
}
```
这个程序使用了一个结构体 `Contact` 来存储每个联系人的信息,同时使用了一个数组来存储所有联系人。程序通过文件读写来实现联系人信息的持久化。用户可以通过在控制台中输入数字来选择不同的操作,比如添加、查找、删除、修改和显示联系人等。如果通讯录已满或者用户输入的联系人姓名不存在,则会提示相应的错误信息。
阅读全文