动态数组和用户输入c ++

时间:2018-02-08 17:30:16

标签: c++ function templates printing dynamic-arrays

我正在为我的C ++类编写一个程序,它接受用户输入int和char数组的大小,用随机值(数字0-100,字母AZ)填充数组,然后排序,反转和显示两个阵列。

大部分程序都有效,我理解我在这里使用的逻辑,但是......

多次运行和调试代码后。我注意到当数组填充值时,第一个元素,即使它实际上被赋予了一个值,它也不会打印按升序给出的赋值,而是按降序排列?我根本不明白这一点。

注意:我必须使用模板函数来排序,反转和显示数组。

template <class T> 
void sort(T *arr, int a) {
    T temp;
    for (int i = 0; i < a; i++) {
        for (int j = a; j > 0; j--) {
            if (arr[i] > arr[j]) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
 }

template <class T>
void reverse(T *arr, int a) {
    T temp;
    for (int i = 0; i < a / 2; i++) {
        temp = arr[i];
        arr[i] = arr[a - i];
        arr[a - i] = temp;
    }
}

template <class T>
void display(T *arr, int a) {
    for (int i = 0; i < a; i++) {
        cout << arr[i] << ", ";
    }
    cout << endl;
}

template<class T>
void save(T *arr, int a) {
    sort(arr, a);
    display(arr, a);
    reverse(arr, a);
    display(arr, a);
}

int main() {

    int x, y;

    cout << "Please enter a number for an array of data type \"int\"" << endl;
    cin >> x;
    cout << "Please enter a number for an array of data type \"char\"" << endl;
    cin >> y;

    int *arr1 = new int[x];
    char *arr2 = new char[y];

    for (int i = 0; i < x; i++) 
        cout << (arr1[i] = rand() % 100 + 1);

    srand(time(nullptr));
    for (int i = 0; i < y; i++)
        cout << (arr2[i] = rand() % 26 + 65);


    system("cls");

    save(arr1, x);
    save(arr2, y);

    delete[]arr1;
    delete[]arr2;

    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:1)

你在几个地方都有一个不合适的错误。

    for (int j = a; j > 0; j--) {

不正确。 a是数组的无效索引。将该行更改为使用j = a-1

    for (int j = a-1; j > 0; j--) {

reverse中有一个类似的,一个一个错误的错误。而不是

    arr[i] = arr[a - i];
    arr[a - i] = temp;

你需要使用:

    arr[i] = arr[a - i - 1];
    arr[a - i - 1] = temp;

您对sort的实施不正确。我不想在此处查看算法详细信息,但更改用于j的值的顺序似乎可以解决问题。

for (int i = 0; i < a; i++) {
    for (int j = i+1 ; j < a ; j++) {
       // The swapping code.
    }
}

答案 1 :(得分:1)

您在这里使用完整的长度:

save(arr1, x);
save(arr2, y);

所以在reverse

arr[i] = arr[a - i]; arr[a - i] = temp;

你需要-1的长度,否则当i == 0

时你会得到一个无效的索引

arr[i] = arr[a - 1 - i]; arr[a - 1 - i] = temp;

sort

中的R Sahu相同

for (int j = a; j > 0; j--) {

你需要-1,因为a是一个无效索引的长度。

for (int j = a-1; j > 0; j--) {

作为旁注,您可以在Temp t内的for循环内以及reverse中的if内宣布sort,因为它只是用于这些范围。

编辑: 我也忽略了,sort你需要改变

j>0

j >= 0

这样你也可以访问数组的第一个元素。

答案 2 :(得分:0)

您正在使用O(n ^ 2)时间复杂度的冒泡排序。考虑使用更快的算法。如果您不想自己实现它,请使用sort()函数。它的复杂性大约是O(n log n),非常好。

http://www.cplusplus.com/reference/algorithm/sort/

#include <iostream>
#include <algorithm>

using namespace std;

bool comp(int i1, int i2) { // comp function is to compare two integers
    return i1 < i2;
}

int main() {

    int x[30];
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x[i];
    }

    sort(x, x + n, comp); // if you don't provide comp function ( sort(x, x+n)     ), sort() function will use '<' operator

    for (int i = 0; i < n; i++) {
        cout << x[i] << " ";
    }

    return 0;
}