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

A. 货币兑换(指针与常量)

题目描述

设定以下汇率常量

美元汇率为6.2619,表示1美元兑换6.2619元人民币

欧元汇率为6.6744,表示1欧元兑换6.6744元人民币

日元汇率为0.0516,表示1元日元兑换0.0516元人民币

港币汇率为0.8065,表示1元港币币兑换0.8065元人民币

定义一个常量指针,根据需求指针指向不同的汇率,然后计算出各种货币兑换为人民币的数量

要求:不能直接使用汇率常量进行计算,必须使用常量指针,只能使用一个指针

输入

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

每行先输入一个字母,表示货币类型,然后再输入一个数字(正浮点数),表示货币数量

D表示美元,E表示欧元,Y表示日圆,H表示港币

依次输入t行

输出

每行输出兑换后的人民币数量,保留4位小数

在C++中,输出指定精度的参考代码如下:

#include

#include //必须包含这个头文件

using namespace std;

void main( )

{ double a =3.141596;

cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位

}

输入样例1

4
Y 10000
D 88.3
H 200
E 73.1

输出样例1

516.0000
552.9258
161.3000
487.8986

AC代码

#include<bits/stdc++.h>
using namespace std;
/*
设定以下汇率常数
美元汇率为6.2619,表示1美元兑换6.2619元人民币
欧元汇率为6.6744,表示1欧元兑换6.6744元人民币
日元汇率为0.0516,表示1元人民币兑换0.0516元人民币
港币汇率为0.8065,表示1元港币币兑换0.8065元人民币
定义一个常量指针,根据需求指针指向不同的汇率,然后计算出各种货币兑换为人民币的数量
要求:不能直接使用汇率常量进行计算,必须使用常量指针,只能使用一个指针

输入一个
每行先输入一个字母,表示货币类型,然后再输入一个数字(正浮点数),表示货币数量
D表示美元,E表示欧元,Y表示日圆,H表示港币
依次输入t行
*/


class Solution {
	const double* exchange_rate;
	double exchange_rate_list[4] = { 6.2619,6.6744,0.0516,0.8065 };
	double value;
public:
	Solution() {
		char ch;
		cin >> ch >> value;
		switch (ch)
		{
		case 'D':
			exchange_rate = &exchange_rate_list[0];
			break;
		case 'E':
			exchange_rate = &exchange_rate_list[1];
			break;
		case 'Y':
			exchange_rate = &exchange_rate_list[2];
			break;
		case 'H':
			exchange_rate = &exchange_rate_list[3];
			break;
		default:
			break;
		}

	}


	double getRMB() {
		return  *exchange_rate * value;
	}


};


int main() {
	int n;
	cin >> n;
	while (n--) {
		Solution s;
		cout << fixed << setprecision(4) << s.getRMB() << endl;
	}
	return 0;
}

B. 成绩查询(指针运算)

题目描述

已知一组学生成绩,然后根据输入的序号查询成绩

要求:

  1. 使用一个整数数组存储学生成绩

  2. 使用一个指针指向数组中间元素

  3. 使用++和–运算符,求出数组中间元素的前一个成绩和后一个成绩

  4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问

例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???

  1. 整个程序除了输入时可以使用数组下标,其他部分都不能使用,都必须使用指针进行访问,且只能定义一个指针变量。

输入

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

第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)

第三行输入1个序号,表示要查询成绩的学生的序号。

依次输入t个实例

按自然意义,序号是从1开始计算

提示:在数组中是从…

输出

对于每个测试实例:

第一行输出数组中间元素的前一个成绩和后一个成绩(若为偶数,取中间右边的数为中间数)

第二行根据序号输出1个成绩

输入样例1

2
7 66 99 88 44 77 33 11
2
10 60 80 50 20 90 35 70 40 10 95
10

输出样例1

88 77
99
90 70
95

AC代码

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

class Solution{
	int* arr,num,*p,t;
public:
	Solution(){
		cin >> num;
		arr =new int[num];
		for(int i=0;i<num;i++){
			cin>>arr[i];
		}
		p = arr + num/2;
		cin>>t;
	}

	void display(){
		cout << *(--p)<< " ";
		p++;
		p++;
		cout << *(p) << endl; 
		p--;
		p -= (num/2-t+1);
		cout<<*p<<endl;
	}

	~Solution(){
		delete[]arr;
	}
};

int main(){
	int n;
	cin>>n;
	while(n--){
		Solution s;
		s.display();
	}
	return 0;
}

C. 三数论大小(指针)

题目描述

输入三个整数,然后按照从大到小的顺序输出数值。

要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数

输出时,必须使用这三个指针,不能使用存储三个整数的变量

输入

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

第二行起,每行输入三个整数

输入t行

输出

每行按照从大到小的顺序输出每个实例

在每行中,每个数据输出后都带有一个空格,即使该行最后一个数据输出后也要再输出一个空格

输入样例1

3
2 4 6
88 99 77
111 333 222

输出样例1

6 4 2
99 88 77
333 222 111

AC代码

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

class Solution {
	int a, b, c;
	vector<int*>v;
	//指针类型的动态数组
public:
	Solution() {
		cin >> a >> b >> c;
		v.push_back(&a);
		v.push_back(&b);
		v.push_back(&c);
	}

	void Sort() {
		sort(v.begin(), v.end(), [](int* a, int* b) {return *a > *b; });
	}

	void display() {
		for (auto& it : v)
			cout << *it << " ";
		cout << endl;
	}
};


