我的代码看起来不错,但某些输入会导致不需要的输出
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 的实现更简洁,但每个元素使用一个额外的指针。
该程序的目标是接收 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 的实现更简洁,但每个元素使用一个额外的指针。