A. Begrenzte Array-Vorlagenklasse (Klassenvorlage)
Themenbeschreibung
Schreiben Sie eine begrenzte Array-Vorlage BoundArray
(das heißt, überprüfen Sie den Indexverweis auf das Array-Element und beenden Sie die Ausführung des Programms, wenn der Index außerhalb der Grenzen liegt), in der verschiedene Datentypen gespeichert werden können. Es ist erforderlich, die Methode zum Sortieren des Arrays sort
und die Methode zum Durchsuchen des Arrays zu implementieren search
.
eingeben
Geben Sie zuerst t in die erste Zeile ein, um anzuzeigen, dass t Testfälle vorhanden sind
Geben Sie die Daten für jeden Testfall ab der zweiten Zeile ein.
Geben Sie zuerst den Datentyp, I
Darstellung int
, D
Darstellung double
, C
Darstellung char
und dann die Anzahl der Elemente im Array ein
Geben Sie dann jedes Element ein
Geben Sie abschließend das zu suchende Element ein
Ausgang
Geben Sie zunächst die Elemente sortiert von klein nach groß aus
Geben Sie dann das Ergebnis der Suche nach dem Element aus. Wenn es gefunden wird, geben Sie den Index aus. Wenn es nicht gefunden wird, geben Sie es aus-1
Eingabebeispiel 1
2
I 2
1 2
2
D 3
3,5 6,2 2,9
2,1
Ausgabebeispiel 1
1 2
1
2,9 3,5 6,2
-1
AC-Code
#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. Einfache Klassenvorlagen (Klassenvorlagen)
Themenbeschreibung
Definieren Sie eine Listenklasse, die Attribute enthält: eine Liste von Werten (dargestellt durch ein Array mit einer Länge von 100), Datenlänge (die tatsächliche Anzahl von Daten); enthaltene Methoden: Initialisierung, Einfügen, Löschen und Drucken Methode ist definiert als:
1) Initialisieren Sie, akzeptieren Sie externe Parameter, speichern Sie die Daten in der Werteliste und initialisieren Sie alle nicht verwendeten Listenteile auf -1
2) Einfügen, akzeptieren Sie die Einfügeposition und den Einfügewert des externen Parameters. Die Einfügeposition wird ab 0 berechnet. Beachten Sie, dass die Originaldaten ab der Einfügeposition um ein Bit nach hinten verschoben werden müssen und die Datenlänge +1 beträgt
3) Löschen, akzeptieren Sie die Löschposition externer Parameter. Die Löschposition wird ab 0 berechnet. Beachten Sie, dass die Originaldaten ab dem letzten Bit der Löschposition um ein Bit nach vorne verschoben werden müssen und die Datenlänge -1 beträgt
4) Drucken Sie die in einer Zeile enthaltenen Daten aus, geben Sie sie in der Reihenfolge ihrer Position aus und trennen Sie die Daten durch ein einzelnes Leerzeichen
Verwenden Sie die Methode der Klassenvorlage, damit diese Klasse den Ganzzahltyp int
und den Gleitkommatyp double
unterstützt
eingeben
In der ersten Zeile wird zunächst der Parameter n eingegeben, um anzuzeigen, dass n Daten vorhanden sind, und dann werden n Ganzzahlen eingegeben
In der zweiten Zeile werden zwei Parameter eingegeben, die die Einfügeposition und den Einfügewert angeben. Der Wert ist eine Ganzzahl
Die dritte Zeile gibt den Löschort ein
Geben Sie in der vierten Zeile zunächst den Parameter n ein, um anzugeben, dass n Daten vorhanden sind, und geben Sie dann n Gleitkommazahlen ein
In der fünften Zeile werden zwei Parameter eingegeben, die die Einfügeposition und den Einfügewert angeben. Der Wert ist eine Gleitkommazahl
Die sechste Zeile gibt die Löschposition ein
Ausgang
Führen Sie für die ersten drei Eingabezeilen jeweils eine Initialisierung, Einfügung und Löschung durch und rufen Sie die Druckmethode auf, um die in der Liste enthaltenen ganzzahligen Daten auszugeben
Führen Sie für die nächsten drei Eingabezeilen jeweils eine Initialisierung, Einfügung und Löschung durch und rufen Sie die Druckmethode auf, um die in der Liste enthaltenen Gleitkommadaten auszugeben
Eingabebeispiel 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
Ausgabebeispiel 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. Matrix-Klassenvorlage (Klassenvorlage)
Themenbeschreibung
Entwerfen Sie eine Matrix-Klassenvorlage Matrix, die Daten jedes Datentyps unterstützt.
Es ist erforderlich, mindestens zwei Mitgliedsfunktionen zu enthalten: die Matrixtranspositionsfunktion „Transport“ und die Ausdruckfunktion „Print“.
Schreiben Sie die Hauptfunktion zum Testen und rufen Sie die Mitgliedsfunktionen der Klasse auf, um die Transposition und Ausgabe abzuschließen.
eingeben
Geben Sie zuerst t in die erste Zeile ein, um anzuzeigen, dass t Testfälle vorhanden sind
Geben Sie die Daten für jeden Testfall ab der zweiten Zeile ein.
Geben Sie zuerst den Datentyp ein, I bedeutet int, D bedeutet double, C bedeutet char, und geben Sie dann zwei Parameter m und n ein, die die Zeilen bzw. Spalten der Matrix darstellen
Geben Sie als Nächstes die Elemente der Matrix ein, insgesamt m Zeilen, jede Zeile enthält n Daten
Ausgang
transponierte Matrix ausgeben
Eingabebeispiel 1
2
I 2 3
1 2 3
4 5 6
C 3 3
abc
def
ghi
Ausgabebeispiel 1
1 4
2 5
3 6
adg
beh
cfi
AC-Code
#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. Sortierfunktionsvorlage
Themenbeschreibung
Schreiben Sie eine Funktionsvorlage mysort, die ein Array von n Elementen in aufsteigender Reihenfolge sortiert, wobei der Elementtyp ein Basisdatentyp oder ein Punktobjekt sein kann (verglichen mit dem Abstand vom Punkt zum Ursprung). (Es ist erforderlich, dass die von C++ bereitgestellte Sortierfunktionsvorlage nicht verwendet werden kann.)
eingeben
Geben Sie in der ersten Zeile die Anzahl der Tests ein
Geben Sie für jeden Test zwei Zeilen ein. Geben Sie in die erste Zeile einen Großbuchstaben ein, um den Array-Typ anzugeben, I, um den Ganzzahltyp anzugeben, S, um den Zeichenfolgentyp anzugeben, D, um den Zahlentyp mit doppelter Genauigkeit anzugeben, und P, um den Punkt anzugeben und geben Sie schließlich n ein, um die Länge des Arrays anzugeben. Zeile 2 gibt n Daten ein.
Ausgang
Geben Sie pro Test eine Zeile mit sortierten Ergebnissen aus
Eingabebeispiel 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
Ausgabebeispiel 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 Sandy
AC-Code
#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. Objektadditionsfunktionsvorlage
Themenbeschreibung
Die Uhrenklasse CClock hat Stunden, Minuten und Sekunden; die RMB-Klasse CRmb hat drei Datenelemente: Yuan, Winkel und Minuten. Versuchen Sie, eine Vorlage für die Funktion „add“ für die paarweise Addition für diesen Klassenobjekttyp zu definieren, einschließlich drei Parametern: 2 Objekte und ein int, das die Basis darstellt. (Erfordert Methoden, die nicht mit Funktionen überladen werden können)
Die Hauptfunktion sieht so aus:
…
CUhr c1(…), c2(…), c;
c = add(c1, c2, 60);
cout << c << endl;
CRmb r1(…), r2(…), r;
r = add(r1, r2, 10);
cout << r << endl;
eingeben
Die Stunde, Minute und Sekunde des ersten Uhrenobjekts
Die Stunde, Minute und Sekunde des zweiten Uhrenobjekts
Yuan-Winkelminuten des ersten RMB-Objekts
Yuan-Winkelminuten des zweiten RMB-Objekts
Ausgang
Das Ergebnis des Hinzufügens von zwei Uhrenobjekten
Das Ergebnis des Hinzufügens von zwei RMB-Objekten
Eingabebeispiel 1
15 34 25
7 25 36
5
6 7 3 4 5
Ausgabebeispiel 1
23 0 1
9 1 2
AC-Code
#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. Funktionsvorlagen in umgekehrter Reihenfolge ausgeben
Themenbeschreibung
Schreiben Sie eine Funktionsvorlage reverse, die Daten in umgekehrter Reihenfolge ausgibt (die umgekehrte Reihenfolge komplexer Zahlen ist die Permutation von Real- und Imaginärteilen).
eingeben
Geben Sie in der ersten Zeile die Anzahl der Tests ein
Geben Sie für jeden Test eine Zeile ein, geben Sie zunächst einen Großbuchstaben ein, um den Datentyp anzugeben, I für Ganzzahl, D für Doppel, S für Zeichenfolge, C für komplexe Objekte, und geben Sie schließlich die Daten ein.
Ausgang
Geben Sie eine Zeile pro Test aus, Daten in umgekehrter Reihenfolge
Eingabebeispiel 1
5
I 123456
D -235,172
S thisisatest
C -123 456
C 123 -456
Ausgabebeispiel 1
654321
-271,532
Cetace-Ziel
456-123
-456+123
Hinweis
Eine Typkonvertierungsfunktion kann verwendet werden, um ein komplexes Zahlenobjekt in eine Zeichenfolge umzuwandeln. Die folgende Methode kann in der Vorlagenfunktion verwendet werden, um eine numerische Variable a in eine Zeichenfolgenvariable s zu konvertieren: #include "sstream"...ostringstream os; string 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. Klassenvorlage für verknüpfte Listen
Themenbeschreibung
Die einzelne verknüpfte Listenklasse CIntList, deren Knotendatentyp int ist, kann wie folgt definiert werden:
Klasse CNode
{
öffentlich:
int-Daten;
CNode *next;
};
Klasse CIntList
{
Privatgelände:
CNode *head;
öffentlich:
CIntList();
void append(int a); // Am Ende der verknüpften Liste hinzufügen
void insert(int a, int n); //Nach dem n-ten Knoten hinzufügen
void remove(int n); //Entferne den n-ten Knoten
int get(int n); //Die Daten des n-ten Knotens zurückgeben
void set(int a, int n); //Ändern Sie die Daten des n-ten Knotens in a
void print();
~CIntList();
};
Versuchen Sie, es in eine Klassenvorlage CList umzuwandeln, deren Knotendatentyp durch Parameter dargestellt wird.
eingeben
Geben Sie in der ersten Zeile die Anzahl der Tests ein
Geben Sie für jeden Test 5 Zeilen ein. Das Format lautet:
Datentyp (I:int, D:double, S:string) Anzahl der Daten n Daten 1 Daten 2 … Daten n
Knotennummerdaten einfügen (0 bedeutet Einfügen vor dem ersten Knoten).
Knotennummer zurückgeben
Knotennummer löschen
Knotennummerndaten ändern
Ausgang
Jeder Test gibt zwei Zeilen aus. Die erste Zeile gibt die durch die Rückgabeoperation erhaltenen Daten aus (wenn ein Fehler auftritt, wird ein Fehler ausgegeben), und die zweite Zeile gibt nach allen Operationen die Daten aller Knoten in der verknüpften Liste aus.
Eingabebeispiel 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 Dies ist ein Test.
0 gut
1
8
4 Arbeit
Ausgabebeispiel 1
Fehler
2 40 3 5 7 -10
60,4
2,3 10,05 -3,7 60,4 -1,8 5,9
gut
gut Dies ist ein Arbeitstest.
AC-Code
#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();
}
}
}