Помогите реализовать ввод данных через консоль, у самого ума не хватает, программа не моя, частично взял из книжки.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Fraction
{
int sign; // знак дроби (+ или -)
int intPart; // целая часть дроби
int numerator; // числитель дроби
int denominator; // знаменатель дроби
// метод преобразования дроби в смешанный вид
void GetMixedView()
{
GetIntPart(); // выделение целой части числа
Cancellation(); // сокращение дроби
}
// метод сокращения дроби
void Cancellation()
{
if (numerator != 0)
{
int m = denominator,
n = numerator,
ost = m % n;
// вычисление НОД(числителя, знаменателя)
// алгоритмом Евклида
while (ost != 0)
{
m = n;
n = ost;
ost = m % n;
}
int nod = n;
if (nod != 1)
{
numerator /= nod;
denominator /= nod;
}
}
}
// метод выделения целой части дроби
void GetIntPart()
{
if (numerator >= denominator)
{
intPart += (numerator / denominator);
numerator %= denominator;
}
}
// конструктор без параметров
public Fraction()
{
intPart = 0;
numerator = 0;
denominator = 1;
sign = 1;
}
// конструктор c параметрами
public Fraction(int n, int d, int i = 0, int s = 1)
{
intPart = i;
numerator = n;
denominator = d;
sign = s;
GetMixedView();
}
// деструктор
~Fraction()
{
Console.WriteLine("Дробь " + this + " уничтожена.");
}
// метод сложения двух дробей
static public Fraction operator +(Fraction ob1, Fraction ob2)
{
Fraction res = new Fraction();
res.numerator = ob1.sign * (ob1.intPart * ob1.denominator +
ob1.numerator) * ob2.denominator + ob2.sign * (ob2.intPart *
ob2.denominator + ob2.numerator) * ob1.denominator;
res.denominator = ob1.denominator * ob2.denominator;
if (res.numerator < 0)
{
res.numerator *= -1;
res.sign = -1;
}
res.GetMixedView();
return res;
}
// метод сложения дроби с целым числом
static public Fraction operator +(Fraction ob1, int a)
{
// если к дроби прибавляется число, равное 0,
// результат совпадает с операндом-дробью
if (a == 0)
return new Fraction(ob1.numerator, ob1.denominator,
ob1.intPart, ob1.sign);
// создание новой дроби ob2 = a
Fraction ob2 = new Fraction(0, 1, Math.Abs(a), a / Math.Abs(a));
Fraction res = ob1 + ob2; //сложение двух дробей
return res;
}
// метод сложения целого числа и дроби
static public Fraction operator +(int a, Fraction ob1)
{
// если к дроби прибавляется число, равное 0,
// результат совпадает с операндом-дробью
if (a == 0)
return new Fraction(ob1.numerator, ob1.denominator,
ob1.intPart, ob1.sign);
// создание новой дроби ob2 = a
Fraction ob2 = new Fraction(0, 1, Math.Abs(a), a / Math.Abs(a));
Fraction res = ob1 + ob2; //сложение двух дробей
return res;
}
// метод изменение знака дроби на противоположный
// static public Fraction operator - //тут должна быть перегрузка -, но я ее убрал, чтобы код был по меньше
// метод умножения двух дробей
public static Fraction Parse(string str)
{
int intPart, numerator, denominator, sign;
// разделение строки на подстроки
// с помощью разделителя-пробела
string [] strs=str.Split(' ');
string[] strs1;
Fraction res;
if (strs.Length == 1)
{
// в строке не было найдено пробелов
// производим разделение строки по символу ‘/’
strs1 = str.Split('/');
if (strs1.Length == 1)
{
// число задано в виде только целой части
// выделяем целую часть
intPart = int.Parse(strs1[0]);
// в зависимости от значения целой части,
// формируем новую дробь
if (intPart!=0)
res = new Fraction(0, 1, Math.Abs(intPart),
intPart / Math.Abs(intPart));
else
res = new Fraction(0, 1, Math.Abs(intPart), 1);
return res;
}
else
{
// число задано в виде только дробной части
// выделяем отдельно числитель и знаменатель
numerator = int.Parse(strs1[0]);
denominator = int.Parse(strs1[1]);
sign = 1;
// определяем знак числа по знаку числителя
if (numerator < 0)
{
numerator = -numerator;
sign = -1;
}
// формируем новую дробь и приводим ее
// к несократимому виду
res = new Fraction(numerator, denominator, 0, sign);
res.GetMixedView();
return res;
}
}
// дробь задана в смешанном виде
// отделяем дробную часть по разделителю ‘/’
strs1 = strs[1].Split('/');
intPart = int.Parse(strs[0]);
// определяем знак числа по знаку целой части
if (intPart < 0)
{
intPart = -intPart;
sign = -1;
}
else
sign = 1;
numerator = int.Parse(strs1[0]);
denominator = int.Parse(strs1[1]);
// формируем новую дробь и приводим ее
// к несократимому виду
res = new Fraction(numerator, denominator, intPart, sign);
res.GetMixedView();
return res;
}
// метод получения строкового представления дроби – оператор
// преобразования в символьную строку
public static implicit operator string(Fraction ob)
{
string res = "";
// знак числа выводится, только если число отрицательно
if (ob.sign < 0)
res = res + "-";
// если целая часть не равна 0, выводим ее
if (ob.intPart != 0)
res = res + ob.intPart;
// дробная часть печатается, если числитель не равен 0
if (ob.numerator != 0)
res = res + " " + ob.numerator + "/" + ob.denominator;
// если и целая часть и дробная часть равны 0,
// то число равно 0
if (ob.intPart == 0 && ob.numerator == 0)
res = "0";
return res;
}
}
class Program
{
static void Main(string[] args)
{
Fraction r1 = new Fraction(2, 5, 0, 1);
Fraction r2 = new Fraction(3, 5, 0, 1);
Fraction c;
int m = -4;
c = r1 + m;
/*Console.WriteLine("Введите значение с.(числ, знамен, целое, знак.");
c = Fraction.Parse(Console.ReadLine());
Console.WriteLine("с =" + c);*/
Console.WriteLine("r1 = " + r1);
Console.WriteLine("r1 = "+ m);
Console.WriteLine("r1 + r2 = " + c);
Console.ReadLine();
}
}