1.设计原理:
1)类的设计,运用Mytel类和TelManager类的组合关系管理电话号码;在类外定义电话号码的增删查改等功能函数;
2)文件流的操作,用ifstream以输入的方式打开文件加载数据;用ofstream以输出的方式打开文件并保存数据;
3)用到容器vector类似数组表示法表达列表元素的对象;
2.设计步骤:
1)构造一个Mytel类,用来描述单个电话号码;
class Mytel
{
public:
void getdata()
{
cin>>name>>telno;
}
void setname(char a[]){strcpy(name,a);}
void settelno(char a[]){strcpy(telno,a);}
void disp()
{
cout<<name<<setw(12)<<telno<<endl;
}
string getname()
{
return name;
}
string gettelno()
{
return telno;
}
private:
char name[12];
char telno[12];
};
2)设计一个TelManager类,来存多个电话号码。Vector<Mytel> a;//Mytel类向量,长度为零;在类中分别声明具有增、删、查、改等功能的公有成员函数;定义静态成员count来统计电话号码的数量;
class telManager
{
private:
vector<Mytel> a;
static int count; //电话号码数量
public:
void loadfile(); //加载数据
void display(); //输出数据
void search(); //按姓名查询
void add(); //添加数据
void writefile(); //保存数据
void del(); //按姓名删除数据
void modify(); // 按姓名修改号码
};
int telManager::count=0;
3)对类中的函数进行定义;
4)编写主函数,先构建一个菜单,用while(1)作真循环,switch语句中包含case(0-1)的各个功能选择;完成程序的编写;
完整代码如下:
#include<iostream>
#include<fstream>
#include <string>
#include<vector>
#include <iomanip>
#include <cstring>
using namespace std;
class Mytel
{
public:
void getdata()
{
cin>>name>>telno;
}
void setname(char a[]){strcpy(name,a);}
void settelno(char a[]){strcpy(telno,a);}
void disp()
{
cout<<name<<setw(12)<<telno<<endl;
}
string getname()
{
return name;
}
string gettelno()
{
return telno;
}
private:
char name[12];
char telno[12];
};
class telManager
{
private:
vector<Mytel> a;
static int count; //电话号码数量
public:
void loadfile(); //加载数据
void display(); //输出数据
void search(); //按姓名查询
void add(); //添加数据
void writefile(); //保存数据
void del(); //按姓名删除数据
void modify(); // 按姓名修改号码
};
int telManager::count=0;
void telManager::loadfile()
{
ifstream input("phone.txt");
if(!input)
{
cout<<"File cannot be opened."<<endl;
return ;
}
Mytel s;
char name[12],telno[12];
while(input>>name>>telno)
{
s.setname(name);s.settelno(telno);
a.push_back(s);//a[n]=s;
count++;
}
input.close( );
}
void telManager::display()
{
int i;
cout<<"姓名"<<setw(8)<<"电话"<<endl;
for(i=0;i<a.size();i++)
{
cout<<a[i].getname()<<setw(12)<<a[i].gettelno()<<endl;
}
cout<<"电话号码总数为:"<<count<<endl;
}
void telManager::search()
{
string sname;
Mytel one;
int i;
cout<<"输入要查询的姓名(可只输入姓氏):";
cin>>sname;
cout<<"输出查询结果:"<<endl;
cout<<"姓名"<<setw(8)<<"电话"<<endl;
for(i=0;i<a.size();i++)
{
if(a[i].getname()==sname)
a[i].disp( );
}
}
void telManager::add()
{
Mytel one;
cout<<"姓名"<<setw(8)<<"电话"<<endl;
one.getdata();
a.push_back(one);
count++;
}
void telManager::del()
{
string sname;
Mytel one;
cout<<"输入要删除的姓名(可只输入姓氏):";
cin>>sname;
for(int i=0;i<a.size();i++)
{
if(a[i].getname()==sname)
{
a.erase(a.begin()+i);
count--;
}
}
}
void telManager::modify()
{
string sname;
char stelno[12];
Mytel one;
cout<<"输入要修改号码的人的姓名及修改后的号码:";
cin>>sname>>stelno;
for(int i=0;i<a.size();i++)
{
if(a[i].getname()==sname)
{
a[i].settelno(stelno);
}
}
}
void telManager::writefile()
{
int i;
ofstream file("phone.txt" );
for(i=0;i<a.size();i++)
file<<a[i].getname()<<"\t"<<a[i].gettelno()<<endl;
file.close();
}
int main()
{
int sel;
telManager m;
while(1)
{
cout<<"***********************电话薄管理系统**********************";
cout<<endl<<endl;
cout<<"1:加载数据 2:输出数据 3:按姓名查询 4:添加数据" <<endl
<<"5:按姓名删除 6:修改数据 7:保存数据 0:退出"<<endl;
cout<<"***********************************************************";
cout<<"\n请选择(0-7)";
cin>>sel;
switch(sel)
{
case 1:m.loadfile();break;
case 2:m.display();break;
case 3:m.search();break;
case 4:m.add();break;
case 5:m.del();break;
case 6:m.modify();break;
case 7:m.writefile();break;
case 0:exit(1);
}
}
return 0;
}