1.题目
定义一个电话号码类CTelNumber,包含1个字符指针数据成员,以及构造、析构、打印及拷贝构造函数。
字符指针是用于动态创建一个字符数组,然后保存外来输入的电话号码
构造函数的功能是为对象设置键盘输入的7位电话号码,
拷贝构造函数的功能是用原来7位号码的对象升位为8位号码对象,也就是说拷贝构造的对象是源对象的升级.电话升位的规则是原2、3、4开头的电话号码前面加8,原5、6、7、8开头的前面加2。
注意:电话号码只能全部是数字字符,且与上述情况不符的输入均为非法
2.代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> using namespace std;
class CTelNumber { private: char* str; public: CTelNumber(const char* num); CTelNumber(const CTelNumber& c); ~CTelNumber(); void print(); };
CTelNumber::CTelNumber(const char* num) { str = new char[9]; strncpy(str, num , 7); str[7] = '\0'; }
CTelNumber::CTelNumber(const CTelNumber& c) { str = new char[9]; strcpy(str, c.str);
if (str[0] == '2' || str[0] == '3' || str[0] == '4') { str[0] = '8'; } else { str[0] = '2'; } for (int i = 1; i < 8; i++) { str[i] = c.str[i - 1]; } str[8] = '\0'; }
CTelNumber::~CTelNumber() { delete[]str; }
void CTelNumber::print() { cout << str << endl; }
bool isValid(char* s) { if (strlen(s) != 7 || s[0] == '1' || s[0] == '0' || s[0] == '9') { return false; }
for (int i = 0; i < 7; i++) { if (s[i] > '9' || s[i] < '0') { return false; } } return true; }
int main() { int t; cin >> t;
for (int i = 0; i < t; i++) { char* pn = new char[8]; cin >> pn; bool flag = isValid(pn); if (flag) { CTelNumber c1(pn); CTelNumber c2(c1); c2.print(); } else { cout << "Illegal phone number" << endl; } } return 0; }
|
长教训了真的 下次我一定一定一定仔细读题
题目说234前面加8
5678前面加2
我一直都忘记了9这个数字开头也会是非法
一直只考虑了01开头非法
就多考虑这一点点 我前两天下午交的第一遍就可以对了!
后面我就是一直改一直试 我说怎么就不对我一定要做出来
后面实在是过不了了 我就把我的答案和题目发给AI 让它帮我改 我仔细对照了一下 我说那几个主要的函数都没有问题啊 而且我那三个测试样例可以过两个 到底是什么鬼
然后我就把AI的答案放进去测试就过了
虽然过了但我一直耿耿于怀 刚刚直接把前面写的全删了 我说我直接重开 我一定要找出来哪里有问题
最后的最后就是我发现…也是很眼瞎了 也是很执着了 也是长教训了!
所以把这道题写进来,希望自己以后多考虑一点。。。要不又是浪费时间在小问题上了。