用C++编写通信录系统的程序,要求使用分文件,链表(不使用数组) 基本要求: 定义人员(person)类,其中至少包括姓名、性别、电话、地址、邮政编码、邮箱、QQ 号和类别(包括同学,朋友,老师和家人) 功能要求: 1.设计菜单实现功能选择; 2.输入功能:输入人员信息,并保存到文件中; 3.查询功能: 1)能够根据姓名、电话精确查询人员信息; 2)能够根据地址进行模糊查询人员信息; 3) 根据人员类别查询人员信息并输出显示; 4、根据姓名对人员信息排序(按不同的信息内容排序)输出; 5、能根据姓名、电话修改人员信息; 6、能根据姓名、电话删除人员信息; 7、所有的增加、修改、删除能同步到文件;也从文件读取数据到程序。 8、考虑重名问题的处理。
时间: 2023-07-10 16:13:42 浏览: 62
好的,这是一个比较复杂的问题,需要较长的回答。首先,我们需要按照要求定义一个人员类(Person),其中包括姓名、性别、电话、地址、邮政编码、邮箱、QQ号和类别。具体实现可以使用类的成员变量来存储这些信息,例如:
```c++
class Person {
private:
string name; // 姓名
string gender; // 性别
string phone; // 电话
string address; // 地址
string zipCode; // 邮政编码
string email; // 邮箱
string qq; // QQ号
string category; // 类别
public:
// 构造函数、析构函数、拷贝构造函数等
// 成员函数:获取和设置成员变量、显示人员信息等
};
```
接下来,我们可以使用链表来存储人员信息。链表中的每个节点都是一个Person对象,而链表的头指针指向第一个节点。为了方便管理,我们可以将链表的节点定义为一个单独的类(Node),其中包括一个Person对象和指向下一个节点的指针。具体实现可以参考下面的代码:
```c++
class Node {
public:
Person data; // 节点数据
Node *next; // 指向下一个节点的指针
// 构造函数
Node(const Person &person, Node *nextPtr = nullptr) : data(person), next(nextPtr) {}
};
class LinkedList {
private:
Node *head; // 头指针
public:
// 构造函数、析构函数等
// 成员函数:添加节点、删除节点、查找节点、遍历链表等
};
```
接下来,我们需要实现各种功能。首先是输入功能,我们可以使用菜单让用户选择输入人员信息,然后将信息保存到文件中。具体实现可以参考下面的代码:
```c++
void addPerson(LinkedList &list) {
string name, gender, phone, address, zipCode, email, qq, category;
// 通过cin等方式获取用户输入的人员信息
Person person(name, gender, phone, address, zipCode, email, qq, category);
list.add(person); // 将新的Person对象添加到链表中
// 将链表中的所有Person对象保存到文件中
list.saveToFile("data.txt");
}
```
接下来是查询功能。我们需要实现三种查询:根据姓名、电话精确查询人员信息,根据地址进行模糊查询人员信息,根据人员类别查询人员信息并输出显示。具体实现可以参考下面的代码:
```c++
void searchByName(LinkedList &list) {
string name;
// 通过cin等方式获取用户输入的姓名
Person *person = list.findByName(name); // 查找姓名为name的Person对象
if (person != nullptr) {
// 显示查找结果
person->display();
} else {
cout << "未找到姓名为" << name << "的人员信息" << endl;
}
}
void searchByPhone(LinkedList &list) {
string phone;
// 通过cin等方式获取用户输入的电话
Person *person = list.findByPhone(phone); // 查找电话为phone的Person对象
if (person != nullptr) {
// 显示查找结果
person->display();
} else {
cout << "未找到电话为" << phone << "的人员信息" << endl;
}
}
void searchByAddress(LinkedList &list) {
string address;
// 通过cin等方式获取用户输入的地址
list.searchByAddress(address); // 输出地址包含address的所有Person对象
}
```
接下来是排序功能。我们需要根据姓名对人员信息排序(按不同的信息内容排序)输出。具体实现可以参考下面的代码:
```c++
void sortByname(LinkedList &list) {
list.sortByName(); // 根据姓名对链表中的Person对象排序
}
void sortByPhone(LinkedList &list) {
list.sortByPhone(); // 根据电话对链表中的Person对象排序
}
// 其他排序方式的实现类似
```
接下来是修改和删除功能。我们需要能够根据姓名、电话修改人员信息,以及根据姓名、电话删除人员信息。具体实现可以参考下面的代码:
```c++
void modifyByName(LinkedList &list) {
string name;
// 通过cin等方式获取用户输入的姓名
Person *person = list.findByName(name); // 查找姓名为name的Person对象
if (person != nullptr) {
// 通过cin等方式获取用户输入的新信息
person->modify(newName, newGender, newPhone, newAddress, newZipCode, newEmail, newQQ, newCategory);
// 将链表中的所有Person对象保存到文件中
list.saveToFile("data.txt");
} else {
cout << "未找到姓名为" << name << "的人员信息" << endl;
}
}
void modifyByPhone(LinkedList &list) {
string phone;
// 通过cin等方式获取用户输入的电话
Person *person = list.findByPhone(phone); // 查找电话为phone的Person对象
if (person != nullptr) {
// 通过cin等方式获取用户输入的新信息
person->modify(newName, newGender, newPhone, newAddress, newZipCode, newEmail, newQQ, newCategory);
// 将链表中的所有Person对象保存到文件中
list.saveToFile("data.txt");
} else {
cout << "未找到电话为" << phone << "的人员信息" << endl;
}
}
void deleteByName(LinkedList &list) {
string name;
// 通过cin等方式获取用户输入的姓名
list.deleteByName(name); // 删除姓名为name的Person对象
// 将链表中的所有Person对象保存到文件中
list.saveToFile("data.txt");
}
void deleteByPhone(LinkedList &list) {
string phone;
// 通过cin等方式获取用户输入的电话
list.deleteByPhone(phone); // 删除电话为phone的Person对象
// 将链表中的所有Person对象保存到文件中
list.saveToFile("data.txt");
}
```
最后,我们需要考虑重名问题的处理。如果链表中存在多个姓名相同的Person对象,我们需要在查询、排序、修改和删除时进行特殊处理,以免出现错误。具体实现可以参考下面的代码:
```c++
Person *LinkedList::findByName(const string &name) const {
Node *p = head;
while (p != nullptr) {
if (p->data.getName() == name) {
return &p->data; // 找到第一个姓名为name的Person对象并返回
}
p = p->next;
}
return nullptr; // 未找到姓名为name的Person对象
}
void LinkedList::sortByName() {
Node *p = head;
while (p != nullptr) {
Node *q = p->next;
while (q != nullptr) {
if (p->data.getName() > q->data.getName()) {
// 交换p和q的数据
Person temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
}
void LinkedList::deleteByName(const string &name) {
Node *p = head;
Node *prev = nullptr;
while (p != nullptr) {
if (p->data.getName() == name) {
if (prev == nullptr) {
head = p->next;
} else {
prev->next = p->next;
}
delete p; // 释放p所占用的内存空间
return;
}
prev = p;
p = p->next;
}
}
```
以上就是使用C++编写通信录系统的程序的基本实现方法,希望对你有所帮助。
阅读全文