深圳大学计软《面向对象的程序设计》实验9 期中复习

A. 机器人变身(类与对象)【期中模拟】

题目描述

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

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

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

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

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

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

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

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

输入

第一行输入t,表示要执行t次机器人变身

接着每两行,一行输入一个机器人的属性,包括机器名、类型、等级,另一行输入变身类型

依次类推输入

输出

每行输出变身后的机器人信息,要求调用机器人的打印方法来输出,即使机器人不变身也输出

属性输出依次为:名称、类型、等级、血量、伤害、防御

最后一行输出执行变身的次数

输入样例1

3
X001 N 5
H
X002 A 5
D
X003 D 5
D

输出样例1

X001–H–5–250–25–25
X002–D–5–25–25–50
X003–D–5–25–25–50
The number of robot transform is 2

AC代码

#include<iostream>
using namespace std;


class Robot {
    
    
	char type;
	string name;
	int dengji, xueliang, shanghai, fangyu;
	static int cnt;

public:
	Robot() {
    
    
		cin >> name >> type >> dengji;
		f();
	}

	//生成其他信息
	void f() {
    
    
		xueliang = shanghai = fangyu = dengji * 5;
		if (type == 'A')
			shanghai = dengji * 10;
		else if (type == 'D')
			fangyu = dengji * 10;
		else if (type == 'H')
			xueliang = dengji * 50;
	}

	void print() {
    
    
		cout << name << "--" << type << "--" << dengji << "--" << xueliang << "--" << shanghai << "--" << fangyu << endl;
	}

	char getType() {
    
     return type; }
	string getName() {
    
     return name; }
	int getDengji() {
    
     return dengji; }
	int getXueliang() {
    
     return xueliang; }
	int getShanghai() {
    
     return shanghai; }
	int getFangyu() {
    
     return fangyu; }

	void setType(char c) {
    
    
		type = c;
	}

	void setName(string name) {
    
     this->name = name; }
	void setDengji(int v) {
    
     dengji = v; }
	void setXueliang(int v) {
    
     xueliang = v; }
	void setShanghai(int v) {
    
     shanghai = v; }
	void setFangyu(int v) {
    
     fangyu = v; }

	static void print1() {
    
    
		cout << "The number of robot transform is " << cnt << endl;
	}

	void add() {
    
     cnt++; }
};

int Robot::cnt = 0;


bool trans(Robot* p, char desType) {
    
    
	if (p->getType() == desType)
		return false;
	p->setType(desType);
	p->f();
	p->add();
	return true;
}

int main() {
    
    
	int n;
	cin >> n;
	while (n--)
	{
    
    
		Robot r;
		char c;
		cin >> c;
		trans(&r, c);
		r.print();
	}
	Robot::print1();
	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.",存在则调用打印操作输出电话信息,具体看输出样例。

输入

头三行输入三个电话信息,每行包括电话号码、电话类型、状态、机主姓名

接着一行输入t,表示有t个号码要查询

接着t行输入t个电话号码

输出

t行输出t个号码的查询结果

输入样例1

80000001 A 1 tom
80000002 B 0 ken
80000003 C 1 mary
3
50000002
80000003
80000002

输出样例1

80000001 constructed.
80000002 constructed.
80000003 constructed.
wrong number.
Phone=80000003–Type=C–State=use–Owner=mary
Phone=80000002–Type=B–State=unuse–Owner=ken
80000003 destructed.
80000002 destructed.
80000001 destructed.

AC代码

#include<iostream>
#include<vector>
using namespace std;

class ID {
    
    
	int id;
	char type;
public:
	ID(int i, char t) :id(i), type(t) {
    
    }
	ID() {
    
    }
	void setType(char c) {
    
    
		type = c;
	}
	void setID(int i) {
    
    
		id = i;
	}
	char getType() {
    
     return type; }
	int getId() {
    
    
		return id;
	}
};


class Phone {
    
    
	ID _id;
	int state;
	string name;

public:
	Phone() {
    
    
		int id;
		char c;
		cin >> id >> c >> state >> name;
		_id.setID(id);
		_id.setType(c);

		cout << _id.getId() << " constructed." << endl;
	}

	bool find(int num) {
    
    
		return num == _id.getId();
	}


	~Phone()
	{
    
    
		cout << _id.getId() << " destructed." << endl;
	}

	void print() {
    
    
		cout << "Phone=" << _id.getId() << "--Type=";
		cout << _id.getType() << "--State=";
		if (state == 0)
			cout << "unuse";
		else
			cout << "use";
		cout << "--Owner=" << name << endl;
	}

};

int main() {
    
    
	Phone* v = new Phone[3];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
    
    
		int id;
		cin >> id;
		bool f = 0;
		for (int j = 0; j < 3; j++) {
    
    
			if (v[j].find(id)) {
    
    
				v[j].print();
				f = 1;
				break;
			}
		}
		if (!f)
			cout << "wrong number." << endl;
	}
	delete[]v;
	return 0;
}

