当前位置: 首页 > news >正文

通讯录管理系统精解

#include
#include
#include<string.h>
#include
#include
using namespace std;
///根据系统功能要求,首先要设计一个菜单类,描述系统所拥有的功能。
class menu
{
public:
void mainmenu(); ///主菜单,系统主要功能。
void addmenu(); ///因为要求有有手机通讯录和手机卡通讯录,所以需要一个添加菜单
void delmenu(); ///删除菜单
void modmenu(); ///修改菜单
void inqmenu(); ///查询菜单
void dismenu(); ///显示菜单
void mocomenu(); ///移动复制菜单
void sortmenu(); ///排序菜单
void filemenu(); ///文件操作菜单
}m;///创建全局菜单对象,便于调用
void menu::mainmenu()
{
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~“<<endl;
cout<<” ~ 通讯录管理系统主菜单 ~“<<endl;
cout<<” ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~“<<endl;
cout<<” ~ ~“<<endl;
cout<<” ~ 1.新建联系人. 2.删除联系人. ~“<<endl;
cout<<” ~ ~“<<endl;
cout<<” ~ 3.修改联系人的信息. 4.查询联系人信息. ~“<<endl;
cout<<” ~ ~“<<endl;
cout<<” ~ 5.浏览所有联系人的信息. 6.移动、复制联系人 . ~“<<endl;
cout<<” ~ ~“<<endl;
cout<<” ~ 7.读、写文件 8.保存工作到文件. ~“<<endl;
cout<<” ~ ~“<<endl;
cout<<” ~ 0.退出并保存 ~“<<endl;
cout<<” ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~“<<endl;
cout<<” 请输入您的选择:“<<endl;
}
void menu::addmenu()
{
cout<<” --------------------------------------------------“<<endl;
cout<<” | 请选择添加联系人到一个通讯录: |“<<endl;
cout<<” | |“<<endl;
cout<<” | 1.手机通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 2.手机卡通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 3.两个通讯录都添加. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 4.返回主菜单. |“<<endl;
cout<<” --------------------------------------------------“<<endl;
cout<<” 请输入您的选择:“<<endl;
}
void menu::delmenu()
{
cout<<” --------------------------------------------------“<<endl;
cout<<” | 请选择删除哪一个通讯录的联系人: |“<<endl;
cout<<” | |“<<endl;
cout<<” | 1.手机通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 2.手机卡通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 3.两个通讯录都删除. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 4.返回主菜单. |“<<endl;
cout<<” --------------------------------------------------“<<endl;
cout<<” 请输入您的选择:“<<endl;
}
void menu::modmenu()
{
cout<<” --------------------------------------------------“<<endl;
cout<<” | 请选择修改哪一个通讯录的联系人: |“<<endl;
cout<<” | |“<<endl;
cout<<” | 1.手机通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 2.手机卡通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 3.两个通讯录都修改. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 4.返回主菜单. |“<<endl;
cout<<” --------------------------------------------------“<<endl;
cout<<” 请输入您的选择:“<<endl;
}
void menu::inqmenu()
{
cout<<” --------------------------------------------------“<<endl;
cout<<” | 请选择查询哪一个通讯录的联系人: |“<<endl;
cout<<” | |“<<endl;
cout<<” | 1.手机通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 2.手机卡通讯录. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 3.两个通讯录都查询. |“<<endl;
cout<<” | |“<<endl;
cout<<” | 4.返回主菜单. |“<<endl;
cout<<” --------------------------------------------------“<<endl;
cout<<” 请输入您的选择:“<<endl;
}
void menu::dismenu()
{
cout<<” ********************************************“<<endl;
cout<<” * 请选择浏览的通讯录 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 1.手机通讯录. *“<<endl;
cout<<” * *“<<endl;
cout<<” * 2.手机卡通讯录. *“<<endl;
cout<<” * *“<<endl;
cout<<” * 3.返回主菜单. *“<<endl;
cout<<” ********************************************“<<endl;
cout<<” 请输入您的选择:“<<endl;
}
void menu::mocomenu()
{
cout<<” ###############################################################“<<endl;
cout<<” # 请选择要进行的操作. #“<<endl;
cout<<” # #“<<endl;
cout<<” # 1.将联系人的信息从手机卡移动到手机上. #“<<endl;
cout<<” # #“<<endl;
cout<<” # 2.将联系人的信息从手机上移动到手机卡上. #“<<endl;
cout<<” # #“<<endl;
cout<<” # 3.将手机卡中的存储的联系人的信息复制到手机中 #“<<endl;
cout<<” # #“<<endl;
cout<<” # 4.将手机中存储的联系人的信息复制到手机卡中 #“<<endl;
cout<<” # #“<<endl;
cout<<” # 5.返回主菜单. #“<<endl;
cout<<” ###############################################################“<<endl;
cout<<” 请输入您的选择:"<<endl;
}
void menu::sortmenu()
{

 cout<<"                                  **************************************"<<endl;
 cout<<"                                  *         请选择输出排序方式         *"<<endl;
 cout<<"                                  *                                    *"<<endl;
 cout<<"                                  *            1.降序输出              *"<<endl;
 cout<<"                                  *                                    *"<<endl;
 cout<<"                                  *            2.升序输出              *"<<endl;
 cout<<"                                  *                                    *"<<endl;
 cout<<"                                  *            3.退出                  *"<<endl;
 cout<<"                                  **************************************"<<endl;
 cout<<"                                  请输入您的选择:"<<endl;

}
void menu::filemenu()
{
cout<<" ************************************************“<<endl;
cout<<” * 请选择要进行的操作. *“<<endl;
cout<<” * *“<<endl;
cout<<” * 1.读取手机通讯录文件. *“<<endl;
cout<<” * *“<<endl;
cout<<” * 2.写入手机通讯录文件 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 3.读取手机卡通讯录文件 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 4.写入手机卡通讯录文件 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 5.返回主菜单. *“<<endl;
cout<<” ************************************************"<<endl;
cout<< “请输入您的选择:”<<endl;
}

///根据题目要求设计手机联系人类。

