【c++基础】081实际意义的析构函数

简介:实际意义的析构函数

翻译机器人修改

  1. 机器人的特征
    • 姓名
    • 型号
    • 整数:待翻译的整数
    • 翻译的英文句子字符串:字符指针,句子有长有短
    • ……
  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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

#include <cstring>
using namespace std;
static char *num1[] = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};

static char *num10[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

class
{
private:
char name[20];
char type[20]; //机器人型号
int num; //待翻译的整数
char *ps; //指向英文字符串
public:
robot() //构造函数
{
strcpy(name, "XXXXXX");
strcpy(type, "YYYYYY");
num = 0;
ps = new char[5];
strcpy(ps, "zero");
}
void set(char n[], char t[], int m); //设置修改数据
char *out(int a); //英文中每三位数读法相同,所以定义out函数翻译小于1000的整数
char *tran_int(int n); //将1~1999999999的整数翻译成英文句子
void print_num(); //输出整数及其英文句子
~robot() { delete[] ps; }; //析构函数,释放构造函数和set函数中动态申请的ps数组
};
char *robot::out(int a)
{
char k[1000] = "";
int b = a % 100;
//若百位不为0,输出百位数加hundred,若此时十位各位均为0,不加and
if (a / 100 != 0)
{
strcat(k, num1[a / 100]);
strcat(k, " ");
strcat(k, "hundred ");
if (b != 0)
strcat(k, "and ");
}
//当后两位在20以内时,直接调用num1[n],输出
if (b < 20)
{
strcat(k, num1[b]);
strcat(k, " ");
}
else
{
//先调用num10,输出十位数
strcat(k, num10[b / 10]);
//个位不为0时应输出“-”个位数
if (b % 10 != 0)
{
strcat(k, "b-");
strcat(k, num1[b % 10]);
strcat(k, " ");
}
}
char *p = new char[strlen(k) + 1];
strcpy(p, k);
return p;
}
char *robot::tran_int(int n)
{
char *p;
char kk[1000] = "";
if (n > 1999999999)
strcpy(kk, "数字过大,无法处理!");
else
{
//三位三位取出,存入abcd中
int a = n / 1000000000, b = (n % 1000000000) / 1000000, c = (n % 1000000) / 1000, d = n % 1000;
//不等于0时,输出并加上million或thousand
if (a != 0)
{
p = out(a);
strcpy(kk, p);
strcat(kk, "billion ");
delete[] p; //释放在out函数中动态申请的空间
}
if (b != 0)
{
p = out(b);
strcpy(kk, p);
strcat(kk, "million ");
delete[] p; //释放在out函数中动态申请的空间
}
if (c != 0)
{
p = out(c);
strcpy(kk, p);
strcat(kk, "thousand ");
delete[] p; //释放在out函数中动态申请的空间
}
if (d != 0)
{
//根据英文法规则,最后两位前一定有and
if (d < 100 && (a != 0 || b != 0 || c != 0))
strcat(kk, "and ");
p = out(d);
strcat(kk, p);
delete[] p;
}
}
p = new char[strlen(kk) + 1];
strcpy(p, kk);
return p;
}
void robot::set(char n[], char t[], int m)
{
strcpy(name, n);
strcpy(type, t);
if (num == m)
return;
else
{
num = m;
delete[] ps;
}
if (num > 0)
{
char *tp = tran_int(num);
ps = new char[strlen(tp) + 1];
strcpy(ps, tp);
delete[] tp;
}
else if (num == 0)
{
ps = new char[5];
strcpy(ps, "zero");
}
else
{
ps = new char[13];
strcpy(ps, "负数不能翻译");
}
}
void robot::print_num()
{
cout << ps << endl;
}
int main()
{
robot brown;
brown.print_num();
int n;
cout << "请输入n:";
cin >> n;
brown.set("brown", "800#", n);
brown.print_num();
return 0;
}