Experimento de "Programación orientada a objetos" Jisoft de la Universidad de Shenzhen 15 plantillas de funciones y plantillas de clase

A. Clase de plantilla de matriz limitada (plantilla de clase)

Tema Descripción

Escriba una plantilla de matriz limitada BoundArray(es decir, verifique la referencia del subíndice al elemento de la matriz y finalice la ejecución del programa cuando el subíndice esté fuera de los límites), que puede almacenar varios tipos de datos. Es necesario implementar el método de clasificación de la matriz sorty el método de búsqueda de la matriz search.

ingresar

Ingrese t primero en la primera línea, lo que indica que hay t casos de prueba

Ingrese los datos para cada caso de prueba a partir de la segunda fila.

Primero ingrese el tipo de datos, Irepresentación int, Drepresentación double, Crepresentación char, y luego ingrese la cantidad de elementos en la matriz

Luego ingrese cada elemento

Finalmente ingrese el elemento para encontrar

producción

Primero salida los elementos ordenados de pequeño a grande

Luego, emita el resultado de encontrar el elemento, si lo encuentra, emita el subíndice, si no lo encuentra, emita-1

Muestra de entrada 1

2
I 2
1 2
2
D 3
3.5 6.2 2.9
2.1

muestra de salida 1

1 2
1
2,9 3,5 6,2
-1

código de CA

#include<bits/stdc++.h>
using namespace std;

template<class T>
class BoundArray {
    
    
	int size;
	T* p;
public:
	BoundArray() {
    
    
		cin >> size;
		p = new T[size];
		for (int i = 0; i < size; i++)
			cin >> p[i];
	}

	~BoundArray()
	{
    
    
		delete[]p;
	}

	void sort() {
    
    
		make_heap(p, p + size);
		sort_heap(p, p + size);
	}

	int search(T key) {
    
    
		for (int i = 0; i < size; i++) {
    
    
			if (key == p[i])
				return i;
		}
		return -1;
	}

	void print() {
    
    
		for (int i = 0; i < size; i++)
			cout << p[i] << " ";
		cout << endl;
	}


};


int main() {
    
    
	int t;
	cin >> t;
	while (t--)
	{
    
    
		char ch;
		cin >> ch;
		if (ch == 'I') {
    
    
			BoundArray<int>l;
			l.sort();
			l.print();
			int key;
			cin >> key;
			cout << l.search(key) << endl;
		}
		else if (ch == 'D') {
    
    
			BoundArray<double>l;
			l.sort();
			l.print();
			double key;
			cin >> key;
			cout << l.search(key) << endl;
		}
		else if (ch == 'C') {
    
    
			BoundArray<char>l;
			l.sort();
			l.print();
			char key;
			cin >> key;
			cout << l.search(key) << endl;
		}


	}
	return 0;
}

B. Plantillas de clase simples (plantillas de clase)

Tema Descripción

Defina una clase de lista, que contiene atributos: una lista de valores (representada por una matriz con una longitud de 100), longitud de datos (el número real de datos), métodos incluidos: inicialización, inserción, eliminación e impresión. método se define como:

1) Inicializar, aceptar parámetros externos, guardar los datos en la lista de valores e inicializar todas las partes de la lista no utilizadas a -1

2) Insertar, aceptar la posición de inserción y el valor de inserción del parámetro externo, la posición de inserción se calcula desde 0, tenga en cuenta que a partir de la posición de inserción, los datos originales deben retroceder un bit y la longitud de los datos +1

3) Eliminar, aceptar la posición de eliminación de parámetros externos, la posición de eliminación se calcula desde 0, tenga en cuenta que a partir del último bit de la posición de eliminación, los datos originales deben avanzar un bit y la longitud de los datos es -1

4) Imprima, envíe los datos contenidos en una línea en orden de posición y sepárelos con un solo espacio

Use el método de la plantilla de clase para hacer que esta clase admita intel tipo de número entero y doubleel tipo de punto flotante

