KZY------C++习题----3------2023-1-13

t

简易通讯录管理系统

::是作用域运算符,A::B表示作用域A中的-名称B,A可以是名字空间、类、结构; 类作用域操作符
“::”指明了成员函数所属的类。如:M::f(s)就表示f(s)是类M的成员函数。
作用域,如果想在类的外部引用静态成员函数,或在类的外部定义成员函数都要用到。使用命名空间里的类型或函数也要用到(如:std::cout,
std::cin, std::string 等等)

class Test{
    
    
            public:
                Test();
                static void print() 
                {
    
    
                    std::cout<<"Test"<<endl; //命名空间时使用::
                    }
            private:
                int a;
                    };
            Test::Test() : a(1)   //成员函数定义时使用::
            {
    
    }
            Test::get();  //使用静态成员函数时用::
        ```




: 一般用来表示继承;
1. 表示机构内位域的定义(即该变量占几个bit空间)
```C++
typedef struct _XXX{
    
    

    unsigned char a:4;

    unsigned char c;

};XXX

#include<iostream>
#include<fstream>
#include<string>
#include <iomanip>
using namespace std;
const int Max = 1000;

class MailList //联系人类
{
    
    
   private:
	string name;
	string age;
	string sex;
	string tel;
	string address;
	public:
	void setName(string);//给变量赋值函数
	void setAge(string);
	void setSex(string);
	void setTel(string);
	void setAddress(string);
	string getName();//返回变量值函数
	string getAge();
	string getSex();
	string getTel();
	string getAddress();
   /*

   public :
    void setName(string name) //姓名
    {
        this.name=name;
    }
	void setAge(string age )//年龄
	{
        this.age=age;
	}
	void setSex(string sex  )//性别
	{

	    this.sex=sex;
	}
	void setTel(string tel)// 电话
	{
	    this.tel=tel;

	}
	void setAddress(string address) //年龄
	{
	    this.address=address;
	}

	string getName()
	{
	    return this.name;
	}
	string getAge()
	{

	    return this.age;
	}
	string getSex()
	{

	     return this.sex;

	}
	string getTel()
	{

     return this.tel;
	}
	string getAddress()
	{
	     return this.address;
	}

   */

};

 class MailListManager  //联系人管理类
{
    
    
    //管理类  增 删 改 查 退
   private:
    MailList  mail[Max];//数组,MailList类型,这属于实例化对象
	int len;//计数器

   public:
    void initList();//初始化通讯录功能,在通讯录里记录为空时使用
	void insertList();//添加联系人功能,在通讯录里有记录时使用
	void showList();//显示联系人功能,显示通讯录中所有联系人的记录
	void deleteList();//删除联系人功能
	void selectList();//查找联系人功能
	void updateList();//修改联系人功能
	void dropList();//清空通讯录功能
	void save();//保存到文件,文件的写入
	void loading();//加载,读出文件
	int exiet(string);//检查联系人是否存在
};

class User  //用户 -登录等
{
    
    
public:
	User();
	void loading();
	int check(string);
	int login(string, string);
	void sign(string,string);
private:
	string s[50];
	int len;

};


void MailList::setName(string name)
{
    
    
	this->name=name;
}
void MailList::setAge(string age)
{
    
    
	this->age=age;
}
void MailList::setSex(string sex)
{
    
    
	this->sex=sex;
}
void MailList::setTel(string tel)
{
    
    
	this->tel=tel;
}
void MailList::setAddress(string address)
{
    
    
	this->address=address;
}
string MailList::getName()
{
    
    
	return this->name;
}
string MailList::getAge()
{
    
    
	return this->age;
}
string MailList::getSex()
{
    
    
	return this->sex;
}
string MailList::getTel()
{
    
    
	return this->tel;
}
string MailList::getAddress()
{
    
    
	return this->address;
}

User::User()
{
    
    
	len = 0;
}
//这里声明部分就不显示了,直接看定义

