Member 13161564 Ответов: 2

Ошибка двоичного дерева поиска C++, как я вообще могу это сделать?


У меня есть двоичное дерево поиска, некоторые функции в нем, не планируя использовать какие-либо другие библиотеки, ни использовать векторы, я должен использовать массивы и дерево. Этот код будет в основном работать, за исключением ошибки, что для некоторых корней функции, добавляющие массивы, не будут работать или функции печати не будут работать. В принципе, если вы вводите 1 сам по себе, а затем вводите массив, то примерно половина массива будет вставлена в дерево. Понятия не имею, как. Если я попытаюсь сначала вставить число 2 само по себе, а затем массив, он будет работать совершенно нормально. Номер 3 сломан, не знаю, есть ли какая-то закономерность.

Ошибок нет, компилируется нормально. Ожидаемые входные данные: введите числа отдельно или в виде массива, добавьте их все в одно двоичное дерево. Ожидаемый результат: выведите дерево со всеми добавленными числами в массиве и числами, добавленными отдельно.

Пожалуйста, помогите, я в отчаянии и не могу, ради всего святого, найти причину этого.

Спасибо вам всем за что угодно.

P.S. Я относительно новичок в программировании, оно может выглядеть как дерьмо и быть неэффективным, но для меня это не имеет значения, пока оно работает и я знаю, как оно работает.

массивы - с++ бинарное дерево поиска ошибок переполнения стека [^]

Что я уже пробовал:

Пробовал отлаживать, но я новичок, и это меня больше смутило, чем помогло. Попытался поместить код сюда, но я ужасно его редактирую, поэтому просто выложил его на stackoverflow и вставил ссылку сюда.

2 Ответов

Рейтинг:
0

OriginalGriff

Разработка-это не случай "написать его, скомпилировать, исправить ошибки компилятора, скомпилировать, отправить" - просто компиляция не означает, что ваш код правильный! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить почему. Поставить точку останова на строке:
myaverage.DisplayAverage();

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!

Так что попробуйте: научитесь использовать отладчик на относительно тривиальном примере, подобном этому, прежде чем вы столкнетесь с ошибкой в 200 000 строк кода, написанного кем-то другим в тот день, когда он покинул компанию!


Рейтинг:
0

Patrice T

Цитата:
Ошибок нет, компилируется нормально.

"Компилируется нормально "означает, что ваш код корректен на C++, но это не значит, что он делает то, что должен, поскольку" нет ошибки " будет означать.
"Кот летит высоко в небе" - это правильная английская грамматика, но это не имеет смысла.
Цитата:
Пробовал отлаживать, но я новичок, и это меня больше смутило, чем помогло.

Отладчик-это инструмент, и, как и для любого инструмента, вам нужно научиться им пользоваться.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.