ingresar

La primera línea ingresa primero el parámetro n para indicar que hay n datos y luego ingresa n enteros

La segunda línea ingresa dos parámetros, que indican la posición de inserción y el valor de inserción, y el valor es un número entero

La tercera línea ingresa a la ubicación de eliminación

En la cuarta línea, primero ingrese el parámetro n para indicar que hay n datos y luego ingrese n números de punto flotante

La quinta línea ingresa dos parámetros, que indican la posición de inserción y el valor de inserción, y el valor es un número de punto flotante

La sexta línea entra en la posición de borrado

producción

Para las primeras tres líneas de entrada, realice la inicialización, inserción y eliminación respectivamente, y llame al método de impresión para generar los datos enteros contenidos en la lista

Para las siguientes tres líneas de entrada, realice la inicialización, inserción y eliminación respectivamente, y llame al método de impresión para generar los datos de coma flotante contenidos en la lista.

Muestra de entrada 1

5 11 22 33 44 55
2 888
4
5 1,1 2,2 3,3 4,4 5,5
2 88,8
3

muestra de salida 1

11 22 888 33 55
1,1 2,2 88,8 4,4 5,5

#include<bits/stdc++.h>
using namespace std;

template<class T>
class List {
    
    
	vector<T>v;
public:
	List() {
    
    
		int len;
		cin >> len;
		v.resize(len);
		for (auto& it : v)
			cin >> it;
	}

	void insert(int index, T value) {
    
    
		v.insert(v.begin() + index, value);
	}

	void remove(int index) {
    
    
		v.erase(v.begin() + index);
	}

	void print() {
    
    
		for (int i = 0; i < v.size(); i++) {
    
    
			if (i)
				cout << " ";
			cout << v[i];
		}
		cout << endl;
	}

};

int main() {
    
    
	List<int>l1;
	int idx, value;
	cin >> idx >> value;
	l1.insert(idx, value);
	cin >> idx;
	l1.remove(idx);
	l1.print();

	List<double>l2;
	int idx1;
	double value1;
	cin >> idx1 >> value1;
	l2.insert(idx1, value1);
	cin >> idx1;
	l2.remove(idx1);
	l2.print();

	return 0;
}

C. Plantilla de clase Matrix (plantilla de clase)

Tema Descripción

Diseñe una plantilla de clase de matriz Matrix que admita datos de cualquier tipo de datos.

Se requiere que contenga al menos 2 funciones miembro: función de transposición de matriz transporte y función de impresión imprimir

Escriba la función principal para la prueba y llame a las funciones miembro de la clase para completar la transposición y la salida.

ingresar

Ingrese t primero en la primera línea, lo que indica que hay t casos de prueba

Ingrese los datos para cada caso de prueba a partir de la segunda fila.

Primero ingrese el tipo de datos, I significa int, D significa doble, C significa char, y luego ingrese dos parámetros m y n, que representan las filas y columnas de la matriz respectivamente

Luego, ingrese los elementos de la matriz, un total de m filas, cada fila de n datos

producción

matriz transpuesta de salida

Muestra de entrada 1

2
I 2 3
1 2 3
4 5 6
C 3 3
abc
def
ghi

muestra de salida 1

1 4
2 5
3 6
adg
beh
cfi

código de CA

#include<bits/stdc++.h>
using namespace std;

template<class T>
class Matrix {
    
    
	vector<vector<T>>v;
	int n, m;
public:
	Matrix() {
    
    
		cin >> n >> m;
		v.resize(n);
		for (int i = 0; i < n; i++)
			v[i].resize(m);
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				cin >> v[i][j];
	}

	void transport() {
    
    
		vector<vector<T>>v1;
		v1.resize(m);
		for (int i = 0; i < m; i++)
			v1[i].resize(n);

		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				v1[j][i] = v[i][j];
		v = v1;
		swap(n, m);
	}

