Mauzzz0

Fractions

Nov 20th, 2019
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.35 KB | None | 0 0
  1. using System;
  2.  
  3.  
  4. namespace FractionExample
  5. {
  6.     class Fraction //Создаем класс дроби
  7.     {
  8.         //public int numerator { get; set; }
  9.         //public int denominator { get; set; }
  10.  
  11.         public int numerator, denominator; //объявляем целочисленные переменные - числитель и знаменатель
  12.  
  13.         public Fraction(int x, int y) //Конструктор - присваиваем значения числителю и знаменателю
  14.         {
  15.             numerator = x;
  16.             denominator = y;
  17.         }
  18.         public Fraction() //Еще один конструктор - без входных аргументов, присваиваем значение 0 чисоителю и знаменателю
  19.         {
  20.             numerator = 0;
  21.             denominator = 0;
  22.         }
  23.         private static Fraction Reverse(Fraction a) //Функция переворота дроби (используется позже)
  24.         {
  25.             return new Fraction(a.denominator, a.numerator);
  26.         }
  27.  
  28.         private static int LCM(int a, int b) //Функция нахождения наименьшего общего кратного (используется позже)
  29.         {
  30.             int lcm = 1;
  31.             int max = (a > b) ? a : b;
  32.             for (int i = max; ; i += max)
  33.             {
  34.                 if (i % a == 0 && i % b == 0)
  35.                 {
  36.                     lcm = i;
  37.                     break;
  38.                 }
  39.             }
  40.             return lcm;
  41.         }
  42.  
  43.         private static int GCD(int a, int b) //Функция нахождения наибольшего общего делителя (используется позже)
  44.         {
  45.             a = Math.Abs(a);
  46.             b = Math.Abs(b);
  47.             while (a != 0 && b != 0)
  48.             {
  49.                 if (a > b)
  50.                     a %= b;
  51.                 else
  52.                     b %= a;
  53.             }
  54.             return a == 0 ? b : a;
  55.         }
  56.  
  57.         private static Fraction Check(Fraction a) //Функция проверки дроби (используется позже)
  58.         {
  59.             if (a.numerator < 0 & a.denominator < 0) //Если и числ. и знам. меньше 0, то делаем их положительными
  60.             {
  61.                 a.numerator = Math.Abs(a.numerator);
  62.                 a.denominator = Math.Abs(a.denominator);
  63.             }
  64.             if (a.denominator < 0) //Если знам. меньше 0, то делаем его положительным, а числ. отрицательным (будем считать, что дробь отрицательная, если отрицателен числитель)
  65.             {
  66.                 a.denominator = -a.denominator;
  67.                 a.numerator = -a.numerator;
  68.             }
  69.             if (a.denominator == 0) //Если знаменатель равен 0, то создаем исключение
  70.                 throw new Exception("Нельзя делить на 0");
  71.             int gcd = GCD(a.numerator, a.denominator); //находим наибольший общий делитель у числ. и знам, и если он не 1 - делим на него
  72.             if (gcd != 1)
  73.             {
  74.                 a.numerator /= gcd;
  75.                 a.denominator /= gcd;
  76.             }
  77.             return a;
  78.         }
  79.  
  80.         public Fraction FractionAssign() //Функция присваивания значения дроби (ввести можно либо просто число - тогда оно станет числителем, а знаменатель станет равен 1, либо можно ввести конструкцию, например, 22/7 - тут все очевидно)
  81.         {
  82.             string a = Console.ReadLine(); //считываем строку
  83.             if (!a.Contains("/")) //Если в ней нет знака '/'
  84.             {
  85.                 while(true) //Бесконечный цикл с попыткой преобразовать введенное в число и присвоить его числителю
  86.                 {
  87.                     try
  88.                     {
  89.                         numerator = Convert.ToInt32(a);
  90.                         break;
  91.                     }
  92.                     catch (FormatException)
  93.                     {
  94.                         Console.WriteLine("Что-то пошло не так, попробуйте ввести еще раз");
  95.                         a = Console.ReadLine();
  96.                     }
  97.                 }
  98.                 denominator = 1; //Делаем знаменатель равным 1
  99.             }
  100.             else //Иначе
  101.             {
  102.                 string[] numden = a.Split(new char[] { '/' }); //Создаем массив строк (то, что идет до знака '/', и после)
  103.                 while(true) //Бесконечный цикл с попыткой перевода полученных строк в числитель и знаменатель
  104.                 {
  105.                     try
  106.                     {
  107.                         numerator = Convert.ToInt32(numden[0]);
  108.                         denominator = Convert.ToInt32(numden[1]);
  109.                         break;
  110.                     }
  111.                     catch (FormatException)
  112.                     {
  113.                         Console.WriteLine("Что-то пошло не так, попробуйте ввести еще раз");
  114.                         a = Console.ReadLine();
  115.                         numden = a.Split(new char[] { '/' });
  116.                     }
  117.                 }
  118.                
  119.             }
  120.             return Check(new Fraction(numerator, denominator)); //После всего этого возвращаем объект Fraction, прошедший через функцию Check()
  121.  
  122.         }
  123.  
  124.         public static string Output(Fraction a) //Красивый вывод дроби
  125.         {
  126.             if (a.numerator == 0)
  127.                 return "0";
  128.             if (a.denominator == 1)
  129.                 return a.numerator.ToString();
  130.             else
  131.                 return a.numerator + "/" + a.denominator;
  132.         }
  133.  
  134.         //Дальше идут перегруженные операторы. Грубо говоря, это когда есть например объекты fraction1 и fraction2,
  135.         //и можно просто написать fraction1 + fraction2 и получить новую дробь, в которой будет результат сложения.
  136.         //В функции Main есть пара примеров
  137.         //Не буду объяснять работу всех перегруженных операторов, покажу только пример работы оперетора + , который складывает дробь и число (идет вторым сверху)
  138.  
  139.         public static Fraction operator +(Fraction a, Fraction b) //Перегруженный оператор +, который складывает дробь и дробь
  140.         {
  141.             Fraction Res = new Fraction();
  142.             int m = LCM(a.denominator, b.denominator);  
  143.             Res.numerator = a.numerator * (m / a.denominator) + b.numerator * (m / b.denominator);
  144.             Res.denominator = m;
  145.             return Check(Res);
  146.         }
  147.         public static Fraction operator +(Fraction a, int b) //Перегруженный оператор +, который складывает дробь и число
  148.         {
  149.             Fraction Res = new Fraction();  //Создаем новую дробь, в которой будет результат
  150.             Res.numerator = a.numerator + a.denominator * b;  //В ее числитель записываем сумму числителя дроби и произведения числа и знаменателя дроби
  151.             Res.denominator = a.denominator; //Знаменатель дроби-результата равен знаменателю исходной дроби
  152.             return Check(Res); //Возвращаем дробь-результат, пропущенную через функцию Check();
  153.         }
  154.         public static Fraction operator -(Fraction a, Fraction b) //Перегруженный оператор -, который вычитает из дроби дробь
  155.         {
  156.             Fraction Res = new Fraction();
  157.             int m = LCM(a.denominator, b.denominator);
  158.             Res.numerator = a.numerator * (m / a.denominator) - b.numerator * (m / b.denominator);
  159.             Res.denominator = m;
  160.             return Check(Res);
  161.         }
  162.         public static Fraction operator -(Fraction a, int b) //Перегруженный оператор -, который вычитает из дроби число
  163.         {
  164.             Fraction Res = new Fraction();
  165.             Res.numerator = a.numerator - a.denominator * b;
  166.             Res.denominator = a.denominator;
  167.             return Check(Res);
  168.         }
  169.         public static Fraction operator *(Fraction a, Fraction b) //Перегруженный оператор *, который умножает дробь на дробь
  170.         {
  171.             Fraction Res = new Fraction();
  172.             Res.numerator = a.numerator * b.numerator;
  173.             Res.denominator = a.denominator * b.denominator;
  174.             return Check(Res);
  175.         }
  176.         public static Fraction operator *(Fraction a, int b) //Перегруженный оператор *, который умножает дробь на число
  177.         {
  178.             Fraction Res = new Fraction();
  179.             Res.numerator = a.numerator * b;
  180.             Res.denominator = a.denominator;
  181.             return Check(Res);
  182.         }
  183.         public static Fraction operator /(Fraction a, int b) //Перегруженный оператор /, который делит дробь на число
  184.         {
  185.             Fraction Res = new Fraction();
  186.             Res.denominator = a.denominator * b;
  187.             Res.numerator = a.numerator;
  188.             return Check(Res);
  189.         }
  190.         public static Fraction operator /(int a, Fraction b) //Перегруженный оператор /, который делит число на дробь
  191.         {
  192.             return Check(Reverse(b) * a);
  193.         }
  194.         public static Fraction operator /(Fraction a, Fraction b) //Перегруженный оператор /, который делит дробь на дробь
  195.         {
  196.             return Check(a * Reverse(b));
  197.         }
  198.  
  199.     }
  200.     class Program
  201.     {
  202.         static void Main()
  203.         {
  204.             Fraction fraction = new Fraction(2, 5); //Создаем дробь fraction = 2/5
  205.             Fraction fraction1 = new Fraction(1, 6); //Создаем дробь fraction1 = 1/6
  206.             int a = 5;
  207.  
  208.             Console.WriteLine("Результат деления 1/6 на 2/5 = " + Fraction.Output(fraction1/ fraction));
  209.             Console.WriteLine("Результат умножения 2/5 на 5 = " + Fraction.Output(fraction * a));
  210.             Console.WriteLine("Результат сложения 2/5 и 1/6 = " + Fraction.Output(fraction + fraction1));
  211.             Console.ReadKey();
  212.         }
  213.     }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment