Мой код выглядит нормально, но определенные входные данные приводят к нежелательным выходным данным - PullRequest
0 голосов
/ 10 октября 2019

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

"Lesson 1"1-10,12,13,15,18,19-23,25

Код будет выводить:

"For Lesson 1, you will have to complete the following problems: 1, 2, 
3, 4,..." 

до тех пор, пока список не будет завершен.

Если пользователь вводит числа, включенные вдиапазон, диапазоны, которые перекрывают друг друга, или неправильный ввод (исключая обратные диапазоны [вы не можете ввести 16-12 как диапазон]), код будет автоматически сортироваться (в порядке возрастания) и выводить каждое число без повторения каких-либоэлементы. Вы также не можете вводить никакие символы кроме запятых и дефисов (хотя я думаю, что мне удалось заставить cin продолжать чтение до тех пор, пока он не найдет первое значение int после запятой или дефиса), и должен нажать Enter, чтобы передать ввод.

Для получения полной информации о назначении, при необходимости, посмотрите здесь: http://craie -programming.org / 122 / labs / seqlist.html

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

Любые входные данные относительно того, что может бытьвызвав противоречивые вопросы будет принята с благодарностью. Спасибо!

В некоторых случаях работает, но во всех должно работать. Если пользователь хорошо играет с кодом, он работает нормально ... но этот код должен уметь злоупотреблять и работать с ним независимо!

Я попытался поиграться с функцией binarySearch, изменив вычисления ub (верхняя граница) и lb (нижняя граница) в операторе if-else, но проблема, похоже, сохраняется. Возможно, я что-то упустил при попытке, однако я не смог его найти.

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

В настоящее время я работаю над Chromebook с использованием C4Droid IDE - хотя, насколько Chromebook отстой, я недумаю, что это проблема.

Вот ссылка на весь мой код до сих пор, если необходимо: https://docs.google.com/document/d/1umbIlfxRniBb9ANcbwcsv2K4hjAHEjH3itGFVB6p83U/edit?usp=sharing

Я считаю, что следующие функции могут быть причиной проблемы (все инкапсулированыв класс problemList):

bool binarySearch(int num, int lb, int ub){
        int mid = (lb + ub) / 2;
        if(ub - lb > 1){
            if(num == numbers[mid]){
                return true;
            }
            else if(num > numbers[mid]){ 
                lb = mid + 1;
                binarySearch(num, lb, ub);
            }
            else{
                ub = mid;
                binarySearch(num, lb, ub);
            }
    }
        else return false;
}

И / ИЛИ

void addNumber(int n){ /* adds a number to the numbers vector while sorting it at the same time via a backwards bubble sort.*/  
    if(!binarySearch(n, 0, numbers.size() - 1)){
        vector<int>::size_type currentIndex = 
                numbers.size();
        while(currentIndex > 0 && numbers[currentIndex - 1] > n){
            currentIndex--;
        }
            numbers.insert(currentIndex + numbers.begin(), 
                n);
    }
}

И / ИЛИ

void setVector(){
    bool going = true;
    unsigned int firstNum, secondNum;
    cin >> firstNum;
    numbers.push_back(firstNum);
    do{
        switch(cin.peek()){
            case ',':
                cin.ignore();
                cin >> firstNum;
                addNumber(firstNum);
                break;

            case '-':
                cin.ignore();
                cin >> secondNum;
                for(int x = firstNum + 1; x <= 
                                secondNum; x++)
                    addNumber(x);       
                         break;

            case '\n':
                going = false;
                break;

            default:
                cin.ignore();
                break;
        }
    }while(going);  
}   

Если я введу случайный набор чисел (как указано ранее)), включая перекрывающиеся диапазоны и уже существующие и вышедшие из строя номера, я часто получаю неверный вывод. Часто выходные данные повторяют числа, пропускают некоторые числа или даже размещают числа в неправильном порядке.

Например, если пользователь вводит:

"Lesson 1"1-6,3,6,2-7,4,5,1-7,9-12,10-13

Программа должна вывести:

For Lesson 1 you need to do the following problems:
1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13

Обратите внимание, как он пропускает 8, так как 8 не было включено ни в число, ни в какие-либо диапазоны. Вывод, который я получу, однако, будет (при тестировании):

For Lesson 1 you need to do the following problems:
1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 9, 10, 11, 11, 12, 12, 13

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Альтернативная реализация с использованием forward_list :

forward_list<unsigned> numbers;

void addNumber(unsigned num)
{
  auto last_visited = numbers.end();
  for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
  {
    if (*iter == num)
      return;
    if (*iter > num)
      break;
    last_visited = iter;
  }
  if (last_visited == numbers.end())
    numbers.push_front(num);
  else
    numbers.insert_after(last_visited, num);
}

Реализация с использованием list более чистая, но использует дополнительный указатель на элемент.

0 голосов
/ 11 октября 2019

Возможно, ваша проблема заключается в условии binarySearch:

    if(ub - lb > 1)

У меня не было разрешения на доступ к вашему полному коду, поэтому я не могу проверить это в данный момент, но думаю, что это приведет кваш двоичный поиск не смог проверить первый и последний элементы в вашем векторе. Может быть, вы могли бы попробовать переключить это на:

    if(ub - lb >= 0)

Надеюсь, это поможет.

...