前言
我打算在这个学期写一下我的SZTU c++实验的代码,以供参考,也是方便自己复习的时候知道自己当时的想法,非常欢迎各位大佬提出宝贵的意见。
尽量能做到每次都更新吧,怎么这么早就立flag。
这次实验是指针第一部分,考察了常量指针,指针运算,指针与数组的相关操作。
A. 货币兑换(指针与常量)
题目描述
设定以下汇率常量:
- 美元汇率为6.2619,表示1美元兑换6.2619元人民币
- 欧元汇率为6.6744,表示1欧元兑换6.6744元人民币
- 日元汇率为0.0516,表示1元日元兑换0.0516元人民币
- 港币汇率为0.9200,表示1元港币兑换0.92元人民币
定义一个常量指针,根据需求指针指向不同的汇率,然后计算出各种货币兑换为人民币的数量。要求:不能直接使用汇率常量进行计算,必须使用常量指针,只能使用一个指针。
输入
输入一个t表示有t个测试实例。
每行先输入一个字母,表示货币类型,然后再输入一个数字(正浮点数),表示货币数量。
- D表示美元
- E表示欧元
- Y表示日元
- H表示港币
依次输入t行。
输出
每行输出兑换后的人民币数量,保留4位小数。
样例
题解
在c++中,我们没法像c语言中的 printf 那样控制浮点数位数,只能使用 fixed << setprecision(n) 来控制输出小数点后n位数, 需要加上 iomanip 这个头文件。
这里你们可以选择 #include <bits/stdc++.h>, 也就是竞赛选手常用的万能头,关于万能头的利弊我就不在这里赘述了,大家可以自行搜索。
这道题没什么可讲的,就是使用了常量指针来进行计算,代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int t;
cin >> t;
double d = 6.2619, e = 6.6744, y = 0.0516, h = 0.9200;
while (t--)
{
char type;
double n;
cin >> type >> n;
const double *RATE = nullptr; // 初始化为空
if (type == 'D')
{
RATE = &d;
}
else if (type == 'E')
{
RATE = &e;
}
else if (type == 'Y')
{
RATE = &y;
}
else
{
RATE = &h;
}
cout << fixed << setprecision(4) << *RATE * n << endl;
}
return 0;
}
提一嘴,如果你使用 c++20 的话,你可以使用 std::format 来进行格式控制,需要加上 format 这个头文件,输出的那一行就能改写成 cout << format("{:.4f}\n", *rate * n);
,我认为会更加清晰。
B. 成绩查询(指针运算)
题目描述
已知一组学生成绩,然后根据输入的序号查询成绩。
要求:
- 使用一个整数数组存储学生成绩。
- 使用一个指针指向数组中间元素。
- 使用
++
和--
运算符,求出数组中间元素的前一个成绩和后一个成绩。 - 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问。例如,有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算?
- 整个程序除了输入时可以使用数组下标,其他部分尽量使用指针进行访问。
输入
- 第一行输入
t
表示有t
个测试实例。 - 第二行先输入
n
,表示有n
个学生,然后再输入n
个成绩(正整数)。 - 第三行输入1个序号,表示要查询成绩的学生的序号。
依次输入t
个实例。
按自然意义,序号是从1开始计算。
输出
对于每个测试实例:
- 第一行输出数组中间元素的前一个成绩和后一个成绩。
- 第二行根据序号输出1个成绩。
样例
题解
这题也是考察基本功的,用指针来代替数组下标,代码如下:
#include <iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int *a = new int[n];
int *p