Моя цель состоит в том, чтобы игрок ввел кучу чисел для массива, а затем этот массив записался в текстовый файл. Другая часть этого заключается в том, чтобы иметь возможность получать набор чисел из текстового файла и помещать их в отсортированный массив от самого высокого до самого низкого, а затем выводить этот массив. Но по какой-то причине я получаю много ошибок, которые, как мне кажется, можно исправить с помощью некоторых исследований. К сожалению, есть одна очень запутанная ситуация, когда я проверяю правильность несортированного массива, выводя каждый элемент массива. Это не часть финальной программы, а пока тест. У меня есть цикл for, который делает это, и он отлично работает, выводя каждое число, как и ожидалось. Затем в следующем цикле for должно произойти то же самое, но все выводимые числа перепутаны. Я не понимаю как. Код ниже

void readFile(string fName) {
    string fileName = fName + ".txt";
    ifstream myFile(fileName);
    char c;
    string num;
    int count = 0;

    // Bring the array from file to int array
    while (!myFile.eof()) {
        myFile.get(c);
        if (isspace(c) && num != "") {
            int n = stoi(num);
            intArray[count] = n;
            count++;
            num = "";
            continue;
        }
        if (!myFile.eof()) {
            num += c;
        }
    }

    for (int i = 0; i < 10; i++) {
        cout << intArray[i] << endl;
    }

    // Sort the array higest to lowest
    for (int i = 0; i < 10; i++) {
        cout << intArray[i] << "       ";
        for (int j = 9; j >= i; j--) {
            if (j == 0) {
                continue;
            }
            if (intArray[j] > intArray[j - 1]) {
                int temp = arr[j];
                intArray[j] = intArray[j - 1];
                intArray[j - 1] = temp;
            }
        }
        cout << endl;
    }
}

Извините за форматирование выше, это странно, поэтому представьте, что код находится внутри функции.

Вот что это выводит:

1
2
3
4
5
6
7
8
99
234
1
1
1
1
1
1
1
1
1
1

Числа перед серией 1 - это фактический массив, 1 - это то, что, по-видимому, является массивом в соответствии с cout в последнем разделе кода, где написано cout << intArray[i]

0
Maddman 21 Ноя 2019 в 02:56
Второй цикл пытается (и не удается) отсортировать список. Поскольку массив изменяется во втором цикле, вы не ожидаете, что он выведет те же значения, что и в первом цикле. Есть ли причина, по которой вы не используете std::vector для хранения и std::sort?
 – 
PeteBlackerThe3rd
21 Ноя 2019 в 03:11

1 ответ

Ваш массив выглядит отсортированным. Причина, по которой все печатаются, связана с расположением cout << во внешнем цикле.

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

234,1,2,3,4,5,6,7,8,99

Теперь представьте, что вы увеличили i до 1 во внешнем цикле. Когда вы индексируете свой массив intArray[i], i-й элемент теперь равен 1, потому что вы правильно переместили его туда. Каждый раз вы перемещаете свои меньшие элементы вверх на одну позицию в массиве, а затем индексируете позицию, где находится 1.

Не пытайтесь распечатать отсортированный массив во время его сортировки. Вместо этого переберите его и распечатайте после сортировки.

2
jkb 21 Ноя 2019 в 03:29
Да я уже понял что я тупой
 – 
Maddman
21 Ноя 2019 в 03:35
«Глупые» ошибки часто легко обнаруживаются путем пошагового выполнения программы с помощью отладчика и наблюдения за тем, где программа делает непредвиденное. Тупой не делает ошибку программирования. Тупой не использует доступные инструменты, чтобы помочь найти ошибку. Время, потраченное на обучение использованию отладчика среды разработки, потрачено с пользой.
 – 
user4581301
21 Ноя 2019 в 03:47