设计并实现简单通讯录系统
1.定义描述联系人信息的类(数据类)
数据成员:身份证号(常成员)、姓名、手机号(用字符串数组,可能不止一个)、QQ号、微信号、住址;
成员函数:构造函数若干、get/set函数、显示函数。
2.定义功能实现类(操作类)
数据成员:联系人数组(链表也可)、联系人数量、数组容量;
成员函数:
构造函数(完成对本类数据成员的初始化);
增加联系人(在尾部增加);
按身份证号查询联系人并输出找到的联系人信息。找不到,不做任何操作;
按身份证号修改联系人信息(找到,修改全部其他数据。否则,不做任何操作);
按身份证号删除联系人信息;
按“姓”(如姓李)查找所有满足条件的联系人并逐一输出;
析构函数(可不要)
过程
这个系统开发过程遇到了各种各样的问题,我首先想到的是用对象数组来表示操作类的联系人,但是id要求是常对象,构造函数的赋值是个大问题,于是转变思路,不采用数组转而采用单链表,这时又出现问题了,用带头节点的还是不带头的呢?处于数据结构的习惯,我先用带头节点的试一下,但是first的构造函数没法赋初值,所以不得已采用了不带头结点的形式,没有采用结构体而是利用 不使用结构体实现单链表中方法构造单链表,原理是:类的成员可以是其他类的对象,称为类的组合。不能以类自身的对象作为本类的成员。但是可以是本身的指针或者引用。
#include<iostream>
#include<string>
using namespace std;
class Person
{
private:
const string id;
string name;
int n;
string tel[10];
string qq;
string wx;
string address;
//Person* first;
Person* next;
public:
Person()
{
next = NULL;
}
Person(string id_in, string name_in, int n_in, string tel[], string qq_in, string wx_in, string address_in);
Person(const Person& p) ;
void setName(string input)
{
name = input;
}
void setQq(string input)
{
qq = input;
}
void setWx(string input)
{
wx = input;
}
void setAddress(string input)
{
address = input;
}
void setNext(Person* input)
{
next = input;
}
void setTel();
void setN(int input)
{
n = input;
}
//void setFirst(Person* input) { first = input; };
Person* getNext()
{
return next;
}
//Person* getFirst() { return first; }
string getId()
{
return id;
}
string getName()
{
return name;
}
string getQq()
{
return qq;
}
string getWx()
{
return wx;
}
string getAddress()
{
return address;
}
int getN()
{
return n;
}
void display();
};
Person::Person(const Person& p):id(p.id)
{
this->name = p.name;
this->n = p.n;
for (int i = 0; i < n; i++)
{
this->tel[i] = p.tel[i];
}
this->qq = p.qq;
this->wx = p.wx;
this->address = p.address;
next = NULL;
/*
name = new char[strlen(p.name.c_str()) + 1];
strcpy(name.c_str(), p.name.c_str());
string* phone;
phone = new string[10];
strcpy(phone->c_str, p.tel->c_str);
qq = new char[strlen(p.qq.c_str()) + 1];
strcpy(qq.c_str, p.qq.c_str);
wx = new char[strlen(p.wx.c_str()) + 1];
strcpy(wx.c_str, p.wx.c_str);
address = new char[strlen(p.address.c_str()) + 1];
strcpy(address.c_str, p.address.c_str);
*/
}
Person::Person(string id_in, string name_in, int n_in, string tel_in[], string qq_in, string wx_in, string address_in) :id(id_in)
{
this->name = name_in;
this->n = n_in;
for (int i = 0; i < n; i++)
{
tel[i] = tel_in[i];
}
this->qq = qq_in;
this->wx = wx_in;
this->address = address_in;
next = NULL;
}
void Person::display()
{
cout << getId() << " " << getName() << " " << getQq() << " " << getWx() << " " << getAddress() << endl;
for (int i = 0; i < n; i++)
{
cout << tel[i] << " ";
}
cout << endl;
}
void Person::setTel()
{
for (int i = 0; i < n; i++)
{
cin >> tel[i];
}
}
class Operation
{
private:
Person* personlist;
int num;
int max;
public:
Operation();
Operation(int n);
int getNum()
{
return num;
}
int getMax()
{
return max;
}
Person* getList()
{
return personlist;
}
void add(Person man);
void findPerson(string id);
void modify(string id);
void deletePerson(string id);
void findName(string name);
void print();
~Operation();
};
Operation::Operation()
{
//list->setFirst(new Person());
//list->getFirst()->setNext(NULL);
personlist = NULL;
num = 1;
max = 10;
}
Operation::Operation(int n)
{
//list->setFirst(new Person());
//list->getFirst()->setNext(NULL);
personlist = NULL;
num = 1;
max = n;
}
Operation::~Operation()
{
Person* p;
while (personlist)
{
p = personlist->getNext();
delete personlist;
personlist = p;
}
}
void Operation::print()
{
Person* p;
p = personlist;
while (p != NULL)
{
p->display();
p = p->getNext();
}
}
void Operation::add(Person man)
{
if (num < max)
{
if (personlist == NULL)
{
personlist = &man;
}
else
{
Person* r, * s, * p;
//p = list->getFirst();
p = personlist;
while (p->getNext() != NULL)
{
p = p->getNext();
}
r = p;
s = new Person(man);
r->setNext(s);
r = s;
r->setNext(NULL);
num++;
}
}
else
{
return;
}
}
void Operation::findPerson(string id)
{
Person* p;
//p = list->getFirst()->getNext();
p = personlist;
while (p != NULL && id != p->getId())
{
p = p->getNext();
}
if (p == NULL)
return;
else
{
p->display();
}
}
void Operation::modify(string id)
{
//Person* p = list->getFirst();
Person* p = personlist;
while (p != NULL)
{
if ((p->getId() == id))
{
string name, qq, wx, address;
int n;
cin >> name >> qq >> wx >> address;
cin >> n;
p->setN(n);
p->setTel();
p->setName(name);
p->setQq(qq);
p->setWx(wx);
p->setAddress(address);
break;
}
p = p->getNext();
}
}
void Operation::deletePerson(string id)
{
Person* p, * q, * s;
p = personlist;
//p = list->getFirst()->getNext();
int k = 1;
while (p != NULL && id != p->getId())
{
p = p->getNext();
k++;
}
if (k == 1 && p == personlist)
{
q = personlist->getNext();
delete personlist;
personlist = q;
num--;
return;
}
else if (k == num)
{
s = personlist;
int i = 0;
while (i < k - 2)
{
s = s->getNext();
i++;
}
s->setNext(NULL);
delete p;
num--;
return;
}
else if (p == NULL || p->getNext() == NULL)
return;
else
{
int j = 0;
p = personlist;
//p = list->getFirst();
while (j < k - 2)
{
p = p->getNext();
j++;
}
q = p->getNext();
p->setNext(q->getNext());
delete q;
num--;
}
}
void Operation::findName(string name)
{
//Person* p = list->getFirst();
Person* p = personlist;
int location = -1;
while (p != NULL)
{
location = p->getName().find(name);
if (location >= 0)
{
p->display();
}
p = p->getNext();
}
}
int main()
{
string tel1[1] = { "13863268888" };
string tel2[1] = { "13506325555" };
string tel3[2] = { "15665286666","17866708888" };
string tel4[1] = { "13905389999" };
string tel5[3] = { "18663265678","18805316789","17666718808" };
string tel6[1] = { "18766706776" };
Person p1("370102", "张明", 1, tel1, "1212890", "zm000101", "山东济南历下区");
Person p2("370201", "张强", 1, tel2, "31628976", "wq666", "山东青岛市南区");
Person p3("370402", "胡宇", 2, tel3, "11209160", "hty56789", "山东枣庄市中区");
Person p4("370901", "李梅", 1, tel4, "2721722188", "lm_wechat", "山东泰安泰山区");
Person p5("110106", "张勇", 3, tel5, "99319811", "LiuYong6711", "北京东城区");
Person p6("310106", "张义", 1, tel6, "3312982", "zysh982", "上海黄埔区");
p1.display();
p2.display();
p3.display();
p4.display();
p5.display();
p6.display();
cout << "==============" << endl;
Operation book(8);
book.add(p1);
book.add(p2);
book.add(p3);
book.add(p4);
book.add(p5);
book.add(p6);
cout << endl;
cout << book.getNum() << endl;
book.print();
book.findPerson("370901");
book.findPerson("999999");
book.modify("370102");
book.print();
book.modify("999999");
book.deletePerson("310106");
cout << endl;
cout << book.getNum() << endl;
book.print();
book.findName("胡");
book.findName("张");
book.findName("孙");
}