Получение странного отрицательного числа в моем выводе при использовании массива, который я изменил в одной функции, в другой функции - PullRequest
0 голосов
/ 28 сентября 2018

Я пишу программу, которая принимает введенный пользователем список до 25 целых чисел, затем печатает отсортированный список с использованием пузырьковой сортировки, отсортированный список по убыванию и некоторую другую информацию о списке, такую ​​как медиана, минимум имаксимум и режим.

Я проверил все свои функции в программе по отдельности на массиве, который я создал с использованием списков инициализаторов (не из пользовательского ввода / cin), и они работают нормально, но когда я запускаю программу что-товыключен.Например, когда я ввожу 1,2,3,4, функция, которая печатает отсортированный список в порядке убывания, печатает 3,2,1, -858993460.Он всегда пропускает наибольшее целое число и добавляет в конце -858993460, независимо от того, какие значения я поместил во входной массив.Вот соответствующая часть моего кода:

#include <iostream>
using namespace std;

void input(int ulist[26], int& n);
void Bubblesort(int ulist[26], int slist[26], int n);
void print(int list[26], int n);
int n;
void reversesort(int slist[26], int n);


void main()
{
    int ulist[26], slist[26];
    input(ulist, n); 
    cout << "Unsorted";
    print(ulist, n);
    cout << "Sorted";
    Bubblesort(ulist, slist, n);
    print(slist, n);
    reversesort(slist, n);   
    cin >> n;
}

void input(int ulist[26], int& n)
{
    int i(0), value;
    cout << "enter value : \n";
    cin >> value;

    while (i < 25 && value != -999)
    {
        ulist[i] = value;
        i++;
        if (i < 25)
        {
            cin >> value;
        }
    }
    n = i;
}

void Bubblesort(int ulist[26], int slist[26], int n)
{
    int i, j, temp;
    for (i = 0; i < n; i++)
        slist[i] = ulist[i];

    for (j = 25 - 1; j > 0; j--)        //25 is Length of the array 
        for (i = 0; i < j; i++)
            if (slist[i] > slist[i + 1])
            {
                temp = slist[i];
                slist[i] = slist[i + 1];
                slist[i + 1] = temp;
            }

}

void print(int list[26], int n)
{
    int i;
    cout << " list of numbers are : \n"; 
    for (i = 0; i < n; ++i)
    {
        cout << list[i] << '\n';
    }
    cout << "\n\n";
}

void reversesort(int slist[26], int n) //checked w online compiler, works
{
    cout << "List of numbers in descending order is: \n";
    for (int i = n - 1; i >= 0; --i)
        cout << slist[i] << ", ";
    cout << "\n";
}

Я предполагаю, что это какая-то проблема с памятью и что источник этого связан с передачей slist, который был изменен в функции bubblesort, черезфункции, которые я написал.Я довольно новичок в C ++ (из Python), поэтому я предполагаю, что упускаю что-то, что касается передачи массивов в функции.

РЕДАКТИРОВАТЬ: я думаю, чтобы подвести итог - как я могувзять данные, введенные в функцию ввода, и использовать этот массив в другой функции?И как я могу взять массив, который был отсортирован функцией bubblesort, и использовать этот массив в другой функции?

1 Ответ

0 голосов
/ 28 сентября 2018

Первый случай неопределенного поведения в вашем коде:

    if (slist[i] > slist[i + 1])

в Bubblesort.

В связи с

for (j = 25 - 1; j > 0; j--)
    for (i = 0; i < j; i++)

максимальным индексом, доступным для этогоцикл равен slist[24] (24 из i + 1, где i < j и j = 25 - 1 = 24, поэтому i = 23).

Ваш ввод только 4 числа, поэтому инициализируются только от slist[0] до slist[3],Остальные элементы (от slist[4] до slist[25]) неинициализированы.Чтение из неинициализированной переменной имеет неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...