设计一个类模板template<class Type>

  1. 编写一个程序,使用类模板对数组元素进行排序、倒置、查找和求和。
    
    【提示】
    设计一个类模板
    template
    class Array{

    };
    具有对数组元素进行排序、倒置、查找和求和的功能,然后产生类型实参分别为double型的两个模板类,分别对整型数组与又精度数组完成所要求的操作。

以下是一点思路,可作为参考

#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。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:
    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;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^