ХЕЛП МИИИИ!!! СРОЧНО НАДО!!!
Даны две простые дроби. Найти их произведение. Сократить полученную дробь.
С ИСПОЛЬЗОВАНИЕМ СТРУКТУР
C#
Структуры в C#
Сначала проверим две предыдущие программы. Первая:
Вторая:
Так всегда бывает у таких вот с позволения сказать "программистов"! А вот у меня код работает, причём верно!
Уязвимости кода традиционные: нет защиты от некорректного ввода (это если вводить вместо дробей какую-нибудь ерунду, а не то что нужно !) и возможен выход за пределы возможностей представления целых чисел знаковым восьмибайтным типом long при больших получающихся произведениях числителей и знаменателей. Но это вполне допустимые уязвимости.
Сокращения дробей реализованы в функции произведения дробей multiplication при помощи метода Евклида после нахождения самого этого произведения, так как в задании не сказано, что нужно выводить результат в виде сократимой дроби, а значит и не нужно! Если результат после сокращения получается целым числом, то это целое число и выводится, а никакая не дробь!


using System;
class New_Project
{ public struct fraction
{ public long a, b; };
fraction enter(string s)
{ fraction u; Console.Write(s);
var line = Console.ReadLine().Split("/");
u.a = int.Parse(line[0]); u.b = int.Parse(line[1]);
return u; }
public long gcd(long u, long v)
{ long w; if (u < 0) u = -u; for (;;) { w = u % v;
if (w == 0) return v; else { u = v; v = w; } } }
fraction multiplication(fraction x, fraction y)
{ fraction u; u.a = x.a * y.a; u.b = x.b * y.b;
if (u.a == 0) u.b = 1; else { long v = gcd(u.a, u.b);
u.a /= v; u.b /= v; } return u; }
public void Main()
{ fraction x, y, z; while (true) { x = enter("x: ");
y = enter("y: "); if (x.a == 0 || y.b == 0)
Console.WriteLine(0); else { z = multiplication(x, y);
if (z.b == 1) Console.WriteLine(z.a); else
Console.WriteLine(z.a + "/" + z.b); } } } }
В двух строчках вводятся две дроби с любым целым числителем и натуральным знаменателем через знак дроби / в качестве разделителя, они могут быть положительными и отрицательными, сократимыми и несократимыми, но вводить нужно правильно, тогда и работать всё будет правильно!
Сокращения дробей реализованы в функции произведения дробей multiplication при помощи метода Евклида после нахождения самого этого произведения, так как в задании не сказано, что нужно выводить результат в виде сократимой дроби, а значит и не нужно! Если результат после сокращения получается целым числом, то это целое число и выводится, а никакая не дробь!
это не ок мне)
Дима Погорельчук
стоп, что?
using System;
struct Fraction
{
public int Numerator;
public int Denominator;
}
static void Main(string[] args)
{
Fraction frac1, frac2;
Console.WriteLine("Введите первую дробь:");
Console.Write("Числитель: ");
frac1.Numerator = int.Parse(Console.ReadLine());
Console.Write("Знаменатель: ");
frac1.Denominator = int.Parse(Console.ReadLine());
Console.WriteLine("\nВведите вторую дробь:");
Console.Write("Числитель: ");
frac2.Numerator = int.Parse(Console.ReadLine());
Console.Write("Знаменатель: ");
frac2.Denominator = int.Parse(Console.ReadLine());
Fraction result = MultiplyFractions(frac1, frac2);
Console.WriteLine("\nПроизведение дробей: {0}/{1}", result.Numerator, result.Denominator);
SimplifyFraction(ref result);
Console.WriteLine("Сокращенная дробь: {0}/{1}", result.Numerator, result.Denominator);
Console.ReadKey();
}
static Fraction MultiplyFractions(Fraction f1, Fraction f2)
{
Fraction result;
result.Numerator = f1.Numerator * f2.Numerator;
result.Denominator = f1.Denominator * f2.Denominator;
return result;
}
static void SimplifyFraction(ref Fraction fraction)
{
int greatestCommonFactor = GCD(fraction.Numerator, fraction.Denominator);
fraction.Numerator /= greatestCommonFactor;
fraction.Denominator /= greatestCommonFactor;
}
static int GCD(int a, int b)
{
while (a != 0 && b != 0)
{
if (a > b)
a %= b;
else
b %= a;
}
return a == 0 ? b : a;
}
struct Fraction
{
public int Numerator;
public int Denominator;
}
static void Main(string[] args)
{
Fraction frac1, frac2;
Console.WriteLine("Введите первую дробь:");
Console.Write("Числитель: ");
frac1.Numerator = int.Parse(Console.ReadLine());
Console.Write("Знаменатель: ");
frac1.Denominator = int.Parse(Console.ReadLine());
Console.WriteLine("\nВведите вторую дробь:");
Console.Write("Числитель: ");
frac2.Numerator = int.Parse(Console.ReadLine());
Console.Write("Знаменатель: ");
frac2.Denominator = int.Parse(Console.ReadLine());
Fraction result = MultiplyFractions(frac1, frac2);
Console.WriteLine("\nПроизведение дробей: {0}/{1}", result.Numerator, result.Denominator);
SimplifyFraction(ref result);
Console.WriteLine("Сокращенная дробь: {0}/{1}", result.Numerator, result.Denominator);
Console.ReadKey();
}
static Fraction MultiplyFractions(Fraction f1, Fraction f2)
{
Fraction result;
result.Numerator = f1.Numerator * f2.Numerator;
result.Denominator = f1.Denominator * f2.Denominator;
return result;
}
static void SimplifyFraction(ref Fraction fraction)
{
int greatestCommonFactor = GCD(fraction.Numerator, fraction.Denominator);
fraction.Numerator /= greatestCommonFactor;
fraction.Denominator /= greatestCommonFactor;
}
static int GCD(int a, int b)
{
while (a != 0 && b != 0)
{
if (a > b)
a %= b;
else
b %= a;
}
return a == 0 ? b : a;
}
public struct ValueS
{
public float value;
public ValueS(int _newValue)
{
value = _newValue;
}
private void Main()
{
ValueS value1 = new(15);
ValueS value2 = new(17);
float multiplayValue = value1 * value2;
}
public static float operator *(ValueS _value1, ValueS _value2)
{
return _value1.value * _value2.value;
}
}
{
public float value;
public ValueS(int _newValue)
{
value = _newValue;
}
private void Main()
{
ValueS value1 = new(15);
ValueS value2 = new(17);
float multiplayValue = value1 * value2;
}
public static float operator *(ValueS _value1, ValueS _value2)
{
return _value1.value * _value2.value;
}
}
Zloy Zwer
Зачем здесь тип float, где тут простые дроби и где их сокращение (если наибольший общий делитель числителя и знаменателя в произведении двух простых дробей не равен единице), чудо ты пернатое?

Похожие вопросы
- C# Массив структур.Конструктор .Доступ к отдельным элементам массива в массиве структур.
- Стоит ли дальше учить C#?
- Программирование на C Sharp (C#)
- Сегодня начал учить c#, решил сделать калькулятор простой и столкнулся с такой ошибкой при компиляции, хелпуйте.
- Что лучше C# или C++?
- Зачем разбивать код в C# на отдельные классы?
- Помогите пожалуйста. Написать на C#
- Python, C, C++, C#, Что выбрать-то?
- Помогите разобраться с заданием! C#
- Стоит ли изучать c# в 13 лет?
Но где попало может и не работать - это верно! Вот поэтому и не надо никогда пользоваться чем попало вместо нормальных систем программирования и сред развития!
Да, кстати, это уже второй безумный вброс в мой ответ - первый идиотский комментарий почему-то бесследно исчез...