	void print() {
    
    
		for (int i = 0; i < n; i++) {
    
    
			for (int j = 0; j < m; j++) {
    
    
				if (j)cout << " ";
				cout << v[i][j];
			}
			cout << endl;
		}
	}
};

int main() {
    
    
	int t;
	cin >> t;
	while (t--)
	{
    
    
		char ch;
		cin >> ch;
		if (ch == 'I') {
    
    
			Matrix<int>m;
			m.transport();
			m.print();
		}
		else if (ch == 'D') {
    
    
			Matrix<double>m;
			m.transport();
			m.print();
		}else if (ch == 'C') {
    
    
			Matrix<char>m;
			m.transport();
			m.print();
		}
	}
	return 0;
}

D. Plantilla de función de clasificación

Tema Descripción

Escriba una plantilla de función mysort que clasifique una matriz de n elementos en orden ascendente, donde el tipo de elemento puede ser un tipo de datos básico o un objeto de punto (comparado por la distancia desde el punto hasta el origen). (Se requiere que no se pueda usar la plantilla de función de clasificación proporcionada por C++)

ingresar

Introduzca el número de pruebas en la primera línea

Ingrese dos líneas para cada prueba. En la primera línea, ingrese una letra mayúscula para indicar el tipo de matriz, I para indicar el tipo de número entero, S para indicar el tipo de cadena, D para indicar el tipo de número de doble precisión, P para indicar el punto , y finalmente ingrese n para indicar la longitud de la matriz. La línea 2 ingresa n datos.

producción

Salida de una línea de resultados ordenados por prueba

Muestra de entrada 1

4
I 10
15 3 51 27 9 35 78 14 65 8
D 3
-11.3 25.42 13.2
P 6
1.1 2.2 2.4 -6.5 12 32 1.2 1.3 -3.5 0.1 9.2 1.1
S 4
Sandy David Eason Cindy

muestra de salida 1

3 8 9 14 15 27 35 51 65 78
-11.3 13.2 25.42
(1.2, 1.3) (1.1, 2.2) (-3.5, 0.1) (2.4, -6.5) (9.2, 1.1) (12.0, 32.0)
cindy david eason arena

código de CA

#include<bits/stdc++.h>
using namespace std;

template<class T>
class MySort;

class Point {
    
    
	double x, y;
	template<class T>
	class MySort;
public:
	Point() {
    
    }

	double getDistance() const {
    
    
		return sqrt(x * x + y * y);
	}

	bool operator <(const Point& p)const {
    
    
		return getDistance() < p.getDistance();
	}

	friend ostream& operator << (ostream& output, Point& p) //定义运算符“<<”重载函数
	{
    
    
		output << fixed << setprecision(1) << "(" << p.x << ", " << p.y << ")";
		return output;
	}

	friend istream& operator >> (istream& input, Point& p) //定义运算符“<<”重载函数
	{
    
    
		input >> p.x >> p.y;
		return input;
	}


};



template<class T>
class MySort {
    
    
	vector<T>v;
	class Point;
public:
	MySort() {
    
    
		int size;
		cin >> size;
		v.resize(size);
		for (auto& it : v) {
    
    
			cin >> it;
		}

		make_heap(v.begin(), v.end());
		sort_heap(v.begin(), v.end());

		for (int i = 0; i < size; i++) {
    
    
			cout << v[i] << " ";
		}
		cout << endl;
	}
};

int main() {
    
    
	int t;
	cin >> t;
	while (t--)
	{
    
    
		char ch;
		cin >> ch;
		if (ch == 'I') {
    
    
			MySort<int>s;
		}
		else if (ch == 'D') {
    
    
			MySort<double>s;
		}
		else if (ch == 'S') {
    
    
			MySort<string>s;
		}
		else if (ch == 'P') {
    
    
			MySort<Point>s;
		}

	}
	return 0;
}

E. Plantilla de función de adición de objetos

Tema Descripción

