Проблема со значениями Srand C++

Итак, я создаю лотерейный билет со случайными значениями, а затем сортирую его. Я не беспокоюсь о методе сортировки, так как учитель не ищет классы и т. д. по этому заданию, и это работает, однако, мои значения билетов, которые я получаю, несмотря на использование srand (время (0)), а затем ранд () % 40 + 1 - что, я думаю, должно сделать мои случайные числа между 1-40... но mainTicket[0] всегда равен 0. Есть идеи? Извините за форматирование, заставило добавить лишние пробелы и испортить отступ.

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void mainLotto (int main[]);
void lottoSort (int ticketArr[]);

int main()
{
int mainTicket[5];

srand (time(0));

mainLotto(mainTicket);

do
{
    lottoSort(mainTicket);
} while (mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2] || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4] || mainTicket[4] > mainTicket[5]);

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

return 0;
}

///
/// <> Creates the actual lottery ticket
///
void mainLotto (int main[])
{
// Creating the ticket
for (int i = 0; i < 5; i++)
{
    main[i] = rand() % 40 + 1;
}
}

///
/// <> Sorts the actual lottery ticket
///
void lottoSort (int ticketArr[])
{
 // Sorting the ticket
for (int j = 0; j < 5; j++)
{
    if (ticketArr[j] > ticketArr[j+1])
    {
        int temp;

        temp = ticketArr[j+1];

        ticketArr[j+1] = ticketArr[j];

        ticketArr[j] = temp;
    }
}
}

person ldehart    schedule 02.11.2014    source источник
comment
ticketArr[j+1] выходит за пределы   -  person Galik    schedule 02.11.2014
comment
Просто совет для дальнейшего рассмотрения: попробуйте ограничить себя разумной длиной строки, например, 80 или около того, особенно в коде, который вы публикуете в Интернете. Принуждать читателей к горизонтальной прокрутке — это действительно плохо. Кроме того, правильный отступ (выберите один из распространенных стилей, например, K&R), последовательно применяемый, действительно полезен не только здесь, но и для вас самих.   -  person Deduplicator    schedule 02.11.2014
comment
Я использую постоянную форму отступа, но я не делаю отступы в самых первых вещах, которые я должен сделать здесь для кодирования. Я могу начать делать это для будущего использования здесь, спасибо за совет!   -  person ldehart    schedule 02.11.2014


Ответы (2)


Я вижу две проблемы с доступом к вашим массивам за пределами границ:

Здесь:

int main()
{
    int mainTicket[5];

    srand(time(0));

    mainLotto(mainTicket);

    do
    {
        lottoSort(mainTicket);
    }
    while(mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2]
        || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4]);
//      || mainTicket[4] > mainTicket[5]); // OUT OF BOUNDS!!!

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

    return 0;
}

И здесь:

void lottoSort(int ticketArr[])
{
    // Sorting the ticket
    for(int j = 0; j < 4; j++) // j < 4 NOT 5!!! <== WAS OUT OF BOUNDS
    {
        if(ticketArr[j] > ticketArr[j + 1])
        {
            int temp;

            temp = ticketArr[j + 1];

            ticketArr[j + 1] = ticketArr[j];

            ticketArr[j] = temp;
        }
    }
}

Вероятно, процедура сортировки перетаскивала ноль из-за границ массива.

person Galik    schedule 02.11.2014
comment
Вау, я тоже пропустил условный оператор... теперь он работает как шарм, спасибо, ребята! - person ldehart; 02.11.2014

Я только что напечатал элемент, который, как вы утверждаете, всегда равен нулю, после mainLotto(), и он дал 30.

Я подозреваю, что проблема заключается в том, где вы говорите нам не смотреть. :)

В функции сортировки вы делаете:

for (int j = 0; j < 5; j++) {
    if (ticketArr[j] > ticketArr[j + 1]) {

Массив имеет размер 5. Ваш j в конечном итоге примет значение, равное 4.

Затем вы делаете ticketArr[j + 1], что на самом деле является доступом вне границ.

Исправление состоит в том, чтобы идти до 4 в вашем цикле, а не 5.

Как сказал Галик, mainTicket[4] > mainTicket[5] также является запретным доступом, и после прочтения моего ответа вы должны понять, почему. :)

person gsamaras    schedule 02.11.2014
comment
Ах, я совсем пропустил это! Любые предложения о том, как я могу переписать его, чтобы убедиться, что я никогда не выйду за пределы? Пробую комбинацию j и j-1, но у меня не очень получается. - person ldehart; 02.11.2014
comment
Ваш цикл должен идти до 4, а не до 5. @ldehart - person gsamaras; 02.11.2014