2009-07-15 6 views
0

while (bool) 루프를 만들려고 시도한 후에 벡터에 내용이 없기 때문에 벡터의 내용을 볼 수 없어 실패했습니다. 사용자 (예 : 여기에 코드의 중요한 부분이 있습니다.외부에서 루프를 끊을 수 있습니까?

편집 : 작업 코드, 그러나 = 의미는 무엇입니까?

#include "std_lib_facilities.h" 

class Name_pairs 
{ 
public: 
     vector<string>names; 
     vector<double>ages; 
     bool test(); 
     string read_names(); 
     double read_ages(); 
     void print(); 
}; 

string Name_pairs::read_names() 
{ 
     string name; 
    cout << "Enter name: "; 
    cin >> name; 
    names.push_back(name); 
    return name; 
} 

double Name_pairs::read_ages() 
{ 
    double age; 
    cout << "Enter corresponding age: "; 
    cin >> age; 
    ages.push_back(age); 
    cout << endl; 
    return age; 
} 

void Name_pairs::print() 
{ 
    for(int i = 0; i < (names.size()-1) && i < (ages.size()-1); ++i) 
      cout << names[i] << " , " << ages[i] << endl; 
} 

bool Name_pairs::test() 
{ 
    if(ages.empty() || names.empty()) return true; 
    if(ages.back() = 0 || names.back() == "0"){ 
          return false;} 
    return true; 
} 


int main() 
{ 
    Name_pairs np; 
    cout << "Enter names and ages. Use 0 to cancel.\n"; 
    bool finished = false; 
    while(!finished){ 
    finished |= "0" == np.read_names(); 
    finished |= 0 == np.read_ages();}   
    np.print(); 
    keep_window_open(); 
} 
+0

코드를 이해하는 데 문제가 있습니다. 두 번째 블록 이후에 세 번째 블록이 있습니까? 아니면 루프의 일부입니까? 너무 길지 않다면 hte loop의 전체 몸체 (조건 포함)를 게시 할 수 있습니까? – Falaina

+0

물론 문제가 없습니다. 내가 시도한 bool 테스트로 게시 할 것입니다. – trikker

+0

@Trikker : 제발 코드 서식을 수정하십시오. 나는 당신을 위해 그것을 고쳤지만, 당신의 편집은 온통 밟아 버렸습니다. –

답변

1

이 상당히된다 단순한.

방금 ​​입력 한 값을 실제로 반환하도록 설정 메소드를 변경하십시오.

bool finished = false; 
while(!finished) 
{ 
    finished = finished || "0" == np.read_names(); 
    finished = finished || 0 == np.read_ages(); 
} 

것은 당신이 당신의 종료를 설정하고 있기 때문에 :

Double Name_pairs::read_ages() 
{ 
    Double age; 
    cout << "Enter corresponding age: "; 
    cin >> age; 
    ages.push_back(age); 
    cout << endl; 
    return age; 
} 

그런 다음 루프에서 반환 된 값을 직접 테스트 할 수 있습니다 : 나는 또한 방법의 지역 변수가 들어온다에서 부작용을 방지하기 위해 연령 만든 상태 (종료하려면 0 번 입력)에서 일관성을 위해 출구 조건을 테스트하는 것이 좋습니다.

은 어쨌든 그것을보고 어떻게 ... 코드 나에 댓글을 AEM을 반영하는 코드를 변경


편집을 이해하는 짧고 쉽게입니다. 이렇게하면 올바른 논리 연산자가 사용됩니다. 캐스 캐이 딩 평가에 관해서는 첫 번째 대답이 0이면 두 번째 질문에 대해서도 물어 보지 않습니다 (나머지는 성명이 평가되지 않으므로 진술의 나머지 부분은 평가되지 않습니다). 따라서 조심해야합니다. 이 경우 (예를 들어 두 벡터가 항상 동일한 길이를 가질 것으로 예상되는 경우). 그러나 사용자가 이미 나가기를 원한다고 말했기 때문에 유용성이 현저하다는 것을 알았습니다. 다른 질문을하는 데 아무 쓸모가 없었습니다.

+0

나는 이것을 시험해보고 싶다. 그러나 이것을 사용하고있는 것은 무엇입니까? = 연산자? 나는 그것을 본 적이 없다. – trikker

+0

이것이 효과가 있습니다. 하지만 뭘하니? – trikker

+2

'finished | = condition'은'finished = finished |'와 동일합니다. (condition)'표현식이 느리게 평가되면 (C#에서와 같이) finshed가 이미 true이면 'condition'은 평가되지 않습니다. 즉 np.read_names() == "0"이면 np.read_ages()가 호출되지 않습니다. –

3

각 함수가 bool을 반환하도록 만들 수 있습니다. 그런 다음 루프에서 함수가 false를 반환했는지 확인하십시오. 만약 그렇다면.

또한 함수 내에서 오류를 throw하고 외부에서 catch하고 적절하게 처리 할 수 ​​있지만 약간 극단적이라고 생각합니다. 나는 당신이 '출구 코드'유형의 것을 찾고 있다는 인상을 받는다. 이 경우 단순히 bool을 반환하고 루프에서 벗어나야하는지 확인하는 것이 좋습니다.

편집 : 그래서 업데이트 된 코드는 조금 복잡한 것 같다, 그러나 이것은 제가 지금까지 부울을 반환로에서 얻고 있었다 것은 간다 :

void Name_pairs::read_names() 
{ 
    cout << "Enter name: "; 
    cin >> name; 
    names.push_back(name); 
} 

bool Name_pairs::read_ages() 
{ 
    cout << "Enter corresponding age: "; 
    cin >> age; 

    if (age == 0) 
     return false; 
    ages.push_back(age); 
    cout << endl; 
    return true; 
} 

// Now we can test if its time to break. 
while (true) 
{ 
    np.read_names(); 
    if (!np.read_ages()) 
     break; 
} 
+0

나는 이것을 시도했지만 외모보다 더 힘들다. – trikker

+1

적어도 한 번 이상 뭔가를해야한다면'do..while() '루프를 사용하는 것을 고려해보십시오. 그게 그곳에있는 것입니다. –

0

당신은 확인 기능은 값을 반환 할 수 있습니다 필요한 경우 값을 나누십시오.

함수를 호출 한 후에 읽은 값을 확인할 수도 있습니다. 이 경우 if (names.back() == "something") 또는 if (ages.back() == 0)가 작동하는 것처럼 보입니다.

편집 :

귀하의 일반적인 생각은 잘 (당신의 종료 조건이 충족되는 경우 false를 돌려 루프의 모든 반복에 대한 테스트를()를 실행)하지만, 몇 가지 구현 오류가 :

if(ages[bool_counter] = 0 || names[bool_counter] == "0") 

첫 번째 조건은 "="대신 "="가 필요합니다. 나는 당신의 컴파일러가 이것에 관해 당신에게 경고했을 것이라고 생각한다. 당신은 일반적으로 그의 경고를 들어야한다. :). 현재 성명서는 연령 [0]에 0으로 지정하지 않고 0으로 지정하고 있습니다.

