西北农林科技大学2024学年C++面向对象程序设计OJ——T14 安全数组类模板

一.题目描述

Description

设计一个安全数组类模板Array<T>,其中包含数组的输入、输出、排序和查找等方法,使用三种类型的数据对其进行测试。

(1)设计构造函数Array<T>::Array(int n),可动态分配n个T类型的存储空间;

(2)设计析构函数Array<T>::~Array()释放内存;

(3)重载输入流运算符istream &operator>>(istream& in, Array<T>& arr)读入n个T类型数据;

(4)重载输出流运算符ostream &operator<<(ostream& out, const Array<T>& arr)输出n个T类型数据;

(5)重载[]运算符,若索引值i越界,则输出“Out of boundary”并退出程序,否则返回第i个数据元素;

(6)基于<algorithm>中的sort函数定义成员函数void Array<T>::sort(),实现数组排序;

(7)设计成员函数int Array<T>::search(T e)const,若查找成功返回非负索引值,否则返回-1;

(8)设计函数模板void Process(Array<T> &a)用于测试数组类模板。

main函数对应测试代码如下:

int main()
{
    string type;
    int n;

    cin >> type >> n;
    if (type=="int")
    {
        Array<int> a(n);
        Process(a);
    }
    else if (type=="double")
    {
        Array<double> a(n);
        Process(a);
    }
    else if (type=="string")
    {
        Array<string> a(n);
        Process(a);
    }
    else
        cout << "Input error!" << endl;

    return 0;
}

二.输入与输出

Input

数据类型type和元素个数n

n个数据元素

索引值pos

查找键值key

Output

排序前数据序列

排序后数据序列

索引值pos对应数据元素

查找到的数据元素索引值

Sample Input 1 

int 5
18 2 4 6 25
2
6

Sample Output 1

18 2 4 6 25
2 4 6 18 25
6
2

Sample Input 2 

double 6
24.5 3.6 18.3 96.4 102.56 88.1
3
102

Sample Output 2

24.5 3.6 18.3 96.4 102.56 88.1
3.6 18.3 24.5 88.1 96.4 102.56
88.1
-1

Sample Input 3 

string 7
dispose campus budget slip bacteria consume blast
7
campus

Sample Output 3

dispose campus budget slip bacteria consume blast
bacteria blast budget campus consume dispose slip
Out of boundary!

三.代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
template<typename T>
class Array{
    int size_;
    T *arr;
public:
    Array(int n):size_(n){this->arr=new T[n];}
    ~Array(){delete[] arr;}
    int getsize()const{return this->size_;}
    template<typename Ti>
    friend istream &operator>>(istream& in,Array<Ti>& arr);
    template<typename To>
    friend ostream &operator<<(ostream& in,const Array<To>& arr);
    void sort_arr(){sort(arr,arr+size_);}
    int Search(T e){
        for(int i=0;i<size_;i++){
            if(arr[i]==e)
                return i;
        }
        return -1;
    }
    T& operator[](const int index){
        if(index<0 || index>=this->size_){
            cout<<"Out of boundary!"<<endl;
            exit(0);
        }
        return this->arr[index];
    }
};
template <typename T>
void Process(Array<T> &a){
        int pos;
        T e;
        cin>>a;
        cout<<a<<endl;
        a.sort_arr();
        cout<<a<<endl;
        cin>>pos;
        cout<<a[pos]<<endl;
        cin>>e;
        cout<<a.Search(e)<<endl;
}
template<typename Ti>
istream &operator>>(istream& in,Array<Ti>& obj){
    for(int i=0;i<obj.getsize();i++)
        in>>obj.arr[i];
    return in;
}
template<typename To>
ostream &operator<<(ostream& out,const Array<To>& obj){
    int i;
    for(i=0;i<obj.getsize()-1;i++){
        	out<<obj.arr[i]<<" ";
    }
    out<<obj.arr[i];
    return out;
}
int main()
{
    string type;
    int n;

    cin >> type >> n;
    if (type=="int")
    {
        Array<int> a(n);
        Process(a);
    }
    else if (type=="double")
    {
        Array<double> a(n);
        Process(a);
    }
    else if (type=="string")
    {
        Array<string> a(n);
        Process(a);
    }
    else
        cout << "Input error!" << endl;

    return 0;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失忆已成习惯.

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值