您的位置:首页 > 编程语言 > C语言/C++

C++写的书上一个简单的电话薄程序

2013-11-20 09:50 507 查看
//TelephoneBookMain.cpp文件
#include "Address.h"
#include "AddressBook.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

int MenuSelect(void);
int main()
{
char g_choice;
AddressBook g_maillist;
for(;;)
{
//循环,直到键盘输入结束代码
g_choice = MenuSelect();
switch(g_choice)
{
case 1:
g_maillist.Enter();
break;
case 2:
g_maillist.Erase();
break;
case 3:
g_maillist.List();
break;
case 4:
g_maillist.Save();
break;
case 5:
g_maillist.Load();
break;
case 6:
exit(0);
}
}
return 0;
}
int MenuSelect(void)
{
//显示主菜单
char c;
cout<<"******************************************"<<endl;
cout<<"*     模拟电话薄       v1.0              *"<<endl;
cout<<"*     1.添加通讯录                       *"<<endl;
cout<<"*     2.删除通讯录                       *"<<endl;
cout<<"*     3.显示通讯录                       *"<<endl;
cout<<"*     4.电话薄存盘                       *"<<endl;
cout<<"*     5.读出电话薄                       *"<<endl;
cout<<"*     6.退出                             *"<<endl;
cout<<"******************************************"<<endl;
cout<<"请输入(1~6):"<<endl;
do
{
//键盘输入循环
cin.get(c);
} while (c < '1' || c > '6');
return c - '0';
}

//Address.h文件
#ifndef ADDRESS_H
#define ADDRESS_H

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
// 通讯录类
class Address
{

public:
Address(){m_status = true;}//构造时清空通讯录
~Address(){}
string GetName() const;
string GetPhone() const;
void Enter(string &name, string &phone); //输入通讯录
bool IsEmptry();
void Set();  //置通讯录状态0,非空
void Clear();//置通讯录状态1,空
private:
char m_name[31];
char m_phone[21];
bool m_status;  //通讯录状态,true表示空,false表示该通讯录已经被占用
};

#endif

//AddressBook.h文件
#ifndef   ADDRESS_BOOK_H
#define  ADDRESS_BOOK_H

#include "Address.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

const int ItemNum = 100;  //通讯录最大数量
//电话薄类
class AddressBook
{
public:
AddressBook(){m_num = 0;}//构造函数,对象创建时通讯薄为空
~AddressBook(){}
void Enter();   //输入通讯录条目
void Erase();   //删除通讯录条目
void Load();    //从文件中读取电话薄的内容
void Save();    //电话薄存盘
void List();    //显示电话薄的内容
private:
int m_num;      //通讯录条目数
Address Item[ItemNum]; //通讯录
int FineFree(); //查找空的通讯录
};

#endif

//Address.cpp文件
#include "Address.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

string Address::GetName() const
{
string s = m_name;
return s;
}

string Address::GetPhone() const
{
string s = m_phone;
return s;
}

void Address::Enter(string &name, string &phone)
{
int len = name.length();
if (len > 30)   //输入超长时截断
{
len = 30;
}
name.copy(m_name, len, 0);
m_name[len] = 0;  //字符串结束符,把string转换成char*
len = phone.length();
if (len > 20)   //输入超长时截断
{
len = 20;
}
phone.copy(m_phone, len, 0);
m_phone[len] = 0; //字符串结束符,把string转换成char*
}

bool Address::IsEmptry()
{
return m_status;
}

void Address::Set()//置通讯录状态0,非空
{
m_status = false;
}

void Address::Clear()//置通讯录状态1,空
{
m_status = true;
}

//AddressBook.cpp文件
#include "Address.h"
#include "AddressBook.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

int AddressBook::FineFree()
{
int t;
for(t=0; t<ItemNum; t++)
{
if (Item[t].IsEmptry())
{
return t;
}
}
return -1; //电话薄已记满
}

void AddressBook::Enter()
{
string name, phone;
int pointer;
pointer = FineFree();
if (-1 == pointer)
{
cout << "电话薄已记满";
}
else
{
cout << "电话薄中有" <<  m_num << "条通信录" <<endl;
cout << "输入姓名: ";
cin >> name;
cout << "输入电话号码: ";
cin >> phone;
Item[pointer].Enter(name, phone);
Item[pointer].Set();
m_num++;
}
}

void AddressBook::Erase()
{
int t;
string s;
cout << "电话薄中有" << m_num << "条通讯录" <<endl;
if (!m_num)
{
cout << "电话薄已空!" <<endl;
}
else
{
cout << "输入姓名: ";
cin >>s;
for(t=0; t<ItemNum; t++)
{
if (!Item[t].IsEmptry() && Item[t].GetName() == s)
{
Item[t].Clear();
m_num--;
cout << "已经删除" << s << "的通讯录。" <<endl;
break;
}
}
if (ItemNum == t)
{
cout << "该名字不存在" <<endl;
cin.get();
}
}
}

ostream &operator << (ostream &output, const Address &addr)
{
//重载 << ,直接用cout输出通讯录
output << setiosflags(ios::left) <<setw(31)
<< addr.GetName() <<setw(21) << addr.GetPhone();
return output;
}

void AddressBook::List()
{
int t,i,j;
Address list[ItemNum], temp;
if (!m_num)
{
cout << "电话薄已空!" << endl;
}
else
{
cout << "电话薄中有" << m_num << "条通讯录" <<endl;
for(t=0; t<ItemNum; t++)
{
list[t] = Item[t];
}
for(i=0; i<ItemNum; i++)
{
//排序
for(j=ItemNum - 1; j>i; j--)
{
if (list[j-1].GetName() > list[j].GetName())
{
temp = list[j-1];
list[j-1] = list[j];
list[j] = temp;
}
}
}
cout << setiosflags(ios::left) <<setw(31)
<< "姓名" << setw(21) << "电话" <<endl;
for(t=0; t<ItemNum; t++)
{
if (!list[t].IsEmptry())
{
cout << list[t] <<endl;
}
}
} //end else
}

void AddressBook::Save()
{
ofstream file;
int i;
char fname[41];
cout << "输入保存的文件名: " ;
cin >>fname;
file.open(fname, ios::out);
if (!file)
{
cout << "打开文件失败!" <<endl;
cin.get();
}
else
{
for(i=0; i<ItemNum; i++)
{
if (file && !file.eof())
{
file.write(reinterpret_cast < const char * >(&Item[i]),sizeof(Address));
}
}
file.close();
}//end else
}

void AddressBook::Load()
{
ifstream file;
int i;
char fname[41];
cout << "输入读取的文件名: ";
cin >> fname;
file.open(fname, ios::in);
if (!file)
{
cout << "打开文件失败!" <<endl;
cin.get();
}
else
{
m_num = 0;
for (i=0; i<ItemNum; i++)
{
if (file && !file.eof())
{
file.read(reinterpret_cast <char *> (&Item[i]), sizeof(Address));
}
if (!Item[i].IsEmptry())
{
m_num++;
}
}
file.close();
}//end else
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++