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

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

题目描述

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

1月 January

2月 February

3月 March

4月 April

5月 May

6月 June

7月 July

8月 August

9月 September

10月 October

扫描二维码关注公众号,回复: 15300290 查看本文章

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