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); 
} 
} 

Здесь я тестирую номера, чтобы узнать, являются ли они основными. Счет увеличивается каждый раз, когда остаток деления n/i равен 0, поэтому, когда count = 2, выход равен 1 для да, в противном случае 0 для нет. Я получил программу, чтобы проверить столько чисел, сколько я хочу правильно во время сеанса, но я пытаюсь создать escape-последовательность.Завершение интерактивной программы вызывает бесконечный цикл

Я попытался использовать условие (n == 'q') для quit, но когда я ввожу q, программа циклически бесконечно. Я попытался сделать перерыв; оператор для этого условия в цикле while, но результат тот же. Я предполагаю, что эта проблема связана с преобразованием char-int/int-char. Может кто-нибудь намекнуть мне, как я могу создать рабочую последовательность выхода?

+1

Почему бы не сделать ваше условие выхода специальным номером, который не имеет смысла для вашей программы, например, 0 или -1? – perelman

+0

Возможный дубликат [Бесконечный цикл после приема ввода и тестирования, чтобы увидеть, является ли это int в C++] (http://stackoverflow.com/questions/8618473/infinite-loop-after-receiving-input-and-testing-to- see-if-its-an-int-in-c) –

ответ

3

У вас нет кода, который мог бы читать a q. В вашей логике ввода принимается только число. Затем вы проверяете, соответствует ли это число знаку q. Эквивалентное целое число с буквой q равно 113. Если вы попробуете это, оно прекратится.

Поскольку вы действительно хотите ввести число или письмо, вам нужно написать логику ввода, которая может принять либо. Затем вам нужно будет проверить, какой ввод вы получили, а затем обработать его соответствующим образом.

+0

Ответ должен указывать на состояние потока, как он туда попал и как правильно его обрабатывать. И тогда 'while (std :: cin >> n) {' –

+0

Woohoo old post bump! как упоминается Mooing Duck, вы можете использовать 'cin >> inttype', чтобы попытаться прочитать целое число. Если это не удается, это означает, что в буфере есть что-то не целое. Вам нужно будет сначала перезагрузить поток, а затем попытаться прочитать строку из него. Это будет успешным, и вы сможете сравнить строку с «q», «quit» и т. Д. – Wug

1

'q' - символ. n - целое число.

Проверка того, будет ли n == 'q' неявным образом преобразовать 'q' в тип int - так что ваша программа выйдет, если вы положите номер 113 (ASCII для 'q').

Возможно, вы хотите использовать число из пределов обычного ввода (например, отрицательное значение или ноль) в качестве условия завершения.

Side Примечание: вы не инициализацииn перед проверкой его в петле while. Можно начинать с n с любого случайного мусора, поэтому некоторый процент времени, в течение которого ваша программа будет автоматически выходить без выполнения цикла. Вы должны скомпилировать свой код с -Wall -Wextra (если используете gcc), чтобы компилятор предупредил вас об очевидных вещах, подобных этому.

+0

Подсказка: бесконечный цикл с потоком означает, что поток находится в плохом состоянии. –

+0

@MooingDuck Что? Он только читает из 'cin' в' n', который имеет тип 'int'. Причина, по которой существует «бесконечный цикл», заключается в том, что у него есть цикл «while», условие завершения которого он не ударил (потому что он неправильно понял, что именно он проверял). Посмотрите еще раз на код. – Borealid

+2

При вводе чего-либо, что не является действительным целым числом, его код будет повторяться для неопределенного значения _previous_ (или undefined) n, потому что 'std :: cin' будет иметь свой набор битбитов и не будет выполнять никаких дополнительных ввода. –

Смежные вопросы