Untitled
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); //возращаем результат } } }