class Phone_LXR
{
protected:
string name,tel;
public:
Phone_LXR(string na=“无姓名”,string te=“无电话号码”)///带默认值的构造函数
{
name=na;tel=te;
}
void set(string na,string te);///数据成员赋值
int modify();///修改成员函数
friend ostream&operator<<(ostream&out,Phone_LXR&p); ///友元函数重载<<
friend istream&operator>>(istream&in, Phone_LXR&p); ///重载>>
string getname(){return name;} ///获取姓名
string gettel(){return tel;} ///获取电话号码

};
void Phone_LXR::set(string na,string te)
{
name=na;
tel=te;
}
istream&operator>>(istream&in,Phone_LXR&p)
{
cout<<“请输入联系人姓名:”;in>>p.name;
cout<<“请输入联系人电话号码:”;in>>p.tel;
return in;
}
ostream&operator<<(ostream&out,Phone_LXR&p)
{

	out<<"姓名:"<<p.name;
	out<<" 电话号码:"<<p.tel<<endl;
	return out;
}

int Phone_LXR::modify()
{
cout<<" *************************************“<<endl;
cout<<” * 1.修改姓名 2.修改电话号码 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 3.全部修改 4.退出此次修改 *“<<endl;
cout<<” *************************************“<<endl;
cout<<” 请输入选择"<<endl;
int xuan;
string xinxi;
while(cin>>xuan)
{
switch(xuan)
{
case 1:
{

			  cout<<"请输入要修改的联系人姓名:"<<endl;
			  cin>>xinxi;
			  name=xinxi;
			  cout<<"更改成功"<<endl;break;
			 }


	     case 2:
	    	{
			  cout<<"请输入要修改的联系人电话号码:"<<endl;
			  cin>>xinxi;
			  tel=xinxi;
			  cout<<"更改成功"<<endl;break;
	    	}
		 case 3:
            {
			  cout<<"请输入要修改的联系人姓名:"<<endl;
			  cin>>xinxi;
			  name=xinxi;
			  cout<<"请输入要修改的联系人电话号码:"<<endl;
			  cin>>xinxi;
			  tel=xinxi;
			  cout<<"更改成功"<<endl;break;
            }
		 case 4:
		     {
		         cout<<"退出修改"<<endl;break;
             }
		 default:
           cout<<"输入错误,请重新输入."<<endl;
		 }
        cout<<"                                  修改成功,请按下面提示进行操作"<<endl;
		cout<<"                                  *************************************"<<endl;
        cout<<"                                  * 1.修改姓名        2.修改电话号码  *"<<endl;
        cout<<"                                  *                                   *"<<endl;
        cout<<"                                  * 3.全部修改        4.退出修改系统  *"<<endl;
		cout<<"                                  *************************************"<<endl;
		cout<<"                                  请输入您的选择:"<<endl;
		 if(xuan==4)
            break;
    }
		return 0;

}

///根据要求写手机卡联系人派生类

class SIM_LXR:public Phone_LXR ///手机卡联系人类
{
string jiguang,qq;
public:
SIM_LXR(string na=“无姓名”,string te=“无电话号码”,string jg=“无籍贯”,string q=“无qq”):Phone_LXR(na,te) ///带参的构造函数
{
jiguang=jg;
qq=q;
}
void set(string na,string te,string jg,string q);///成员赋值函数
int modify();///修改成员函数
friend ostream&operator <<(ostream&out,SIM_LXR&s); ///友元函数重载<<
friend istream&operator >>(istream&in, SIM_LXR&s); ///重载>>
string getjiguang()
{
return jiguang;
}
string getqq()
{
return qq;
}
};
void SIM_LXR::set(string na,string te,string jg,string q)
{
Phone_LXR::set(na,te);
jiguang=jg;
qq=q;
}
int SIM_LXR::modify()
{
cout<<" *************************************“<<endl;
cout<<” * 1.修改姓名 2.修改电话号码 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 3.修改籍贯 4.修改QQ号码 *“<<endl;
cout<<” * *“<<endl;
cout<<” * 5.全部修改 6.退出修改系统 *“<<endl;
cout<<” *************************************“<<endl;
cout<<” 请输入选择"<<endl;
int xuan;
string xinxi;
while(cin>>xuan)
{
switch(xuan)
{
case 1:
{

			  cout<<"请输入要修改的联系人姓名:"<<endl;
			  cin>>xinxi;
			  name=xinxi;
			  cout<<"更改成功"<<endl;
			  break;
			 }
	     case 2:
	    	{
			  string xinxi;
			  cout<<"请输入要修改的联系人电话号码:"<<endl;
			  cin>>xinxi;
			  tel=xinxi;
			  cout<<"更改成功"<<endl;
			  break;
	    	}
	    	case 3:
	    	{
			  string xinxi;
			  cout<<"请输入要修改的联系人籍贯:"<<endl;
			  cin>>xinxi;
			  jiguang=xinxi;
			  cout<<"更改成功"<<endl;
			  break;
	    	}
	    	case 4:
	    	{
			  string xinxi;
			  cout<<"请输入要修改的联系人QQ号码:"<<endl;
			  cin>>xinxi;
			  qq=xinxi;
			  cout<<"更改成功"<<endl;
			  break;
	    	}
		 case 5:
            {
	          string xinxi;
			  cout<<"请输入要修改的联系人姓名:"<<endl;
			  cin>>xinxi;
			  name=xinxi;
			  cout<<"请输入要修改的联系人电话号码:"<<endl;
			  cin>>xinxi;
			  tel=xinxi;
			  cout<<"请输入要修改的联系人籍贯:"<<endl;
			  cin>>xinxi;
			  jiguang=xinxi;
			  cout<<"请输入要修改的联系人QQ号码:"<<endl;
			  cin>>xinxi;
			  qq=xinxi;
			  cout<<"更改成功"<<endl;
			  break;
            }
		 case 6:
		     {
		         cout<<"退出修改"<<endl;
		         break;
		     }
		 default:
           cout<<"输入错误,请重新输入"<<endl;
		 }
		  cout<<"                                  修改成功,请按下面提示进行操作"<<endl;
         cout<<"                                  *************************************"<<endl;
         cout<<"                                  * 1.修改姓名        2.修改电话号码  *"<<endl;
         cout<<"                                  *                                   *"<<endl;
         cout<<"                                  * 3.修改籍贯        4.修改QQ号码    *"<<endl;
         cout<<"                                  *                                   *"<<endl;
         cout<<"                                  * 5.全部修改        6.退出修改系统  *"<<endl;
         cout<<"                                  *************************************"<<endl;
          cout<<"请输入您的选择"<<endl;
		 if(xuan==6) break;
		}
		return 0;

}
istream&operator>>(istream&in,SIM_LXR&s)
{
cout<<“请输入姓名:”; in>>s.name;
cout<<“请输入电话号码:”;in>>s.tel;
s.Phone_LXR::set(s.name,s.tel);
cout<<“请输入籍贯:”; in>>s.jiguang;
cout<<“请输入qq:”; in>>s.qq;
return in;
}
ostream&operator<<(ostream&out,SIM_LXR&s)
{

	out.setf(ios::left);///控制长度
	out.width(25);
	out<<"姓名:"<<s.getname()<<endl;
	out.width(25);
	out<<"电话号码:"<<s.gettel()<<endl;
	out.width(25);
	out<<"籍贯:"<<s.jiguang<<endl;
	out.width(25);
	out<<"qq:"<<s.qq<<endl;
	return out;
}