C. 银行账户(拷贝构造)【期中模拟】

题目描述

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

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

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

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

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

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

输入

输入测试个数t,表示有t个活期账户

先输入一个活期账户的账户号码、账户类型、余额(根据输入创建活期账户和定期账户)

接着输入两个操作符,第一个操作符对活期账户操作,第二个操作符对定期账户进行操作。若输入大写字母C表示计息操作,若输入大写字母P表示查询操作

以此类推输入其他账户的信息和操作

输出

每两行输出一对活期账户和定期账户的操作结果。

输入样例1

2
12345678 P 10000
C P
23456789 E 20000
P C

输出样例1

Account=12345678–sum=10050
Account=62345678–Person–sum=10000–rate=0.015
Account=23456789–Enterprise–sum=20000–rate=0.005
Account=73456789–sum=20300

AC代码

#include<iostream>
#include<vector>
using namespace std;

class Account {
    
    
	double balance;
	double rate;
	int id;
	char type;
public:
	Account() {
    
    
		cin >> id >> type >> balance;
		rate = 0.005;
	}

	Account(const Account& a) {
    
    
		balance = a.balance;
		rate = 0.015;
		id = a.id + 50000000;
		type = a.type;
	}

	void print() {
    
    

	}

	void C() {
    
    
		balance *= (1.0 + rate);
		cout << "Account=" << id << "--";
		cout << "sum=" << balance << endl;
	}

	void P() {
    
    
		cout << "Account=" << id << "--";
		if (type == 'P')
			cout << "Person--";
		else 
			cout << "Enterprise--";
		cout << "sum=" << balance << "--";
		cout << "rate=" << rate << endl;
	}
};

int main() {
    
    
	int n;
	cin >> n;
	while (n--)
	{
    
    
		Account a;
		Account b(a);
		char c1, c2;
		cin >> c1 >> c2;
		if (c1 == 'C')
			a.C();
		else
			a.P();
		if (c2 == 'P')
			b.P();
		else
			b.C();
	}
	return 0;
}

D. 生日打折(复合类构造)

题目描述

定义一个日期类Date,包含数据成员year\month\day,还包含构造函数及其他函数(根据需要自己添加)

定义一个会员类VIP,包含数据成员id和birth,其中id是整数表示会员编号;birth是Date类型表示生日。

类VIP包含构造函数和其他函数(根据需要自己添加),还包含一个折扣函数Discount。函数Discount返回结果为浮点数表示折扣,函数包含1个参数为日期类型,函数功能是判断参数日期是否会员生日,是则折扣为0.5,不是则折扣为0.95

编写程序实现上述类功能并实现输入输出的要求

输入

第一行输入年、月、日,表示今天日期

第二行输入t表示有t个会员

第三行输入第1个会员的ID、生日的年、月、日

第四行输入第1个会员的消费金额

依次类推输入下一个会员的两行数据…

输出

根据会员的消费金额,调用Discount函数判断今天是否会员生日并得到折扣,然后计算会员打完折的消费金额

每一行先输出会员编号,再输出会员打完折的消费金额,消费金额只需要输出整数部分

提示把浮点数转整数

double x = 123.456

cout<<int(x)<<endl;

输入样例1

2017 4 20
2
1111 2000 4 20
136
2222 2000 3 30
125

输出样例1

1111’s consumption is 68
2222’s consumption is 118

AC代码

#include<iostream>
using namespace std;

class Date {
    
    
	int y, m, d;
public:

	Date() {
    
     cin >> y >> m >> d; }
	Date(int y, int m, int d) :
		y(y), m(m), d(d)
	{
    
    
	}

	bool operator ==(const Date& date)const {
    
    
		return  m == date.m && d == date.d;
	}

};


class VIP {
    
    
	int id;
	Date birth;
public:
	VIP(int id, Date b) :
		id(id),
		birth(b) {
    
    

	}

	double Discount(const Date& today) {
    
    
		if (today == birth)
			return 0.5;
		return 0.95;
	}

	void print(double money, const Date& today) {
    
    
		cout << id << "'s consumption is " << (int)(money * Discount(today)) << endl;
	}

};

int main() {
    
    
	Date today;

	int n;
	cin >> n;
	while (n--) {
    
    
		int a, b, c, d;
		cin >> a >> b >> c >> d;
		VIP v(a, Date(b, c, d));
		double money;
		cin >> money;
		v.print(money, today);
	}
	return 0;
}

E. 电视遥控(静态+友元)【期中模拟】

题目描述

电视机包含音量、模式、频道号等属性,其中模式分为TV和DVD两种。电视机在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++语言和面向对象思想来实现上述要求

输入

第一行输入n,表示有n台电视台

第二行输入t,表示将执行t次遥控操作

接着输入t行,每行依次输入电视机编号i、模式k、频道号x和变化音量,其中i表示第i台电视机,k为1表示TV模式,k为2表示DVD模式。

输出