La clase de reloj CClock tiene horas, minutos y segundos; la clase RMB CRmb tiene tres miembros de datos: yuan, ángulo y minutos. Intente definir una plantilla de función de suma por pares para este tipo de objeto de clase, incluidos tres parámetros: 2 objetos y un int que representa la base. (Requiere métodos que no se pueden sobrecargar con funciones)

La función principal se ve así:

CClock c1(…), c2(…), c;

c = suma(c1, c2, 60);

cout << c << endl;

CRmb r1(…), r2(…), r;

r = suma(r1, r2, 10);

cout << r << endl;

ingresar

La hora, el minuto y el segundo del primer objeto de reloj.

La hora, minuto y segundo del segundo objeto de reloj

Yuan minutos angulares del primer objeto RMB

Yuan minutos angulares del segundo objeto RMB

producción

El resultado de sumar dos objetos de reloj.

El resultado de agregar dos objetos RMB

Muestra de entrada 1

15 34 25
7 25 36
5 6
7 3 4 5

muestra de salida 1

23 0 1
9 1 2

código de CA

#include<bits/stdc++.h>
using namespace std;

class CClock {
    
    
	int h, m, s;
public:
	CClock() {
    
    
		cin >> h >> m >> s;
	}

	CClock(int h, int m, int s) :
		h(h),
		m(m),
		s(s) {
    
    }

	template<class T>
	friend T add(T, T, int);
	int getSumSecond(int n) {
    
    
		return s + m * n + h * n * n;
	}

	friend CClock add(CClock& a, CClock& b, int n) {
    
    
		int sum = a.getSumSecond(n) + b.getSumSecond(n);
		int hour = sum / (n * n);
		sum = sum % (n * n);
		int minu = sum / n;
		int sece = sum % n;
		return CClock(hour, minu, sece);
	}

	void print() {
    
    
		cout << h << " " << m << " " << s;
	}

	friend ostream& operator << (ostream& output, CClock& p) //定义运算符“<<”重载函数
	{
    
    
		p.print();
		return output;
	}

};

class RMB {
    
    
	int y, j, f;
public:
	RMB(int y, int j, int f) :y(y), j(j), f(f)
	{
    
    

	}

	RMB() {
    
     cin >> y >> j >> f; }

	int getSumFen(int n) {
    
    
		return f + j * n + y * n * n;
	}



	friend RMB add(RMB& a, RMB& b, int n) {
    
    
		int sum = a.getSumFen(n) + b.getSumFen(n);
		int hour = sum / (n * n);
		sum = sum % (n * n);
		int minu = sum / n;
		int sece = sum % n;
		return RMB(hour, minu, sece);
	}

	void print() {
    
    
		cout << y << " " << j << " " << f;
	}

	friend ostream& operator << (ostream& output, RMB& p) //定义运算符“<<”重载函数
	{
    
    
		p.print();
		return output;
	}

	template<class T>
	friend T add(T, T, int);
};

template<class T>
T add(T a, T b, int n) {
    
    
	return add(a, b, n);
}

int main() {
    
    
	CClock c1, c2;
	CClock c = add(c1, c2, 60);
	cout << c << endl;
	RMB r1, r2;
	RMB r = add(r1, r2, 10);
	cout << r << endl;
	return 0;
}

F. Plantillas de funciones de salida en orden inverso

Tema Descripción

Escriba una plantilla de función inversa que genere datos en orden inverso (el orden inverso de los números complejos es la permutación de las partes real e imaginaria).

ingresar

Introduzca el número de pruebas en la primera línea

Ingrese una línea para cada prueba, primero ingrese una letra mayúscula para indicar el tipo de datos, I para entero, D para doble, S para cadena, C para objetos complejos y finalmente ingrese los datos.

producción

Salida de una fila por prueba, datos en orden inverso

Muestra de entrada 1

5
I 123456
D -235.172
Este es un test
C -123 456
C 123 -456

