Grampy Cat Ответов: 3

Опишите класс, реализующий двоичный счетчик


Задача:Опишите класс, реализующий двоичный счетчик, который может увеличивать или уменьшать свое значение на единицу в этом диапазоне. Обеспечьте инициализацию счетчика значениями по умолчанию и произвольными значениями. Превышение диапазона создает исключения.

Но я всегда получаю ошибку, что "этот аргумент находится вне диапазона допустимых значений." Пожалуйста, помогите мне исправить)

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

<pre>class Counter
    {
        int val;
        public int Value { get { return val; } set { val = value; InRange(); } }
        int min { get; }
        int max { get; }
 
        public Counter(int _val, int _min, int _max)
        {
            Value = _val;
            min = _min;
            max = _max;
        }
        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()
        {
            if (val > max || val < min) ;
            throw new ArgumentOutOfRangeException("Значение не в заявленном диапазоне.");
            
        }
 
        class Class1
        {
            static void Main()
            {
                Counter counter = new Counter(5, 0, 10); 
                Counter counterRand = new Counter(7, 29);
                counter++;
                counterRand--;
 
            }
        }
    }
}

3 Ответов

Рейтинг:
2

OriginalGriff

Измените свой конструктор: установите максимальный и минимальный уровни, прежде чем устанавливать свое значение.
В вашем текущем способе вы сначала устанавливаете значение, которое вызывает InRange, который проверяет его на соответствие Max и Min, которые вы еще не установили, - поэтому они по умолчанию равны нулю, и вы всегда будете проваливать тест, если только установленное вами значение также не равно нулю.


Grampy Cat

Вы очень хорошо это объясняете, но я все еще не до конца понимаю ... так что ... можете ли вы показать, что именно нужно изменить с помощью кусков кода?

OriginalGriff

Да ладно тебе!

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

Grampy Cat

Я просто не до конца понимаю свою ошибку и поэтому прошу вас о помощи. Я уже понял, что сначала у меня есть чек, а потом устанавливается значение, но ничего не происходит.

OriginalGriff

Буквально: прочитайте то, что я сказал, и подумайте о порядке, в котором все происходит; используйте отладчик, чтобы следить за вашим кодом, если вы не понимаете - он покажет вам, что именно происходит и когда.

Поместите точку останова в первую строку конструктора счетчика и запустите приложение в отладчике. Когда он достигнет точки останова, он остановится и позволит вам взять управление на себя. Шагайте через свой код строка за строкой и наблюдайте, что происходит с вашими переменными!

Да, я могу точно сказать тебе, что делать, и это будет намного быстрее для нас обоих, но ты ничего не узнаешь, поэтому в следующий раз повторишь ту же ошибку.

Попробуйте - это не сложно, и это важный навык для изучения.

Grampy Cat

На самом деле я из России и скажу, что сообщество этого форума гораздо добрее, чем российский форум. И что самое смешное, я только что узнал о точке останова ... За что вам огромное спасибо. Но теперь я перепробовал все, что могло прийти мне в голову, и не могли бы вы сказать мне, что нужно изменить.
Конечно, я еще постараюсь понять свою ошибку, но сейчас мне нужен результат ..

OriginalGriff

Если вы используете отладчик, он покажет вам.
Поместите точку останова в начало конструктора счетчика.
Когда вы нажмете точку останова, вы можете использовать мышь, чтобы навести курсор на переменные, и она покажет вам значения. И вы увидите, что _val, _min и _max имеют значения 5, 0 и 10 соответственно.

Теперь используйте "step into" из панели инструментов отладки или меню, чтобы войти в строку
Значение = _val;
Он установит "val" в значение 5, а затем вызовет InRange - шаг в это.
Сразу же он проверяет "val" против "max" и "min" - так что наведите курсор мыши на все три и посмотрите, каковы значения.
Что это такое? Что же будет дальше? (И почему тест заканчивается точкой с запятой?)
Почему они являются теми ценностями, которыми они являются?

Подумайте об этом минуту или две ...

Grampy Cat

Я понял, что с конструктором счетчика все в порядке, но почему там 0 во время проверки ..

OriginalGriff

Нет, не в порядке - в этом все дело.
Отладчик показывает вам, что "max" и "min" равны нулю, когда вы добираетесь до InRange, не так ли?
Почему ты так думаешь?

Grampy Cat

на самом деле, я понятия не имею, почему это происходит, но это так

Grampy Cat

Ну, логически говоря, InRange не видит значения 5 0 10, но почему?

OriginalGriff

Развитие не похоже на другие курсы: вы должны помнить некоторые вещи, да - но в основном это о том, как вы учитесь думать правильно (и в зависимости от того, где вы живете, даже учитесь думать в первый раз!)

Итак, используйте свои маленькие серые клетки: возьмите лист бумаги и создайте на нем три коробки. Обозначьте их "value", "min" и "max". Поставьте ноль в каждом из них.

Теперь вы будете компьютером: в частности, вы будете запускать код конструктора счетчика.
Итак, для начала добавьте три поля: "_val", "_min" и "_max" - дайте им значения, которые вы передаете конструктору: 5, 0 и 10 соответственно.
Выполнение первой инструкции:
Значение = _val;
Для этого вам нужно будет "ввести" код задатчика значений, но следуйте ему, меняя содержимое коробки по ходу дела.
Что, по-вашему, происходит?

Серьезно, попробуй.

phil.o

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

ОГ означает, что: с момента установки Value свойство внутренне вызывает InRange() метод, то вы должны установить минимальное и максимальное значения до установка самого значения; в противном случае и минимум, и максимум будут равны нулю, и ваш конструктор не будет принимать никакого другого значения, кроме нуля.

Кроме того, вы должны иметь представление о том, что такое отладка; это позволит вам лучше понять, что делает ваш код, исследуя его состояние шаг за шагом.
Учебник: научитесь отлаживать код C# с помощью Visual Studio

Рейтинг:
1

RickZeeland

Я проверил ответы Фила и Гриффа в этой скрипке .NET, она работает:
Онлайн-компилятор C# | .NET Fiddle[^]


Grampy Cat

Слушай, как этот код выглядит как блок-схема?

Рейтинг:
0

phil.o

Получить Class1 класс вне игры Counter класс.


Grampy Cat

Но правильно ли написан класс 1? Потому что как была ошибка, так она и осталась.

phil.o

Какая ошибка?
И я вижу очевидный недостаток: вы не проверяете, правильно ли упорядочены границы при создании.

Grampy Cat

"Исключение не обработано" - это нормально?

phil.o

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

Grampy Cat

О СРИ, а как это исправить?

Grampy Cat

О боже, я понимаю, Спасибо.
Черт возьми, ребята, спасибо Вам большое за помощь. Вы были добры ко мне, несмотря на то, что я все еще тот нуб в этой теме. А теперь по-русски)))
Спасибо вам ребят, теперь я стану русским хакером и буду сам решать кто станет будущим президентом США. Но на сам деле это шутка, все равно вам огромное спасибо)))