每行输出执行遥控操作后的电视机信息

最后一行输出当前播放电视和播放DVD的电视机数量。

具体格式看样例

输入样例1

10
5
3 1 11 20
4 2 99 -20
5 2 99 80
5 1 55 -60
6 2 99 -70

输出样例1

第3号电视机–TV模式–频道11–音量70
第4号电视机–DVD模式–频道99–音量30
第5号电视机–DVD模式–频道99–音量100
第5号电视机–TV模式–频道55–音量40
第6号电视机–DVD模式–频道99–音量0
播放电视的电视机数量为8
播放DVD的电视机数量为2

AC代码

#include<iostream>
using namespace std;

class Tel {
    
    
	static int cntTV, cntDVD;
	int yinliang, pindao;
	int moshi;
public:
	Tel() {
    
    
		moshi = 1;
		cntTV++;
		pindao = 0;
		yinliang = 50;
	}

	void changeYin(int v) {
    
    
		yinliang += v;
		if (yinliang > 100)
			yinliang = 100;
		else if (yinliang < 0)
			yinliang = 0;
	}

	void print1() {
    
    
		if (moshi == 1)
			cout << "TV模式--";
		else if (moshi == 2)
			cout << "DVD模式--";
		cout << "频道" << pindao << "--";
		cout << "音量" << yinliang << endl;
	}

	static void print() {
    
    
		cout << "播放电视的电视机数量为" << cntTV << endl;
		cout << "播放DVD的电视机数量为" << cntDVD << endl;
	}

	//2 DVD
	//1 TV
	friend void yaokongqi(Tel* p, int moshi, int pindao, int bianyin) {
    
    
		if (p->moshi != moshi) {
    
    

			if (p->moshi == 1)
				p->cntTV--;
			else if (p->moshi == 2)
				p->cntDVD--;

			p->moshi = moshi;

			if (p->moshi == 1)
				p->cntTV++;
			else
				p->cntDVD++;

		}
		p->pindao = pindao;

		p->changeYin(bianyin);
		p->print1();

	}
};



int Tel::cntTV = 0;
int Tel::cntDVD = 0;

int main() {
    
    
	int n, t;
	cin >> n >> t;
	Tel* p = new Tel[n];
	while (t--)
	{
    
    
		int i, k, x, delta;
		cin >> i >> k >> x >> delta;
		cout << "第" << i << "号电视机--";
		i--;
		yaokongqi(p + i, k, x, delta);
	}
	Tel::print();
	return 0;
}

F. 链表的冒泡排序(结构体+链表)

题目描述

根据输入,采用尾插法创建链表。对创建的链表使用冒泡排序进行降序排序,输出排序后的链表。

说明:程序中不可见数组、容器,否则计0分。

输入

测试次数t

每组测试数据格式为:

数据个数n

n行,每行一个字符串

输出

对每组测试数据,输出字符串按字典降序排序后的链表。各组输出间以空行分隔。

输入样例1

2
4
shenzhen
nanjing
beijing
wuhan
6
china
brazil
germany
philippines
switzerland
singapore

输出样例1

wuhan
shenzhen
nanjing
beijing

switzerland
singapore
philippines
germany
china
brazil

AC代码

#include<iostream>
using namespace std;

struct Node {
    
    
	string v;
	Node* next;
	Node(string v = "", Node* next = NULL) {
    
    
		this->v = v;
		this->next = next;
	}
};



class List {
    
    
	Node* head;
	int len;
public:
	List() {
    
    
		head = new Node();
		cin >> len;
		Node* p = head;
		for (int i = 0; i < len; i++) {
    
    
			string s;
			cin >> s;
			p->next = new Node(s);
			p = p->next;
		}
	}

	void print() {
    
    
		Node* p = head->next;
		while (p) {
    
    
			cout << p->v << endl;
			p = p->next;
		}
		cout << endl;
	}

	//交换p之后的两个节点
	void swap(Node* p) {
    
    
		Node* p1 = p->next;
		Node* p2 = p1->next;

		p->next = p2;
		Node* q = p2->next;
		p2->next = p1;
		p1->next = q;
	}

	//找到第index个节点的前一个
	Node* findNode(int index) {
    
    
		Node* p = head;
		while (index--)
			p = p->next;
		return p;

	}


	void BubbleSort() {
    
    
		for (int i = 1; i < len; i++) {
    
    
			bool flag = 0;
			Node* prior;
			int j;
			for (j = 0, prior = head; j < len - i; j++, prior = prior->next)
			{
    
    
				if (prior->next->v < prior->next->next->v) {
    
    
					swap(prior);
					flag = 1;
				}
			}
			if (!flag)
				break;
		}
	}

	~List() {
    
    
		while (head) {
    
    
			Node* p = head->next;
			delete head;
			head = p;
		}
	}


};



int main() {
    
    
	int t;
	cin >> t;
	while (t--) {
    
    

		List l;
		l.BubbleSort();
		l.print();

	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46655675/article/details/129324321