muestra de salida 1

654321
-271.532
objetivo cetáceo
456-123
-456+123

pista

Se puede usar una función de conversión de tipos para convertir un objeto de número complejo en una cadena. El siguiente método se puede usar en la función de plantilla para convertir una variable numérica a en una variable de cadena s: #include "sstream"...ostringstream os; cadena s;os << a;s = os.str();

#include<bits/stdc++.h>
using namespace std;

class Complex {
    
    
	double r, i;
public:
	Complex() {
    
     cin >> r >> i; }

	friend ostream& operator<<(ostream& output, Complex& c) {
    
    
		output << c.r;
		if (!c.i)
			return output;
		if (c.i > 0)
			cout << "+";
		cout << c.i;
		return output;
	}

	friend istream& operator>>(istream& input, Complex& c) {
    
    
		input >> c.r >> c.i;
		return input;
	}


	friend void reverse(Complex&c) {
    
    
		swap(c.r, c.i);
		cout << c << endl;
	}

};



template<class T>
void reverse(T t) {
    
    
	string s = to_string(t);
	//if (typeid(t) == typeid(double)) {
    
    
	//	while (*s.rbegin()=='0'){
    
    
	//		s.pop_back();
	//	}
	//}

	reverse(s.begin(), s.end());

	if (*s.rbegin() == '-') {
    
    
		s.pop_back();
		cout << "-";
	}
	
	if (typeid(t) == typeid(int)) {
    
    
		cout << stoi(s) << endl;
		return;
	}

	if (typeid(t) == typeid(double)) {
    
    
		cout << stod(s) << endl;
		return;
	}

	cout << s << endl;
}

void reverse(string &s) {
    
    
	reverse(s.begin(), s.end());
	cout << s << endl;
}



int main() {
    
    
	int t;
	cin >> t;
	while (t--)
	{
    
    
		char ch;
		cin >> ch;
		string t1;
		if (ch == 'I') {
    
    
			int t1;
			cin >> t1;
			reverse<int>(t1);
		}
		else if (ch == 'D') {
    
    
			double t1;
			cin >> t1;
			reverse<double>(t1);
		}
		else if (ch == 'S') {
    
    
			string t1;
			cin >> t1;
			reverse(t1);
		}

		else {
    
    
			Complex t1;
			reverse(t1);
		}

	}

}

G. Plantilla de clase de lista vinculada

Tema Descripción

La clase de lista enlazada única CIntList cuyo tipo de datos de nodo es int se puede definir de la siguiente manera:

clase CNodo

{

público:

datos int;

CNodo *siguiente;

};

clase CIntList

{

privado:

NodoC *cabeza;

público:

CIntList();

void append(int a); //Agregar al final de la lista enlazada

void insert(int a, int n); //Añadir después del enésimo nodo

void remove(int n); //Elimina el nodo n

int get(int n); //Devuelve los datos del nodo n

void set(int a, int n); //Cambiar los datos del nodo n a un

impresión vacía ();

~CIntList();

};

Intente cambiarlo por una plantilla de clase CList cuyo tipo de datos de nodo esté representado por parámetros.

ingresar

Introduzca el número de pruebas en la primera línea

Ingrese 5 líneas para cada prueba, el formato es:

Tipo de datos (I:int, D:doble, S:cadena) Número de datos n Datos 1 Datos 2 … Datos n

Insertar datos del número de nodo (0 significa insertar antes del primer nodo)

devolver el número de nodo

Eliminar número de nodo

Modificar datos de número de nodo

producción

Cada prueba genera dos líneas. La primera línea genera los datos obtenidos por la operación de retorno (si ocurre un error, genera un error), y la segunda línea genera los datos de todos los nodos en la lista vinculada después de todas las operaciones.

Muestra de entrada 1

3
I 5 2 3 5 7 3
1 40
7
7
6 -10
D 6 1.1 2.3 10.05 0.0 -1.8 5.9
4 60.4
5
1
3 -3.7
S 4 esto es una prueba.
0 bueno
1
8
4 trabajo

