Shenzhen University Jiruan „Objektorientierte Programmierung“ Experiment 3 Zeiger 2

A. Monatsabfrage (Array von Zeigern)

Themenbeschreibung

Es ist bekannt, dass die englischen Wörter jedes Monats wie folgt lauten. Es ist erforderlich, ein Array von Zeigern zu erstellen. Jeder Zeiger im Array zeigt auf eine englische Zeichenfolge eines Monats. Es ist erforderlich, das entsprechende englische Wort entsprechend auszugeben Geben Sie die Monatsnummer ein.

Januar Januar

Februar Februar

MärzMärz

April April

Mai Mai

Juni Juni

Juli

AugustAugust

September September

Oktober Oktober

NovemberNovember

Dezember Dezember

eingeben

Die Eingabe t in der ersten Zeile repräsentiert t Testinstanzen

Geben Sie dann pro Zeile die Zahl eines Monats ein

Geben Sie nacheinander t Zeilen ein

Ausgang

Jede Zeile gibt die Zeichenfolge des entsprechenden Monats aus. Wenn kein Wort dieses Monats vorhanden ist, wird ein Fehler ausgegeben

Eingabebeispiel 1

3
5
11
15

Ausgabebeispiel 1

Mai-
November-
Fehler

AC-Code

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


int main() {
    
    
	const char* month[12]{
    
     "January","February","March","April","May","June","July","August","September","October","November","December" };
	int t;
	cin >> t;
	while (t--) {
    
    
		int n;
		cin >> n;
		if (n > 0 && n <= 12)
			cout << *(month + n - 1) << endl;
		else
			cout << "error" << endl;
	}
	return 0;
}

B. Digitales Urteil (der Zeiger ist ein Funktionsparameter)

Themenbeschreibung

Geben Sie eine Zeichenfolge ein, um festzustellen, ob es sich bei der Zeichenfolge um eine Zeichenfolge vollständiger Ganzzahlwerte handelt. Wenn Sie beispielsweise „1234“ eingeben, bedeutet dies die Ganzzahl 1234. Wenn Sie „12a3“ eingeben, bedeutet dies, dass es sich nur um eine Zeichenfolge und nicht um eine Ganzzahl handelt .

Es ist erforderlich, die Funktion isNumber zu schreiben, der Parameter ist ein Zeichenzeiger und der Rückgabewert ist ein Ganzzahltyp

Wenn die Zeichenfolge eine Ganzzahl darstellt, werten Sie die Ganzzahl aus und geben Sie sie zurück

Gibt -1 zurück, wenn die Zeichenfolge keine Ganzzahl darstellt

Die Hauptfunktion muss isNumber aufrufen, um die Zeichenfolge zu beurteilen, und darf keine ähnlichen Funktionen verwenden, die in C++ oder Drittanbietern enthalten sind

eingeben

Geben Sie t ein, um anzugeben, dass es t Testinstanzen gibt

Geben Sie pro Zeile eine Zeichenfolge ein

Geben Sie nacheinander t Zeilen ein

Ausgang

Geben Sie das Beurteilungsergebnis für jede Zeile aus

Eingabebeispiel 1

3
1234
567a
0890

Ausgabebeispiel 1

1234
-1
890

AC-Code

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

bool isNumber(char* str) {
    
    
	char* p = str;
	while (*p) {
    
    
		if (*p >= '0' && *p <= '9')
			p++;
		else
			return false;
	}
	return true;
}


int main() {
    
    
	int t;
	cin >> t;
	while (t--){
    
    
		char num[100];
		cin >> num;
		if (isNumber(num))
			cout << atoi(num) << endl;
		else
			cout << "-1" << endl;
	}
	return 0;
}

C. String-Vergleich (Zeiger und Zeichen)

Themenbeschreibung

Schreiben Sie eine Funktion, um zwei Zeichenfolgen zu vergleichen. Die Parameter sind zwei Zeichenzeiger (erfordert eine explizite Definition, z. B. char * S, char * T) und vergleichen die Größe der Zeichenfolgen S und T. Gibt 1 zurück, wenn S größer als T ist, -1, wenn S kleiner als T ist, und 0, wenn S gleich T ist.

