Grampy Cat Ответов: 1

Опишите класс экономического двоичного счетчика


Это может звучать как сама задача: он может увеличивать или уменьшать свое значение на единицу в заданном диапазоне. Предоставляется значение инициализации. При отсутствии за границей делаются исключения.
А теперь я хотел бы спросить вас, все ли соответствует этому условию или я что-то упускаю?

Что я уже пробовал:

using System;
namespace laba7
{
    public class Program
    {
        public static void Main()
        {
            int x, y, z;
            Console.WriteLine("Начало решения");
            Console.WriteLine("Введите значение");
            x = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите минимум");
            y = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите максимум");
            z = int.Parse(Console.ReadLine());
            Counter counter = new Counter(x, y, z);
            counter--;
            Console.WriteLine("Ответ: {0}", counter.Value);
            
            Console.WriteLine("Конец решения");
            Console.ReadLine();

        }

        class Counter
        {
            int val;

            public int Value
            {
                get { return val; }
                set { val = value; InRange(); }
            }

            private int min { get; set; }

            private int max { get; set; }

            public Counter(int _val, int _min, int _max)
            {
                min = _min;
                max = _max;
                Value = _val;
            }

            public Counter(int _min, int _max)
            {
                min = _min;
                max = _max;
                Value = new Random().Next(min, max + 1);
            }

            public static Counter operator ++(Counter c)
            {
                c.Value++;
                return c;
            }

            public static Counter operator --(Counter c)
            {
                c.Value--;
                return c;
            }

            void InRange()
            {
                try
                {
                    if (val > max || val < min)
                        throw new ArgumentOutOfRangeException("Значение не в заявленном диапазоне.");
                }
                catch (ArgumentOutOfRangeException e)
                {
                    Console.WriteLine($"Ошибка: {e}");
                }
            }

        }

    }
}

Richard MacCutchan

Работает ли он в соответствии с требованиями?

Grampy Cat

Ну, вроде бы да, но, например, он добавляет или вычитает единицу только в зависимости от этой строки в начале, но должно ли это быть так?

Counter counter = new Counter(x, y, z);
counter--;

1 Ответов

Рейтинг:
1

Richard Deeming

Цитата:
try
{
    if (val > max || val < min)
        throw new ArgumentOutOfRangeException("Значение не в заявленном диапазоне.");
}
catch (ArgumentOutOfRangeException e)
{
    Console.WriteLine($"Ошибка: {e}");
}
В этом нет никакого смысла. Выбрасывание исключения только для того, чтобы вы могли поймать его на следующей строке и написать сообщение на консоль, тратит много ресурсов. Просто использовать:
if (val > max || val < min)
    Console.WriteLine("Ошибка: Значение не в заявленном диапазоне.");

Но у вас все равно будет проблема, что ваш объект находится в недопустимом состоянии, и вызывающий не может этого знать. Было бы лучше проверить это значение перед изменением состояния вашего объекта:
public int Value
{
    get { return val; }
    set 
    { 
        if (value > max || value < min)
            throw new ArgumentOutOfRangeException("Значение не в заявленном диапазоне.");
        
        val = value;
    }
}


Maciej Los

5ed!

Grampy Cat

Ок, спасибо. Работает ли программа вообще как двоичный счетчик? или как десятичный счетчик?
В этом плане я все сделал правильно?

Richard Deeming

Я не совсем понимаю, что вы подразумеваете под "двоичным" или "десятичным" счетчиком. Число есть число; у него нет основания, пока вы не покажете его человеку.

А компьютер будет (обычно) храните числа в двоичном формате, используя стандартное представление, часто определяемое IEEE. Но это не влияет на то, как вы их используете.