2010-08-24 8 views
0

사용자에게 일련의 질문을 요구하는 콘솔 기반 응용 프로그램을 작성하고 있습니다. 예컨대 :일련의 프롬프트에 goto를 사용하지 않으려면 어떻게해야합니까?

는 "열 기록을 입력 :"

를 "당신이 X을 하시겠습니까?"

"Y 하시겠습니까?"

"계속 하시겠습니까?"

사용자가 아무런 입력없이 아무 것도 입력하지 않으면 한 단계 올라가고 싶습니다. 이것은 goto를 사용하여 쉽습니다. 내가 생각할 수있는 유일한 다른 방법은 멀리 보이는의 루프에 중첩되어 있으며 두 개 이상의 프롬프트에 대해 다루기가 쉽지 않습니다. 이 작업을 수행하는 쉬운 방법이 있어야합니다. 단지 생각할 수 없습니다.

답변

1
당신은 기본적으로 매우 간단한 상태 머신 작성하는

- 모든 상태를 표현하기 위해 사용 기능 : (당신이 언어를 지정하지 않았기 때문에 나는 무작위 의사 코드를 사용합니다)

get_information(): 
    return get_record() 

ask_record(): 
    record = read_line() 
    return() if !record 
    return ask_y(record) 

ask_x(record): 
    x = read_line() 
    return ask_record() if !x 
    return ask_y(record, x) 

ask_y(record, x): 
    y = read_line() 
    return ask_x(record) if !y 
    return ask_continue(record, x, y) 

ask_continue(record, x, y) 
    continue = read_line() 
    return ask_y(record, x) if !continue 
    return (record, x, y) 

이는 간단하다 접근. 일부 언어에서는 호출 스택이 커지며 그렇지 않은 경우 호출 스택이 커집니다. 당신은 스택 성장을 유발하는 언어가 있다면, 당신은 할 get_information를 다시 작성하여,이를 방지하기 위해 트램폴린을 사용할 수 있습니다

x = get_information 
while x is function: 
    x=x() 
return x 

ask_x(record): 
    x = read_line() 
    return (lambda: ask_record()) if !x 
    return (lambda: ask_y(record, x)) 

심지어 일부 question 구조에서 결과의 질문 메모리 주소를 추출 :

struct question { 
    question *next, *prev; 
    char prompt[]; 
    char **result; 
} 

을 호출하고 -> 다음으로 이동하거나 결과에 NULL에 도달 할 때까지 -> prev를 호출합니다 (중지 조건, 결과가 채워지고 질문이없는 경우). 왼쪽).

직접적인 포인터 액세스로 명령형 언어를 사용하면 마지막 솔루션이 "가장 일반적인"것일 수 있습니다.

1

반복적이 아닌 반복적으로 작성하십시오.

+0

for 루프는 무엇입니까 (즉, 여러 수준의 중첩이 필요합니까?)? – Jason

1

간단한 상태 시스템으로 작성하십시오.

while(running) 
{ 
    if (state == INIT) 
    { 
     out("enter record"); 
     state = DO_X; 
    } 
    else if (state == DO_X) 
    { 
     do whatever for x. 
     state = WHATEVER_NEXT_STATE_IS; 
    } 
} 
+0

Upvoted, 비록 * 작성된 코드가 싫지만. 자라면 쉽게 나눌 수 없습니다. 한 줄의 변경과 새로운 라이브러리를 사용하여 모듈화하고 새로운 경로를 연결할 수 없습니다. 10 개 이상의 주에 도달 한 후에는 어떤 링크를 쉽게 찾을 수 없습니다. 그래도 일반적인 아이디어는 좋습니다. – viraptor

관련 문제