Vergleichsregeln:

1. Vergleichen Sie die Zeichen an derselben Position der beiden Zeichenfolgen. Der Größenvergleich der Zeichen basiert auf dem ASCII-Wert

2. Wenn im Vergleich die Anzahl der Zeichen der Zeichenfolge S größer als die Anzahl der Zeichen der Zeichenfolge T ist und die Anzahl der Zeichen kleiner als T ist, gilt S als größer als T. Wenn gleich, ist S gleich T, und wenn kleiner als, ist S kleiner als T

Beispielsweise ist S aaccdd und T eebbbb. Jeder Positionsvergleich zeigt, dass die ersten beiden Buchstaben von S kleiner als T sind, die letzten vier Buchstaben jedoch größer als T, und schließlich wird S als größer als T angesehen

3. Wenn zwei Saiten unterschiedlich lang sind, ist die längere Saite größer

Geben Sie zwei Zeichenfolgen in die Hauptfunktion ein und rufen Sie diese Funktion auf, um eine Beurteilung vorzunehmen. In der Beurteilungsfunktion muss der Zeiger des Funktionsparameters zum Zeichenvergleich verwendet werden

eingeben

Geben Sie t ein, um anzugeben, dass es t Testinstanzen gibt

Geben Sie dann alle zwei Zeilen zwei Zeichenfolgen ein

Geben Sie t Instanzen nacheinander ein

Ausgang

Vergleichsergebnisse für eine Instanz pro Zeile ausgeben

Eingabebeispiel 1

3
aaccdd
eebbbb
AAbb++
aaEE*-
zznnkk
aaaaaaa

Ausgabebeispiel 1

1
0
-1

AC-Code

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

int str_cmp(char* S, char* T) {
    
    
	char* p = S, * q = T;
	int cnt_s = 0, cnt_t = 0;

	while (*p && *q) {
    
    
		if (*p > *q)
			cnt_s++;
		else if (*p < *q)
			cnt_t++;
		p++;
		q++;
	}

	if (*p && !*q)
		return 1;
	if (!*p && *q)
		return -1;
	if (cnt_s > cnt_t)
		return 1;
	if (cnt_s < cnt_t)
		return -1;
	return 0;
}

int main() {
    
    
	int n;
	cin >> n;
	while (n--) {
    
    
		char s1[100], s2[100];
		cin >> s1 >> s2;
		cout << str_cmp(s1, s2) << endl;
	}
	return 0;
}

D. Dynamisches Array (Zeiger und Array)

Themenbeschreibung

Zu Beginn ist die Länge des Arrays unbekannt, und je nach Anforderung werden verschiedene Zeigertypen erstellt. Mithilfe der Zeiger wird ein Array mit der entsprechenden Länge erstellt und anschließend werden unterschiedliche Anforderungen erfüllt

Wenn es erforderlich ist, ein ganzzahliges Array zu erstellen, berechnen Sie den Durchschnittswert aller Daten im Array

Wenn Sie aufgefordert werden, ein Zeichenarray zu erstellen, suchen Sie nach dem größten Buchstaben im Array

Wenn Sie aufgefordert werden, ein Array aus Gleitkommazahlen zu erstellen, ermitteln Sie den Mindestwert des Arrays

Es ist erforderlich, dass der gesamte Prozess des Programms keine Array-Indizes verwenden kann und Zeiger von der Array-Erstellung über die Eingabe bis hin zur Suche, dem Vergleich, der Berechnung und der Ausgabe verwendet werden müssen

Tipp: Verwenden Sie das neue Schlüsselwort

eingeben

Die Eingabe t in der ersten Zeile zeigt an, dass es t Testinstanzen gibt

Geben Sie in der zweiten Zeile zunächst einen Großbuchstaben ein, um den Array-Typ anzugeben, I, um den Ganzzahltyp anzugeben, C, um den Zeichentyp anzugeben, und F, um den Gleitkommazahlentyp anzugeben. Geben Sie dann n ein, um die Array-Länge anzugeben.

Geben Sie in der dritten Zeile n Daten ein

Geben Sie t Instanzen nacheinander ein