void MailListManager::loading()//加载函数的定义
{
    
    
	len = 0;//计数器len,每次调用加载函数的时候都要重新初始化为0,这样做是防止之后添加联系人时重复加载导致保存多次。
	string name, sex, age, tel, address;//局部变量,每次使用都要声明一下的
	ifstream in;//实例化文件类“fstream”对象
	in.open("maillist/mail.txt");//打开文件
	if (!in)//如果文件未打开
	{
    
    

		cout << "--文件打开失败--" << endl;
		system("pause");
	}
	else
	{
    
    
		while (!in.eof())//如果未达到文件末尾
		{
    
    
			in >> name >> age >> sex >> tel >> address;
			if (in.fail())break;//ifstream类的作用是从文件中读出数据到控制台上,但没有显示出来,这就相当于再次赋值给数组,就是给之前声明的MailList类的数组,所以这里使用数组mail[*].***保存数据,因为不知道到底有多少数据,所以用死循环来控制,跳出条件是达到文件末尾就跳出,这样就可以保证将文件中的内容全部存到数组里
			mail[len].setName(name);
			mail[len].setAge(age);
			mail[len].setSex(sex);
			mail[len].setTel(tel);
			mail[len].setAddress(address);
			len++;
		}
	}
	in.close();
}
int MailListManager::exiet(string name)//检验联系人是否存在
{
    
    
	for (int i = 0; i < len; i++)//每当调用检验联系人的函数之前,一定要加载一下,让数据全部保存到控制台的数组中,且要从控制台输入一个名字传给检验联系人函数,让传入的名字与数组中的数据逐一对比,从而检验联系人是否存在
	{
    
    
		if (mail[i].getName() == name)
		{
    
    
			return i;//如果存在,返回数组下标
		}
	}
	return -1;//不存在,返回-1
}
void MailListManager::save()//保存文件函数
{
    
    
	ofstream out;//ofstream类的作用是把控制台上的数据写入文件
	out.open("maillist/mail.txt");//打开文件
	if (!out)//如果文件未打开
	{
    
    
		cout << "--文件打开失败--" << endl;
	}
	else
	{
    
    
		for (int i = 0; i < len; i++)//这里的计数器len的值来自之后定义的函数中,len的值取决于谁调用的保存函数
		{
    
    
			out << mail[i].getName() << " " << mail[i].getAge() << " " << mail[i].getSex() << " " << mail[i].getTel() << " " << mail[i].getAddress() << endl;
		}
	}


	out.close();
}


