面向对象程序设计-02-指针1

声明

题解包含以下内容:

  • (相对)高级的 C++ 模板及语法技巧
  • 仅适用于 C++20 标准的代码
  • 强烈的个人代码风格和 Modern C++ 范式追求
  • 泛滥的标准库函数

换句话说就是(相较于其他公开题解)更低的查重率和更高的使用门槛;请酌情使用。

【id:369】【20分】A. 使用函数找出数组中的最大值 (指针)

题目描述

本题要求实现一个找出整型数组中最大值的函数,要求函数内访问数组元素使用指针,不要使用数组下标。

主函数参考如下:

#include <iostream>
using namespace std;
 
int FindArrayMax( int a[], int n );
 
int main()
{
    const int MAXN=10;
    int i, n;
    int a[MAXN];
 
    cin>>n;
    for( i=0; i<n; i++ ){
        cin>>a[i];
    }
 
    cout<<FindArrayMax(a, n)<<endl;
 
    return 0;
}
 
/* 请在这里填写答案 */

输入

函数接口定义:

int FindArrayMax( int a[], int n );

其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。

输出

见样例

样例

输入样例1输出样例1
4
20 78 99 -14
99

Answer

#include <iostream>
#include <algorithm>
using namespace std;

int FindArrayMax(int *a, int n)
{
  return *max_element(a, a + n);
}

int main()
{
  uint64_t length {};
  cin >> length;
  int* arr = new int[length];
  for (size_t i = 0ull; i < length; ++i)
    cin >> *(arr + i);
  cout << FindArrayMax(arr, length) << endl;
  delete[] arr;
  return 0;
}

【id:7】【20分】B. 三数论大小(指针)

题目描述

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

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

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

输入

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

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

输入t行

输出

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

样例

输入样例1输出样例1
3
2 4 6
88 99 77
111 333 222
6 4 2
99 88 77
333 222 111

Answer

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  uint64_t t {};
  cin >> t;
  while (t--) {
    int *arr = new int[3];

    cin >> *arr >> *(arr + 1) >> *(arr + 2);
    sort(arr, arr + 3, greater<int>());
    cout << *arr << ' ' << *(arr + 1) << ' ' << *(arr + 2) << endl;

    delete[] arr;
  }
  return 0;
}

【id:8】【20分】C. 货币兑换(指针与常量)

题目描述

设定以下汇率常量

美元汇率为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++中,输出指定精度的参考代码如下:

#include <iostream>

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

using namespace std;

int main( )

{ double a =3.141596;

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

}

样例

输入样例1输出样例1
4
Y 10000
D 88.3
H 200
E 73.1
516.000
552.9258
184.0000
487.8986

Answer

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

constexpr double exchange_rate[] = {
  6.2619, 6.6744, 0.0516, 0.9200
};

int main()
{
  uint64_t t {};
  cin >> t;
  while (t--) {
    char cash_tp {};
    double cash_val {};
    cin >> cash_tp >> cash_val;
    switch (cash_tp) {
    case 'D': {
      cash_val *= *(exchange_rate + 0);
    } break;
    case 'E': {
      cash_val *= *(exchange_rate + 1);
    } break;
    case 'Y': {
      cash_val *= *(exchange_rate + 2);
    } break;
    case 'H': {
      cash_val *= *(exchange_rate + 3);
    } break;
    default: {
    } break;
    }
    cout << fixed << setprecision(4) << cash_val << endl;
  }
  return 0;
}

【id:15】【20分】D. 成绩查询(指针运算)

题目描述

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

要求:

  1. 使用一个整数数组存储学生成绩
  2. 使用一个指针指向数组中间元素
  3. 求出数组中间元素的前一个成绩和后一个成绩
  4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问

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

  1. 整个程序除了输入时可以使用数组下标,其他部分尽量使用使用指针进行访问。

输入

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

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

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

依次输入t个实例

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

提示:在数组中是从…

输出

对于每个测试实例:

第一行输出数组中间元素的前一个成绩和后一个成绩

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

样例

输入样例1输出样例1
2
7 66 99 88 44 77 33 11
2
11 60 80 50 20 90 35 70 40 10 9 30
9
88 77
99
90 70
10

提示

当数组长度为偶数时,中间元素指的是靠后面的那一个元素

Answer

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  uint64_t t {};
  cin >> t;
  while (t--) {
    size_t stu_num {};
    cin >> stu_num;
    int *score = new int[stu_num] {};
    for (auto itr = score; itr != (score + stu_num); ++itr)
      cin >> *itr;
    cout << *(score + (stu_num / 2) - 1) << ' ' << *(score + (stu_num / 2) + 1) << endl;
    size_t select {}; cin >> select;
    cout << score[select - 1] << endl;
    delete[] score;
  }
  return 0;
}

【id:9】【20分】E. 动态数组(指针与数组)

题目描述

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

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

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

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

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

提示:使用new关键字

输入

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

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

第三行输入n个数据

依次输入t个实例

输出

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

样例

输入样例1输出样例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
E
55
1.9

Answer

#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;

template<typename T>
T* get_input(size_t scale)
{
  T* ret = new T[scale] {};
  for (auto itr = ret; itr != (ret + scale); ++itr)
    cin >> *itr;
  return ret;
}

int main()
{
  uint64_t t {};
  cin >> t;
  while (t--) {
    char selection {};
    size_t length {};
    cin >> selection >> length;
    switch (selection) {
    case 'I': {
      auto arr = get_input<int>(length);
      cout << accumulate(arr, arr + length, 0) / length << endl;
      delete[] arr;
    } break;
    case 'C': {
      auto arr = get_input<char>(length);
      cout << *max_element(arr, arr + length) << endl;
      delete[] arr;
    } break;
    case 'F': {
      auto arr = get_input<double>(length);
      cout << *min_element(arr, arr + length) << endl;
      delete[] arr;
    } break;
    default: break;
    }
  }

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值