回 帖 发 新 帖 刷新版面

主题:学生通讯录

《学生通讯录》,请教各路高手,用Turbo C++ 3.0来完成,多谢!!! 

回复列表 (共3个回复)

沙发

#include <iostream> 
#include <string> 
#include "address.h" 
#include "addressList.h" 
#include "addressBook.h" 
using namespace std; 
int main() 

new AddressBook; //开启通信录 
return 0; 

ostream& operator<<(ostream& os, const RecordList& c_rl) 

RecordList::const_iterator it; 
RecordList::const_iterator it_end =c_rl.end(); 
for (it=c_rl.begin();it!=it_end; it++) 

os << (*it)->name << '\n' << (*it)->tel << '\n'; 

return os; 

istream& operator>> (istream& is, RecordList& rl) 

Record* rec; 
string name; 
while (true) 


//注意这里使用的是全局的getline()函数,而不是istream的成员函 
//数.全局的getling()函数将从istream中取出最后一个分隔符, 
//而istream的成员函数getline则不会 
getline(is,name); 
if (name =="") 
break; 
rec = new Record; 
rec->name=name; 
getline(is,rec->tel ); 
rl.push_back(rec); 

return is; 




#include<stdlib.h> 
#include<fstream> 
#include "addressBook.h" 

using namespace std; 

AddressBook::AddressBook() 

isModified = false; 
start(); 


AddressBook::~AddressBook() 



//功能:显示欢迎画面,并开始进行用户交互处理 
void AddressBook::start() 

cout<<"\n" 
<<"\t******************************\n" 
<<"\t* 这是一个 *\n" 
<<"\t* 简单的通信录程序 *\n" 
<<"\t* 可以对通信录进行简单管理 *\n" 
<<"\t* 欢迎使用通信录 *\n" 
<<"\t******************************\n" 
<<"\n"; 
handleMenu(); 


//功能:显示通信录菜单,返回用户选择的选项 
//返回:用户选择的选项,是1-9之间的一个字符 

char AddressBook::menuSelect() 

cout<<"\n" 
<<"1.显示记录\n" 
<<"2.查询记录\n" 
<<"3.增加记录\n" 
<<"4.删除记录\n" 
<<"5.保存记录\n" 
<<"6.读取记录\n" 
<<"7.新建记录\n" 
<<"8.结束运行\n" 
<<"\n左边数字对应功能选择,请选1-8:"; 
char choice[2]; 
while(true) 

cin.getline(choice,2); 
if(choice[0]<'1' || choice[0]>'8') 
cout<<"\n输入错误,重选1-8:"; 
else 
break; 

return choice[0]; 


//功能:根据用户选择的项目调用相应的处理函数 
void AddressBook::handleMenu() 

while(true) 

switch(menuSelect()) 

case '1': 
displayRecords(); 
break; 
case '2': 
queryRecord(); 
break; 
....... 


//功能:打印用于显示记录信息时的表头 
void AddressBook::dispTable() 




//功能:显示通信录中的所有记录 
void AddressBook::displayRecords() 




//功能:首先检查通信录是否已保存,然后清空当前通信录中所有记录 
//注意:该函数覆盖了基类中的函数 
void AddressBook::clear() 



//功能:查询指定记录 
void AddressBook::queryRecord() 



//功能:向当前通信录追加新的记录 
//注意:该函数重载了基类中的函数 
void AddressBook::addRecord() 




/* 

//说明:如果使用string 类,效果更好。下面是实现本功能的程序代码: 
while(true) 

//输入新记录 
string name; 
cout<<"姓名:"; 
getline(cin,name); 
//如果输入的姓名为“0”,则结束添加记录的操作 
if(name=="0") 
break; 
Record* rec=new Record; 
rec->name=name; 
cout<<"电话:"; 
getline(cin,rec->tel); 
//将新记录加入链表 
AddressList::addRecord(rec); 


//同理,下面的成员函数removeRecord()中的判断,可以使用如下替代方法: 
string str; 
getline(cin,str); 
while(true) 

if(str[0]!='1' && str[0]!='2') 

cout<<"输入错误,重选1-2:"; 
getline(cin,str); 

else 
break; 




*/ 

//功能:从当前通信录移除指定的记录 
//注意:该函数重载了基类中的函数 
void AddressBook::removeRecord() 

if(empty()) 

cout<<"通信录已空,退出删除操作!"<<endl; 
return; 

//选择获取需要删除的记录的方式 
cout<<"可以通过姓名或电话删除记录\n" 
<<"1.通过姓名\n" 
<<"2.通过电话\n"; 
char choice[2]; 
cin.getline(choice,2); 
while(true) 

if(choice[0]!='1' && choice[0]!='2') 

cout<<"输入错误,重选1-2:"; 
cin.getline(choice,2); 

else 
break; 

int type=static_cast<int>(choice[0])-48; 
//输入需要匹配的字符串 
if(type==1) 
cout<<"请输入姓名:"<<flush; 
else 
cout<<"请输入电话:"<<flush; 
char pattern[20]; 
cin.getline(pattern,20); 
int deletedCount=0; 
//找到匹配的记录 
Iterator it=findRecord(pattern,type,first()); 
Iterator it_end=pastEnd(); 
while(it!=it_end) 

cout<<"找到一条匹配的记录:\n"; 
dispTable(); 
cout<<(*it)->name<<"\t\t"<<(*it)->tel<<"\n"; 
cout<<"确定要删除这条记录吗?[Y/N]"; 
cin.getline(choice,2); 
//删除这条记录 
if(choice[0]!='n' && choice[0]!='N') 

it=AddressList::removeRecord(it); 
deletedCount++; 

//取下一条匹配的记录 
if(it!=it_end) 
it=findRecord(pattern,type,++it); 

