1874 模板类Array

肇砖oj题,仅供参考,不怕被钟sir封号三周你就抄

Description

请实现一个模版类 Array ,实现可以直接访问的线性群体,包括:

私有数据成员:

T* list;    /// 用于存放动态分配的数组内存首地址

int siz;   /// 数组大小。为了避免与 size 同名而高亮显示,特意减少一个字符

成员函数:

  • 构造函数 : Array( int sz = 10 )

  • 拷贝构造函数 : Array( const Array<T> &a )

  • 析构函数 : ~Array()

  • 重载赋值运算符 operator = : operator = ( const Array<T> &rhs )

  • 重载 下标运算符[] ,用于 左值: operator [] ( int i )

  • 载 下标运算符[] 常函数,用于 右值 : operator [] ( int i ) const

  • 重载到 T* 类型的转换 :operator T * ()

  • 取数组的大小 : getSize()

  • 修改数组的大小 : resize( int sz )

程序框架:

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

你的 Array 模版类代码放在这里

/// read() 用于验证 重载的指针转换运算符
void read( double *p, int n ) {
    for ( int i = 0; i < n; i++ )
        cin >> p[i];
}

int main() {
    int n;
    cin >> n;
    
    Array<double> da(n);    /// 创建一个 double类型元素 的 对象da
    read( da, n );
    
    /// 输出 Array类的 对象da 全部元素
    for ( int i = 0; i < da.getSize(); i++ )
        cout << da[i] << ' ';
    cout << endl;
    
    Array<int> prime(5);    /// 创建一个 int类型元素 的 对象prime
    /// 求 [2, n] 的全部素数,存放到 prime 中

    int cnt = 0; /// 统计当前找到的素数的个数
    cin >> n;  /// 读入范围

    for ( int i = 2; i <= n; i ++ ) {   /// 检查 i 是否能被比它小的素数整除
        bool isPrime = true;
        for ( int j = 0; j < cnt; j ++ )
            /// 若 i 被 prime[j] 整除,说明 i 不是质数
            if ( i % prime[j] == 0 ) {
                isPrime = false;
                break;
            }

        if ( isPrime ) {
            if ( cnt == prime.getSize() )   /// 当装满了
                prime.resize( cnt * 2 );    /// 空间扩大一倍
            prime[ cnt ++ ] = i;
        }
    }
    
    for ( int i = 0; i < cnt; i ++ )
        cout << setw(8) << prime[i];
    cout << endl;
    
    return 0;
}

Input

第一行是一个整数 k  ( k > 0 )

第二行是 k 个浮点数,表示要存入 Array对象 da

第三行是一个整数 n  ( n > 2 ),表示要找出 [ 2, n ] 中的素数,存入 Array对象 prime 中

Output

第一行输出 n 个读入的浮点数

第二行从小到大输出 [ 2, n ] 中的素数

Sample Input

5
1.23 2.34 3.1415 4.56 10.00001
10

Sample Output

1.23 2.34 3.1415 4.56 10.00001
       2        3        5        7

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

template <class T>
class Array{
private:
	T *list;
	int size;
public:
	
	Array(int sz){
		size = sz;
		list = new T [size];
	}
	
	int getSize(){
		return size;
	}
	
	T &operator [](int n){
		return list[n];
	}
	
	const T &operator [](int n) const{
		return list[n];
	}
	
	void resize(int sz){
		if(size==sz) return;
		T *newlist = new T [sz];
		int n = (sz<size)?sz:size;
		for(int i=0;i<n;i++)
		   newlist[i]=list[i];
		delete[]list;
		list=newlist;
		size=sz;
	}
	
	operator T *(){
		return list;
	}
	
	operator const T * () const{
		return list;
	}
};

/// read() 用于验证 重载的指针转换运算符
void read( double *p, int n ) {
    for ( int i = 0; i < n; i++ )
        cin >> p[i];
}

int main() {
    int n;
    cin >> n;
    
    Array<double> da(n);    /// 创建一个 double类型元素 的 对象da
    read( da, n );
    
    /// 输出 Array类的 对象da 全部元素
    for ( int i = 0; i < da.getSize(); i++ )
        cout << da[i] << ' ';
    cout << endl;
    
    Array<int> prime(5);    /// 创建一个 int类型元素 的 对象prime
    /// 求 [2, n] 的全部素数,存放到 prime 中

    int cnt = 0; /// 统计当前找到的素数的个数
    cin >> n;  /// 读入范围

    for ( int i = 2; i <= n; i ++ ) {   /// 检查 i 是否能被比它小的素数整除
        bool isPrime = true;
        for ( int j = 0; j < cnt; j ++ )
            /// 若 i 被 prime[j] 整除,说明 i 不是质数
            if ( i % prime[j] == 0 ) {
                isPrime = false;
                break;
            }

        if ( isPrime ) {
            if ( cnt == prime.getSize() )   /// 当装满了
                prime.resize( cnt * 2 );    /// 空间扩大一倍
            prime[ cnt ++ ] = i;
        }
    }
    
    for ( int i = 0; i < cnt; i ++ )
        cout << setw(8) << prime[i];
    cout << endl;
    
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值