Выводить сумму, разность, произведение и частное двух натуральных дробей - C (СИ)
Формулировка задачи:
Доброго вечера.
Цель:
Выводить сумму, разность, произведение и частное двух натуральных дробей.
Проблема:
Все вроде бы работает, но! Если у второй дроби числитель больше знаменателя - не работает)). Опытным путем установил, что проблема возникает при вычитании. Если "отключить" это действие - фурычит.
Код:
P.S. На самом деле работает - громко сказано. Считает деление не правильно, если в знаменателе единица, не выводит целое число, да и сам код, как мне кажется мог быть короче. То есть, понимаю, что не идеал)))
P.P.S. Буду признателен, если вместе с указанием на ошибку будет не только "правильный" фрагмент кода, но и объяснение, на сколько не жалко времени )))
P.P.P.S. Над английским не смеяться! В процессе изучения, использую везде где и как могу.))))
Спасибо.
#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);
}Решение задачи: «Выводить сумму, разность, произведение и частное двух натуральных дробей»
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;
}
Объяснение кода листинга программы
- Объявление переменных a, b, c, d, x, y, gcd в функции main.
- Ввод чисел с клавиатуры и сохранение их в переменные a, b, c, d с помощью функции scanf.
- Вычисление суммы дробей a/b + c/d и вывод результата на экран с помощью функции printf.
- Нахождение НОД(наибольшего общего делителя) для чисел x и y с помощью функции grecomdiv.
- Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
- Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
- Вычисление разности дробей a/b - c/d и вывод результата на экран с помощью функции printf.
- Нахождение НОД для чисел x и y с помощью функции grecomdiv.
- Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
- Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
- Вычисление произведения дробей a/b * c/d и вывод результата на экран с помощью функции printf.
- Нахождение НОД для чисел x и y с помощью функции grecomdiv.
- Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
- Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
- Вычисление частного дробей a/b / c/d и вывод результата на экран с помощью функции printf.
- Нахождение НОД для чисел x и y с помощью функции grecomdiv.
- Деление обоих чисел x и y на НОД с помощью оператора /= для получения целых чисел.
- Проверка на то, что числитель больше знаменателя и вывод на экран целой и дробной частей числа с помощью функции printf.
- Вычисление частного дробей a/b / c и вывод результата на экран с помощью функции printf.
- Вычисление частного дробей a/b / d и вывод результата на экран с помощью функции printf.