人员通讯录教材1、问题描述编写一个简单的通讯录管理程序。通讯录记
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//person.h #include<iostream> #include<fstream> using namespace std;
enum Item {
It_name, It_province, It_city, It_street, It_phone_num, It_postaddr };
class Person { public:
百度文库
strcpy(m_province,province); strcpy(m_city,city); strcpy(m_street,street); strcpy(m_phone_num,phone_num); m_postaddr=postaddr;
}
void Phonebook::add_person(char*name1,char*province1,char*city1,char*street1,char*phone_num1,int postaddr1) {
} else {
temp->p.set_item(name1,province1,city1,street1,phone_num1,postaddr1); temp->next=head; head=temp;
return; } }
//overload << of Person ostream & operator<< (ostream & stream, Person & p) {
作,指针操作,对输入进行了异常处理。 由 Phbok 类实现所有的功能,其不同的函数实现不同的功能: 1)添加:由 add 函数完成,数据从标准输入读取 2)显示:由 show 函数完成,输出 6 条记录后暂停输出,按任一键继续输出 3)存储:由 store 函数完成,用到了重载的输出运算符>> 4)装入:由 input 函数完成,函数中用到了 skipws 跳过多余的空白字符 5)查询:由 search 函数完成,挨个节点搜索链表,若搜到则将节点移至链表头 6)修改:由 modify 函数完成,根据用户输入的姓名搜索联系人,若找到多个同名的联
~Person();
public: char* m_name; char* m_province; char* m_city; char* m_street; char* m_phone_num; unsigned long m_postaddr;
};
struct element {
Person p; element* next; element() {
注意:测试数据中应考虑到人员可以同名的情况。
2、问题解析 � 方法一: 程序中使用自定义类 Person 存储通讯录中单条记录的信息(一个联系人的所有信息),
Phbok 类表示通讯录,通讯录存储在无头节点的链表中,链表节点为结构体 element。 所使用知识点为:类,枚举类型,文件流操作,运算符重载(>>),链表,字符串操
contact(); bool OpenFile( std::string fileName ); bool SaveAs( std::string fileName ); bool Add(); bool Delete(); bool Find(); bool Print(); bool Clear(); int size(); 应用程序中包含 Main 函数和菜单选择函数 Option。 该程序还对通讯录进行了一些扩展,如对通讯录里的成员进行分组,如:家人、朋友、 同事及其他。
next=0; } };
typedef element* Node;
class Phonebook { public:
Node head; public:
Phonebook() { head=NULL;
} void add_person(char*name1=0,char*province1=0,char*city1=0,char*street1=0,char*phone_num=0,int
系人,则再让用户选择要修改的联系人,选好联系人后可选择不同的项进行修改 Phbok 类中 move_to_head 函数用于将链表中的节点移至链首,center 函数用于提供用户
操作接口。 main 函数实现创建通讯录、编辑通讯录和退出程序三个功能。
� 方法二: 程序中使用结构 contactData 存储通讯录中单条记录的信息(一个联系人的所有信息), 构造类 contact 表示通讯录,contact 中用一个数组 std::vector<contactData> cData 表示通讯录, 在 contact 中定义相关操作,从而实现通讯录功能,如: private: bool parse( std::string str ); void FindName(); void FindGroup(); void findOption(); public:
Person(); void set_item(char*name,char*province,char*city,char*street,char*phone_num,int postaddr); friend ostream& operator << (ostream& stream, Person& p); void modify_item(Item it);
};
//phonebook.cpp #include<cstdlib> #include<cstring> #include<iomanip> #include<fstream> #include<conio.h> #include"person.h" using namespace std; static int stn=0;
Node temp;
do { temp=new element;
} while(!temp);
if(name1==0)//若姓名为空则提示用户输入信息 {
char*name1=new char[20]; char*province1=new char[20]; char*city1=new char[20]; char*street1=new char[20]; char*phone_num1=new char[20]; cout<<"姓名 省份 城市 街道 电话号码 邮政编码\n"; cin>>name1>>province1>>city1>>street1>>phone_num1>>postaddr1; temp->p.set_item(name1,province1,city1,street1,phone_num1,postaddr1); temp->next=head; head=temp; delete name1; delete province1; delete city1; delete street1; delete phone_num1; return;
Person::Person() {
m_name=0; m_province=0; m_city=0; m_street=0; m_phone_num=0; m_postaddr=0; }
Person::~Person() {
if(m_name!=0) delete m_name;
if(m_province!=0) delete m_province;
� 方法三: 程序创建一个 Person 类,表示通讯录的每条记录,将每条记录的指针存储在 STL 中的 list 容器中。 所使用知识点为:类,文件流操作,运算符重载(>>),STL 中的容器和迭代器,字 符串操作。 1) void inputfromfile(char*file_name,list<Person*> &list2)//从文件读入通讯录 2) void outputtoscreen(list<Person*> list3)//输出通讯录到屏幕 3) void insertfromscreen(list<Person*> &list2,char*file_name)//从屏幕读入时将一条记
人员通讯录
1、问题描述
编写一个简单的通讯录管理程序。通讯录记录有姓名,地址(省、市(县)、街道),电 话号码,邮政编码等四项。
程序应提供的基本管理功能有: 1)添加:即增加一个人的记录到通讯录中。 2)显示:即在屏幕上显示所有通讯录中的人员信息,应能分屏显示。 3)存储:即将通讯录信息保存到一个文件中。 4)装入:即将文件中的信息读入程序。 5)查询:可根据姓名查找某人的相关信息,若找到显示其心目、地址、电话号码和邮 政编码。 6)修改:可修改一个人的除姓名外其他信息。
//修改联系人的信息 void Person::set_item(char*name,char*province,char*city,char*street,char*phone_num,int postaddr) {
m_name=new char[strlen(name)+1]; m_province=new char[strlen(province)+1]; m_city=new char[strlen(city)+1]; m_street=new char[strlen(street)+1]; m_phone_num=new char[strlen(phone_num)+1]; strcpy(m_name,name);
stream.setf(ios::left); stream<<p.m_name<<" "<<p.m_province<<" "<<p.m_city<<" "<<p.m_street<<" "<<p.m_phone_num<<" "<<p.m_postaddr; return stream; }
if(m_city!=0) delete m_city;
if(m_street!=0) delete m_street;
if(m_phone_num!=0) delete m_phone_num;
}
void Person::modify_item(Item it) {
char * item; switch(it) { case It_name:
item=m_name; break; case It_province: item=m_province; break; case It_city: item=m_city; break; case It_street: item=m_street; break; case It_phone_num: item=m_phone_num; break; default: item=NULL; }; if(!item) return; char * temp = new char[20]; cin>>temp; if(item!=0) delete item; item=new char[strlen(temp)+1]; strcpy(item,temp); delete temp; }
录插入到文件末端 4) int search(char* name,list<Person*> &list2)//输入姓名,从已有通讯录查找 5) int modify(char* name,list<Person*> &list2)//修改已有记录,可逐项修改 Main 函数进行流程控制
3、示例程序 方法一:
postadd=0); void save_to_file(char*file_name=0); Node search(Node start,char* name,int &count,int ndo=0,int mshow=1); void display(); void load_from_file(char*file_name=0); void modify_person(char* name); void move_to_head(Node moved); void opt_center(); ~Phonebook();
enum Item {
It_name, It_province, It_city, It_street, It_phone_num, It_postaddr };
class Person { public:
百度文库
strcpy(m_province,province); strcpy(m_city,city); strcpy(m_street,street); strcpy(m_phone_num,phone_num); m_postaddr=postaddr;
}
void Phonebook::add_person(char*name1,char*province1,char*city1,char*street1,char*phone_num1,int postaddr1) {
} else {
temp->p.set_item(name1,province1,city1,street1,phone_num1,postaddr1); temp->next=head; head=temp;
return; } }
//overload << of Person ostream & operator<< (ostream & stream, Person & p) {
作,指针操作,对输入进行了异常处理。 由 Phbok 类实现所有的功能,其不同的函数实现不同的功能: 1)添加:由 add 函数完成,数据从标准输入读取 2)显示:由 show 函数完成,输出 6 条记录后暂停输出,按任一键继续输出 3)存储:由 store 函数完成,用到了重载的输出运算符>> 4)装入:由 input 函数完成,函数中用到了 skipws 跳过多余的空白字符 5)查询:由 search 函数完成,挨个节点搜索链表,若搜到则将节点移至链表头 6)修改:由 modify 函数完成,根据用户输入的姓名搜索联系人,若找到多个同名的联
~Person();
public: char* m_name; char* m_province; char* m_city; char* m_street; char* m_phone_num; unsigned long m_postaddr;
};
struct element {
Person p; element* next; element() {
注意:测试数据中应考虑到人员可以同名的情况。
2、问题解析 � 方法一: 程序中使用自定义类 Person 存储通讯录中单条记录的信息(一个联系人的所有信息),
Phbok 类表示通讯录,通讯录存储在无头节点的链表中,链表节点为结构体 element。 所使用知识点为:类,枚举类型,文件流操作,运算符重载(>>),链表,字符串操
contact(); bool OpenFile( std::string fileName ); bool SaveAs( std::string fileName ); bool Add(); bool Delete(); bool Find(); bool Print(); bool Clear(); int size(); 应用程序中包含 Main 函数和菜单选择函数 Option。 该程序还对通讯录进行了一些扩展,如对通讯录里的成员进行分组,如:家人、朋友、 同事及其他。
next=0; } };
typedef element* Node;
class Phonebook { public:
Node head; public:
Phonebook() { head=NULL;
} void add_person(char*name1=0,char*province1=0,char*city1=0,char*street1=0,char*phone_num=0,int
系人,则再让用户选择要修改的联系人,选好联系人后可选择不同的项进行修改 Phbok 类中 move_to_head 函数用于将链表中的节点移至链首,center 函数用于提供用户
操作接口。 main 函数实现创建通讯录、编辑通讯录和退出程序三个功能。
� 方法二: 程序中使用结构 contactData 存储通讯录中单条记录的信息(一个联系人的所有信息), 构造类 contact 表示通讯录,contact 中用一个数组 std::vector<contactData> cData 表示通讯录, 在 contact 中定义相关操作,从而实现通讯录功能,如: private: bool parse( std::string str ); void FindName(); void FindGroup(); void findOption(); public:
Person(); void set_item(char*name,char*province,char*city,char*street,char*phone_num,int postaddr); friend ostream& operator << (ostream& stream, Person& p); void modify_item(Item it);
};
//phonebook.cpp #include<cstdlib> #include<cstring> #include<iomanip> #include<fstream> #include<conio.h> #include"person.h" using namespace std; static int stn=0;
Node temp;
do { temp=new element;
} while(!temp);
if(name1==0)//若姓名为空则提示用户输入信息 {
char*name1=new char[20]; char*province1=new char[20]; char*city1=new char[20]; char*street1=new char[20]; char*phone_num1=new char[20]; cout<<"姓名 省份 城市 街道 电话号码 邮政编码\n"; cin>>name1>>province1>>city1>>street1>>phone_num1>>postaddr1; temp->p.set_item(name1,province1,city1,street1,phone_num1,postaddr1); temp->next=head; head=temp; delete name1; delete province1; delete city1; delete street1; delete phone_num1; return;
Person::Person() {
m_name=0; m_province=0; m_city=0; m_street=0; m_phone_num=0; m_postaddr=0; }
Person::~Person() {
if(m_name!=0) delete m_name;
if(m_province!=0) delete m_province;
� 方法三: 程序创建一个 Person 类,表示通讯录的每条记录,将每条记录的指针存储在 STL 中的 list 容器中。 所使用知识点为:类,文件流操作,运算符重载(>>),STL 中的容器和迭代器,字 符串操作。 1) void inputfromfile(char*file_name,list<Person*> &list2)//从文件读入通讯录 2) void outputtoscreen(list<Person*> list3)//输出通讯录到屏幕 3) void insertfromscreen(list<Person*> &list2,char*file_name)//从屏幕读入时将一条记
人员通讯录
1、问题描述
编写一个简单的通讯录管理程序。通讯录记录有姓名,地址(省、市(县)、街道),电 话号码,邮政编码等四项。
程序应提供的基本管理功能有: 1)添加:即增加一个人的记录到通讯录中。 2)显示:即在屏幕上显示所有通讯录中的人员信息,应能分屏显示。 3)存储:即将通讯录信息保存到一个文件中。 4)装入:即将文件中的信息读入程序。 5)查询:可根据姓名查找某人的相关信息,若找到显示其心目、地址、电话号码和邮 政编码。 6)修改:可修改一个人的除姓名外其他信息。
//修改联系人的信息 void Person::set_item(char*name,char*province,char*city,char*street,char*phone_num,int postaddr) {
m_name=new char[strlen(name)+1]; m_province=new char[strlen(province)+1]; m_city=new char[strlen(city)+1]; m_street=new char[strlen(street)+1]; m_phone_num=new char[strlen(phone_num)+1]; strcpy(m_name,name);
stream.setf(ios::left); stream<<p.m_name<<" "<<p.m_province<<" "<<p.m_city<<" "<<p.m_street<<" "<<p.m_phone_num<<" "<<p.m_postaddr; return stream; }
if(m_city!=0) delete m_city;
if(m_street!=0) delete m_street;
if(m_phone_num!=0) delete m_phone_num;
}
void Person::modify_item(Item it) {
char * item; switch(it) { case It_name:
item=m_name; break; case It_province: item=m_province; break; case It_city: item=m_city; break; case It_street: item=m_street; break; case It_phone_num: item=m_phone_num; break; default: item=NULL; }; if(!item) return; char * temp = new char[20]; cin>>temp; if(item!=0) delete item; item=new char[strlen(temp)+1]; strcpy(item,temp); delete temp; }
录插入到文件末端 4) int search(char* name,list<Person*> &list2)//输入姓名,从已有通讯录查找 5) int modify(char* name,list<Person*> &list2)//修改已有记录,可逐项修改 Main 函数进行流程控制
3、示例程序 方法一:
postadd=0); void save_to_file(char*file_name=0); Node search(Node start,char* name,int &count,int ndo=0,int mshow=1); void display(); void load_from_file(char*file_name=0); void modify_person(char* name); void move_to_head(Node moved); void opt_center(); ~Phonebook();