muestra de salida 1

error
2 40 3 5 7 -10
60.4
2.3 10.05 -3.7 60.4 -1.8 5.9
bueno
bueno esta es una prueba de trabajo.

código de CA

#include<bits/stdc++.h>
using namespace std;

template<class T>
struct CNode
{
    
    
	T data;
	CNode<T>* next;
	CNode() {
    
     next = NULL; }
	CNode(T d, CNode<T>* n = NULL) {
    
    
		data = d;
		next = n;
	}
};

template<class T>
class List {
    
    
	int len;
	CNode<T>* head;
public:
	List() {
    
    
		cin >> len;
		head = new CNode<T>;
		CNode<T>* p = head;
		for (int i = 0; i < len; i++) {
    
    
			p->next = new CNode<T>;
			p = p->next;
			cin >> p->data;
		}
	}

	void append(T a) {
    
    
		CNode<T>p = head;
		while (p) {
    
    
			p = p->next;
		}
		p = new CNode<T>(a);
		len++;
	}

	void insert(T a, int n) {
    
    
		if (n < 0 || n > len)
			return;

		CNode<T>* p = head;

		for (int i = 0; i < n; i++) {
    
    
			p = p->next;
		}

		CNode<T>* s = new CNode<T>(a, p->next);
		p->next = s;
		len++;
	}

	void remove(int n) {
    
    
		if (n < 0 || n >= len)
			return;

		CNode<T>* p = head;
		for (int i = 0; i < n; i++) {
    
    
			p = p->next;
		}
		CNode<T>* s = p->next;
		p->next = s->next;
		delete s;
		len--;
	}

	void set(T a, int n) {
    
    
		if (n < 0 || n >= len)
			return;
		CNode<T>* p = head->next;
		for (int i = 0; i < n; i++) {
    
    
			p = p->next;
		}
		p->data = a;
	}

	void print() {
    
    
		CNode<T>* p;
		for (p = head->next; p->next; p = p->next)
			cout << p->data << " ";
		cout << p->data << endl;
	}

	T get(int n) {
    
    
		CNode<T>* p = head->next;
		for (int i = 0; i < n; i++)
			p = p->next;
		return p->data;
	}

	int getSize() {
    
     return len; }
};

int main() {
    
    
	int t;
	cin >> t;
	while (t--)
	{
    
    
		char ch;
		cin >> ch;
		if (ch == 'I') {
    
    
			List<int>l;
			int a;
			int n;
			cin >> n >> a;
			l.insert(a, n);

			cin >> n;
			if (n<1 || n>l.getSize()) {
    
    
				puts("error");
			}
			else {
    
    
				cout << l.get(n - 1) << endl;
			}

			cin >> n;
			l.remove(n - 1);

			cin >> n >> a;
			l.set(a, n - 1);

			l.print();
		}
		else if (ch == 'D') {
    
    
			List<double>l;
			double a;
			int n;
			cin >> n >> a;
			l.insert(a, n);

			cin >> n;
			if (n<1 || n>l.getSize()) {
    
    
				puts("error");
			}
			else {
    
    
				cout << l.get(n - 1) << endl;
			}

			cin >> n;
			l.remove(n - 1);

			cin >> n >> a;
			l.set(a, n - 1);

			l.print();
		}
		else if (ch == 'S') {
    
    
			List<string>l;
			string a;
			int n;
			cin >> n >> a;
			l.insert(a, n);

			cin >> n;
			if (n<1 || n>l.getSize()) {
    
    
				puts("error");
			}
			else {
    
    
				cout << l.get(n - 1) << endl;
			}

			cin >> n;
			l.remove(n - 1);

			cin >> n >> a;
			l.set(a, n - 1);

			l.print();
		}

	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46655675/article/details/129334487
Recomendado
Clasificación