【id:51】【20分】C. 电话号码升位(拷贝构造函数)
题目描述
定义一个电话号码类CTelNumber,包含1个字符指针数据成员,以及构造、析构、打印及拷贝构造函数。
字符指针是用于动态创建一个字符数组,然后保存外来输入的电话号码
构造函数的功能是为对象设置键盘输入的7位电话号码,
拷贝构造函数的功能是用原来7位号码的对象升位为8位号码对象,也就是说拷贝构造的对象是源对象的升级.电话升位的规则是原2、3、4开头的电话号码前面加8,原5、6、7、8开头的前面加2。
注意:电话号码只能全部是数字字符,且与上述情况不符的输入均为非法)
输入
测试数据的组数 t
第一个7位号码
第二个7位号码
…
输出
第一个号码升位后的号码
第二个号码升位后的号码
…
如果号码升级不成功,则输出报错信息,具体看示例
输入样例
3
6545889
3335656
565655
输出样例
26545889
83335656
Illegal phone number
解题思路:注意!!!这里题目所说的号码非法输入包括了号码长度不为7、号码非数字和能升级成功的号码(不以2、3、4、5、6、7、8开头的号码)。这题的思路为:先创建字符数组,判断输入是否为合法电话号码。如果是的话就用该字符数组创建对象,用创建对象拷贝构造一个新的对象以实现号码升级。
#include<iostream>
#include<string>
using namespace std;
class CTelNumber
{
private:
char* p;
public:
CTelNumber(char* point); //构造函数
~CTelNumber(); //析构函数
CTelNumber(const CTelNumber&a);//拷贝构造函数
};
CTelNumber::CTelNumber(char* point)
{
p = new char[8];
for (int i = 0; i < 8; i++)
{
p[i] = *point;
point++;
}
}
CTelNumber::~CTelNumber()
{
delete[]p;
}
CTelNumber::CTelNumber(const CTelNumber& a)
{
p = new char[9]; //加多一位
if (a.p[0] == '2' || a.p[0] == '3' || a.p[0] == '4') //判断情况
{
p[0]='8'; //首位为8,其余的拷贝
int k = 0;
for (int i = 1; i < 9; i++,k++)
{
p[i] = a.p[k]; //拷贝操作
}
}
else if (a.p[0] == '5' || a.p[0] == '6' || a.p[0] == '7' || a.p[0] == '8') //同上
{
p[0] = '2';
int k = 0;
for (int i = 1; i < 9; i++, k++)
{
p[i] = a.p[k];
}
}
cout << p << endl;
}
int isDigtal(char* p)
{
int num = 0;
if (p[0] < '2' || p[0]> '8') //判断不能升级的号码
{
return 0;
}
for (int i = 0;p[i] != '\0' && p[i] >= '0' && p[i] <= '9'; i++)//判断字符是否为数字
{
num++;
}
if (num == 7)//判断数字的个数
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
char p[8]; //7个数字+'\0'共8个字符
cin >> p;//注意像这样直接输入编译器会自动帮我们在后面补上'\0'
if (isDigtal(p))//判断号码是否合法
{
CTelNumber old(p);