2010-11-21 7 views
23

Я создаю программу для проектов 3-го проекта Эйлера, и хотя это может быть неважно, в результате я постоянно пытаюсь сделать этот код числом и проверить, является ли оно простым или нет. Теперь, прежде чем я попытаюсь устранить эту функцию, он дает мне ошибку «исключение с плавающей запятой» сразу после ввода номера. Вот код:Исключение с плавающей запятой C++ Почему и что это такое?

int main() 
{ 
    int input; 
    cout << "Enter number: " << endl; 
    cin>> input; 
    int i = input/2; 
    int c; 
    for (i>0; i--;) { 
     c= input%i; 
     if (c==0 || i == 1) 
      cout << "not prime" << endl; 
     else 
      cout << "prime" << endl; 
    } 
    return 0; 
} 

так по сути почему это дает мне исключение с плавающей запятой и что это значит?

+6

Что-то не так с вашей петлей. – Lazer

+0

исключение с плавающей точкой имеет много причин, но в зависимости от вашего кода, я согласен с Пит, и я думаю, что c = input% i; является причиной проблемы, и я надеюсь, что мой ответ поможет вам. – TopDeveloper

ответ

24

«floating point number» - это то, как компьютеры обычно представляют числа, которые не являются целыми числами, - в основном число с десятичной точкой. В C++ вы объявляете их с float вместо int. Исключением с плавающей запятой является ошибка, возникающая, когда вы пытаетесь сделать что-то невозможное с числом с плавающей запятой, например, делить на ноль.

+0

Хорошо, позвольте мне убедиться, что я понимаю свой собственный код, прежде чем попытаюсь его исправить. Для lop будет выполняться только если i> 0 правильно? Тогда единственный раз, когда он разделится позже, будет c = input% i. Поэтому он никогда не должен делиться на 0? – samuraiseoul

+0

Если вы внимательно посмотрите на свой цикл, вы увидите, что его тело может запускаться один раз с i == 0. – Crashworks

+0

if i == 1? Таким образом, приращение/уменьшение цикла цикла происходит в конце цикла, даже если вы пишете его вверху? – samuraiseoul

9

Множество причин исключения с плавающей запятой. Глядя на ваш код, ваш цикл for кажется немного «неправильным». Похоже на возможное деление на ноль.

for (i>0; i--;){ 
c= input%i; 

Это деление на ноль в какой-то момент, так как вы уменьшаете i.

+0

поэтому цикл for автоматически уменьшает i в первый раз? – samuraiseoul

+0

Я думаю, вам нужно немного использовать точки останова и попытаться продумать решение немного больше. Вы не хотите, чтобы мы просто дали вам ответ, который будет работать, не так ли? – Pete

28
for (i>0; i--;) 

, вероятно, неправильно и должно быть

for (; i>0; i--) 

вместо этого. Обратите внимание, где я помещал точки с запятой. Условие идет в середине, а не в начале.

+0

Да, но это не является причиной исключения с плавающей запятой – Anonymous

+1

@ Анонимно Косвенно, это так. Замена точек с запятой разрешала 'i' быть' 0' (что условие 'i> 0' не было бы оговорено). – Ontonator

0

Проблема в цикл в фрагменте кода:
для (я> 0; i--;)

Здесь, ваше намерение, кажется входом в цикл, если (я> 0) и уменьшают значение i на один после завершения цикла for.

Работает ли это так? Посмотрим.

Посмотрите на синтаксис цикла для():

**for (initialization; condition check; increment/decrement) { 
    statements; 
}** 

инициализации получает выполняется только один раз в начале цикла. Обратите особое внимание на ";" в вашем фрагменте кода и сопоставить его с синтаксисом for loop.

Инициализация: i> 0: выполняется только один раз. Не влияет на ваш код.

Проверка состояния: i -: post декремент.

   Here, i is used for condition check and then it is decremented. 
       Decremented value will be used in statements within for loop. 
       This condition check is working as increment/decrement too in your code. 

Позволяет остановиться здесь и увидеть исключение с плавающей точкой.

что это? Один простой пример - разделение на 0. То же самое происходит с вашим кодом.

Когда я достигаю 1 в состоянии проверки, проверка состояния подтверждается, чтобы быть правдой.
Из-за пост-декремента я буду 0, когда он входит в цикл.

Modulo operation at line #9 results in divide by zero operation. 

С этим фоном вы сможете исправить проблему в цикле.