Выводить сумму, разность, произведение и частное двух натуральных дробей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго вечера. Цель: Выводить сумму, разность, произведение и частное двух натуральных дробей. Проблема: Все вроде бы работает, но! Если у второй дроби числитель больше знаменателя - не работает)). Опытным путем установил, что проблема возникает при вычитании. Если "отключить" это действие - фурычит. Код:
#include <stdio.h>
 
int main()
{int ans;
while(ans!=2)
    {long int a,b,c,d,ch,zn,ch1,zn1,ch2,zn2,ch3,zn3,x,y,z,x1,y1,x2,y2,x3,y3,z1,z2,z3;
    puts("Please, enter two simple fractions: ");
    scanf("%ld/%ld%ld/%ld",&a,&b,&c,&d);
        if (a==0||b==0||c==0||d==0)
        {printf("Enter correct fraction!");
        }
        else
        ch=a*d+b*c;
        zn=b*d;
        x=ch;
        y=zn;
        while(x!=0 && y!=0)
            {if(x>=y)
            x=x%y;
            else y=y%x;
            }
            z=x+y;
            ch/=z;
            zn/=z;
        ch1=a*d-b*c;
        zn1=b*d;
        x1=ch1;
        y1=zn1;
        while(x1!=0 && y1!=0)
            {if(x1>=y1)
            x1=x1%y1;
            else y1=y1%x1;
            }
            z1=x1+y1;
            ch1/=z1;
            zn1/=z1;
        ch2=a*c;
        zn2=b*d;
        x2=ch2;
        y2=zn2;
        while(x2!=0 && y2!=0)
            {if(x2>=y2)
            x2=x2%y2;
            else y2=y2%x2;
            }
            z2=x2+y2;
            ch2/=z2;
            zn2/=z2;
        ch3=a*d;
        zn3=b*c;
        x3=ch3;
        y3=zn3;
        while(x3!=0 && y3!=0)
            {if(x3>=y3)
            x3=x3%y3;
            else y3=y3%x3;
            }
            z3=x3+y3;
            ch3/=z3;
            zn3/=z3;    
    printf("Sum of entered fractions is %d/%d\n"
    "Difference of entered fractions is %d/%d\n"
    "Product of entered fractions is %d/%d\n"
    "Result of devision of entered fractions is %d/%d\n"
    "Once more? \n"
    "Press 1 to continue or 2 to exit \n",ch,zn,ch1,zn1,ch2,zn2,ch3,zn3);
    scanf("%i", &ans);
    }
        
system("pause");
return(0);
}
P.S. На самом деле работает - громко сказано. Считает деление не правильно, если в знаменателе единица, не выводит целое число, да и сам код, как мне кажется мог быть короче. То есть, понимаю, что не идеал))) P.P.S. Буду признателен, если вместе с указанием на ошибку будет не только "правильный" фрагмент кода, но и объяснение, на сколько не жалко времени ))) P.P.P.S. Над английским не смеяться! В процессе изучения, использую везде где и как могу.)))) Спасибо.

Решение задачи: «Выводить сумму, разность, произведение и частное двух натуральных дробей»

textual
Листинг программы
#include <stdio.h>
 
int grecomdiv(int a, int b)//функция НОД
{
    int low, gcd = 1, i = 2;
    low = a < b ? a : b;
    while(i <= low){
        if(a % i == 0 && b % i == 0){
            gcd = gcd * i;
            a = a / i;
            b = b / i;
        }
        else
            i++;
    }
    return gcd;
}
int main()
{
    int a, b, c, d, x, y, gcd;
    puts("Input numbers:");
    scanf("%d%d%d%d", &a, &b, &c, &d);
    x = a * d + b * c;//сложение дробей
    y = b * d;
    printf("Addition result:\n%d/%d\n", x, y);
    gcd = grecomdiv(x, y);//находим НОД
    x /= gcd;
    y /= gcd;
    if(x > y)//если числитель больше знаменателя
        printf("%d %d/%d\n", x / y, x % y, y);//выводим целую и дробную части
    else
        printf("%d/%d\n", x, y);
    x = a * d - b * c;//вычитание- те же действия,только меняем + на -
    y = b * d;
    printf("Subtraction result:\n%d/%d\n", x, y);
    gcd = grecomdiv(x, y);
    x /= gcd;
    y /= gcd;
    if(x > y)
        printf("%d %d/%d\n", x / y, x % y, y);
    else
        printf("%d/%d\n", x, y);
    x = a * c;//умножение дробей
    y = b * d;
    printf("Multiplication result:\n%d/%d\n", x, y);
    gcd = grecomdiv(x, y);
    x /= gcd;
    y /= gcd;
    if(x > y)
        printf("%d %d/%d\n", x / y, x % y, y);
    else
        printf("%d/%d\n", x, y);
     x = a * d;//деление дробей
     y = c * b;
     printf("Divide result:\n%d/%d\n", x, y);
    gcd = grecomdiv(x, y);
    x /= gcd;
    y /= gcd;
    if(x > y)
        printf("%d %d/%d\n", x / y, x % y, y);
    else
        printf("%d/%d\n", x, y);
    return 0;
}

Объяснение кода листинга программы

  1. Объявление переменных a, b, c, d, x, y, gcd в функции main.
  2. Ввод чисел с клавиатуры и сохранение их в переменные a, b, c, d с помощью функции scanf.
  3. Вычисление суммы дробей a/b + c/d и вывод результата на экран с помощью функции printf.
  4. Нахождение НОД(наибольшего общего делителя) для чисел x и y с помощью функции grecomdiv.
  5. Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
  6. Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
  7. Вычисление разности дробей a/b - c/d и вывод результата на экран с помощью функции printf.
  8. Нахождение НОД для чисел x и y с помощью функции grecomdiv.
  9. Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
  10. Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
  11. Вычисление произведения дробей a/b * c/d и вывод результата на экран с помощью функции printf.
  12. Нахождение НОД для чисел x и y с помощью функции grecomdiv.
  13. Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
  14. Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
  15. Вычисление частного дробей a/b / c/d и вывод результата на экран с помощью функции printf.
  16. Нахождение НОД для чисел x и y с помощью функции grecomdiv.
  17. Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
  18. Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
  19. Вычисление частного дробей a/b / c и вывод результата на экран с помощью функции printf.
  20. Вычисление частного дробей a/b / d и вывод результата на экран с помощью функции printf.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5
Похожие ответы