[C++/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
,可以根据不同类型的数据创建不同的数组对象。同时,该代码还使用了动态内存分配的方式为数组动态分配内存,并用析构函数对动态分配的内存进行释放,避免了内存泄漏的问题。
我是秋说,我们下次见。
本文作者:秋说
本文链接:https://www.cnblogs.com/qiushuo/p/17481451.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步