Ausgang

Jeder gibt das entsprechende Ergebnis entsprechend verschiedenen Array-Typen aus

Eingabebeispiel 1

3
C 5
ADEBC
I 6
22 55 77 33 88 55
F 4
3,1 1,9 6,5 4,8

Ausgabebeispiel 1

E
55
1.9

AC-Code

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

int main() {
    
    
	int t;
	cin >> t;
	while (t--) {
    
    
		char ch;
		int num;
		cin >> ch >> num;
		switch (ch) {
    
    
		case 'C': {
    
    
			char* s = new char[num];
			for (int i = 0; i < num; i++)
				cin >> *(s + i);
			cout << *max_element(s, s + num) << endl;
			delete[]s;
			break; }
		case 'I': {
    
    
			int* arr = new int[num];
			for (int i = 0; i < num; i++)
				cin >> *(arr + i);
			int sum = 0;
			for (int i = 0; i < num; i++)
				sum += *(arr + i);
			cout << 1.0 * sum / num << endl;
			delete[]arr;
			break; }
		case 'F': {
    
    
			double* arr_f = new double[num];
			for (int i = 0; i < num; i++)
				cin >> *(arr_f + i);
			cout << *min_element(arr_f, arr_f + num) << endl;
			delete[]arr_f; }
		default:
			break;
		}
	}
	return 0;
}

E. Drei Strings in einem (Zeiger und Zeichenarray)

Themenbeschreibung

Geben Sie drei Zeichenfolgen ein, lesen Sie die Teilzeichenfolgen jeder Zeichenfolge über den Zeiger (die Teilzeichenfolge bezieht sich auf einen kleinen kontinuierlichen Teil der Zeichenfolge) und führen Sie sie zu einer neuen Zeichenfolge zusammen

Erfordern:

  1. Für die Erstellung und Eingabe der drei Zeichenfolgen können Arrays verwendet werden oder nicht

  2. Berechnen Sie nach der Eingabe die Länge der neuen Zeichenfolge basierend auf der Länge der Teilzeichenfolge der drei Zeichenfolgen

  3. Verwenden Sie die dynamische Array-Methode, um eine neue Zeichenfolge zu erstellen, und verwenden Sie Zeiger, um verschiedene Teile der drei Zeichenfolgen zu lesen und sie in die neue Zeichenfolge zu kopieren. Dies erfordert, dass der gesamte Prozess keine Array-Indizes verwenden kann

  4. Gibt einen neuen String mithilfe eines Zeigers aus

eingeben

Die Eingabe t in der ersten Zeile zeigt an, dass es t Testinstanzen gibt

Geben Sie drei Zeichenfolgen in drei aufeinanderfolgenden Zeilen ein. Jede Zeichenfolge enthält 10 Zeichen

Geben Sie für drei aufeinanderfolgende Zeilen die Zahlen a und b in jede Zeile ein und geben Sie die Start- und Endpositionen jedes Teilstrings an. Beachten Sie, dass die Position der Zeichenfolge im allgemeinen Sinne aus 1 berechnet wird, was sich von der Array-Position in der Programmierung unterscheidet. Beispielsweise ist die Zeichenfolge abcdefg die Startposition 3, die Endposition 5 und die Teilzeichenfolge lautet cde

Geben Sie t Instanzen nacheinander ein

Ausgang

Geben Sie die neue zusammengeführte Zeichenfolge in jeder Zeile aus

Eingabebeispiel 1

2
abcdefghij
ABCDEFGHIJ
aabbccddee
3 5
2 6
8 10
AABBCCDDEE
ffgghhiijj
FFGGHHIIJJ
1 4
5 8
2 7

Ausgabebeispiel 1

cdeBCDEFdee
AABBhhiiFGGHHI

AC-Code

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

class Solution {
    
    
	int a1, b1, a2, b2, a3, b3;
	char s1[100], s2[100], s3[100];
	char* new_string;
public:
	Solution() {
    
    
		cin >> s1 >> s2 >> s3 >> a1 >> b1 >> a2 >> b2 >> a3 >> b3;
	}

	~Solution() {
    
    
		delete[]new_string;
	}