///根据要求写通讯簿抽象类

class Book
{
public:
virtual int add()=0; ///增加纯虚函数,增加一个联系人
virtual int del(string Tel)=0; ///删除纯虚函数:删除一个联系人
virtual int display()=0; ///显示纯虚函数,显示所有联系人的信息
virtual int modify(string Tel)=0; ///修改纯虚函数,修改某一联系人的信息:
virtual int inquire(string Name)=0; ///查询纯虚函数,查询并显示某一联系人的信息
virtual int read()=0; ///读文件
virtual int write()=0; ///写文件
virtual int save()=0; ///保存文件
};

///根据要求写手机通讯簿类(数据库类,继承于通讯簿抽象类)用于记录手机中储存的所有联系人信息

class Phone_book:public Book
{
int sum; ///表示手机联系人的数量,
vector<Phone_LXR> p; ///实现手机联系人动态数组,不怕数组越界
public:
Phone_book();///构造函数读取文本文件中的数据,并根据文件内容创建联系人对象数组。
~Phone_book();///将对象数组中的内容写入到文本文件中
int add(); ///增加函数:增加一个联系人
int del(string Tel); ///删除操作:删除一个联系人
int display(); ///显示所有联系人的信息
int modify(string Tel); ///修改某一联系人的信息:
int inquire(string Name); ///查询并显示某一联系人的信息
int moco(string sname,string stel);///移动复制操作
int getsum(){return sum;}///获取已有联系人数量(附加功能)
string getname(int i){return p[i].getname();}///获取手机第i个姓名p[i].name
string gettel(int i){return p[i].gettel();}///获取手机卡第i个电话号码s[i].tel
int read(); ///读取手机通讯录文件
int write(); ///读取手机通讯录文件
int save(); ///保存工作
int clear()///清空
{
p.clear();
sum=-1;
}

};
Phone_book::Phone_book()///构造函数读取数据
{
sum=-1; ///vector从0开始算起
char s[100];
char pname[30],ptel[30];
Phone_LXR lxr; ///创建手机联系人临时对象,方便进行调用手机联系人函数进行输入。
ifstream in(“D://Phone book.txt”,ios::in); ///读的方式打开文件,读取文本文件中的数据
if(!in)
{
cout<<“无法打开手机通讯录文件”<<endl;
return ;
}
in.getline(s,100);///省略标题栏信息的作用
in.getline(s,100);
in.getline(s,100);
in.getline(s,100);
while(in>>pname>>ptel&&pname!=“无姓名”)
{
lxr.set(pname,ptel);
p.push_back(lxr);
sum++;
}
in.close();
}
Phone_book::~Phone_book()///析构函数写入数据
{
ofstream out(“D://Phone book.txt”,ios::out); ///写的方式打开文件。写入数据
if(!out)
{
cout<<“无法打开手机通讯录文件”<<endl;
return ;
}
out<<" ********************************************“<<endl;
out<<” * 手机通讯簿 *“<<endl;
out<<” ********************************************"<<endl;
out.setf(ios::left);///控制长度
out.width(25);
out<<“姓名”;
out.width(25);
out<<“电话号码”;
for(int i=0;i<=sum;i++) ///注意这里是小于等于
{
out.setf(ios::left);///控制长度
out.width(25);
out<<p[i].getname();
out.width(25);
out<<p[i].gettel();
out<<endl;
}
out.close();
}
int Phone_book::add()
{

if(sum>1000)///要求能存储1000人。
    {
        cout<<"对不起您的手机通讯容量已满,即将返回"<<endl;
        return 0;
    }
Phone_LXR lxr;///创建临时手机联系人对象方便调用函数。
cin>>lxr;
cout<<lxr<<endl;
cout<<"该联系人是否添加到手机,Y(是)/N(否)"<<endl;
char s;
cin>>s;
if(s=='Y'||s=='y')
{
p.push_back(lxr);
sum++;
cout<<"成功添加联系人到手机通讯簿"<<endl;
}
else if(s=='N'||s=='n')
    cout<<"已经取消操作"<<endl;
else
    cout<<"您的输入有误,请重新输入"<<endl;

}
int Phone_book::del(string Tel)
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法删除,即将返回”<<endl;
return 0;
}
bool flag=0;
while(1)
{
for(int i=0;i<=sum;i++) ///注意这里是小于等于,因为sum从-1开始
{
if(p[i].gettel()Tel)
{
flag=1;
cout<<“将要删除手机联系人的信息如下”<<endl;
cout<<“姓名: “<<p[i].getname()<<”\t”<<"电话: "<<p[i].gettel()<<endl;
cout<<“是否删除该联系人信息,Y(是)/N(否)”<<endl;
char s;
cin>>s;
if(s
’Y’||s==‘y’)
{
p.erase(p.begin()+i);///动态数组的指定删除操作
sum–;
cout<<“删除该联系人成功”<<endl;
cout<<“是否在手机继续寻找具有相同电话号码的联系人,Y(是)/N(否)”<<endl;
cin>>s;
if(s==‘Y’||s==‘y’)
{cout<<“继续搜索中”<<endl;}
else if(s==‘N’||s==‘n’)
break;
}
else
{
cout<<“是否在手机继续寻找具有相同电话号码的联系人,Y(是)/N(否)”<<endl;
cin>>s;
if(s==‘Y’||s==‘y’)
{cout<<“继续搜索中”<<endl;}
else if(s==‘N’||s==‘n’)
break;
}
}
cout<<“搜索结束”<<endl;

  }
  if(flag==0)           ///容错性
  {
	cout<<"在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)"<<endl;
	char s;
	cin>>s;
	if(s=='N'||s=='n')
	break;
	else if(s=='Y'||s=='y')
	{
	    cout<<"请重新输入要删除联系人的电话号码"<<endl;
	    cin>>Tel;
	    continue;
    }
	else
	{
	    cout<<"输入错误,本次删除取消"<<endl;
	    break;
    }
  }
  else break;
 }

}
int Phone_book::modify(string Tel)
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法修改,即将返回”<<endl;
return 0;
}
bool flag=0;
while(1)
{
for(int i=0;i<=sum;i++) ///注意这里是<=,sum从-1开始
{
if(p[i].gettel()Tel)
{
flag=1;
cout<<“将要修改手机通讯录联系人的信息如下”<<endl;
cout<<p[i]<<endl;///重载了运算符输出方便
cout<<“是否修改该联系人信息,Y(是)/N(否)”<<endl;
char s;
cin>>s;
if(s
’Y’||s==‘y’)
{
p[i].modify();
cout<<p[i]<<endl;
cout<<“验证修改信息,是否重新修改。Y(是)/N(否)”<<endl;
cin>>s;
if(s==‘Y’||s==‘y’)
{p[i].modify();}
cout<<“是否继续寻找具有相同电话号码的联系人,Y(是)/N(否)”<<endl;///按照顺序继续循环(就相当于查找后面同号码的联系人)
cin>>s;
if(s==‘Y’||s==‘y’)
{cout<<“继续搜素中”<<endl;}
else if(s==‘N’||s==‘n’) break;
}
else
{
cout<<“是否继续寻找具有相同电话号码的联系人,Y(是)/N(否)”<<endl;
cin>>s;
if(s==‘Y’||s==‘y’)
{cout<<“继续搜素中”<<endl;}
else if(s==‘N’||s==‘n’) break;
}
}
}
if(flag0) ///容错性
{
cout<<“在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)”<<endl;
char s;
cin>>s;
if(s
’N’||s==‘n’)
break;
else if(s==‘Y’||s==‘y’)
{cout<<“请重新输入要修改联系人的电话号码”<<endl;
cin>>Tel;continue;}
else
{cout<<“输入错误,本次修改取消”<<endl;break;}
}
else break;
}
}
bool cmp(Phone_LXR a,Phone_LXR b) ///按姓名升序排列函数
{
return a.getname()< b.getname();
}
int Phone_book::inquire(string Name)
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法查询,即将返回”<<endl;
return 0;
}
sort(p.begin(),p.end(),cmp);///通过自定义比较函数,实现按姓名升序排列
while(1)
{
int flag=1;
for(int i=0;i<=sum;i++)
{
if(p[i].getname()Name)
{
cout<<p[i]<<endl;
flag=0;
break;
}
}
if(flag
0)
break;
else
{
cout<<“在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)”<<endl;
char s;
cin>>s;
if(s==‘N’||s==‘n’)
break;
else if(s==‘Y’||s==‘y’)
{cout<<“请重新输入要查询联系人的姓名”<<endl;cin>>Name;continue;}
else
{cout<<“输入错误,本次查询取消”<<endl;break;}
}
}
}
int Phone_book::display()
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法修改,即将返回”<<endl;
return 0;
}
cout<<“目前手机通讯录人数:”<<sum+1<<endl;
m.sortmenu();
int xuan;
cin>>xuan;
sort(p.begin(),p.end(),cmp);///按姓名升序排列 ,一次就够,省时间
cout<<" **************************************“<<endl;
cout<<” * 手机通讯录 *“<<endl;
cout<<” **************************************"<<endl;
switch(xuan)
{
case 1:///降序
{
for(int i=sum;i>=0;i–)
cout<<p[i]<<endl;
break;
}
case 2:///升序
{
for(int i=0;i<=sum;i++)
cout<<p[i]<<endl;
break;
}

case 3:break;
default:
cout<<"操作错误,退出显示菜单"<<endl;
 }

}
int Phone_book::moco(string Name,string Tel)
{

for(int i=0;i<=sum;i++)
{
	if(Name==p[i].getname()&&Tel==p[i].gettel())
	{
		return 0;
	}
}

Phone_LXR lxr;
lxr.set(Name,Tel);
p.push_back(lxr);    ///添加
sum++;
return 0;

}
int Phone_book::read()
{

char s[100];
char  pname[100],ptel[100];
ifstream in("D://Phone book.txt"); ///读的方式打开文件,读取文本文件中的数据
if(!in)
{
	cout<<"无法打开手机通讯录文件"<<endl;
	return 0;
}
 in.getline(s,100);///省略标题栏信息的操作
 in.getline(s,100);
 in.getline(s,100);
 while(in>>pname>>ptel&&pname!="无姓名")
 {
  cout<<pname<<"\t"<<ptel<<endl;
 }
 in.close();///很重要,记得关闭

}
int Phone_book::write()
{
Phone_LXR lxr;
ofstream out(“D://Phone book.txt”); ///写的方式打开文件,写入数据。
if(!out)
{
cout<<“无法打开手机通讯录文件”<<endl;
return 0;
}
cin>>lxr;
out.setf(ios::left);
out.width(25);
out<<lxr.getname();
out.width(25);
out<<lxr.gettel();
out<<endl;
p.push_back(lxr);
sum++;
out.close();
}
int Phone_book::save()///保存操作。
{
ofstream out(“D://Phone book.txt”); ///写的方式打开文件
if(!out)
{
cout<<“无法打开手机通讯录文件”<<endl;
return 0;
}
out<<““<<endl;
out<<”* 手机通讯簿 *“<<endl;
out<<”
”<<endl;
out<<“姓名: “<<”\t”<<“电话号码: “<<endl;
for(int i=0;i<=sum;i++) ///注意这里是小于等于
{
out<<p[i].getname()<<”\t”<<p[i].gettel()<<endl;///写入联系人信息
}
out.close();///记得关闭
}

///根据要求写手机卡通讯簿派生类(数据库类,继承于通讯簿抽象类)用于记录手机卡中储存的所有联系人信息

class SIM_book:public Book ///其实跟手机通讯簿的写法差不多,实现基本相同
{
int sum; ///手机卡联系人的数量
vector<SIM_LXR>s; ///实现手机卡联系人动态数组,不用担心数组越界
public:
SIM_book();///构造函数读取文本文件中的数据,并根据文件内容创建联系人对象数组。
~SIM_book();///析构函数将对象数组中的内容写入到文本文件中。
int add(); ///增加函数,增加一个联系人
int del(string Tel); ///删除函数,删除一个联系人
int display(); ///显示所有联系人的信息
int modify(string Tel); ///修改某一联系人的信息:
int inquire(string Name); ///查询并显示某一联系人的信息
int moco(string pname,string ptel); ///复制移动函数,因为手机联系人只有两个数据成员,传两个参就好了
int getsum(){return sum;} ///获取已有联系人数量
string getname(int i){return s[i].getname();} ///获取手机卡第i个姓名
string gettel(int i){return s[i].gettel();} ///获取手机卡第i个电话号码
string getjiguang(int i){return s[i].getjiguang();} ///获取手机卡第i个籍贯
string getqq(int i){return s[i].getqq();} ///获取手机卡第i个
int read(); ///读取手机卡通讯录文件
int write(); ///写入手机卡通讯录文件
int save(); ///保存文件
int clear(){s.clear();sum=-1;} ///清空工作
};
SIM_book::SIM_book()
{
sum=-1;
char a[100];
char sname[100],stel[100],sjg[100],sqq[100];
SIM_LXR lxr; ///创建手机联系人临时对象,方便调用。
ifstream in(“D://SIM book.txt”,ios::in); ///读的方式打开文件,读取文本文件中的数据
if(!in)
{
cout<<“无法打开手机卡通讯录文件”<<endl;
return ;
}
in.getline(a,100);///省略标题栏信息
in.getline(a,100);
in.getline(a,100);
in.getline(a,100);
while(in>>sname>>stel>>sjg>>sqq&&sname!=“无姓名”)
{
lxr.set(sname,stel,sjg,sqq);
s.push_back(lxr);
sum++;
}
in.close();///记得关闭文件
}
SIM_book::~SIM_book()
{
SIM_LXR lxr;
ofstream out(“D://SIM book.txt”,ios::out); ///写的方式打开文件
if(!out)
{
cout<<“无法打开手机卡通讯录文件”<<endl;
return ;
}
out<<" ********************************************“<<endl;
out<<” * 手机卡通讯簿 *“<<endl;
out<<” ********************************************"<<endl;
out.setf(ios::left);///控制长度
out.width(25);
out<<“姓名”;
out.width(25);
out<<“电话号码”;
out.width(25);
out<<“籍贯”;
out.width(25);
out<<“qq”<<endl;
for(int i=0;i<=sum;i++)
{

	out.setf(ios::left);
	out.width(25);
	out<<s[i].getname();
	out.width(25);
	out<<s[i].gettel();
	out.width(25);
	out<<s[i].getjiguang();
	out.width(25);
	out<<s[i].getqq()<<endl;
}
out.close();

}
int SIM_book::add()
{
if(sum>1000)///要求能存储1000人。
{
cout<<“对不起您的手机通讯容量已满,即将返回”<<endl;
return 0;
}
SIM_LXR lxr;
cin>>lxr;
cout<<lxr;
cout<<“是否将该联系人添加到手机卡,Y(是)/N(否)”<<endl;
char a;
cin>>a;
if(a==‘Y’||a==‘y’)
{
s.push_back(lxr);
sum++;
cout<<“手机卡添加联系人成功”<<endl;
}
else if(a==‘N’||a==‘n’)
cout<<“取消操作”<<endl;
else
cout<<“输入错误,请重新输入”<<endl;
}
int SIM_book::del(string Tel)
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法删除,即将返回”<<endl;
return 0;
}
bool flag=0;
while(1)
{

 for(int i=0;i<=sum;i++)
  {
  	if(s[i].gettel()==Tel)
  	{    flag=1;
  		cout<<"将要删除手机联系人的信息"<<endl;
  		cout<<s[i];
  		cout<<"是否删除该联系人信息,Y(是)/N(否)"<<endl;
  		char a;
  		cin>>a;
  		if(a=='Y'||a=='y')
  		{
  			s.erase(s.begin()+i);
  			sum--;
  			cout<<"删除该联系人信息成功"<<endl;
  			cout<<"是否在手机卡中继续寻找具有相同电话号码的联系人,Y(是)/N(否)"<<endl;
  			cin>>a;
  			if(a=='N'||a=='n') break;
			if(a=='Y'||a=='y')
                {cout<<"继续搜素中"<<endl;}
  		}
  		else
		{
			cout<<"是否在手机卡中继续寻找具有相同电话号码的联系人,Y(是)/N(否)"<<endl;
  			cin>>a;
  			if(a=='Y'||a=='y'){cout<<"继续搜素中"<<endl;}
  			else if(a=='N'||a=='n') break;
		}
  	}
  		cout<<"搜素结束"<<endl;
    }
    if(flag==0)
    {
	cout<<"在手机卡通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)"<<endl;
	char a;
	cin>>a;
	if(a=='N'||a=='n')
	break;
	else if(a=='Y'||a=='y')
	{
	    cout<<"请重新输入要删除联系人的电话号码"<<endl;
	    cin>>Tel;continue;
    }
	else
	{
	    cout<<"输入错误,请重新输入"<<endl;
	    break;
    }
  }
  else break;
}

}
int SIM_book::modify(string Tel)
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法修改,即将返回”<<endl;
return 0;
}
bool flag=0;
while(1)
{
for(int i=0;i<=sum;i++) ///注意这里是<=,sum从-1开始
{
if(s[i].gettel()Tel)
{
flag=1;
cout<<“要修改手机通讯录联系人的信息”<<endl;
cout<<s[i]<<endl;
cout<<“是否要修改该联系人信息,Y(是)/N(否)”<<endl;
char a;
cin>>a;
if(a
’Y’||a==‘y’)
{
s[i].modify();
cout<<s[i]<<endl;
cout<<“修改后联系人信息,是否重新修改。Y(是)/N(否)”<<endl;
cin>>a;
if(a==‘Y’||a==‘y’)
{s[i].modify();}
cout<<“是否在手机卡中继续寻找具有相同电话号码的联系人,Y(是)/N(否)”<<endl;
cin>>a;
if(a==‘Y’||a==‘y’)
{cout<<“继续搜素中”<<endl;}
else if(a==‘N’||a==‘n’)
break;
}
else
{
cout<<“是否在手机卡中继续寻找具有相同电话号码的联系人,Y(是)/N(否)”<<endl;
cin>>a;
if(a==‘Y’||a==‘y’)
{cout<<“继续搜素中”<<endl;}
else if(a==‘N’||a==‘n’) break;
}
}
}
if(flag0) ///容错性
{
cout<<“在手机卡通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)”<<endl;
char a;
cin>>a;
if(a
’N’||a==‘n’)
break;
else if(a==‘Y’||a==‘y’)
{
cout<<“请重新输入要删除联系人的电话号码”<<endl;
cin>>Tel;continue;
}
else
{cout<<“输入错误,请重新输入”<<endl;break;}
}
else break;
}
}
bool cmp2( SIM_LXR a, SIM_LXR b) ///按姓名降序排列函数
{
return a.getname()<b.getname();
}
int SIM_book::inquire(string Name)
{
if(sum<0)
{
cout<<“对不起,您的手机通讯暂无联系人,无法查询,即将返回”<<endl;
return 0;
}
int l=0,r=sum;
while(1)
{
int flag=1;
for(int i=0;i<=sum;i++)
{
if(s[i].getname()Name)
{
cout<<s[i]<<endl;
flag=0;
break;
}
}
if(flag
0)
break;
else
{
cout<<“在手机通讯录无法找到具有该电话号码的联系人,是否重新输入?Y(是)/N(否)”<<endl;
char s;
cin>>s;
if(s==‘N’||s==‘n’)
break;
else if(s==‘Y’||s==‘y’)
{cout<<“请重新输入要查询联系人的姓名”<<endl;cin>>Name;continue;}
else
{cout<<“输入错误,本次查询取消”<<endl;break;}
}
}
}
int SIM_book::display()
{
if(sum<0) {cout<<“手机卡通讯容量已空,即将返回”<<endl;return 0;}

 cout<<"目前手机卡通讯录人数:"<<sum+1<<endl;
 m.sortmenu();
 int xuan;
 cin>>xuan;
 sort(s.begin(),s.end(),cmp2);///按姓名升序排列 ,一次就够,省时间
 cout<<"                                  **************************************"<<endl;
 cout<<"                                  *           手机通卡讯录             *"<<endl;
 cout<<"                                  **************************************"<<endl;
 switch(xuan)
 {

case 1:
	{
		 for(int i=sum;i>=0;i--)
	 	cout<<s[i]<<endl;;
	 	break;
	}
case 2:
   {
	 for(int i=0;i<=sum;i++)
	 	cout<<s[i]<<endl;;
	 	break;
   }
case 3:break;
default:
cout<<"操作错误,退出显示菜单"<<endl;
 }

}
int SIM_book::moco(string pname,string ptel)
{
for(int i=0;i<=sum;i++)
{
if(pnames[i].getname()&&ptels[i].gettel())
{
return 0;
}
}
SIM_LXR lxr;
lxr.set(pname,ptel,“无籍贯”,“无QQ”);///因为手机通讯录只有两个数据成员
s.push_back(lxr); ///添加
sum++;
return 0;
}
int SIM_book::read()
{
char a[100];
char sname[100],stel[100],sjg[100],sqq[100];
ifstream in(“D://SIM book.txt”,ios::in); ///读的方式打开文件,读取文本文件中的数据
if(!in)
{
cout<<“无法打开手机卡通讯录文件”<<endl;
return 0;
}
in.getline(a,100);///省略标题栏信息
in.getline(a,100);
in.getline(a,100);
while(in>>sname>>stel>>sjg>>sqq&&sname!=“无姓名”)
{
cout<<sname<<“\t”<<stel<<“\t”<<sjg<<“\t”<<sqq<<endl;;
}
in.close();///关闭文件
}
int SIM_book::write()///写法都差不多
{
SIM_LXR lxr;
ofstream out(“D://SIM book.txt”,ios::out); ///写的方式打开文件
if(!out)
{
cout<<“无法打开手机卡通讯录文件”<<endl;
return 0;
}
cin>>lxr;
out<<lxr.getname()<<“\t”<<lxr.gettel()<<“\t”<<lxr.getjiguang()<<“\t”<<lxr.getqq()<<endl;
s.push_back(lxr);
sum++;
out.close();///关闭文件
}
int SIM_book::save()
{

ofstream out("D://SIM book.txt",ios::out); ///写的方式打开文件

if(!out)
{
cout<<“无法打开手机卡通讯录文件”<<endl;
return 1;
}
out<<““<<endl;
out<<”* 手机卡通讯簿 *“<<endl;
out<<”
”<<endl;
out<<“姓名”<<“\t”<<“电话号码”<<“\t”<<“籍贯”<<“\t”<<“QQ”<<endl;
for(int i=0;i<=sum;i++)///利用数组循环输出
{
out<<s[i].getname()<<“\t”<<s[i].gettel()<<“\t”<<s[i].getjiguang()<<“\t”<<s[i].getqq()<<endl;
}
out.close();
}

///根据要求写用户类(操作类,完成通讯簿的操作)能对两个通讯录进行管理操作。多态性就要在这里实现了

class user
{
Phone_book p;///手机通讯录类数据成员
SIM_book s;///手机卡通讯录类数据成员
public:
user() ; ///构造函数
int add(); ///添加联系人(基类指针调用两通讯录对象实现多态,下面操作同理)
int del(); ///删除联系人
int modify(); ///修改联系人
int inquire(); ///查询联系人
int display(); ///显示联系人
int movs_p(); ///把联系人信息从手机卡移动到手机
int movp_s(); ///把联系人信息从手机移动到手机卡
int copys_p(); ///把联系人信息从手机卡复制到手机
int copyp_s(); ///把联系人信息从手机移动到手机卡
int moco(); ///移动复制,有以上四个功能
int file(); ///文件操作
int save(); ///保存工作
~user();
};
user::user()
{
cout<<" @@@@@@@@@@@@@@@@@@“<<endl;
cout<<” * “<<endl;
cout<<” @ 欢迎使用通讯录管理系统 @“<<endl;
cout<<” * “<<endl;
cout<<” @
@
@
@@@@@@@@@@@@@@@“<<endl;
cout<<endl;
}
user::~user()
{
cout<<” @@@@@@@@@@@@@@@@@@“<<endl;
cout<<” * “<<endl;
cout<<” @ 已退出系统,谢谢您的使用 @“<<endl;
cout<<” * “<<endl;
cout<<” @
@
@
@@@@@@@@@@@@@@@"<<endl;
cout<<endl;;
}
int user::add()
{
int xuan;
Book *q; ///创建基类指针
while(cin>>xuan)
{
switch(xuan)
{
case 1:///手机联系人添加
q=&p; ///基类指针指向派生类对象 ,实现多态
q->add();
break;
case 2:///手机卡联系人添加
q=&s;
q->add();
break;
case 3:///手机和手机卡联系人都添加
q=&p;
q->add();
q=&s;
q->add();
break;
case 4:
break;
default:
cout<<“操作错误,请重新输入”<<endl;
}
if(xuan==4) break;
m.addmenu();///操作菜单,后面操作的都要写
}
return 0;

}
int user::del()
{
int xuan;
Book *q; ///创建基类指针
while(cin>>xuan)
{

 switch(xuan)
 {
 case 1:
  {
  q=&p;     ///基类指针指向派生类对象 ,实现多态
  string tel;
  cout<<"请输入在手机通讯录要删除联系人的电话号码:"<<endl;
  cin>>tel;
  q->del(tel);
  break;
  }
 case 2:
   {
   	q=&s;
   string tel;
   cout<<"请输入在手机卡通讯录要删除联系人的电话号码:"<<endl;
   cin>>tel;
   q->del(tel);
   break;
   }
 case 3:
   {
   	q=&p;
   string tel;
   cout<<"请输入在手机和手机卡通讯录要删除联系人的电话号码:"<<endl;
   cin>>tel;    ///基类指针指向派生类对象 ,实现多态
   q->del(tel);
   q=&s;
   q->del(tel);
   break;
   }
 case 4:
	break;
 default:
   cout<<"操作错误,请重新输入"<<endl;
 }

 if(xuan==4) break;
 m.delmenu();
}
return 0;

}
int user::modify()
{
int xuan;
Book *q; ///创建基类指针
while(cin>>xuan)
{
switch(xuan)
{
case 1:
{
q=&p; ///基类指针指向派生类对象 ,实现多态
string tel;
cout<<“请输入在手机通讯录要修改联系人的电话号码:”<<endl;
cin>>tel;
q->modify(tel);
break;
}
case 2:
{
q=&s;
string tel;
cout<<“请输入在手机卡通讯录要修改联系人的电话号码:”<<endl;
cin>>tel;
q->modify(tel);
break;
}
case 3:
{
q=&p;
string tel;
cout<<“请输入在手机和手机卡通讯录要修改联系人的电话号码:”<<endl;
cin>>tel; ///基类指针指向派生类对象 ,实现多态
q->modify(tel);
q=&s;
q->modify(tel);
break;
}
case 4:
break;
default:
cout<<“操作错误,请重新输入”<<endl;
}
if(xuan4) break;
m.modmenu();
}
return 0;
}
int user::inquire()
{
int xuan;
Book *q; ///创建基类指针
while(cin>>xuan)
{
switch(xuan)
{
case 1:
{
q=&p; ///基类指针指向派生类对象 ,实现多态
string tel;
cout<<“请输入在手机通讯录要查询联系人的姓名:”<<endl;
cin>>tel;
q->inquire(tel);
break;
}
case 2:
{
q=&s;
string tel;
cout<<“请输入在手机卡通讯录要查询联系人的姓名:”<<endl;
cin>>tel;
q->inquire(tel);
break;
}
case 3:
{
q=&p;
string tel;
cout<<“请输入在手机和手机卡通讯录要查询联系人的姓名:”<<endl;
cin>>tel; ///基类指针指向派生类对象 ,实现多态
q->inquire(tel);
q=&s;
q->inquire(tel);
break;
}
case 4:
break;
default:
cout<<“操作错误,请重新输入”<<endl;
}
if(xuan
4) break;
m.inqmenu();
}
return 0;
}
int user::display()
{
int xuan;
Book *q; ///创建基类指针
while(cin>>xuan)
{
switch(xuan)
{
case 1:///显示手机通讯录
{
q=&p; ///基类指针指向派生类对象 ,实现多态
q->display();
break;
}
case 2:///显示手机卡通讯录
{
q=&s;
q->display();
break;
}
case 3:
break;
default:
cout<<“操作错误,请重新输入”<<endl;
}
if(xuan==3) break;
m.dismenu();
}
return 0;
}
int user::moco()
{
int xuan;
while(cin>>xuan)
{
switch(xuan)
{
case 1:///把联系人信息从手机卡移动到手机
{
movs_p();
break;
}
case 2:///把联系人信息从手机移动到手机卡
{
movp_s();
break;
}
case 3:
{
copys_p();///把联系人信息从手机卡复制到手机
break;
}
case 4:
{
copyp_s();///把联系人信息从手机复制到手机卡
break;
}
case 5:
break;
default:
cout<<“操作错误,请重新输入”<<endl;
}

 if(xuan==5) break;
 m.mocomenu();
}
return 0;

}
int user::movp_s()
{
cout<<" 手机联系人信息移动到手机卡中"<<endl;

if(p.getsum()<0)
    {
        cout<<"手机通讯录暂无联系人,无法移动,即将返回"<<endl;
        return 0;
}
int sum=p.getsum();         ///手机通讯录的联系人是变化的
for(int i=0;i<=sum;i++)
{
	if(s.getsum()>1000)
        {cout<<"手机卡通讯录容量已满,无法移动,即将返回"<<endl;return 0;}
	s.moco(p.getname(i),p.gettel(i));     ///函数调用Phone_book中数组,这里p和Phone_book 中存放联系人vector的p是不一样的
}
p.clear();
sum=-1;
cout<<"操作完成"<<endl;
return 0;

}
int user::movs_p()
{
cout<<" 手机卡联系人信息移动到手机中"<<endl;
if(s.getsum()<0){cout<<“手机卡通讯录无联系人,无法移动,即将返回”<<endl;return 0;}
int sum=s.getsum(); ///手机卡通讯录的联系人是变化的
for(int i=0;i<=sum;i++)
{
if(p.getsum()>1000)
{cout<<“手机通讯录已满,无法移动,即将返回”<<endl;return 0;}
p.moco(s.getname(i),s.gettel(i)); ///函数调用SIM_book中数组,这里s和PSIM_book 中存放联系人vector的s是不一样的
}
s.clear(); ///清除全部
cout<<“操作完成”<<endl;
return 0;
}
int user::copyp_s()
{
cout<<" 手机联系人信息复制到手机卡中"<<endl;
if(p.getsum()<0)
{cout<<“手机通讯录暂无联系人,无法复制,即将返回”<<endl;return 0;}
for(int i=0;i<=p.getsum();i++)
{
if(s.getsum()>1000)
{cout<<“手机卡通讯录已满,无法复制,即将返回”<<endl;return 0;}
s.moco(p.getname(i),p.gettel(i)); ///函数调用Phone_book中数组,这里p和Phone_book 中存放联系人vector的p是不一样的,
}
cout<<“操作完成”<<endl;
return 0;
}
int user::copys_p()
{
cout<<" 手机卡联系人信息复制到手机中"<<endl;
if(s.getsum()<0)
{cout<<“手机卡通讯录无联系人,无法复制,即将返回”<<endl;return 0;}
for(int i=0;i<=s.getsum();i++)
{
if(p.getsum()>1000)
{cout<<“手机通讯录已满,无法复制,即将返回”<<endl;return 0;}
p.moco(s.getname(i),s.gettel(i)); ///函数调用SIM_book中数组,这里s和PSIM_book 中存放联系人vector的s是不一样的
}
cout<<“操作完成”<<endl;
return 0;

}
int user::file()
{
int xuan;
Book *q; ///创建基类指针
while(cin>>xuan)
{
switch(xuan)
{
case 1:///读取手机文件
q=&p; ///基类指针指向派生类对象 ,实现多态
q->read();
break;
case 2:///写入手机文件
q=&p;
q->write();
break;
case 3:///读取手机卡文件
q=&s;
q->read();
break;
case 4:///写入手机卡文件
q=&s;
q->write();
break;
case 5:
break;
default:
cout<<“操作错误,请重新输入”<<endl;
}
if(xuan==5) break;
m.filemenu();
}
return 0;
}
int user::save()
{
Book *q; ///创建基类指针
q=&p; ///基类指针指向派生类对象 ,实现多态
q->save();///保存手机文件
q=&s;
q->save();///保存手机卡文件
return 0;
}

///主函数进行操作

int main()
{
user u;
m.mainmenu();
int xuan;
while(cin>>xuan)
{
switch(xuan)
{
case 1:m.addmenu();
u.add();
break;
case 2:m.delmenu();
u.del();
break;
case 3:m.modmenu();
u.modify();
break;
case 4:m.inqmenu();
u.inquire();
break;
case 5:m.dismenu();
u.display();
break;
case 6:m.mocomenu();
u.moco();
break;
case 7:m.filemenu();
u.file();
break;
case 8:u.save();
break;
case 0:break;
default:
cout<<“选择错误,请重新输入”<<endl;
}
if(xuan==0) break;
m.mainmenu();
}
return 0;
}

相关文章:

  • 线上展厅表现形式 广州商迪
  • CDH 07Cloudera Manager freeIPA安装配置(markdown新版)
  • 22-09-23 西安 谷粒商城(05)CompletableFuture异步编排、nginx实现页面静态化
  • 【Javaweb】JSP标准标签库
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • React受控组件与非受控组件详解
  • Rust(4): 字符串类型
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • OSG跨平台编译:CMake跨平台安装(Windows、Linux、MacOS环境下安装)
  • OSG学习之一:坐标系
  • 治疗肺炎和脑膜炎的美国生物制药公司【Alopexx】申请纳斯达克IPO
  • Vue基础之事件机制、事件修饰符以及双向数据绑定
  • linux socket:接收时阻塞与非阻塞的设置
  • 9月23日计算机视觉基础学习笔记——经典机器学习
  • leetcode 并查集整理
  • 分享一款快速APP功能测试工具
  • 03Go 类型总结
  • k8s 面向应用开发者的基础命令
  • Spring核心 Bean的高级装配
  • 对象管理器(defineProperty)学习笔记
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 如何胜任知名企业的商业数据分析师?
  • 跳前端坑前,先看看这个!!
  • 通过git安装npm私有模块
  • 回归生活:清理微信公众号
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 数论-逆元
  • #162 (Div. 2)
  • #WEB前端(HTML属性)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (5)STL算法之复制
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (动态规划)5. 最长回文子串 java解决
  • (二十三)Flask之高频面试点
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • *上位机的定义
  • .htaccess配置常用技巧
  • .NET : 在VS2008中计算代码度量值
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net 知识杂记
  • .NET 中 GetProcess 相关方法的性能
  • .net项目IIS、VS 附加进程调试
  • .net中生成excel后调整宽度
  • /etc/fstab和/etc/mtab的区别
  • /etc/skel 目录作用
  • @requestBody写与不写的情况
  • [APUE]进程关系(下)