Задать вопрос
@parDgus

Как сделать ввод даных через консоль?

Помогите реализовать ввод данных через консоль, у самого ума не хватает, программа не моя, частично взял из книжки.
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();
    }
}
  • Вопрос задан
  • 2908 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
cjey
@cjey
Ввод четырех чисел через пробел
var s = Console.ReadLine();
            var arr = s.Split(' ');

            if (arr.Length == 4)
            {
                var a1 = Convert.ToDouble(arr[0]);
                var a2 = Convert.ToDouble(arr[1]);
                var a3 = Convert.ToDouble(arr[2]);
                var a4 = Convert.ToDouble(arr[3]);

                Console.Write("{0} {1} {2} {3}", a1, a2, a3, a4);

                Console.ReadKey();
            }
Ответ написан
Комментировать
Ti_Fix
@Ti_Fix
_
А разве вот этот кусок вашего закомментированного кода не берет данные из консоли:
/*Console.WriteLine("Введите значение с.(числ, знамен, целое, знак.");
c = Fraction.Parse(Console.ReadLine());
Console.WriteLine("с =" + c);*/
?
Если этого достаточно, то просто раскомментируйте (уберите символы /* */), если нет, то поясните что конкретно нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы