首页 > 编程语言 >[C++/PTA] 有序数组(类模板)

[C++/PTA] 有序数组(类模板)

时间:2023-06-14 21:58:42浏览次数:40  
标签:int MyArray pC C++ 数组 size data 模板 PTA

题目要求

实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。

每行输入的第一个数字为0,1,2或3:为0时表示输入结束; 为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。

如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的数量。

从每行第三个输入开始,依次输入指定类型的数据。

类模板:

template
class MyArray

裁判测试程序样例:

#include <iostream>
using namespace std;

/* 请在这里填写答案 */

template<class T>
MyArray<T>::~MyArray(){ delete[] data;}

template<class T>
bool MyArray<T>::check(){
    int i;
    for(i=0;i<size-1;i++)
        if(data[i]>data[i+1]) { cout<<"ERROR!"<<endl;return false;}
    return true;
}
int main( )
{
    MyArray<int> *pI;
    MyArray<float> *pF;
    MyArray<char> *pC;
    int ty, size;
    cin>>ty;
    while(ty>0){
        cin>>size;
        switch(ty){
            case 1: pI = new MyArray<int>(size);   pI->sort(); pI->check(); pI->display(); delete pI; break;
            case 2: pF = new MyArray<float>(size); pF->sort(); pF->check(); pF->display(); delete pF; break;
            case 3: pC = new MyArray<char>(size);  pC->sort(); pC->check(); pC->display(); delete pC; break;
        }
        cin>>ty;
    }
    return 0;
}

输入样例:
1 3 2 3 1
2 4 1.5 2.6 3.7 0.5
3 2 A a
0

输出样例:
1 2 3
0.5 1.5 2.6 3.7
A a

解题思路

在MyArray类中定义类模板、构造函数、析构函数、排序函数和输出函数等成员函数:

  • 类模板定义了类型T,表示数组中的元素类型。

  • 构造函数的参数是一个整数,表示需要创建的数组的大小。它会动态地分配一段内存,存放输入的数据。

  • 析构函数用于在对象销毁时释放内存。

  • 排序函数使用冒泡排序算法对数组中的元素进行升序排序。

  • 输出函数用于输出数组中的元素。

代码

template<class T>   // 类模板,T为数组中元素的类型
class MyArray{
private:
    T *data;        // 指向数组的指针
    int size;       // 数组大小
 
public:
    MyArray(int s);     // 带参数的构造函数
    ~MyArray();         // 析构函数
    void sort();        // 排序
    void display();     // 输出
    bool check();       // 检查数组是否有序
};

template<class T>
MyArray<T>::MyArray(int s){
    size = s;
    data = new T[size]; // 动态分配内存
    for(int i=0;i<size;i++)
        cin>>data[i];   // 输入数组元素
}

template<class T>
void MyArray<T>::display(){
    for(int i=0;i<size;i++){
        cout<<data[i];      // 输出当前元素的值
        if(i<size-1)        // 如果不是最后一个元素,则输出一个空格
            cout<<" ";
    }
    cout<<endl;             // 换行
}