cout<<"一共删除了"<<deletedCount<<"条记录\n" 
<<"现在还有"<<size()<<"条记录"<<endl; 
if(deletedCount!=0) 
isModified=false; 


//功能:将通信录保存至指定文件 
//注意:该函数重载了基类中的函数 
void AddressBook::saveRecords() 

if(empty()) 

cout<<"没有记录可存!"<<endl; 
return; 

//因为下面的程序中使用string类的成员函数,所以需要进行一次转换 
string fname; 
char name[16]; 
cout<<"请输入要存在的文件名(直接回车选择文件sname):"; 
cin.getline(name,16); 
fname=name; 
if(fname.empty()) 
fname="sname"; 
ofstream of(fname.c_str(),ios_base::out); 
if(!of) 

cout<<"不能存入文件!"<<endl; 
return; 

AddressList::saveRecords(of); 
of.close(); 
cout<<size()<<"条记录已经存入文件,请继续操作。"<<endl; 
isModified=false; 

//功能:从指定文件读取记录追加到当前通信录末尾 
//注意:该函数重载了基类中的函数 
void AddressBook::loadRecords() 



void AddressBook::quit() 

















板凳

#ifndef H_ADDRESSBOOK_H_NNN 
#define H_ADDRESSBOOK_H_NNN 
#include "addressList.h" 

//处理通信录操作的面向用户使用的类,包含所有功能的用户界面及用户交互的实现 
class AddressBook :public AddressList 

protected: 
bool isModified; //通信录是否已被修改还未保存 
public: 
AddressBook(); 
virtual ~AddressBook(); 

//开始通信录的用户界面操作 
virtual void start(); 
//菜单处理函数 
virtual void handleMenu(); 
//显示记录 
virtual void displayRecords(); 
//查询记录 
virtual void queryRecord(); 
//增加记录 
virtual void addRecord(); 
//删除记录 
virtual void removeRecord(); 
//保存记录 
virtual void saveRecords(); 
//读取记录 
virtual void loadRecords(); 
//结束程序 
virtual void quit(); 
//清空当前通信录 
virtual void clear(); 
protected: 
//菜单选择函数 
char menuSelect(); 
//显示表头 
void dispTable(); 
}; 
#endif //H_ADDRESSBOOK_HZ-NNN 

#include "addressList.h" 
AddressList::~AddressList() 

recList.clear(); 

//功能:向通信录中添加新的记录 
//参数:rec,指向新记录的指针 
void AddressList::addRecord (Record* rec) 

if (rec !=NULL) 

recList.push_back(rec); 


//功能:从通讯录中删除一个记录 
//参数:it,指向欲删除记录的迭代器 
//注意:it,应是可提领的迭代器,可以通过findRecord()获得 
AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it) 

return recList.erase(it); 

//功能:从通信录中寻找一个记录 
//参数:pattern,欲寻找的记录的指定域与pattern相等 
// type,为1表示欲寻找记录的名称(name)与pattern相等; 

// 为2表示欲寻找记录的电弧(tel)与(pattern)相等。 
// from,从from开始寻找匹配的记录。 
//返回:若找到了则返回的迭代器指向第一个匹配记录的迭代器, 
// 若找不到则返回的迭代器等于pastEnd()的返回值。 
//注意:from应是可提领的迭代器。 
// 第一次调用可以用first(),之后使用上一次findRecord()的返回值增1, 
// 直到返回pastEnd(),便可以获得所有匹配的记录。 

AddressList::Iterator AddressList::findRecord(string pattern,int type,AddressList::Iterator from) 

Iterator it; 
Iterator it_end=recList.end(); 
for (it=from; it!=it_end; it++) 

if ((type==1 && (*it)->name==pattern)||(type==2 && (*it)->tel==pattern)) 
break; 

return it; 


//功能:将通信录保存到输出流中 
//参数:os.指定的输出流 
void AddressList::saveRecords(ostream &os) 

os << recList; 

//功能:从输入流中读入数据并追加到当前通信录的末尾 
//参数:is,指定的输入流 
//返回:读入的记录数 
int AddressList::loadRecords(istream &is) 

int ori =size(); 
is >> recList; 
return size()-ori; 



#ifndef H_ADDRESSLIST_H_AAA 
#define H_ADDRESSLIST_H_AAA 


#include <iostream> 
#include <string> 
#include "address.h" 


using namespace std; 

//处理通信录操作的底层类,包括增加记录、删 
//除记录、查询记录以及保存和读取记录的函数, 
//该类不涉及任何关于用户界面的操作 
class AddressList 

protected: 
RecordList recList;// 使用对象成员作为数据成员 
public: 
typedef RecordList::iterator Iterator; 
//向通信录中添加新的记录 
virtual void addRecord(Record* rec); 
//从通信录中删除一个记录 
virtual Iterator removeRecord(Iterator it); 
//从通讯录中寻找一个记录 
virtual Iterator findRecord(string pattern,int type,Iterator from); 
//将通信录保存到输出流中 
virtual void saveRecords(ostream& os); 
//从输入流中读入数据并追加到当前通信录的末尾 
virtual int loadRecords(istream& is); 
virtual ~AddressList(); 
//获得通信录中存储的记录数 
const int size() const {return (int)recList.size();} 
//通信录是否为空 
const bool empty() const {return recList.empty();} 
//清除通信录 
virtual void clear() {recList.clear();} 
//获得通信录的第一条记录 
Iterator first(){return recList.begin();} 
//获得通信录超过最后一个记录之后的迭代器 
Iterator pastEnd() {return recList.end();} 
}; 
#endif //H_ADDRESSLIST_H_AAA

3 楼

抄的  我也正在学习呢

我来回复

您尚未登录,请登录后再回复。点此登录或注册