A.机器人变身(类与对象)

题目描述

编写一个机器人类,包含属性有机器名、血量、伤害值、防御值、类型和等级。其中血量、伤害和防御和等级、类型相关:

普通型机器人,类型为N,血量、伤害、防御是等级的5倍

攻击型机器人,类型为A,攻击是等级的10倍,其他属性和普通的一样

防御型机器人,类型为D,防御是等级的10倍,其他属性和普通的一样

生命型机器人,类型为H,生命是等级的50倍,其他属性和普通的一样。

机器人操作包括:打印、各个属性的获取和设置方法,构造函数可有可无,根据需要自行编写

编写一个全局函数用于机器人变身,使得各种类型机器人能够相互转变。参数包括机器人对象指针和变身后的机器人类型,功能是修改机器人类型,并更改相关的属性。如果变身类型和机器人原来的类型不同,则执行变身功能,并返回true;如果变身类型和原来类型相同,则不执行变身,并返回false.

要求所有数据成员都是私有属性,用C++语言和面向对象设计思想来编程实现上述要求

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
#include<iostream>
#include<cstring>
using namespace std;

class robot
{
private:
string name;
int level,HP,damage,defense;
char type;
public:
robot(string n, char t, int l);
void print();
void set(char t);
char get()
{
return type;
}
};

robot::robot (string n,char t,int l)
{
name = n;
type = t;
level = l;
}

void robot::set(char t)
{
HP = 5 * level;
damage = 5 * level;
defense = 5 * level;
if (t == 'A')
{
damage = 10 * level;
}
else if (t == 'D')
{
defense = 10 * level;
}
else if (t == 'H')
{
HP = 50 * level;
}
this->type = t;
}


void robot::print()
{
cout << name << "--" << type << "--" << level << "--" << HP << "--" << damage << "--" << defense<<endl;
}

bool turn(robot& r, char change)
{
if (r.get() == change)
{
return false;
}
else
{
r.set(change);
return true;
}
}

int main()
{
int t, ll, sum=0;
char tt, cc;
string nn;
cin >> t;
while (t--)
{
cin >> nn >> tt >> ll;
cin>>cc;
robot r(nn, tt, ll);
r.set(tt);
sum += turn(r, cc);
r.print();
}
cout << "The number of robot transform is " << sum << endl;

return 0;
}

B.虚拟电话(构造与析构)

题目描述

虚拟电话包含属性:电话号、状态、机主姓名。
1、电话号是一个类,它包含号码和类型,其中号码是整数类型,类型用单个字母表示用户类别,A表示政府,B表示企业、C表示个人。类操作包括构造、属性的获取和设置等方法,根据需要自行编写。
2、状态用一个数字表示,1表示在用,0表示未用,
3、机主姓名是一个字符串

电话操作包括:构造、析构、打印和查询。
1、构造函数需要考虑复合类成员的构造,并且输出提示信息。假设电话号码为12345678,则构造函数输出"12345678 constructed."
2、打印是输出电话的相关信息,其中如果电话状态是在用则输出use;状态是未用则输出unuse,输出格式看示例。
3、析构函数是输出提示信息。假设电话号为12345678,则析构函数输出"12345678 destructed. "
4、查询操作是根据给定的号码查询电话,如果电话自身号码和给定号码不相同,则返回0;如果电话自身号码和给定号码相同,则返回1

用C++和面向对象思想实现以下要求:
1、输入相关数据,创建三个电话对象,并通过构造方法初始化。
2、输入若干个电话号码,通过查询操作查询这些号码是否在三个电话对象中,如果不存在输出"wrong number.",存在则调用打印操作输出电话信息,具体看输出样例

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
#include<iostream>
#include<cstring>
using namespace std;

class phone
{
private:
string p_name;
int state, p_number;
char p_type;
public:
phone(string na, int st, int num, char tp)
{
p_name = na;
state = st;
p_number = num;
p_type = tp;
cout << p_number << " constructed." << endl;
}
void print();
~phone()
{
cout << p_number << " destructed." << endl;
}
int check(int s);
};

void phone::print()
{
cout << "Phone=" << p_number << "--Type=" << p_type << "--State=";
if (state == 1)
{
cout << "use";
}
else if(state==0)
{
cout << "unuse";
}
cout << "--Owner=" << p_name << endl;

}

int phone::check(int p_num)
{
if (p_number == p_num)
{
return 1;
}
else
{
return 0;
}
}

int main()
{
int number, state;
char type;
string name;
int t;
cin >> number >> type >> state >> name;
phone one(name, state, number, type);
cin >> number >> type >> state >> name;
phone two(name, state, number, type);
cin >> number >> type >> state >> name;
phone three(name, state, number, type);
cin >> t;
while (t--)
{
cin >> number;
int tmp = 0;
tmp += one.check(number);
if (one.check(number))
one.print();
tmp += two.check(number);
if (two.check(number))
two.print();
tmp += three.check(number);
if (three.check(number))
three.print();
if (tmp == 0)
{
cout << "wrong number." << endl;
}
}
return 0;
}

C.银行账户(拷贝构造)

题目描述

银行账户包括余额、利率、号码、类型等属性,其中号是固定8位整数,类型表示个人还是企业账户,如果是个人用P标识,企业用E标识。

账户又分为活期账户和定期账户,活期利率为0.5%,定期利率为1.5%。