template<class T>
void MyArray<T>::sort(){
    for(int i=0;i<size-1;i++)               // 从数组第一位开始冒泡排序
        for(int j=0;j<size-i-1;j++)
            if(data[j]>data[j+1]){          // 交换相邻两个元素的位置
                T temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
}

整体代码如下:

#include <iostream>
using namespace std;

template<class T>   // 类模板,T为数组中元素的类型
class MyArray{
private:
    T *data;        // 指向数组的指针
    int size;       // 数组大小
 
public:
    MyArray(int s);     // 带参数的构造函数
    ~MyArray();         // 析构函数
    void sort();        // 排序
    void display();     // 输出
    bool check();       // 检查数组是否有序
};

template<class T>
MyArray<T>::MyArray(int s){
    size = s;
    data = new T[size]; // 动态分配内存
    for(int i=0;i<size;i++)
        cin>>data[i];   // 输入数组元素
}

template<class T>
void MyArray<T>::display(){
    for(int i=0;i<size;i++){
        cout<<data[i];      // 输出当前元素的值
        if(i<size-1)        // 如果不是最后一个元素,则输出一个空格
            cout<<" ";
    }
    cout<<endl;             // 换行
}

template<class T>
void MyArray<T>::sort(){
    for(int i=0;i<size-1;i++)               // 从数组第一位开始冒泡排序
        for(int j=0;j<size-i-1;j++)
            if(data[j]>data[j+1]){          // 交换相邻两个元素的位置
                T temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
}


template<class T>
MyArray<T>::~MyArray(){ delete[] data;}   // 析构函数,释放内存

template<class T>
bool MyArray<T>::check(){
    int i;
    for(i=0;i<size-1;i++)
        if(data[i]>data[i+1]) { cout<<"ERROR!"<<endl;return false;}
    return true;
}

int main(){
    MyArray<int> *pI;       // 整型数组指针
    MyArray<float> *pF;     // 浮点型数组指针
    MyArray<char> *pC;      // 字符型数组指针
    int ty, size;

    cin>>ty;    // 输入数组元素类型,0表示输入结束
    while(ty>0){
        cin>>size;  // 输入数组大小
        switch(ty){
            case 1: 
                pI = new MyArray<int>(size);   // 创建整型数组对象
                pI->sort();     // 数组排序
                pI->check();    // 检查数组是否有序
                pI->display();  // 输出数组
                delete pI;      // 释放内存
                break;
            case 2: 
                pF = new MyArray<float>(size); // 创建浮点型数组对象
                pF->sort();
                pF->check();
                pF->display();
                delete pF;
                break;
            case 3: 
                pC = new MyArray<char>(size);  // 创建字符型数组对象
                pC->sort();
                pC->check();
                pC->display();
                delete pC;
                break;
        }
        cin>>ty;    // 继续输入下一组数据
    }
    return 0;
}

总结

该题主要考察类模板和动态内存分配的知识。

使用类模板定义的通用的数组类 MyArray,可以根据不同类型的数据创建不同的数组对象。同时,该代码还使用了动态内存分配的方式为数组动态分配内存,并用析构函数对动态分配的内存进行释放,避免了内存泄漏的问题。

我是秋说,我们下次见。

标签:int,MyArray,pC,C++,数组,size,data,模板,PTA
From: https://www.cnblogs.com/qiushuo/p/17481451.html

相关文章

  • [C++/PTA] 2017Final 圆周率山
    题目要求为了参加学校的社团风采展,怡山小学数学组的同学们决定画一座圆周率山,以宣传圆周率。已知圆周率为:3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253......
  • [C++/PTA] 类的定义和使用
    题目要求定义一个日期类Date,内有数据成员年、月、日,另有成员函数:构造函数用于初始化数据成员,输出,闰年的判断。编写主函数:创建日期对象,计算并输出该日是该年的第几天。输入:每组测试数据仅包含一个测试用例,每个测试用例占一行包括三个数,分别表示年、月、日。输出:该日是该年的......
  • [C++/PTA] 立方体类的实现
    题目要求立方体类Box的实现,完成计算体积、计算表面积、输出结果等功能。其中给定的主函数为:intmain(){floatab;cin>>ab;Boxobj;obj.seta(ab);obj.getvolume();obj.getarea();obj.disp();return0;}输入格式:立方体的边......
  • [C++/PTA] 汽车收费
    题目要求现在要开发一个系统,管理对多种汽车的收费工作。给出下面的一个基类框架classVehicle{protected:stringNO;//编号public:virtualvoiddisplay()=0;//输出应收费用}以Vehicle为基类,构建出Car、Truck和Bus三个类。Car的收费公式为:载客数8+重量2Truck的收费......
  • [C语言/PTA] 学生成绩链表处理
    题目要求本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。函数接口定义:structstud_node*createlist();structstud_node*deletelist(structstud_node*head,intmin_score);函数createlist利用scanf从输入......
  • [C语言/PTA] 单链表结点删除
    题目要求本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:structListNode{intdata;ListNode*next;};函数接口定义:structListNode*readlist();structListNode*deletem(structListNode*L,intm);......
  • [C++/PTA] 计算时间相减
    题目要求题目描述:定义一个时间类,小时和分钟是其两个私有成员数据。输入一个起始时间和一个结束时间(起始时间早于结束时间),通过运算符重载-(减号),计算这两个时间相隔多少分钟。说明:这两个时间在同一天之内,且采用24小时计时分式,即从00:00-23:59。输入格式:测试输入包含若干测......
  • [C语言/PTA] 建立学生信息链表
    题目要求本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。函数接口定义:voidinput();该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:structstud_node{intnum;/*学号*/charnam......
  • [C++/PTA] 括号匹配
    题目要求给定仅包含()[]{}六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。输入格式:第一行一个整数T(T<=10)其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)输出格式:对于每个字符串,匹配输出Yes,否则输出No......
  • c++的常量折叠
    一,前言有关C++语言的const常量的考察点:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read-only的区域。所以说C++的const常量和常量字符串是不同的,常量字符......