Выводить сумму, разность, произведение и частное двух натуральных дробей - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д