2014-02-09 2 views
1

이름 목록을 관리하는 간단한 프로그램을 작성했습니다 (프로그램 세그먼트는 아래 참조). 변수 "option"에 대한 사용자 입력이 4 일 때 함수 "choice()"가 끝나고 main()으로 돌아가서 프로그램을 끝내기를 기대했습니다. 그러나 choice()는 몇 번 반복되는 경향이 있습니다 "옵션"에 4를 지정한 후에도 다음과 같이 설정하십시오.void 함수의 끝에 도달하면 예기치 않은 결과가 발생합니다.

Would you like to: 
    (1) - Add name(s) to the list 
    (2) - Remove name(s) from the list 
    (3) - View the list 
    (4) - Exit the program 
(type 1, 2, 3, or 4): 4 


Exiting Program... 


Would you like to: 
    (1) - Add name(s) to the list 
    (2) - Remove name(s) from the list 
    (3) - View the list 
    (4) - Exit the program 
(type 1, 2, 3, or 4): 4 


Exiting Program... 

ryan$ _ 

전체 프로그램이 없으면 문제의 원인은 무엇이라고 생각하십니까? 추천 할 수있는 정보가 충분하지 않다면 죄송합니다.

네 번째 if 문 선택 끝에서 "exit (0)"주석을 달았습니다. choice()가 끝나고 main()으로 돌아 가야합니다. 나는이 진술을 피하는 것을 선호 할 것이다. 그러나 그것은 내가 지금 일할 수있는 유일한 해결책이다. 당신의 도움을 주셔서 감사합니다.

- 라이언

int main() 
{ 
    cout << endl 
      << "WELCOME TO THE NAME LIST PROGRAM" << endl 
      << "--------------------------------" << endl; 

    choice(); 

    return 0; 
} 


void choice() 
{ 
    string option = "0"; 

    cout << "\nWould you like to:"    << endl 
    << "\t(1) - Add name(s) to the list"  << endl 
    << "\t(2) - Remove name(s) from the list" << endl 
    << "\t(3) - View the list"    << endl 
    << "\t(4) - Exit the program"    << endl 
    << "(type 1, 2, 3, or 4): "; 

    getline(cin,option); 

    while(option != "1" && option != "2" && 
      option != "3" && option != "4" ) 
    { 
     cout << "\nInvalid input, reenter: "; 
     getline(cin,option); 
    } 

    if(option == "1") 
    { 
     appendNames(); 
     choice(); 
    } 
    else if(option == "2") 
    { 
     string flag = "menu"; 
     removeNames(flag); 
     choice(); 
    } 

    else if(option == "3") 
    { 
     viewNames(); 
     choice(); 
    } 

    else if(option == "4") 
    { 
     cout << "\n\nExiting Program...\n\n"; 
     // exit(0); 
    } 
} 
+0

메인 실행 전에'choice() '를 선언 했습니까? – lightandlight

+0

예, main이 호출되기 전에 함수 원형을 포함합니다. 전체 프로 그램은 ~ 480 라인이므로 나는 가장 적절하다고 생각한 것을 포함 시켰습니다. – AnthonyBeach

+0

게시 된 코드를 테스트 한 결과 문제를 재현 할 수 없습니다.OS/컴파일러 명령/실행 명령은 무엇입니까? – lightandlight

답변

1

이 문제는 기능이 어떻게 작동하는지에 대한 오해에서 비롯된 것이라고 생각합니다. 이름을 표시하는 함수가 있다고 가정 해보십시오.

void showName() 
{ 
    cout << "Ryan" << endl; 
} 

이제 10 번 반복 해 보겠습니다. 프로그램의 특정 방법으로, 당신은 아마 같은 것을 할 것 :

void showName(int times) 
{ 
    cout << "Ryan" << endl; 

    if (times > 0) { 
     showName(--times); 
    } 

    return; 
} 

int main() 
{ 
    showName(10); 
} 