账户操作有计息、查询操作。计息操作是根据利率计算利息,并把利息增加到余额中,并做相关信息输出。查询操作是输出账户的全部信息。

创建一个活期账户,并通过构造函数初始化各个属性。然后通过拷贝构造来创建一个定期账户,信息与活期账户基本相同,不同之处包括:定期账户号码是活期账户号码加50000000(7个0);利率是定期利率。

要求所有数据成员都是私有属性

用C++语言的类与对象思想来编写程序实现上述要求

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
#include<iostream>
using namespace std;

class BankAccount
{
private:
double balance, irate;
int num;
char type;
public:
BankAccount(int n, char t, double b)
{
num = n;
type = t;
balance = b;
irate = 0.005;
}
BankAccount(BankAccount& ba)
{
num = 50000000 + ba.num;
type = ba.type;
balance = ba.balance;
irate = 0.015;
}
void rate();
void check();
void operate(char tt);
};

void BankAccount::rate()
{
balance = balance * irate + balance;
cout << "Account=" << num << "--sum=" << balance << endl;
}

void BankAccount::check()
{
cout << "Account=" << num << "--";
if (type == 'P')
{
cout << "Person";
}
else
{
cout << "Enterprise";
}
cout << "--sum=" << balance << "--rate=" << irate << endl;
}

void BankAccount::operate(char tt)
{
if (tt == 'C')
{
rate();
}
if (tt == 'P')
{
check();
}
}

int main()
{
int t, n;
double b;
char tp, op1, op2;
cin >> t;
while (t--)
{
cin >> n >> tp >> b >> op1 >> op2;
BankAccount p(n, tp, b);
BankAccount q(p);
p.operate(op1);
q.operate(op2);
}
return 0;
}

D.电视遥控(静态+友元)

题目描述

电视机包含音量、模式、频道号等属性,其中模式分为TVDVD两种。电视机在TV模式下,将播放相应频道的内容;在DVD模式下,电视机使用统一的频道号播放DVD的内容,频道号统一为99。另外,电视机采用静态成员的方法共享两个数据:播放电视的电视机数量和播放DVD的电视机数量,初始都为0。

电视机操作包括打印、相关静态函数、属性的获取和设置等,根据需要自行编写。

现编写一个遥控器函数,通过友元方法对电视机进行控制,它的参数包括电视机对象、模式、变化音量、频道号,无返回值。函数操作包括:
1、对电视机对象进行模式设置,如果设置为DVD模式,则频道号参数一定是99;如果设置TV模式,则要把频道号设置相应的值。
2、根据变化音量进行调整,例如原有音量为50,现输入变化音量为-30,则50-30=20,音量最终为20。音量值最低为0,最高为100,超过范围则音量不再变化。
3、更新当前播放电视和播放DVD的电视机数量
4、调用电视机对象的打印方法输出电视相关信息
提示:如果电视机原来模式和参数传递的模式是相同的,那么实际操作就是调整音量、切换频道和输出信息。

注意:函数第一个参数必须是一个电视机对象,不可以是整数类型,可以是对象、或对象指针、或对象引用,根据需要自行编写。
用动态数组方法创建n台电视机,从1开始编号,频道号为编号,音量初始为50,模式为TV,然后通过遥控器函数对电视机进行控制。
所有类的数据成员都是私有属性。请使用C++语言和面向对象思想来实现上述要求

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
#include<iostream>
#include<cstring>
using namespace std;

class TV
{
private:
int number;
int volume;
int channel;
string mode;
static int t_num;
static int d_num;

public:
TV(int n, int c, string m, int v)
{
number = n;
channel = c;
mode = m;
volume = v;
t_num++;
}
void set(string m, int c);
void adjust(int v);
void print();
friend void control(TV& t, string m, int v, int c);
static int getTV()
{
return t_num;
}
static int getDVD()
{
return d_num;
}
};

int TV::t_num = 0;
int TV::d_num = 0;

void TV::set(string m, int c = 0)
{
if (mode == "TV" && m == "DVD")
{
channel = 99;
d_num++;
t_num--;
}
else if (mode == "DVD" && m == "TV")
{
channel = c;
t_num++;
d_num--;
}
else if (m == "TV")
{
channel = c;
}

mode = m;
}

void TV::adjust(int v)
{
volume += v;
if (volume > 100)
{
volume = 100;
}
else if (volume < 0)
{
volume = 0;
}
}

void TV::print()
{
cout << "第" << number << "号电视机--" << mode << "模式--频道" << channel << "--音量" << volume << endl;
}

void control(TV& t, string m, int c, int v)
{
t.set(m, c);
t.adjust(v);
t.print();
}

int main()
{
int n, t;
cin >> n >> t;

TV** tele = new TV * [n];
for (int j = 0; j < n; j++)
{
tele[j] = new TV(j + 1, j + 1, "TV", 50);
}
while (t--)
{
int i, k, cv, x;
string m;
cin >> i >> k >> x >> cv;
if (k == 1)
{
m = "TV";
}
else if(k == 2)
{
m = "DVD";
}
control(*tele[i - 1], m, x, cv);
}

cout << "播放电视的电视机数量为" << TV::getTV() << endl;
cout << "播放DVD的电视机数量为" << TV::getDVD() << endl;

for (int i = 0; i < n; i++)
{
delete tele[i];
}
delete[]tele;

return 0;
}