2015-03-18 4 views
2

Я работаю над программой, которая позволяет пользователю практиковать деление. Мой код ниже:ошибка сегментации C++ (ядро сбрасывается) с модулем

//div1 
#include <iostream> 
#include <stdlib.h> 
#include <time.h> 
#include <algorithm> 
using namespace std; 

#define CLS "\033[2J\033[1;1H" 
#define NEWLINE "\n" 

int main() { 
    srand(time(NULL)); 
    int a, div1, div2; 
    div1=rand()%11; 
    div2=rand()%11; 
    while (div2>div1) { 
     swap(div1,div2); 
     continue; 
    } 
    if (div1%div2!=0) { 
     return main(); 
    } else { 
     cout << CLS; 
     cout << NEWLINE; 
     do { 
      cout << div1 << "/" << div2 << " = ?" << endl; 
      cin >> a; 
      cout << CLS; 
      cout << NEWLINE; 
      cout << "\t\tWrong!!" << endl; 
      cout << NEWLINE; 
     } while (a!=div1/div2); 
     cout << CLS; 
     cout << NEWLINE; 
     cout << "\t\tCorrect!!" << endl; 
     cout << NEWLINE; 
     cout << "Hit enter to continue." << endl; 
     cin.ignore(); 
     cin.get(); 
     return main(); 
    } 
    return 0; 
} 

В принципе, то, что предполагается сделать, это сначала выбрать два случайных числа. Затем предполагается проверить, превышает ли второе число (div2) первое (div1), и если они есть, он переключит их. Затем он будет использовать модуль (div1% div2), чтобы убедиться, что два числа могут быть разделены друг на друга без остатка. Если они не могут быть разделены без остатка, он перезапустит программу (return main();). Однако всякий раз, когда я запускаю его, я получаю ошибку сегментации : ядро ​​сбрасывает либо при запуске, либо после запуска нескольких раз. Есть какие нибудь идеи как это починить?

Спасибо!

+1

'return main();' пожалуйста, не делайте этого. – WhozCraig

+0

Что следует использовать тогда? system()? – pdf4664

+0

return main() - это в основном рекурсивный вызов main, и это заставит вас застрять в бесконечном цикле, который в конечном итоге переполнит стек. Следовательно, ошибка сегментации. Ваша программа должна либо закончен, либо циклически работать, но обычно (не через рекурсивный вызов, так как это переполнит ваш стек) в зависимости от того, что вы пытаетесь сделать. –

ответ

2

Вот пример того, что я сказал в комментариях. Очевидно, вы можете реорганизовать это так, чтобы он работал более изящно (на данный момент он иногда дает вам исключения с плавающей запятой), но он дает вам представление о том, как это сделать, не вызывая главное.

ПРИМЕЧАНИЕ: Вам не нужно делать константу для NEWLINE. В std уже есть встроенная константа. Фактически, вы уже используете эту константу (endl). Так что вы можете просто сделать cout < < endl вместо cout < < NEWLINE.

//div1 
#include <iostream> 
#include <stdlib.h> 
#include <time.h> 
#include <algorithm> 
using namespace std; 

#define CLS "\033[2J\033[1;1H" 
#define NEWLINE "\n" 

int main() { 
    while(true) { 
     srand(time(NULL)); 
     int a, div1, div2; 
     div1=rand()%11; 
     div2=rand()%11; 
     while (div2>div1) { 
      swap(div1,div2); 
      continue; 
     } 
     if (div1%div2!=0) { 
     } else { 
      cout << CLS; 
      cout << NEWLINE; 
      do { 
       cout << div1 << "/" << div2 << " = ?" << endl; 
       cin >> a; 
       cout << CLS; 
       cout << NEWLINE; 
       cout << "\t\tWrong!!" << endl; 
       cout << NEWLINE; 
      } while (a!=div1/div2); 
      cout << CLS; 
      cout << NEWLINE; 
      cout << "\t\tCorrect!!" << endl; 
      cout << NEWLINE; 
      cout << "Hit enter to continue." << endl; 
      cin.ignore(); 
      cin.get(); 
     } 
    } 
    return 0; 
} 
+0

Я сделал что-то немного другое, но у него такая же общая идея, и это, казалось, сработало. Спасибо! – pdf4664

0

Этот код может зависеть от ошибки «разделите на 0». Вот почему вы будете получать ошибку.

Строка «if (div1% div2! = 0) {« кажется ошибочной. В этой строке, если div2 == 0, ваш код сработает.

+0

Это неверно. Деление на ноль действительно неопределено, но это не приведет к сбою. Вы можете легко проверить это. Напишите программу, делящуюся на 0. Компилятор будет предупреждать вас, когда вы ее скомпилируете, но при ее запуске она не сработает. Предупреждение будет выглядеть примерно так: 'test.cpp: 12: 10: предупреждение: деление на ноль не определено [-Wdivision-by-zero]' –

+0

@EdwardL. По моему пониманию, когда вы запускаете программу с делением на ноль, вы получите ошибку SIGFPE, и программа завершится. –

+0

Я полагаю, что это может быть компилятор/система. Я тестировал это под clang-600.0.57, и он не сбой при компиляции с этой версией, я попытаюсь проверить, что сделает компилятор GNU. –