2012-02-12 61 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); 
} 
} 

在這裏,我正在測試數字,看看它們是否是素數。每次除數n/i的餘數爲0時計數都會增加,因此當count = 2時,輸出爲1表示否,否則爲0。我已經得到程序在會話期間測試儘可能多的數字,但我試圖創建一個轉義序列。結束互動程序導致無限循環

我嘗試使用條件(n =='q')退出,但是當我輸入q時,程序無限循環。我試着休息一下;語句在while循環內但是結果是相同的。我猜這個問題與char-int/int-char轉換有關。有人可以向我暗示我如何創建工作退出序列?

+1

爲什麼不讓你的退出條件成爲一個特殊的數字,對你的程序來說沒有意義,比如0或-1? – perelman 2012-02-12 06:30:21

+0

可能重複[無限循環後接收輸入和測試,看看它是否是一個int在C + +](http://stackoverflow.com/questions/8618473/infinite-loop-after-receiving-input-and-testing-to-請參閱if-it-int-in-c) – 2012-02-12 06:55:11

回答

3

您有沒有代碼可以閱讀 a q。您的輸入邏輯只接受一個數字。然後測試該數字是否等於q字符。字母q的等效整數是113.如果嘗試這樣,它將退出。

由於您確實想輸入一個數字一個字母,您需要編寫可接受的輸入邏輯。然後你需要檢查你得到的輸入,然後相應地處理它。

+0

回答應該提及流狀態,它如何到達那裏,以及如何正確處理它。然後'while(std :: cin >> n){' – 2012-02-12 06:38:26

+0

嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚!正如Mooing Duck所說的那樣,你可以使用'cin >> inttype'來嘗試讀取一個整數。如果失敗,那意味着緩衝區中有一些不是整數。您需要先重置流,然後嘗試從中讀取一個字符串。這將會成功,你可以將字符串與''q「',''quit」'或其他任何東西進行比較。 – Wug 2012-09-12 22:10:10

1

'q'是一個字符。 n是一個整數。

檢查n == 'q'是否會將'q'隱式轉換爲int類型 - 因此,如果您輸入113(ASCII代表'q'),程序將退出。

您可能希望將常規輸入(例如負值或零)的範圍外的數字用作終止條件。

旁註:你沒有while循環檢查前初始化nn有可能以任意隨機垃圾開始,所以有一定比例的程序會自動退出而不運行循環。你應該編譯你的代碼-Wall -Wextra(如果使用gcc)讓編譯器警告你這樣的明顯的東西。

+0

提示:無限循環表示流處於不良狀態。 – 2012-02-12 06:37:02

+0

@MooingDuck什麼?他只從'cin'讀入''n'類型'int'。有一個「無限循環」的原因只是他有一個'while'循環,其終止條件他沒有打(因爲他誤解了他正在檢查的內容)。再看看代碼。 – Borealid 2012-02-12 06:40:04

+2

輸入任何不是有效整數的數據後,他的代碼將無限期地重複n的_previous_(或undefined)值,因爲'std :: cin'將設置其badbit位並且不會執行其他輸入。 – 2012-02-12 06:45:16