【C++OJ拷贝构造】电话号码升位(拷贝构造函数)
题目描述
定义一个电话号码类CTelNumber,包含1个字符指针数据成员,以及构造、析构、打印及拷贝构造函数。
字符指针是用于动态创建一个字符数组,然后保存外来输入的电话号码
构造函数的功能是为对象设置键盘输入的7位电话号码,
拷贝构造函数的功能是用原来7位号码的对象升位为8位号码对象,也就是说拷贝构造的对象是源对象的升级.电话升位的规则是原2、3、4开头的电话号码前面加8,原5、6、7、8开头的前面加2。
注意:合法的电话号码:1、长度为7位;2、电话号码的字符全部是数字字符;3、第一个字符只能是以下字符:2、3、4、5、6、7、8。与上述情况不符的输入均为非法
输入
测试数据的组数 t
第一个7位号码
第二个7位号码
…
输出
第一个号码升位后的号码
第二个号码升位后的号码
…
如果号码升级不成功,则输出报错信息,具体看示例
输入样例
3
6545889
3335656
565655
输出样例
26545889
83335656
Illegal phone number
参考代码
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
class CTelNumber
{
private:
char *s; //包含1个字符指针数据成员,用于动态创建一个字符数组,然后保存外来输入的电话号码
public:
CTelNumber() {} //无参构造函数
CTelNumber(char *p) //构造函数
{
s = new char[8]; // new空间,长度是7+1
strcpy(s, p);
}
CTelNumber(CTelNumber &p) //拷贝构造函数,用原来7位号码的对象升位为8位号码对象
{
s = new char[9];
if (p.s[0] == '2' || p.s[0] == '3' || p.s[0] == '4') //原2、3、4开头的电话号码前面加8
{
s[0] = '8';
}
else if (p.s[0] == '5' || p.s[0] == '6' || p.s[0] == '7' || p.s[0] == '8') //原5、6、7、8开头的前面加2
s[0] = '2';
for (int i = 0; i < 7; i++)
{
s[i + 1] = p.s[i]; //赋值后面7位数
}
}
void print() //打印函数
{
for (int i = 0; i < 8; i++)
cout << s[i];
cout << endl;
}
~CTelNumber() //析构函数
{
delete[] s;
}
};
bool isLegal(char *p)
{
int i;
if (p[0] <= '1' || p[0] >= '9')
return false;
for (i = 0; i < 8 && p[i] != '\0' && p[i] >= '0' && p[i] <= '9'; i++)
;
return i >= 7;
}
int main()
{
int t;
cin >> t;
char *p;
while (t--)
{
p = new char[8];
cin >> p;
if (isLegal(p))
{
CTelNumber c1(p);
CTelNumber c2(c1);
c2.print();
}
else
cout << "Illegal phone number" << endl;
}
}