我的代码看起来不错,但某些输入会导致不需要的输出

My code seems fine, but certain inputs result in undesired outputs

该程序的目标是接收 user-input 数字列表,以逗号分隔。这些数字可以包括范围。在输入数字之前,用户必须输入问题集的标题,但这部分代码似乎可以正常工作。例如,如果用户输入:

"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,..." 

直到列表完成。

如果用户输入的数字包含在一个范围内,相互重叠的范围,或out-of-order输入(不包括向后的范围[您不能输入16-12作为范围]),代码将自动排序(按递增顺序)并输出每个数字而不重复任何元素。除了逗号和连字符之外,您也不能输入任何字符(尽管我相信我设法让 cin 继续阅读,直到它找到逗号或连字符后的第一个 int 值),并且必须按 enter 键提交输入。

如需有关作业的完整信息,请查看此处:http://craie-programming.org/122/labs/seqlist.html

这个问题很难准确定位,因为它只在用户输入极其复杂但有效的输入时才会发生。包括重叠范围、重复数字和乱序输入似乎导致列表在这里和那里重复几个数字,我根本找不到为什么会这样!

任何关于可能导致不一致问题的输入将不胜感激。谢谢!

它在某些情况下有效,但它必须在所有情况下都有效。如果用户对代码表现得很好,它就可以正常工作……但是无论如何,这段代码必须能够承受滥用并通过它来工作!

我尝试修改 binarySearch 函数,更改 if-else 语句中 ub(上限)和 lb(下限)的计算,但问题似乎仍然存在。也许我在尝试时遗漏了一些东西,但是我找不到它。

我也试过在 do-while 循环中摆弄 switch 语句,一切似乎都很好,虽然也许默认情况可能导致错误......如果是这样,我肯定找不到为什么。

我目前正在使用 C4Droid 开发 Chromebook IDE-- 尽管 Chromebook 很烂,但我认为这不是问题所在。

如果需要,这里是我目前所有代码的 link:https://docs.google.com/document/d/1umbIlfxRniBb9ANcbwcsv2K4hjAHEjH3itGFVB6p83U/edit?usp=sharing

我相信以下函数可能是问题的原因(全部封装到problemList class):

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;
}

AND/OR

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);
    }
}

AND/OR

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);  
}   

如果我输入一组随机数字(如前所述),包括重叠范围和 pre-existing 以及乱序数字,我经常会收到无效输出。通常,输出会重复数字、跳过某些数字,甚至会以错误的顺序放置数字。

例如,如果用户输入:

"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

您的问题可能出在 binarySearch 条件上:

    if(ub - lb > 1)

我无权访问您的完整代码,因此目前无法对此进行测试,但我认为这会导致您的 binarySearch 无法检查向量中的第一个和最后一个元素。也许您可以尝试将其切换为:

    if(ub - lb >= 0)

希望对您有所帮助。

使用 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 的实现更简洁,但每个元素使用一个额外的指针。