深圳大学计软《面向对象的程序设计》实验3 指针2

A. 月份查询(指针数组)

题目描述

已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词

1月 January

2月 February

3月 March

4月 April

5月 May

6月 June

7月 July

8月 August

9月 September

10月 October

11月 November

12月 December

输入

第一行输入t表示t个测试实例

接着每行输入一个月份的数字

依次输入t行

输出

每行输出相应的月份的字符串,若没有这个月份的单词,输出error

输入样例1

3
5
11
15

输出样例1

May
November
error

AC代码

#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. 数字判断(指针为函数参数)

题目描述

输入一个字符串,判断这个字符串是否一个完全整数值的字符串,例如输入"1234",那么表示整数1234,输入"12a3"就表示只是一个字符串,不是一个整数

要求编写函数isNumber,参数是一个字符指针,返回值是整数类型

如果字符串表示一个整数,则计算出这个整数并且返回

如果字符串不是表示一个整数,则返回-1

主函数必须调用isNumber来判断字符串,不能使用任何C++自带或第三方的类似函数

输入

输入t表示有t个测试实例

每行输入一个字符串

依次输入t行

输出

每行输出判断结果

输入样例1

3
1234
567a
0890

输出样例1

1234
-1
890

AC代码

#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. 字符串比较(指针与字符)

题目描述

编写一个函数比较两个字符串,参数是两个字符指针(要求显式定义,例如char *S, char *T),比较字符串S和T的大小。如果S大于T,则返回1,如果S小于T则返回-1,如果S与T相等则返回0。

比较规则:

1.把两个字符串的相同位置上的字符进行比较,字符的大小比较以ASCII值为准

2.在比较中,如果字符串S的字符大于字符串T的字符的数量超过小于的数量,则认为S大于T,如果等于则S等于T,如果小于则S小于T

例如S为aaccdd,T为eebbbb,每个位置比较得到S前两个字母都小于T,但后4个字母都大于T,最终认为S大于T

3.如果两个字符串长度不同,则更长的字符串为大

在主函数中输入两个字符串,并调用该函数进行判断,在判断函数中必须使用函数参数的指针进行字符比较

输入

输入t表示有t个测试实例

接着每两行输入两个字符串

依次输入t个实例

输出

每行输出一个实例的比较结果

输入样例1

3
aaccdd
eebbbb
AAbb++
aaEE*-
zznnkk
aaaaaaa

输出样例1

1
0
-1

AC代码

#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. 动态数组(指针与数组)

题目描述

一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求

若要求创建整数数组,计算数组内所有数据的平均值

若要求创建字符数组,找出数组内的最大字母

若要求创建浮点数数组,找出数组的最小值

要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针

提示:使用new关键字

输入

第一行输入t表示有t个测试实例

第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。

第三行输入n个数据

依次输入t个实例

输出

每个根据不同的数组类型输出相应的结果

输入样例1

3
C 5
A D E B C
I 6
22 55 77 33 88 55
F 4
3.1 1.9 6.5 4.8

输出样例1

E
55
1.9

AC代码

#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. 三串合一(指针与字符数组)

题目描述

输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串

要求:

  1. 三个字符串的创建和输入可以使用数组,也可以不用

  2. 输入后,根据三个字符串的子串的长度,计算出新字符串的长度

  3. 使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标

  4. 使用指针输出新的字符串

输入

第一行输入t表示有t个测试实例

连续三行输入三个字符串,每个字符串都包含10个字符

连续三行,每行输入数字a和b,表示每个子串的开始和结束位置。注意字符串的位置是按照一般意义从1开始计算,和编程中的数组位置不同。例如字符串abcdefg,开始位置是3,结束位置是5,那么子串就是cde

依次输入t个实例

输出

每行输出合并后的新字符串

输入样例1

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

输出样例1

cdeBCDEFdee
AABBhhiiFGGHHI

AC代码

#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. 函数调用(函数指针)

题目描述

定义并实现三个函数:

第一个函数是整数函数,返回类型为整数,参数是一个整数变量,操作是求该变量的平方值

第二个函数是浮点数函数,返回类型为浮点数,参数是一个浮点数变量,操作是求该变量的平方根值。求平方根可以使用函数sqrt(浮点参数),将返回该参数的平方根,在VC中需要头文件cmath。

第三个函数是字符串函数,无返回值,参数是一个字符串指针,操作是把这个字符串内所有小写字母变成大写。

要求:定义三个函数指针分别指向这三个函数,然后根据调用类型使用函数指针来调用这三个函数。不能直接调用这三个函数。

如果类型为I,则通过指针调用整数函数;如果类型为F,则通过指针调用浮点数函数;如果类型为S,则通过指针调用字符串函数

输入

第一行输入一个t表示有t个测试实例

每行先输入一个大写字母,表示调用类型,然后再输入相应的参数

依次输入t行

输出

每行输出调用函数后的结果

输入样例1

5
S shenzhen
I 25
F 6.25
I 31
S China

输出样例1

SHENZHEN
625
2.5
961
CHINA

AC代码

#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;
}

猜你喜欢

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