永发信息网

用C语言编写一个小型的通讯录

答案:2  悬赏:20  手机版
解决时间 2021-02-08 21:49
用C语言编写一个小型的通讯录
最佳答案
#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()
{

}



//功能:从当前通信录移除指定的记录
//注意:该函数重载了基类中的函数
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
//通信录是否为空
const bool empty() const
//清除通信录
virtual void clear()
//获得通信录的第一条记录
Iterator first()
//获得通信录超过最后一个记录之后的迭代器
Iterator pastEnd()
};
#endif //H_ADDRESSLIST_H_AAA
另外,站长团上有产品团购,便宜有保证
全部回答

//没有写查找的,也不知道你准备以什么方式查找。

//以单链表实现

#include <stdio.h> #include <stdlib.h>

void addaddress(struct address *addr);    //添加一个通讯记录 void deleteaddress(struct address *addr);    //删除一个通讯记录 int showaddress(struct address *addr);    //显示通信录 void showhelp(struct address *addr);    //显示帮助信息 void showinformation();    //显示操作信息

struct address    //通讯地址结构     {     char name[20];     char cellphone[12];     char email[50];     struct address *next;     };

int main()

{

struct address *addrp=null;     addrp=(struct address*)malloc(sizeof(struct address));     showhelp(addrp);

}

//添加通讯地址

void addaddress(struct address *addr) {   struct address* newnode=null,*cur=addr,*next=cur->next;   newnode=(struct address*)malloc(sizeof(struct address));   printf("please input your name:\n");   scanf("%s",newnode->name);   printf("please input your cellphone no.:\n");   scanf("%s",newnode->cellphone);   printf("please input your e-mail:\n");   scanf("%s",newnode->email);

 

while(next) {     cur=next;     next=cur->next; } newnode->next=next; cur->next=newnode;

showaddress(addr);

}

//删除通讯地址

void deleteaddress(struct address *addr) {     struct address *cur=addr,*dp=null;     int index;    //要删除的索引     int i=1;     int notempty=0;    //通讯录非空?为0表示通讯录为空。     system("cls");     notempty=showaddress(addr);    //判断通讯录中是否有数据     if(!notempty)     {     printf("there is no data in address list \n");     sleep(3);     system("cls");     showinformation();     return ;     }     printf("please choose which address you want to delete \n");     scanf("%d",&index);

   //寻找到要删除的节点。(即通讯地址记录)

    for(i=1;i<index;i++)     {     cur=cur->next;     }     dp=cur->next;     cur->next=dp->next;     free(dp);     showinformation(); }

//显示通讯录 int showaddress(struct address *addr) {     struct address *cur=addr->next;     int i=0;     if(!cur)     {     printf("no information in address list\n");     return 0;     }     while(cur)     {     i++;     printf("[%d]:\n",i);     printf("name=%s\n",cur->name);     printf("cellphone=%s\n",cur->cellphone);     printf("email=%s\n",cur->email);     cur=cur->next;     }     return i; }

//帮助操作 void showhelp(struct address *addr) {     int i;     showinformation();     while(1)     {     scanf("%d",&i);     switch (i)     {     case 0:     return ;     case 1:     showaddress(addr);     break;     case 2:     addaddress(addr);     break;     case 3:     deleteaddress(addr);     break;     case 4:     system("cls");     showinformation();     break;     }     }

}

//显示操作信息 void showinformation() {     printf("you can do these operations:\n");     printf("0 quit this program\n");     printf("1 show the address list\n");     printf("2 add an address to the address list\n");     printf("3 delete an address from the address list\n");     printf("4 to clear the screen and show help \n"); }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
平安停车场(236省道)地址在哪,我要去那里办
描写每个季节大海的句子(4句),不要古诗
新加坡和马来西亚说粤语多,还是普通话多?
清真麻辣火锅鸡这个地址在什么地方,我要处理
解释纳米粒子吸收光谱蓝移和红移的原因。
秋丛绕舍似陶家,遍绕篱边日渐斜。猜一动物
牙齿矫正价格
武汉淘动天下科技有限公司怎么样??靠谱吗?
肃南县民族贸易有限责任公司利民店地址在什么
平顶山教育学院停车场(凌云路与曙光街交叉口
公司安排你带一名实习生,一段时间后,你发现
日本清水寺第八十签文: 深山多养道 忠正帝王
市政大厦停车场(市政大楼东西路与怀仁路交叉
DNF怎样以管理员的身份进入
请问北理法硕非法学就业怎么样
推荐资讯
天通银指价建仓单如何设置
农村平房地基沉降不匀怎么处理好
惠文陶瓷生活馆怎么去啊,有知道地址的么
中英《南京条约》规定:议定英国驻中国之总管
向第三人履行合同,合同解除后,第三人需要列
为什么有些酒店的入住时间为下午3点之后,退
美天淘地址有知道的么?有点事想过去
临渊鱼儿家境很好吗
快速提高数学基础题的正确率?
单选题水在生物体内是一种良好的溶剂,是各种
广州街头很多女孩子把头用薄纱巾蒙起来是什么
心情烦,我给老板说不做了,然后有点后悔,该怎
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?