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 sort
y 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, I
representación int
, D
representación double
, C
representació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 int
el tipo de número entero y double
el 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();
}
}
}