地址薄C++该类存有姓名,地址,电话号码,生日等信息。

1.自己设计一个地址簿(类地址簿,和主程序),功能自定义(如输入、输出、查
找、排序等功能),至少需要有输入、输出(需重载提取运算符>>和插入运算符<<)
和查找功能.程序要求记录联系人的姓名,地址,电话号码,生日等信息. 数据成员至少有一个是指针类型,需要有动态内存分配.必须在类中定义和实现
构造函数、析构函数和拷贝构造函数;并在主程序中调用上这些函数.

设计思路:

只定义一个地址薄类,该类存有姓名,地址,电话号码,生日等信息。
在类中有运算符重载,方便输入信息,有默认构造函数,带参数构造函数,析构函数,以及拷贝构造函数

#include <iostream>
#include <string>
using namespace std;
int ssCount;
class AddressBook
{
friend istream& operator >>(istream& input, AddressBook& add); //运算符重载,方便输出
friend ostream& operator <<(ostream& output, AddressBook& add); //运算符重载,方便输入
private:
	int telephone;
	char * name;
	int birthday;
	char *address;
public:
	AddressBook& operator = (const AddressBook& p)
	{
		if (this != &p)
		{
			this->birthday = p.birthday;
			this->telephone = p.telephone;
			name= new char[strlen(p.name) + 1];
			strcpy_s(name, strlen(p.name) + 1, p.name);
			address = new char[strlen(p.address) + 1];
			strcpy_s(address, strlen(p.address) + 1, p.address);
		}
		return *this;
	}
	AddressBook() {
		telephone = 0;
		name = new char[30];
		birthday = 0;
		address = new char[30];
	};
	AddressBook(int tele, char* n, int b, char* add) {
	telephone = tele;
	name = n;
	birthday = b;
	address = add;
	};
	~AddressBook()
	{
	     if ((this->telephone != 0) && (this->address != NULL) && (this->name != NULL))
	    {
		cout << "析构函数调用" << endl;
		cout << "名字是 " << this->name << " 生日日期是 " << this->birthday << " 家
		庭住址是 " << this->address << " 电话号码是 " << this->telephone << endl;
		delete[]name;
		delete[]address;
	}
};
AddressBook(const AddressBook& a) //拷贝构造函数
{
telephone = a.telephone;
name = a.name;
birthday = a.birthday;
address = a.address;
};
bool getname(AddressBook& p, char* a)
{
if (strcmp(p.name, a) == 0)
return true;
else
return false;
}
int getbirthday()
{
return birthday;
}
};
istream& operator >>(istream& input, AddressBook& add)
{
input >> add.name >> add.birthday >> add.address >> add.telephone;
cout << endl;
return input;
}
ostream& operator <<(ostream& output, AddressBook& add)
{
output << "名字是 " << add.name << " 生日日期是 " << add.birthday << " 家庭住址是
" << add.address << " 电话号码是 " << add.telephone;
return output;
}
void Menu()
{
cout << "**************************" << endl;cout << "*********** 欢迎使用地址薄 ******" << endl;
cout << "*******1.输出添加的人员信息******" << endl;
cout << "*******2.查找所有已有人员信息*****" << endl;
cout << "******3.添加地址薄存有的人员信息**" << endl;
cout << "******4.给地址薄存有的人员信息排序**" << endl;
cout << "**********5.退出系统**************" << endl;
cout << "**************************" << endl;
}
AddressBook ad[10];
int main()
{
bool flag = 0; //用于结束地址薄的功能
bool flag1 = 1; //用于查找人员,未找到做标记
Menu();
int m = 0;
int n = 0, x = 0;
int j = 0;
ssCount = 0;
AddressBook tem;
cout << "请输入要增加的成员数: ";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "请分别输入第 " << i + 1 << "个成员的信息,姓名、生日,电话、地址:" << endl;
cin >> ad[i];
ssCount++;
}
while (flag == 0)
{
cout << "请输入选择的功能 1-5" << endl;
cin >> m;
switch (m)
{
case 1://输出功能
cout << "******正在使用输出功能********" << endl;
for (int i = 0; i < ssCount; i++)
{
cout << ad[i] << endl;
}break;
case 2://查找功能
cout << "******正在使用查找功能********" << endl;
char* name1;
name1 = new char[30];cout << "请输入名字:";
cin >> name1;
for (int i = 0; i < ssCount; i++)
{
for (int j = 0; j < ssCount; j++)
{
if (ad[i].getname(ad[j], name1))
{
cout << ad[j] << endl;
flag1 = 0;
}
}
}
if (flag1 == 1)
cout << "没有找到" << endl;
break;
case 3://添加功能
cout << "******正在使用添加功能********" << endl;
j = ssCount;
cout << "请输入要增加的成员数:";
cin >> x;
for (int i = j; i < j + x; i++)
{
cout << "请分别输入第 " << i+1 << "个成员的信息,姓名、生日,电话、地址:" << endl;
cin >> ad[i];
ssCount++;
}
cout << "此时总人数是:" << ssCount << endl;
break;
case 4:
cout << "******正在使用排序功能********" << endl;
for (int i = 1; i < ssCount; i++)
{
for (int j = 0; j < ssCount - i ; j++)
{
if (ad[j].getbirthday() > ad[j + 1].getbirthday())
{
tem = ad[j];
ad[j] = ad[j + 1];
ad[j + 1] = tem;
}
}
}for (int i = 0; i < ssCount; i++)
{
cout << ad[i] << endl;
}; break;
case 5:cout << "退出地址薄" << endl; flag = 1; break;
}
}
return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值