	void cat() {
    
    
		new_string = new char[b1 - a1 + b2 - a2 + b3 - a3 + 4];
		char* q = new_string;
		for (char* p = s1 + a1 - 1; p <= s1 + b1 - 1; p++)
			*(q++) = *p;
		for (char* p = s2 + a2 - 1; p <= s2 + b2 - 1; p++)
			*(q++) = *p;
		for (char* p = s3 + a3 - 1; p <= s3 + b3 - 1; p++)
			*(q++) = *p;
		*q = '\0';
	}

	char* get_new_string() {
    
    
		return new_string;
	}

};

int main() {
    
    
	int n;
	cin >> n;
	while (n--) {
    
    
		Solution s;
		s.cat();
		cout << s.get_new_string() << endl;
	}
	return 0;
}

F. Funktionsaufruf (Funktionszeiger)

Themenbeschreibung

Definieren und implementieren Sie drei Funktionen:

Die erste Funktion ist eine Ganzzahlfunktion, der Rückgabetyp ist eine Ganzzahl, der Parameter ist eine Ganzzahlvariable und die Operation besteht darin, den Quadratwert der Variablen zu ermitteln

Die zweite Funktion ist eine Gleitkommafunktion, der Rückgabetyp ist eine Gleitkommazahl, der Parameter ist eine Gleitkommazahlvariable und die Operation besteht darin, den Quadratwurzelwert der Variablen zu ermitteln. Um die Quadratwurzel zu finden, können Sie die Funktion sqrt (Gleitkommaparameter) verwenden, die die Quadratwurzel des Parameters zurückgibt, und in VC ist die Header-Datei cmath erforderlich.

Die dritte Funktion ist eine Zeichenfolgenfunktion ohne Rückgabewert. Der Parameter ist ein Zeichenfolgenzeiger und die Operation besteht darin, alle Kleinbuchstaben in der Zeichenfolge in Großbuchstaben umzuwandeln.

Anforderung: Definieren Sie drei Funktionszeiger, die jeweils auf diese drei Funktionen zeigen, und verwenden Sie dann die Funktionszeiger, um diese drei Funktionen entsprechend dem Aufruftyp aufzurufen. Diese drei Funktionen können nicht direkt aufgerufen werden.

Wenn der Typ I ist, wird die Ganzzahlfunktion über den Zeiger aufgerufen. Wenn der Typ F ist, wird die Gleitkommafunktion über den Zeiger aufgerufen. Wenn der Typ S ist, wird die String-Funktion über den Zeiger aufgerufen

eingeben

Geben Sie in der ersten Zeile ein t ein, um anzugeben, dass es t Testinstanzen gibt

Geben Sie zunächst in jeder Zeile einen Großbuchstaben ein, um die Art des Anrufs anzugeben, und geben Sie dann die entsprechenden Parameter ein

Geben Sie nacheinander t Zeilen ein

Ausgang

Jede Zeile gibt das Ergebnis des Funktionsaufrufs aus

Eingabebeispiel 1

5
S Shenzhen
I 25
F 6,25
I 31
S China

Ausgabebeispiel 1

SHENZHEN
625
2,5
961
CHINA

AC-Code

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

int Square(int n) {
    
    
	return n * n;
}

double Sqrt(double s) {
    
    
	return sqrt(s);
}

void ToUpper(char* str) {
    
    
	char* p = str;
	while (*p) {
    
    
		*p = toupper(*p);
		p++;
	}
}

int main() {
    
    
	int t;
	cin >> t;
	while (t--) {
    
    
		char ch;
		cin >> ch;
		char* p();

		int(*p1)(int) = Square;
		double(*p2)(double) = Sqrt;
		void(*p3)(char* s) = ToUpper;

		switch (ch) {
    
    
		case 'S':
			char s[100];
			cin >> s;
			p3(s);
			cout << s << endl;
			break;
		case 'I':
			int n;
			cin >> n;
			cout << p1(n) << endl;
			break;
		case 'F':
			double d;
			cin >> d;
			cout << p2(d) << endl;
		default:
			break;
		}

	}
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_46655675/article/details/129299354