编写一个程序,使用类模板对数组元素进行排序、倒置、查找和求和。
【提示】以下是一点思路,可作为参考
#include <iostream>
#include <algorithm>
#include <iomanip>
template <typename T>
class Array {
private:
T* m_arr; // 指向数组首元素的指针
int m_size; // 数组的大小
public:
// 构造函数
Array(int size)
: m_arr(new T[size]), m_size(size)
{}
// 析构函数
~Array() {
delete[] m_arr;
}
// 获取数组元素的个数
int size() const {
return m_size;
}
// 获取指向数组首元素的指针
T* data() const {
return m_arr;
}
// 获取指向第 i 个元素的指针
T* at(int i) const {
if (i < 0 || i >= m_size) {
throw std::out_of_range("index out of range");
}
return &m_arr[i];
}
// 排序
void sort() {
std::sort(m_arr, m_arr + m_size);
}
// 倒置
void reverse() {
std::reverse(m_arr, m_arr + m_size);
}
// 查找
int search(const T& x) {
for (int i = 0; i < m_size; i++) {
if (m_arr[i] == x) {
return i;
}
}
return -1; // 没找到
}
// 求和
T sum() const {
T s = 0;
for (int i = 0; i < m_size; i++) {
s += m_arr[i];
}
return s;
}
};
int main() {
Array<double> arr1(5);
arr1.at(0)[0] = 1.1;
arr1.at(1)[0] = 2.2;
arr1.at(2)[0] = 3.3;
arr1.at(3)[0] = 4.4;
arr1.at(4)[0] = 5.5;
std::cout << "arr1:\n";
for (int i = 0; i < arr1.size(); i++) {
std::cout << std::fixed << std::setprecision(1) << arr1.at(i)[0] << " ";
}
std::cout << "\n\n";
arr1.sort();
std::cout << "arr1 sorted:\n";
for (int i = 0; i < arr1.size(); i++) {
std::cout << std::fixed << std::setprecision(1) << arr1.at(i)[0] << " ";
}
std::cout << "\n\n";
arr1.reverse();
std::cout << "arr1 reversed:\n";
for (int i = 0; i < arr1.size(); i++) {
std::cout << std::fixed << std::setprecision(1) << arr1.at(i)[0] << " ";
}
std::cout << "\n\n";
std::cout << "sum of arr1: " << arr1.sum() << "\n\n";
std::cout << "index of 3.3 in arr1: " << arr1.search(3.3) << "\n\n";
Array<int> arr2(5);
arr2.at(0)[0] = 1;
arr2.at(1)[0] = 5;
arr2.at(2)[0] = 3;
arr2.at(3)[0] = 2;
arr2.at(4)[0] = 4;
std::cout << "arr2:\n";
for (int i = 0; i < arr2.size(); i++) {
std::cout << arr2.at(i)[0] << " ";
}
std::cout << "\n\n";
arr2.sort();
std::cout << "arr2 sorted:\n";
for (int i = 0; i < arr2.size(); i++) {
std::cout << arr2.at(i)[0] << " ";
}
std::cout << "\n\n";
arr2.reverse();
std::cout << "arr2 reversed:\n";
for (int i = 0; i < arr2.size(); i++) {
std::cout << arr2.at(i)[0] << " ";
}
std::cout << "\n\n";
std::cout << "sum of arr2: " << arr2.sum() << "\n\n";
std::cout << "index of 3 in arr2: " << arr2.search(3) << "\n\n";
return 0;
}
以下是一个使用类模板对数组元素进行排序、倒置、查找和求和的程序示例:
#include <iostream>
using namespace std;
template<typename T>
class Array {
private:
T* data;
int size;
public:
Array(int n) {
size = n;
data = new T[size];
for (int i = 0; i < size; i++) {
cout << "Enter element " << i+1 << ": ";
cin >> data[i];
}
}
~Array() {
delete[] data;
}
void sort() {
for (int i = 0; i < size-1; i++) {
for (int j = i+1; j < size; j++) {
if (data[j] < data[i]) {
T temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
void reverse() {
for (int i = 0; i < size/2; i++) {
T temp = data[i];
data[i] = data[size-i-1];
data[size-i-1] = temp;
}
}
int search(T key) {
for (int i = 0; i < size; i++) {
if (data[i] == key) {
return i;
}
}
return -1;
}
T sum() {
T total = 0;
for (int i = 0; i < size; i++) {
total += data[i];
}
return total;
}
void print() {
for (int i = 0; i < size; i++) {
cout << data[i] << " ";
}
cout << endl;
}
};
int main() {
Array<int> intArray(5);
cout << "Original integer array: ";
intArray.print();
intArray.sort();
cout << "Sorted integer array: ";
intArray.print();
intArray.reverse();
cout << "Reversed integer array: ";
intArray.print();
cout << "Enter a number to search for: ";
int key;
cin >> key;
int index = intArray.search(key);
if (index == -1) {
cout << "Number not found." << endl;
} else {
cout << "Number found at index " << index << "." << endl;
}
cout << "Sum of integer array: " << intArray.sum() << endl;
Array<double> doubleArray(5);
cout << "Original double array: ";
doubleArray.print();
doubleArray.sort();
cout << "Sorted double array: ";
doubleArray.print();
doubleArray.reverse();
cout << "Reversed double array: ";
doubleArray.print();
cout << "Enter a number to search for: ";
double doubleKey;
cin >> doubleKey;
int doubleIndex = doubleArray.search(doubleKey);
if (doubleIndex == -1) {
cout << "Number not found." << endl;
} else {
cout << "Number found at index " << doubleIndex << "." << endl;
}
cout << "Sum of double array: " << doubleArray.sum() << endl;
return 0;
}
在这个程序中,我们定义了一个类模板 Array,它包含了整型数组和双精度浮点数数组的操作。使用类模板,我们可以将这些操作用于不同的数据类型。
在构造函数中,我们为数组元素逐个输入值。sort() 函数使用选择排序算法对数组元素进行排序,reverse() 函数将数组元素倒置。search() 函数用于查找指定值的位置,sum() 函数计算数组元素的总和。print() 函数用于打印数组元素。
在 main() 函数中,我们首先创建了一个整型数组和一个双精度浮点数数组,并调用它们的各种操作。需要注意的是,在创建类实例时,必须指定类型参数,如 Array 和 Array。
不知道你这个问题是否已经解决, 如果还没有解决的话:template<class Type>
class ArrayOperation{
private:
Type* array;
int size;
public:
// 构造函数,能够初始化一个指定大小的数组
ArrayOperation(int size) {
this->size = size;
array = new Type[size];
}
// sort方法,能够对数组元素进行排序,使用任何排序算法均可
void sort() {
//使用选择排序进行排序
for (int i = 0; i < size - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < size; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
swap(array[i], array[minIndex]);
}
}
}
// reverse方法,能够将数组元素按照相反顺序排列
void reverse() {
for (int i = 0; i < size / 2; i++) {
swap(array[i], array[size - i - 1]);
}
}
// search方法,能够在数组中查找指定元素,并返回其下标
int search(Type target) {
for (int i = 0; i < size; i++) {
if (array[i] == target) {
return i;
}
}
return -1; //若未找到,返回-1
}
// sum方法,能够求出数组元素的总和
Type sum() {
Type total = 0;
for (int i = 0; i < size; i++) {
total += array[i];
}
return total;
}
~ArrayOperation() {
delete[] array;
}
};
int main() {
ArrayOperation<int> i_array(5);
i_array[0] = 5;
i_array[1] = 4;
i_array[2] = 2;
i_array[3] = 3;
i_array[4] = 1;
cout << "before sort: " << endl;
for (int i = 0; i < 5; i++) {
cout << i_array[i] << " ";
}
cout << endl;
i_array.sort();
cout << "after sort: " << endl;
for (int i = 0; i < 5; i++) {
cout << i_array[i] << " ";
}
cout << endl;
i_array.reverse();
cout << "after reverse: " << endl;
for (int i = 0; i < 5; i++) {
cout << i_array[i] << " ";
}
cout << endl;
cout << "search(3): " << i_array.search(3) << endl;
cout << "sum: " << i_array.sum() << endl;
ArrayOperation<double> d_array(5);
d_array[0] = 1.1;
d_array[1] = 5.2;
d_array[2] = 3.3;
d_array[3] = 2.4;
d_array[4] = 4.5;
cout << "before sort: " << endl;
for (int i = 0; i < 5; i++) {
cout << d_array[i] << " ";
}
cout << endl;
d_array.sort();
cout << "after sort: " << endl;
for (int i = 0; i < 5; i++) {
cout << d_array[i] << " ";
}
cout << endl;
d_array.reverse();
cout << "after reverse: " << endl;
for (int i = 0; i < 5; i++) {
cout << d_array[i] << " ";
}
cout << endl;
cout << "search(3.3): " << d_array.search(3.3) << endl;
cout << "sum: " << d_array.sum() << endl;
return 0;
}