프로그래밍이 방법은 재귀로 알려져 있습니다,하지만 난 당신이 우연히 것을 도달 한 것을 확신합니다. 재귀는 어떤 상황에서는 편리하지만, 반복하는 것과 같은 간단한 일을하는 일반적인 방법은 아닙니다. 의 함수를 10 번 호출 실제 프로그램을 보자 :

void showName() 
{ 
    cout << "Ryan" << endl; 
} 

int main() 
{ 
    for(int i = 0; i < 10; ++i) { 
     showName(); 
    } 
} 

당신이 기능 showName(), 호출 수신자, 그것은 호출자에게 반환하는 전화마다. 사용자가 4 (출구)에서 다른 옵션 떨어져 선택한으로

if(option == "1") 
{ 
    appendNames(); 
    choice(); 
} 

그런 다음 당신이 실제로 choice() 많은 시간을 요구하고있다 : 당신은 당신이 당신의 예와 같이 한 일을합니다. 따라서 즉시 효력을 얻으려면 exit(0)에 전화해야하는 이유가 설명됩니다.

요약하기, 프로그램이 있어야한다 :이 도움이

int main() 
{ 
    cout << endl 
      << "WELCOME TO THE NAME LIST PROGRAM" << endl 
      << "--------------------------------" << endl; 

    while(!choice()); 

    return 0; 
} 


bool choice() 
{ 
    bool toret = false; 
    string option = "0"; 

    cout << "\nWould you like to:"    << endl 
    << "\t(1) - Add name(s) to the list"  << endl 
    << "\t(2) - Remove name(s) from the list" << endl 
    << "\t(3) - View the list"    << endl 
    << "\t(4) - Exit the program"    << endl 
    << "(type 1, 2, 3, or 4): "; 

    getline(cin,option); 

    while(option != "1" && option != "2" && 
      option != "3" && option != "4" ) 
    { 
     cout << "\nInvalid input, reenter: "; 
     getline(cin,option); 
    } 

    if(option == "1") 
    { 
     appendNames(); 
    } 
    else if(option == "2") 
    { 
     removeNames(); 
    } 

    else if(option == "3") 
    { 
     viewNames(); 
    } 

    else if(option == "4") 
    { 
     cout << "\n\nExiting Program...\n\n"; 
     toret = true; 
    } 

    return toret; 
} 

희망.

+0

이것은 잘못된 평가입니다 : 그의 다른 경우의 재귀는 우리가 여기에서 논의하고있는 그의 종료 사례에 아무런 영향을 미치지 않습니다. – lightandlight

+0

그가 전체 소스 코드를 공개하지 않았기 때문에 계정을 고려하십시오. – Baltasarq

+0

이 상황과 어떻게 관련이 있는지 모르겠다. – lightandlight

0

문제는 while 루프입니다. 사용자는 잘못된 입력이 입력 될 때까지 입력을 계속 입력해야합니다.

while(option != "1" && option != "2" && 
     option != "3" && option != "4" ) 
{ 
    cout << "\nInvalid input, reenter: "; 
    getline(cin,option); 
} 

루프 상태를 변경하거나 루프 내 모든 것을 이동하는 것이 트릭을 수행해야합니다. 도움이 되길 바랍니다. :)

P.S : While 루프 내 모든 것을 이동하려면 종료 옵션에 break;을 추가해야합니다.

+0

정말이에요? 루프 조건은 유효하지 않은 입력을 검사하기 때문에 사용자가 잘못 입력하지 않는 한 유효한 입력이 나올 때까지 입력을 계속해야합니다 (전적으로 가능). – hvd

+0

@hvd 나는 당신과 동의한다 – lightandlight

+0

나는 hvd와 동의하는 경향이있다. while 루프는 유효하지 않은 숫자/입력을 검사합니다. 4는 유효하며 일련의 if 문으로 이동합니다. 핵심은 Baltasarq의 제안에 따라 알고리즘을 약간 단순화하는 것입니다. – AnthonyBeach

관련 문제