첫 번째 요소를 역 참조하려고 시도하기 전에 크기를 확인해야합니다. 그렇지 않으면 나이 또는 이름에 오류가 발생합니다 비어 있습니다.

그래서 내가 선명도 켄의 응답을 선호하지만, 작업을해야

if((ages.size() > 0) && (ages.back() == 0)) || 
    (names.size() > 0) && (names.back() == "0")) 

에 그 변경.

+0

오브젝트가없는 한 그렇지 않습니다. 루프가 발생하기 전에 벡터에서. – trikker

+0

할당 연산자는 구현 될 때와 같지 않았습니다. 코드를 빨리 다시 작성하고 삭제했기 때문에 복사하고 붙여 넣기해야했습니다. deus를 시도했지만 변환 할 수 없습니다. 부울에게. 나는 코드를 게시 할 것이다. – trikker

0

명시 적으로 비어있는 test()/namesages 경우에 확인할 수 있습니다, 단지 "실제는"그렇지 않은 경우 확인합니까 : 문제를 변경하고 거꾸로 보면

bool Name_pairs::test() { 
    if (ages.empty() || names.empty()) 
     return true; 
    return (ages.back() != 0) && (names.back() != "0"); 
} 
+0

나는 이것을 정말로 좋아한다. 그러나, 산출은 나이를 위해 0 생성하고 있습니다. 이유를 모르겠다. – trikker

+1

'test()'함수에 연령대가 [bool_counter] = 0 인 나이를 가지고 있기 때문에 연령이 0으로 출력됩니다. 이것은 'age [bool_counter] == 0'비교를 원할 때 0을 할당 한 것입니다. – sth

0

"외부에서 루프가 끊어 지나요?" -이 질문은 의미가 없습니다. 루프 외부에 있다면 이미 벗어 났으므로 이탈 할 필요가 없습니다.

기본적으로 이러한 유형의 언어를 공유하는 공통점 인 "시퀀스"를 읽어 보는 것이 좋습니다. http://javascript.about.com/library/blstruc1.htm

그런 다음 동일한 페이지에 링크되어 있습니다.

이제이 링크는 자바 스크립트를 설명하지만 논리는 본질적으로 동일하며 코딩 스타일은 다른 C 유형 언어와 거의 다릅니다.

+0

.... 나는 프로그램을 읽지 않을 것이라고 생각합니다. 루프 내부에서 함수를 호출하고 있습니다. 그리고 당신은 그 기능을 사용하여 깨고 싶습니다. – trikker

0

a | = b는 a = a |에 대한 속기입니다. 비. a 또는 b가 true 인 경우 끝에 a가 true입니다.

관련 문제