2012-02-12 3 views
0
//Testing numbers for primality 

#include <iostream> 
#include <cmath> 
using namespace std; 

int main() { 

int n;   //User input number 
int i;   //Input number will be divided by i 
int count;  

count = 0; 

cout << endl; 

while(n != 'q') { 

    cout << "#: "; 
    cin >> n;  

    for(i = 1; i <= n; i++) { 
        //increase the divisor until it's equal to n     
     if(n % i == 0) { 
      count++; 
     }  
     //If there is no remainder, count increases by 1. Since prime numbers are only divisible by 1 and themselves, count will be exactly 2 in the case of a prime number. 

    } 

    if(count == 2) { 
     cout << " 1\n";  //1 = yes prime 

    }else if(count != 2) {  
     cout << " 0\n";  //0 = not prime 

    } 

    count = 0; 

} 

if(n == 'q') { 
    return(0); 
} 
} 

여기서는 숫자를 테스트하여 소수인지 확인합니다. Count는 n/i의 나머지가 0 일 때마다 증가하므로 count = 2 인 경우 출력은 1, 그렇지 않은 경우 0입니다. 세션 중에 정확하게 원하는만큼의 숫자를 테스트하는 프로그램을 얻었지만 이스케이프 시퀀스를 만들려고합니다.대화 형 프로그램 끝내기 무한 루프가 발생합니다

종료 (n == 'q')를 사용하여 시도했지만 q를 입력하면 프로그램이 무한 루프됩니다. 나는 휴식을 취하려고했다. while 루프 내에서이 조건에 대한 설명이 있지만 결과는 같습니다. 이 문제는 char-int/int-char 변환과 관련이 있다고 생각합니다. 누군가 나에게 어떻게 작동 종료 시퀀스를 만들 수 있는지 알려 줄 수 있습니까?

+1

종료 조건을 0이나 -1과 같이 프로그램에 적합하지 않은 특수한 숫자로 만들면 어떨까요? – perelman

+0

가능한 [입력을받은 후 무한 루프가 C++에서 int인지 확인하기위한 루프] (http://stackoverflow.com/questions/8618473/infinite-loop-after-receiving-input-and-testing-to- –

답변

3

을 읽을 수있는 코드가 없습니다.q입니다. 입력 논리는 숫자 만 허용합니다. 그 숫자가 q 문자와 같은지 테스트합니다. 문자 q에 해당하는 정수는 113입니다. 시도하면 종료됩니다.

실제로 숫자 또는을 입력하고 싶으므로 어느 쪽이든 받아 들일 수있는 입력 논리를 작성해야합니다. 그런 다음 어떤 입력을 받았는지 확인한 다음 적절히 처리해야합니다.

+0

답변은 스트림 상태, 어떻게 거기에 도착했는지, 올바르게 처리하는 방법을 언급해야합니다. 그리고 나서 'while (std :: cin >> n) {' –

+0

우후 오래 된 포스트 범프! Mooing Duck이 언급했듯이, 당신은 정수를 읽으려고'cin >> inttype'을 사용할 수 있습니다. 실패하면 버퍼에 정수가 아닌 무언가가 있음을 의미합니다. 먼저 스트림을 재설정하고 이후 스트림에서 문자열을 읽으려고합니다. 이것은 성공할 것이고, 문자열을''q '',''quit''등등과 비교할 수있을 것이다. – Wug

1

'q'는 문자입니다. n은 정수입니다.

n == 'q'이 'q'를 암시 적으로 int 유형으로 변환 할 것인지 확인합니다. 그러면 숫자 113 (ASCII는 'q')을 입력하면 프로그램이 종료됩니다.

종료 조건으로 일반 입력 (예 : 음수 또는 0)의 범위 밖의 숫자를 사용하려고합니다.

사이드 참고 : while 루프에서 그것을 확인하기 전에n를 초기화하지 않았다. n은 임의의 쓰레기로 시작될 수 있으므로 루프를 실행하지 않고 프로그램이 자발적으로 종료하는 일정 비율의 시간이 소요됩니다. -Wall -Wextra (gcc을 사용하는 경우)을 사용하여 코드를 컴파일하여 컴파일러에서 이와 같은 분명한 내용을 경고하도록해야합니다.

+0

힌트 : 스트림이있는 무한 루프는 스트림의 상태가 나쁜 것을 의미합니다. –

+0

@MooingDuck 무엇? 그는'cin'을'int' 타입의'n'으로 읽습니다. 거기에 "무한 루프"가있는 이유는 그가 (정확히 그가 무엇을 체크하고 있는지 오해했기 때문에) 그가 치지 않은 종료 조건을 가진'while' 루프를 가지고 있다는 것입니다. 코드를 다시 살펴보십시오. – Borealid

+2

유효한 정수가 아닌 항목을 입력하면 그의 코드는 _previous_ (또는 정의되지 않은) 값 n에 대해 무기한 반복됩니다. 'std :: cin'은 badbit가 설정되어 더 이상 입력을 수행하지 않기 때문입니다. –

관련 문제