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. 成绩查询(指针运算)
题目描述
已知一组学生成绩,然后根据输入的序号查询成绩
要求:
-
使用一个整数数组存储学生成绩
-
使用一个指针指向数组中间元素
-
使用++和–运算符,求出数组中间元素的前一个成绩和后一个成绩
-
输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问
例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???
- 整个程序除了输入时可以使用数组下标,其他部分都不能使用,都必须使用指针进行访问,且只能定义一个指针变量。
输入
第一行输入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;
}