//项目一:电话簿
//有个父类Book,有成员变量:书本的名字,书本的路径,有4个纯虚函数,分别是增删查改。类PhoneBook继承了类Book,并扩展了电话号码,姓名,扩展了登陆接口,实现了父类的4个纯虚函数。数据信息使用文本的方式存储!
#include <iostream>
using namespace std;
#include <string>
#include <stdlib.h>
#include <fstream>
#include <vector>
#include <time.h>
class Book
{
private:
string _bookname;//书名
string _bookpath;//当前文件的路径
public:
void setbookname(string name)
{
_bookname = name;
}
string getbookname()
{
return _bookname;
}
void setpath(string path)
{
_bookpath = path;
}
string path()
{
return _bookpath;
}
//定义四个增删查改的纯虚函数
virtual void add() = 0;
virtual void del(string &name) = 0;
virtual void sel(string &name) = 0;
virtual void alt(string &name) = 0;
};
class PhoneBook:public Book
{
private:
string _phoneNumber;//电话号码
string _name;//姓名
public:
PhoneBook(){};
void setphonenumber(string phonenumber)
{
_phoneNumber=phonenumber;
}
string getphonenumber()
{
return _phoneNumber;
}
void setname(string name)
{
_name=name;
}
string getname()
{
return _name;
}
void add(){};
void del(string &name){};
void sel(string &name){};
void alt(string &name){};
};
typedef struct PB
{
string name;
string tel;
string bookname;
}PB;
PB phonebook[20];
int num=0;
class ManagePhoneBook:public PhoneBook
{
public:
int total;//总记录数
vector<PhoneBook> PhoneBook;
//添加
void add()
{
char f='y';
string sTemp;
ofstream onfile;//写入文件类
//onfile.open("phonebook.txt",ios::out|ios::app);
onfile.open("phonebook.txt");
do {
cout<<"输入姓名:";
cin>>sTemp;
phonebook[num].name = sTemp;
onfile<<sTemp<<" ";
cout<<"输入电话号码:";
cin>>sTemp;
phonebook[num].tel = sTemp;
onfile<<sTemp<<" ";
cout<<"输入喜欢的书籍:";
cin>>sTemp;
phonebook[num].bookname = sTemp;
onfile<<sTemp<<" "<<"\n";
num++;
cout<<"还要输出吗?y/n"<<endl;
cin>>f;
} while (f=='y');
onfile.close();
}
//根据姓名删除
void del(string &name,int &num1)
{
ofstream onfile;//写入文件类
onfile.open("phonebook.txt");
int i;
int j=0;
for (i=0; i<num1; i++) {
if (phonebook[i].name == name) {
for (j=i; j<num1-1; j++) {
phonebook[j]=phonebook[j+1];
}
num1--;
i--;
cout<<"删除成功!"<<endl;
}
}
//重写到文件
for (int i=0; i<num1; i++) {
onfile<<phonebook[i].name<<" "<<phonebook[i].tel<<" "<<phonebook[i].bookname<<"\n";
}
onfile.close();
}
//根据姓名查询
void sel(string &name,int &num1)
{
int i;
int j=0;
cout<<"------------------------------------\n";
cout<<" 姓名 电话 喜欢的书籍 \n";
cout<<"------------------------------------\n";
for (i=0; i<num1; i++) {
if (phonebook[i].name == name) {
cout<<phonebook[i].name<<" "<<phonebook[i].tel<<" "<<phonebook[i].bookname<<endl;
}
}
}
//根据姓名修改
void alt(string &name,int &num1)
{
string s;
for (int i=0; i<num1; i++) {
if (phonebook[i].name == name) {
cout<<"输入姓名:";
cin>>s;
phonebook[i].name=s;
cout<<"输入电话:";
cin>>s;
phonebook[i].tel = s;
cout<<"输入书名:";
cin>>s;
phonebook[i].bookname = s;
}
break;
}
ofstream onfile;//写入文件类
onfile.open("phonebook.txt");
//重写到文件
for (int i=0; i<num1; i++) {
onfile<<phonebook[i].name<<" "<<phonebook[i].tel<<" "<<phonebook[i].bookname<<"\n";
}
onfile.close();
}
};
//char password[20];//密码
/*******************函数申明******************************************/
void set_psw();//设置密码
int psw_check();//密码验证
void Show_menu();//显示菜单
int get_menu_choice();//接受菜单选择
void InputIntoFile(vector<PhoneBook> PhoneBook);//将vector写入文件
void PrintTitle();//打印头信息
void menu();//菜单相应
/********************函数定义*****************************************/
//菜单相应
void menu(ManagePhoneBook &mphonebook)
{
while(1)
{
Show_menu();//显示菜单
switch (get_menu_choice()) {
case 1://增加记录
mphonebook.add();
break;
case 2://删除记录
{
string s;
cout<<"输入要删除的学生姓名:";
cin>>s;
mphonebook.del(s,num);
}
break;
case 3://查询记录
{
string ss;
cout<<"输入要查询的学生姓名:";
cin>>ss;
mphonebook.sel(ss,num);
}
break;
case 4://修改记录
{
string sss;
cout<<"输入要修改的学生姓名:";
cin>>sss;
mphonebook.alt(sss,num);
}
break;
case 5://查询所有记录
{
cout<<"------------------------------------\n";
cout<<" 姓名 电话 喜欢的书籍 \n";
cout<<"------------------------------------\n";
for (int i=0; i<num; i++) {
cout<<phonebook[i].name<<" "<<phonebook[i].tel<<" "<<phonebook[i].bookname<<endl;
}
}
break;
default:
printf("*********************\n");
printf(" 欢迎使用本系统 \n");
printf("**********************\n");
break;
}
}
}
//打印头信息
void PrintTitle()
{
cout<<"------------------------------------\n";
cout<<" 姓名 电话 喜欢的书籍 \n";
cout<<"------------------------------------\n";
}
//将结构体写入文件
void InputIntoFile(PB phonebook[20])
{
ofstream onfile;//写入文件类
onfile.open("phonebook.txt");
for (int i=0; i<num; i++) {
onfile<<phonebook[i].name<<" "<<phonebook[i].tel<<" "<<phonebook[i].bookname;
}
}
//设置密码
void set_psw()
{
ofstream onfile;//写入文件类
string psw_set ,psw_check;
do
{
cout<<"You must set password first!\n";
cin>>psw_set;
cout<<"---------------------------\n";
cout<<"conform password:";
cin>>psw_check;
if(psw_check == psw_check)
{
cout<<"set password success!\n";
}
else
{
cout<<"error!\n";
}
}
while(psw_check != psw_set);
onfile.open("password.txt",ios::out);
onfile<<psw_set;
onfile.close();
}
//密码验证
int psw_check()
{
ifstream infile;//读取文件类
ofstream onfile;//文件写入类
unsigned int j=1;
string pword;
string password;
infile.open("password.txt",ios::in);
if (!infile.is_open())//如果打开失败,则重新设置密码
{
set_psw();//重新设置密码
}
//取值
infile>>password;
//打开成功验证密码
do {
cout<<"输入密码,你将有三次机会:"<<j<<"/3次机会"<<endl;
cin>>pword;
j++;
} while (password != pword && j<=3);
if (j<=3) {
cout<<"恭喜登陆成功!"<<endl;
return 1;//打开成功
}
else
{
cout<<"你已经输入了三次了,打开文件失败!"<<endl;
return 0;
}
}
//显示菜单
void Show_menu()
{
cout<<">>>>>>>>>>>>>>>>>>>欢迎使用电话簿<<<<<<<<<<<<<<<<<<<<<<<\n";
cout<<"******************************************************\n";
cout<<" 1.增加记录 | 2.删除记录 \n";
cout<<" 3.查询单个记录 | 4.修改记录 \n";
cout<<" 5.查询所有记录 | 0.退出 \n";
cout<<"******************************************************\n";
}
//接受菜单选择
int get_menu_choice()
{
int menu_ch;//菜单选项
do {
cout<<"请选择菜单:";
cin>>menu_ch;
if (menu_ch<0||menu_ch>5) {
cout<<"error";
}
} while (menu_ch<0||menu_ch>5);
return menu_ch;
}
int main(int argc, const char * argv[])
{
ManagePhoneBook m;
if (psw_check()) {
menu(m);
}
return 0;
}