int main() {
	int n;
	cin >> n;
	while (n--) {
		Solution s;
		s.Sort();
		s.display();
	}
	return 0;
}

D. 密钥加密法(指针应用)

题目描述

有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文

例如明文是abcde,密钥是234,那么加密方法就是a对应密钥的2,也就是a偏移2位转化为c;明文b对应密钥的3,就是b偏移3位转化为e,同理c偏移4位转化为g。这时候密钥已经使用完,那么又重头开始使用。因此明文的d对应密钥的2,转化为f,明文的e对应密钥的3转化为h。所以明文abcde,密钥234,经过加密后得到密文是cegfh。

如果字母偏移的位数超过26个字母范围,则循环偏移,例如字母z偏移2位,就是转化为b,同理字母x偏移5位就是转化为c

要求:使用三个指针p、q、s分别指向明文、密钥和密文,然后使用指针p和q来访问每个位置的字符,进行加密得到密文存储在指针s指向的位置。

除了变量定义和输入数据,其他过程都不能使用数组下标法,必须使用三个指针来访问明文、密钥和密文。

提示:当指针q已经移动到密钥的末尾,但明文仍然没有结束,那么q就跳回密钥头

输入

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

第二行输入一个字符串,表示第一个实例的明文

第三行输入一个数字串,表示第一个实例的密钥

依次输入t个实例

输出

每行输出加密后的密文

样例输入1

2
abcde
234
XenOS
56

样例输出1

cegfh
CksUX

AC代码

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

class Solution {
	char* p, * q, * s;
	// p指向明文
	// q指向密钥
	// s指向密文

	char text[100], key[100], ciphertext[100];

public:
	Solution() {
		cin >> text >> key;
		p = text;
		q = key;
		s = ciphertext;
	}


	void display() {
		cout << ciphertext << endl;
	}

	void encryption() {
		while (*p) {
			*s = *p + (*q - '0');
			if (!isalpha(*s))
				*s -= 26;
			s++; p++; q++;
			if (!*q)q = key;
		}
		*s = '\0';
	}

};


int main() {
	int n;
	cin >> n;
	while (n--) {
		Solution s;
		s.encryption();
		s.display();
	}
	return 0;
}

E. 动态矩阵(指针与堆内存分配)

题目描述

未知一个整数矩阵的大小,在程序运行时才会输入矩阵的行数m和列数n

要求使用指针,结合new方法,动态创建一个二维数组,并求出该矩阵的最小值和最大值,可以使用数组下标法。

不能先创建一个超大矩阵,然后只使用矩阵的一部分空间来进行数据访问、

创建的矩阵大小必须和输入的行数m和列数n一样

输入

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

第二行输入两个数字m和n,表示第一个矩阵的行数和列数

第三行起,连续输入m行,每行n个数字,表示输入第一个矩阵的数值

依次输入t个实例

输出

每行输出一个实例的最小值和最大值

输入样例1

2
2 3
33 22 11
66 88 55
3 4
19 38 45 14
22 65 87 31
91 35 52 74

输出样例1

11 88
14 91

AC代码

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

class Solution {
	int** arr;
	int m, n;

public:
	Solution() {
		cin >> m >> n;
		arr = new int* [m];
		for (int i = 0; i < m; i++) {
			arr[i] = new int[n];
			for (int j = 0; j < n; j++)
				cin >> arr[i][j];
		}
	}

	~Solution(){
		for (int i = 0; i < m; i++)
			delete[]arr[i];
		delete[]arr;
	}

	int get_max() {
		int max_value = arr[0][0];
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				if (arr[i][j] > max_value)
					max_value = arr[i][j];
		return max_value;
	}

	int get_min() {
		int min_value = arr[0][0];
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				if (arr[i][j] < min_value)
					min_value = arr[i][j];
		return min_value;
	}

};


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

F. 矩阵左转(指针与数组)

题目描述

输入一个2*3的矩阵,将这个矩阵向左旋转90度后输出

比如现在有2*3矩阵 :

1 2 3

4 5 6

向左旋转90度后的矩阵变为:

3 6

2 5

1 4

要求:除了矩阵创建和数据输入可以使用数组和数组下标的方法,其他过程对矩阵的任何访问都必须使用指针

提示:m行n列的二维矩阵,第i行第j列的元素与首元素的距离为i*n+j,序号从0开始计算

输入

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

连续两行输入一个2*3的矩阵的数据

依次输入t个实例

输出

依次输出左转后的矩阵结果

在输出的每行中,每个数据之间都用空格隔开,最后一个数据后面也带有空格

输入样例1

2
1 2 3
4 5 6
4 5 6
7 8 9

输出样例1

3 6
2 5
1 4
6 9
5 8
4 7

AC代码

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

class Solution {
	int arr[2][3];
	int arr1[3][2];
public:
	Solution() {
		for (int i = 0; i < 2; i++)
			for (int j = 0; j < 3; j++)
				cin >> *(*(arr + i) + j);
	}

	void reverse() {
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 2; j++)
				*(*(arr1 + i) + j) = *(*(arr + j) + 2 - i);
	}

	void display() {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 2; j++)
				cout << *(*(arr1 + i) + j) << " ";
			cout << endl;
		}
	}



};


int main() {
	int n;
	cin >> n;
	while (n--) {
		Solution s;
		s.reverse();
		s.display();
	}
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曹无悔

请支持我的梦想!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值