Программа на C, которая добавляет два целых числа в виде дроби - PullRequest
0 голосов
/ 26 сентября 2011

Я пишу программу на C, которая добавляет два ненулевых целых числа, которые задаются в виде дробей. Целые числа вводятся как n1 d1 n2 d2. Кажется, есть ошибка при вводе определенных отрицательных чисел, например, в следующей комбинации (1 2 -1 2). Это должно указать, что добавляемые числа равны 1/2 и -1/2, а затем указать, что сумма равна 0. Вместо этого программа просто показывает пустую строку и не принимает никаких дополнительных данных. Вторая проблема, с которой я столкнулся, заключается в том, что когда вводится значение часового значения, программа должна отобразить сообщение о завершении, а затем завершиться, вместо этого она отображает «исключение с плавающей запятой».

 int
    main( void )
    {
int n1;
int d1;
int n2;
int d2;
int g;
int p;
int q;
int again;
int sumn;
int sumd;

again = 1;

while ( again == 1 ) {

  printf( "Please enter 4 nonzero integers representing the fractions: " );
  scanf( "%d%d%d%d", &n1, &d1, &n2, &d2 );

  if ( n1 == 0 && n2 == 0 && d1 == 0 && d2 == 0 ) {
    again = 0;
  }
  else {
    again = 1;
  }
  if ( ( n1 == 0 || n2 == 0 || d1 == 0 || d2 == 0 ) && ( n1 != 0 || n2 != 0 || d1 != 0 || d2 != 0 ) ) {
    printf( "One or more of the integers is zero\n" );
    again = 1;
  }
    else {

    g = gcd( d1, d2 );
    p = ( ( n1 * ( d2 / g ) ) + ( n2 * ( d1 / g ) ) );
    q = ( d1 * ( d2 / g ) );

    sumn = ( p / ( gcd( p, q ) ) );
    sumd = ( q / ( gcd( p, q ) ) );

    printf( "The fractions are: %d/%d and %d/%d\n", n1, d1, n2, d2 );

    if ( sumn == sumd ) {
      printf( "Their sum is: 1\n" );
    }
    else {
      if ( sumd == 1 ) {
        printf( "Their sum is: %d\n", sumn );
      }
      else {
        printf( "Their sum is: %d/%d\n", sumn, sumd );
      }
    }
  }
}
printf( "***** Program Terminated *****\n" );

return (EXIT_SUCCESS);
}

int gcd( int a, int b )
{
while ( a != b ) {
  if ( a > b ) {
    a = ( a - b );
  }
  else {
    b = ( b - a );
  }
}
return a;
}

Ответы [ 3 ]

7 голосов
/ 26 сентября 2011

У вас ошибка в функции gcd.Когда a отрицательно, это бесконечный цикл.Поэтому консоль зависает и больше не будет вводить.

int gcd( int a, int b )
{
    while ( a != b ) {
       cout << a << "  " << b << endl;
       if ( a > b ) {
          a = ( a - b );
       }
       else {
          b = ( b - a );
        }
    }
    return a;
}

Вывод: gcd(-1,2)

-1  2
-1  3
-1  4
-1  5
-1  6
-1  7
-1  8
-1  9
-1  10
-1  11
-1  12
-1  13
-1  14
...

ps Да, я знаю, вопрос помечен C, но япросто распечатывать данные в C ++.

РЕДАКТИРОВАТЬ:

Исправление должно сделать a и b положительными:

int gcd( int a, int b )
{
    if (a < 0)
        a = -a;
    if (b < 0)
        b = -b;

    while ( a != b ){
       if ( a > b ){
           a = ( a - b );
       }
       else{
           b = ( b - a );
       }
    }
    return a;
}
1 голос
/ 26 сентября 2011

Когда вы вводите значение Sentinel (я предполагаю, что все равны нулю), он выполняет ваш первый if case внутри while, а затем продолжает выполнение 2-го else case, т.е.

g = gcd( d1, d2 );
p = ( ( n1 * ( d2 / g ) ) + ( n2 * ( d1 / g ) ) );
....

и продолжает вычислять gcd, который, как мне кажется, вызывает исключение с плавающей запятой

0 голосов
/ 26 сентября 2011

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

int gcd( int a, int b )
{
 if (a==0 || b==0)
       return 1;
 if (a < 0)
        a = -a;
 if (b < 0)
        b = -b;
while ( a != b ) {
  if ( a > b ) {
    a = ( a - b );
  }
  else {
    b = ( b - a );
  }
}
return a;
}

Теперь вы видите, что получаете правильные результаты для четной комбинации, например (1 2 -1 2) или даже (-1 -1 -2 -2).

И, чтобы решить проблему часового типа, отредактируйте цикл while следующим образом:

while ( again == 1 ) {

  printf( "Please enter 4 nonzero integers representing the fractions: " );
  scanf( "%d%d%d%d", &n1, &d1, &n2, &d2 );

  if ( n1 == 0 && n2 == 0 && d1 == 0 && d2 == 0 ) {
    again = 0;
  }
  else {    
  if ( ( n1 == 0 || n2 == 0 || d1 == 0 || d2 == 0 ) && ( n1 != 0 || n2 != 0 || d1 != 0 || d2 != 0 ) ) {
    printf( "One or more of the integers is zero\n" );
    again = 1;
  }
    else {

    g = gcd( d1, d2 );
    p = ( ( n1 * ( d2 / g ) ) + ( n2 * ( d1 / g ) ) );
    q = ( d1 * ( d2 / g ) );


    sumn = ( p / ( gcd( p, q ) ) );
    sumd = ( q / ( gcd( p, q ) ) );


    printf( "The fractions are: %d/%d and %d/%d\n", n1, d1, n2, d2 );

    if ( sumn == sumd ) {
      printf( "Their sum is: 1\n" );
    }
    else {
      if ( sumd == 1 ) {
        printf( "Their sum is: %d\n", sumn );
      }
      else {
        printf( "Their sum is: %d/%d\n", sumn, sumd );
      }
    }
  }
 }
}

-Sandip

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...