Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
11 kB
6
Indexable
Never
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Drobi
{
    class Program
    {
        static void Main(string[] args)
        {
            int q, w, e, r, k, l;
            string t;
            Console.Write("Введите целую часть числа а= ");
            k = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите числитель а= ");
            q = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите знаменатель а= ");
            w = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите целую часть числа b= ");
            l = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите числитель b= ");
            e = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите знаменатель b= ");
            r = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите одно из действий с дробями + - / *  ");
            t = Console.ReadLine();
            if (t == "/")
            {
                //Основная программа 
                Дробь a = new Дробь(q, w, k); //создание объекта класса Drob 
                Дробь b = new Дробь(e, r, l);  //создание объекта класса Drob 

                Дробь c;

                c = a / b;
                Console.WriteLine(a.ToString());
                Console.WriteLine(b.ToString());
                Console.WriteLine("Проверка: " + a.ToString() + t + b.ToString() + "=" + c.ToString());
                Console.ReadKey();
            }
            if (t == "+")
            {
                //Основная программа 
                Дробь a = new Дробь(q, w, k); //создание объекта класса Drob 
                Дробь b = new Дробь(e, r, l);  //создание объекта класса Drob 

                Дробь c;

                c = a + b;
                Console.WriteLine(a.ToString());
                Console.WriteLine(b.ToString());
                Console.WriteLine("Проверка: " + a.ToString() + t + b.ToString() + "=" + c.ToString());
                Console.ReadKey();
            }
            if (t == "*")
            {
                //Основная программа 
                Дробь a = new Дробь(q, w, k); //создание объекта класса Drob 
                Дробь b = new Дробь(e, r, l);  //создание объекта класса Drob 

                Дробь c;

                c = a * b;
                Console.WriteLine(a.ToString());
                Console.WriteLine(b.ToString());
                Console.WriteLine("Проверка: " + a.ToString() + t + b.ToString() + "=" + c.ToString());
                Console.ReadKey();
            }
            if (t == "-")
            {
                //Основная программа 
                Дробь a = new Дробь(q, w, k); //создание объекта класса Drob 
                Дробь b = new Дробь(e, r, l);  //создание объекта класса Drob 

                Дробь c;

                c = a - b;
                Console.WriteLine(a.ToString());
                Console.WriteLine(b.ToString());
                Console.WriteLine("Проверка: " + a.ToString() + t + b.ToString() + "=" + c.ToString());
                Console.ReadKey();
            }
        }
    }
    class Дробь//Описание класса Drob 
    {
        public double числитель = 0;
        public double знаменатель = 0;
        public double целая = 0;
        public Дробь(int c, int z, int k)
        {
            this.числитель = c;
            this.знаменатель = z;
            this.целая = k;
        }

        public override string ToString()//cтроковое представление 
        {
            return целая.ToString() + "(" + числитель.ToString() + "/" + знаменатель.ToString() + ")"; 
        }

        public static Дробь operator +(Дробь a, Дробь b)                                 //сложение дробей 
        {
            Дробь t = new Дробь(1, 1, 1);                                                   //создание и инициализация новой дроби 

            t.числитель = Math.Abs((a.числитель * b.знаменатель + a.знаменатель * b.числитель)%(a.знаменатель * b.знаменатель)); //числитель новой дроби 
            t.знаменатель =Math.Abs(a.знаменатель * b.знаменатель);                               //знаменатель новой дроби 
            t.целая = a.целая + b.целая + Math.Ceiling((a.числитель * b.знаменатель + a.знаменатель * b.числитель) / (a.знаменатель * b.знаменатель));
            Дробь.SetFormat(t);                                                          //сокращаем дробь 
            return (t);
            //возвращаем результат 
        }

        public static Дробь operator -(Дробь a, Дробь b)                                 //вычитание дробей 
        {
            Дробь t = new Дробь(1, 1, 1);                                                   //создание и инициализация новой дроби 

            t.числитель = Math.Abs((a.числитель * b.знаменатель - a.знаменатель * b.числитель)% (a.знаменатель * b.знаменатель)); //числитель новой дроби 
            t.знаменатель = Math.Abs(a.знаменатель * b.знаменатель);                               //знаменатель новой дроби 
            t.целая = a.целая - b.целая+ Math.Ceiling((a.числитель * b.знаменатель - a.знаменатель * b.числитель) / (a.знаменатель * b.знаменатель));
            Дробь.SetFormat(t);                                                          //сокращаем дробь 
            return (t);                                                                   //возвращаем результат 
        }

        public static Дробь operator *(Дробь a, Дробь b)   //умножение дробей 
        {
            Дробь t = new Дробь(1, 1, 1);                     //создание и инициализация новой дроби 

            t.числитель = Math.Abs(((a.целая*a.знаменатель+a.числитель)* (b.целая * b.знаменатель + b.числитель))% (a.знаменатель * b.знаменатель));   //числитель новой дроби 
            t.знаменатель = Math.Abs(a.знаменатель * b.знаменатель); //знаменатель новой дроби 
            t.целая = Math.Ceiling((((a.целая * a.знаменатель + a.числитель) * (b.целая * b.знаменатель + b.числитель)) / (a.знаменатель * b.знаменатель)));
            Дробь.SetFormat(t);                            //сокращаем дробь 
            return (t);                                     //возвращаем результат 
        }

        public static Дробь operator /(Дробь a, Дробь b)   //деление дробей 
        {
            Дробь t = new Дробь(1, 1, 1);                     //создание и инициализация новой дроби 

            t.числитель = Math.Abs(((a.целая*a.знаменатель+a.числитель)*b.знаменатель)%((b.целая * b.знаменатель + b.числитель) * a.знаменатель));   //числитель новой дроби 
            t.знаменатель = Math.Abs((b.целая * b.знаменатель + b.числитель) * a.знаменатель); //знаменатель новой дроби 
            double целоеЧасть = ((a.целая * a.знаменатель + a.числитель) * b.знаменатель) % ((b.целая * b.знаменатель + b.числитель) * a.знаменатель);
            t.целая = Math.Ceiling((((a.целая * a.знаменатель + a.числитель) * b.знаменатель) - целоеЧасть)/ ((b.целая * b.знаменатель + b.числитель) * a.знаменатель));
            return (t);                                     //возвращаем результат 
        }

        //процедура по сокращению дроби 
        public static Дробь SetFormat(Дробь a)
        {
            double max = 0;

            //выбираем что больше числитель или знаменатель 
            if (a.числитель > a.знаменатель)
            {
                max = Math.Abs(a.знаменатель);//ВНИМАНИЕ! берем по модулю, что работало и с отрицательными 
            }
            else
            {
                max = Math.Abs(a.числитель);//ВНИМАНИЕ! берем по модулю, что работало и с отрицательными 
            }
            //поиск от максимума до 2 
            for (double i = max; i >= 2; i--)
            {
                //такого числа, поделив на которое бы делилось без 
                //остатка и на числитель и на знаменатель 
                if ((a.числитель % i == 0) & (a.знаменатель % i == 0))
                {
                    a.числитель = a.числитель / i;
                    a.знаменатель = a.знаменатель / i;
                }
            }
            //Определяемся со знаком 
            //если в знаменателе минус, поднимаем его наверх 
            if ((a.знаменатель < 0))
            {
                a.числитель = -1 * (a.числитель);
                a.знаменатель = Math.Abs(a.знаменатель);
            }
            return (a); //возращаем результат 
        }
    }
}