2014-02-05 1 views
0

나는이 사이트와 다른 사이트를 이미 검색했음을 말해야하지만 내 문제를 해결할 수는 없다. 일부 목록에서 작동하는 프로그램을 만들고 있습니다. 코드는 두 번째 목록의 값을 첫 번째 목록으로 복사합니다. 목록 2의 현재 값은 목록 1의 값보다 작아야합니다.이 조건이 true이면 값이 복사됩니다. 그러나 그것은 중요한 것이 아닙니다. GetExitValue()이라는 함수를 만들었습니다.이 함수는 메인의 끝에서 사용자의 입력을 계속할지 여부를 결정합니다. 그리고 이것이 문제입니다. main (잠시 동안) 함수를 호출하면 n (No)을 삽입해도 프로그램이 계속 실행됩니다. 내가 뭘 잘못하고 있는지 말해 줄 수 있니? 대단히 감사합니다 !!do-while 문에서 잘못된 논리가 있습니까?

내 코드가 semplified입니다.

int main(){ 

    do{ 
    . 
    . 
    . 
    . 
    printf("\nProgram finished. Do you wish to re-execute the program? \n\nPress y/Y (Yes) to continue. Press n/N (No) to exit. "); 

    } 
    while(GetExitValue() == 'y' || 'Y'); // **Problem here!!** 

    return 0; 
} 


    char GetExitValue(){ 
     char exit_value; 

      scanf(" %c", &exit_value); 
      while(exit_value != 'y' && exit_value != 'n' && exit_value != 'Y' && exit_value != 'N'){ 
         printf("Value incorrect. insert y or n!!\n"); 
         scanf(" %c", &exit_value); 
        } 
      return exit_value; 
     } 
+0

입니다. 너는 그렇게 할 수 없다. – SLaks

+0

'GetExitValue() == 'y'|| GetExitValue() == 'GetExitValue'가 잘 작동하면 =='Y'' – jasilva

+0

이것은 잘 작동하지 않습니다 ... : \ – IvanProsperi94

답변

2

이 부분 :

올바르게 발견 한
while(GetExitValue() == 'y' || 'Y'); // **Problem here!!** 

, 아마 하지 당신이 무엇을 의미하고. 이 은 항상이고 "Y"(ASCII에서는 0이 아니기 때문에)는 항상 "true"이기 때문에 "true"입니다.

당신은 실제로이 코드를 코드에 넣습니다 : while (condition || 1)이 경우 유용하지 않을 수 있습니다.

. 
. 
// run GetExitValue() only once... 
char gev = GetExitValue(); 
} 
while(gev == 'y' || gev == 'Y'); 

그리고 난 당신이 같은 것을 할 수 있다고 지적합니다 :

당신은 아마이 말은 단지 당신이 사용자가 수행 할 때 0을 반환 GetExitValue()을 변경하려는 경우

. 
. 
} 
while(GetExitValue()); // no need to store value! 

을 다시 실행하지 않으려면 다음을 수행하십시오.

char GetExitValue(){ 
    char exit_value; 

     scanf(" %c", &exit_value); 
     while(exit_value != 'y' && exit_value != 'n' && exit_value != 'Y' && exit_value != 'N'){ 
        printf("Value incorrect. insert y or n!!\n"); 
        scanf(" %c", &exit_value); 
       } 

     return exit_value == 'Y' || exit_value == 'y'; //evaluates to 1 if true 
    } 

아마도 더 깨끗하고, shouldRunAgain()에의 이름은 내 개인적인 취향에 더 많은 정보이다 :)로

+1

대단히 감사합니다 !! 이 작품은 flawlessy ..Btw 거기에 그 더 많은 char없이 이것을 할 또 다른 방법은 무엇입니까 ?? 나는 잠시 동안 호출 된 함수로 그렇게 할 수 없다는 것을 의미합니까 ?? 그리고 내가 충분히 명성을 얻지 못했기 때문에 나는 당신의 답을 상상할 수 없습니다. 그러나 어쨌든 당신을 감사하십시오. 이것은 매우 도움이되었다 !! – IvanProsperi94

+0

뭔가를 추가했습니다. 코드에서 테스트하여보고하십시오. 유용하다고 생각되면 답변을 수락 할 수 있습니다. –

+0

Thanl 당신은 다시 당신을 놀라게하고있다!! : D – IvanProsperi94

0

그동안식이 평가 :

while((GetExitValue() == 'y') || 'Y'); 

그래서 표현이 항상 true입니다 아무것도 또는 진정한 == 사실 때문이다.

0

귀하의 문제는 제로 (false)를하지 C, 아무것도, 여기 -

while(GetExitValue() == 'y' || 'Y');

'Y'부분은 항상 참이 될 것입니다 사실이다. 'Y'의 ASCII 값이 0이 아니므로 while 조건은 항상 true를 반환합니다.

은 당신이해야 할 것은`|| '_logical_ 연산자는 논리 값과 함께 작동 this-

`char x=GetExitValue(); 
while(x == 'y' || x=='Y');`