void MailListManager::initList()//初始化联系人。之前我先写了添加,修改,删除,在解决一些问题的时候发现添加功能调用加载函数与删除修改功能调用加载函数有冲突,导致重复显示,所以在老师的帮助下加入了这个初始化联系人功能,当然有更好的方法,只是我暂时还不会用(TvT)
{
    
    
	string name, age, sex, tel, address;
	cout << "请输入联系人的信息(在姓名后输入stop停止输入):" << endl;
	while (true)
	{
    
    
		cout << "姓名:";
		cin >> name;
		if (name == "stop") break;
		else
		{
    
    
			mail[len].setName(name);//简单的调用函数,不想讲了
			cout << "年龄:";
			cin >> age;
			mail[len].setAge(age);
			cout << "性别:";
			cin >> sex;
			mail[len].setSex(sex);
			cout << "电话号码:";
			cin >> tel;
			mail[len].setTel(tel);
			cout << "家庭地址:";
			cin >> address;
			mail[len].setAddress(address);
			len++;//这个len最终的值会给到save.....emmm..说“给”好像不太准确,找不到合适的词了,反正代码顺着往下执,len加到最后不会再变了,save直接用它。
		}
	}
	save();

}
void MailListManager::insertList()//添加联系人函数
{
    
    
	this->loading();//加载一下初始化联系人的数据
	string name, age, sex, tel, address;//局部变量要重新声明
	cout << "请输入插入联系人的数量:" << endl;
	int count = 0;//再来个计数器,控制每次想要添加的联系人的数量
	cin >> count;//让用户来指定每次添加多少人
	for (int i = 0; i < count; i++)
	{
    
    
		cout << "姓名:";
		cin >> name;
		mail[i].setName(name);//函数调用过程,还是说一下吧。mail[]数组的类型是MailList,然后它是MailListManager这个类的函数成员,通过它作为桥梁来调用MailListManager类成员函数
		cout << "年龄:";
		cin >> age;
		mail[i].setAge(age);
		cout << "性别:";
		cin >> sex;
		mail[i].setSex(sex);
		cout << "电话号码:";
		cin >> tel;
		mail[i].setTel(tel);
		cout << "家庭地址:";
		cin >> address;
		mail[i].setAddress(address);
	}
	ofstream out;//添加有单独的保存文件定义,因为只有添加功能需要使用文件追加
	out.open("maillist/mail.txt", ios::app);
	if (!out)
	{
    
    
		cout << "--文件打开失败--" << endl;
	}
	else
	{
    
    
		for (int i = 0; i < count; i++)
		{
    
    
			out << mail[i].getName() << " " << mail[i].getAge() << " " << mail[i].getSex() << " " << mail[i].getTel() << " " << mail[i].getAddress() << endl;
		}
		out.close();
	}
}
void MailListManager::showList()//显示联系人
{
    
    

	loading();
	MailList temp;
	for (int j=0;j<len;j++)//这里是给联系人排序,通过名字排序
	{
    
    
		for (int i = j+1; i < len; i++)
		{
    
    
			if (mail[j].getName() > mail[i].getName())
			{
    
    
				temp = mail[i];
				mail[i] = mail[j];//交换
				mail[j] = temp;
			}
		}

	}
	for (int i = 0; i < len; i++)//这里的len值来自loading()
	{
    
    
		cout << setw(10) << mail[i].getName() << "  " << setw(8) << mail[i].getAge() << "  " << setw(4) <<
			mail[i].getSex() << "  " << setw(15) << mail[i].getTel() << "  " << setw(20) << mail[i].getAddress();//setw()是格式控制函数
		cout << endl << endl;
	}
}
void MailListManager::updateList()//修改联系人,修改联系人之前要找到这个联系人,存在才能删除
{
    
    
	loading();//加载一下
	string name, age, sex, tel, address;
	cout << "请输入要修改的联系人姓名:";
	cin >> name;
	int ret = exiet(name);//检验一下是否存在,存在exiet()会返回该联系人所在的数组下标,在这个数组下标里重新输入一遍数据覆盖掉原有数据就是修改联系人了
	if (ret != -1)
	{
    
    
		cout << "请重新输入联系人信息:" << endl;
		cout << "姓名:";
		cin >> name;
		mail[ret].setName(name);
		cout << "年龄:";
		cin >> age;
		mail[ret].setAge(age);
		cout << "性别:";
		cin >> sex;
		mail[ret].setSex(sex);
		cout << "电话号码:";
		cin >> tel;
		mail[ret].setTel(tel);
		cout << "家庭地址:";
		cin >> address;
		mail[ret].setAddress(address);
	}
	else
		cout << "啊哦~联系人不存在喔(-o-)";
	save();//改完记得重新保存一下,不然是没有任何改动的哦
}
void MailListManager::deleteList()//删除联系人,理同修改一样,只不过是信息的覆盖变为了内容前移覆盖
{
    
    
	loading();
	string name;
	int o;
	cout << "请输入要删除的联系人的姓名:  ";
	cin >> name;
	int ret = exiet(name);
	if (ret == -1)
	{
    
    
		cout << "啊哦~联系人不存在喔(-o-)";
	}
	else
	{
    
    
		cout << "确定要删除吗?" << endl << "1.确定" << "    " << "2.我再想想" << endl << "请选择:";
		cin >> o;
		if (o == 2)
			cout << "好的~";
		else
		{
    
    

			for (int i = ret; i < len; i++)
			{
    
    
				mail[i] = mail[i + 1];
			}


			cout << "删除成功!";
		}
	}
	save();

}
void MailListManager::selectList()//查找联系人,查找联系人就更简单啦,调用一下检验存在的函数,然后根据下标直接输出此联系人信息就好
{
    
    
	loading();
	string name;
	cout << "请输入要查找的人的姓名:   ";
	cin >> name;
	int ret = exiet(name);
	if (ret != -1)
	{
    
    
		cout << "姓名:" << mail[ret].getName() << endl;
		cout << "年龄:" << mail[ret].getAge() << endl;
		cout << "性别:" << mail[ret].getSex() << endl;
		cout << "电话号码:" << mail[ret].getTel() << endl;
		cout << "家庭地址:" << mail[ret].getAddress() << endl;
	}
	else
		cout << "啊哦~联系人不存在喔(-o-)";
}
void MailListManager::dropList()//清空通讯录,重新写入文件,写入一个空字符覆盖之前的数据,就清空啦
{
    
    
	int n;
	cout << "确定清空吗?" << endl << "  " << "1.YES" << "   " << "2.NO" << "请选择:";
	cin >> n;
	if (n == 2)
	{
    
    
		cout << "ok";
	}
	else
	{
    
    
		ofstream out;
		out.open("maillist/mail.txt");
		if (!out)
		{
    
    
			cout << "--文件打开失败--" << endl;
		}
		else
		{
    
    
			out << " ";
			cout << "清除成功" << endl;
		}
		out.close();
	}
}




void User::loading()//加载函数
{
    
    
	string name, password;
	ifstream in;
	in.open("User/user.txt");
	if (!in)
	{
    
    
		cout << "错误!";
	}
	else
	{
    
    
		while (!in.eof())
		{
    
    
			in >> s[len];
			if (in.fail())break;
			len++;
		}

	}
	in.close();
}
int User::check(string name)//检验函数
{
    
    
	loading();
	for (int i = 0; i < len; i=i+2)
	{
    
    
		if (name == s[i])
		{
    
    
			return i;
		}
		else
		{
    
    
			return -1;
		}
	}
}
int User::login(string name, string password)//登陆函数
{
    
    
	if (check(name) == -1)
	{
    
    
		cout << "用户不存在";
	}
	else
	{
    
    
		if (s[check(name) + 1] == password)
		{
    
    
			return 1;
		}
		else
		{
    
    
			cout << "密码输入错误!";
		}
	}
}
void User::sign(string name,string password)//注册函数
{
    
    
	loading();
	if (check(name) != -1)//已有用户名
	{
    
    
		cout << "用户名已存在!";
	}
	else
	{
    
    
		ofstream out;
		out.open("User/user.txt", ios::app);
		if (!out)
		{
    
    
			cout << "文件打开失败!";
		}
		else
		{
    
    
			out <<endl<< name<<" "<< password;
		}
		out.close();
		cout << "                                            注册成功!";
		system("pause");
	}
}


