다음 설명으로 수업 프로그램을 작성 중입니다.
"이브는 아름다운 공주 였고 많은 구혼자들이 그녀를 구했습니다. 그녀는 다음 절차에 따라 그녀가 결혼 할 사람을 결정하기로 결정했습니다. 그녀는 남자들을 줄 서서 그들의 위치에 따라 번호를 줄 것입니다 (첫 번째 줄에 1, 두 번째는 2, 등등). 그녀가 줄에있는 세 번째 사람에 도달 할 때마다 그 사람은 줄에서 제거됩니다. 그녀가 줄의 끝에 도달 할 때마다 그녀는 처음부터 계속 계산합니다. 줄의 마지막 사람은 그녀와 결혼하는 영광을 누리십시오. "
문제는 코드를 실행할 때마다 대답으로 엄청나게 많은 수를 얻는다는 것입니다. cout을 사용한 테스트는 프로그램이 while 루프의 내용을 건드리지 않음을 보여줍니다. while 루프가 제거되면 프로그램이 '벡터 반복기 + 오프셋 범위를 벗어남'및 "표준 C ++ 라이브러리가 범위를 벗어남"과 충돌합니다.
나는 while 루프 자체에 프로그램 충돌을 일으키는 문제가 있음을 이해하고 있으며, 무엇을 알아 내기 위해 며칠 동안 작업 해 왔습니다. 내가 이해하지 못하는 것은 프로그램이 처음에 while 루프를 무시하는 이유입니다. 모든 조언을 주시면 대단히 감사하겠습니다.
// EveSuitor.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
class EveSuitor
{
vector<int> newList;
public:
EveSuitor::EveSuitor(vector<int> list)
{
vector<int> newList = list;
}
void setUpSuitors(vector<int>list);
int chooseWinner(vector<int>list);
int suitorCounter;
int suitorTotal;
};
void EveSuitor::setUpSuitors(vector<int>v)
{
int numOfSuitors;
cout<< "Enter in the number of suitors that are there: ";
cin>> numOfSuitors;
for (int i = 0; i < numOfSuitors; i++)
{
v.push_back(i);
}
for (unsigned int j = 0; j < v.size(); j++)
{
cout<< v[j] << " ";
}
}
int EveSuitor::chooseWinner(vector<int>v)
{
while (v.size() > 1)
{
v.erase(v.begin()+suitorTotal);
for (unsigned int j = 0; j < v.size(); j++)
{
cout<< v[j] << " ";
}
suitorTotal = suitorTotal + suitorCounter;
if (suitorTotal > v.size())
{
suitorCounter = suitorTotal - v.size();//This will reset the counter for the suitor, so that it will move on to the next suitor at the beginning of the list.
suitorTotal = 0;
}
else
{
suitorCounter = suitorCounter + 3;
suitorTotal = suitorTotal + 3;
}
}
if (v.size() == 1)
{
return v[0];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int suitorTotal = 3;
int suitorCounter = 3;
vector<int>listOfSuitors;
EveSuitor list(listOfSuitors);
list.setUpSuitors(listOfSuitors);
int winner = list.chooseWinner(listOfSuitors);
cout<<"The position you should be at is: " << winner;
return 0;
}
목록이 채워지지 않았습니다. 귀하의 setUpSuitors
기능의 서명이 setUpSuitors(vector<int> v)
이 있다고하는 수단, vector
즉, 함수는 벡터의 복사에 액세스 할 수 있습니다, 값에 의해 전달됩니다. 함수 내에서 벡터를 수정하려면 다음과 같이 참조로 전달해야합니다 setUpSuitors(vector<int>& v)
(참고 &
).
우스꽝스러운 숫자를 얻는 이유는 return v[0];
진술을 지키는 if의 거짓 분기를 취하기 때문에 chooseWinner에서 돌아 오지 않기 때문 입니다. (구현 세부 사항으로 인해 반환 대신 의사 난수 값이 사용됩니다.)
충돌에 관해서는 :
오류 메시지는를 사용하여 벡터에서 삭제하려고 할 때 문제가 발생했음을 알려줍니다 v.erase(v.begin()+suitorTotal);
. 두 가지 문제가 있습니다
1) suitorTotal
및 둘 다 suitorCounter
실제로 클래스 내부에서 초기화 되지 않습니다 . 예를 들어 생성자에 전달하여이를 수정하거나 나중에 설정할 수 있습니다.
2) 이름이 오해의 소지 가없는 v.begin() + suitorTotal
한 v.end()
,에서 작동하지 않는와 동등한 반복자를 제공합니다 erase
. 다음에 삭제할 구혼자를 선택하는 논리를 재고해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다