void menu()
{
    
    
	cout << endl << endl << endl ;
	cout << "                                            -------------------------" << endl;
	cout << "                                            -     1、初始化联系人   -" << endl;
	cout << "                                            -     2、显示联系人     -" << endl;
	cout << "                                            -     3、删除联系人     -" << endl;
	cout << "                                            -     4、查找联系人     -" << endl;
	cout << "                                            -     5、修改联系人     -" << endl;
	cout << "                                            -     6、清空联系人     -" << endl;
	cout << "                                            -     7、添加联系人     -" << endl;
	cout << "                                            -     0、退出通讯录     -" << endl;
	cout << "                                            -------------------------" << endl;
}
int main()
{
    
    
	User u;//实例化对象
	int e;
	cout << endl << endl << endl << endl << endl << endl;
	cout << "                            ******************欢迎使用通讯录管理系统~******************" << endl;
	cout << "                            *                                                         *" << endl;
	cout << "                            *                                                         *" << endl;
	cout << "                            *                                                         *" << endl;
	cout << "                            **********************              ***********************" << endl;
	cout << "                            **1.我已有账户,登录**" <<"              "<< "** 2.我没有账户,注册**" << endl;
	cout << "                            **********************              ***********************" << endl;//这是一个登陆界面,有账户才能管理通讯录哦
	cout << endl<<endl;
	cout<<"                                 请选择:";
	cin >> e;
	if (e == 1)
	{
    
    
		while (true)
		{
    
    
			MailListManager* m = new MailListManager;//来个指针指向堆区
			system("cls");
			string name, password;
			cout <<endl<<endl<< "                                            请输入:" << endl << "                                            用户名:";
			cin >> name;
			cout << endl << "                                            密码:";
			cin >> password;

			int i = u.login(name, password);//调用User里的登陆函数,并将返回值给i,i=1就证明用户名密码输入正确,反之就是输入错误
			if (i == 1)
			{
    
    
				int n;
				while (true)
				{
    
    
					system("cls");
					cout <<endl<<endl<< "                                            登录成功!欢迎" << name << endl;
					cout << "                                            通讯录管理系统功能选项" << endl;
					menu();
					cout << "                                            请选择:";
					cin >> n;
					switch (n)
					{
    
    
					case 7:system("cls"); m->insertList(); system("pause"); break;
					case 2:system("cls"); m->showList(); system("pause"); break;
					case 3:system("cls"); m->deleteList();  system("pause"); break;
					case 4:system("cls"); m->selectList(); system("pause"); break;
					case 5:system("cls"); m->updateList(); system("pause"); break;
					case 6:system("cls"); m->dropList(); system("pause"); break;
					case 1:system("cls"); m->initList(); system("pause"); break;//调用各种函数
					case 0:exit(0); break;
					}
				}
				delete m;
				m = NULL;
			}
			else
			{
    
    
				cout<<endl<<endl << "                                            请重新输入" << endl;
				system("pause");
			}
		}

	}
	else
	{
    
    
		u.loading();//调用User类里的加载函数
		while (true)
		{
    
    
			system("cls");
			string name, password;
			cout <<endl<<endl<< "                                            请输入:" << endl << "                                            用户名:";
			cin >> name;
			if (u.check(name) !=-1)
			{
    
    
				cout << "                                            用户名已存在!请重新输入:"<<endl;
				system("pause");
			}
			else
			{
    
    
				MailListManager* m = new MailListManager;
				cout << endl << "                                            密码:";
				cin >> password;
				/*m->pw();*/
				u.sign(name, password);//调用User类的注册函数,保存注册用户信息
				int n;
				while (true)
				{
    
    
					system("cls");
					cout <<endl<<endl<< "                                            注册成功!欢迎" << name << endl;
					cout << "                                            通讯录管理系统功能选项" << endl;
					menu();
					cout << "                                            请选择:";
					cin >> n;
					switch (n)
					{
    
    
					case 1:system("cls"); m->insertList(); system("pause"); break;
					case 2:system("cls"); m->showList();   system("pause"); break;
					case 3:system("cls"); m->deleteList();  system("pause"); break;
					case 4:system("cls"); m->selectList(); system("pause"); break;
					case 5:system("cls"); m->updateList(); system("pause"); break;
					case 6:system("cls"); m->dropList(); system("pause"); break;
					case 7:system("cls"); m->initList(); system("pause"); break;//调用各种函数
					case 0: exit(0); break;
					}
				}
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45783317/article/details/128619931