Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2018, 09:13   #1
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
Вопрос Почему вывелся 5 а не 0?

Вот как у меня получилось:
Примечание: красным выделил то самое число которые вывелось не то.
-5 -4 -3 -2 -1 0 1 2 3 4 0

Я компилируется так:
Тут выделил синим то что скомпилировала программа:
-5 -4 -3 -2 -1 0 1 2 3 4 5

С какого перепуга у меня получилось другое? Давайте рассуждать! Сначала выполняется
Код:
set
        {
            if (ok(index))
            {
                a[index - lowerBound] = value;
            }
        }
Код:
set
        {
            if (ok(index))
            {
                a[index - lowerBound] = value;
            }
        }
сначала вызывается ok, ну ок:
Код:
 private bool ok(int index)
    {
        if (index >= lowerBound & index <= upperBound) return true;
        return false;
    }
при этом upperBound равен 4, а index равен 5, результат метода ok равен false, даллее смотрим дальше, false и 5 это будет false, не так ли? Поэтому ничто не возвращается, но потом когда читает значение и выполняется аксессор get то возвращаться по идею должен 0, а возвращается 5, почему?

Код программы:
Код:
using System;
class RangeArray {
    // Закрытые данные.
    int[] a; // ссылка на базовый массив
    int lowerBound; // наименьший индекс
    int upperBound; // наибольший индекс
                    // Автоматически реализуемое и доступное только для чтения свойство Length.
    public int Length
    {
        get; private set;
    }
    // Построить массив по заданному размеру.
    public RangeArray(int low, int high)
    {
        high++;
        if (high <= low)
        {
            Console.WriteLine("Неверные индексы");
            high = 1; // создать для надежности минимально допустимый массив
            low = 0;
        }
        a = new int[high - low];
        Length = high - low;
        lowerBound = low;
        upperBound = --high;
    }
    // Это индексатор для класса RangeArray.
    public int this[int index]
    {
        // Это аксессор get.
        get
        {
            if (ok(index))
            {
                return a[index - lowerBound];
            }
            else
            {
                return 0;
            }
        }
        // Это аксессор set.
        set
        {
            if (ok(index))
            {
                a[index - lowerBound] = value;
            }
        }
    }
    // Возвратить логическое значение true, если
    // индекс находится в установленных границах.
    private bool ok(int index)
    {
        if (index >= lowerBound & index <= upperBound) return true;
        return false;
    }
}
// Продемонстрировать применение массива с произвольно
// задаваемыми пределами индексирования.
class RangeArrayDemo {
    static void Main()
    {
        RangeArray ra = new RangeArray(-5, 5);

        // Использовать объект ra в качестве массива.

        Console.WriteLine("Длина массива ra: " + ra.Length);

        for (int i = -5; i <= 5; i++)
            ra[i] = i;

        Console.Write("Содержимое массива ra: ");

        for (int i = -5; i <= 5; i++)
            Console.Write(ra[i] + " ");

        Console.ReadKey();
    }
}
Сразу благодарю за ответ!

Последний раз редактировалось Мaкс; 22.06.2018 в 09:18.
Мaкс вне форума Ответить с цитированием
Старый 22.06.2018, 09:52   #2
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вопрос номер 1. чему равен размер массива a ?
Ну... наверно равен столько же сколько и ra массиву, массив "a" это же ссылка на массив ra, не так ли? Поэтому длина будет ровна 11.


Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вопрос номер 2.
сколько тут элементов
11, везде 11.



Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а мусор вывелся, потому что Вы тут написали неверно
А смысл переделывания <= на < если только переделывали лимит меньше на 1?
Похоже Вы полностью не читали код, поэтому не знаете, что в методе есть такое действие:
Код:
upperBound = --high;
так что upperBound будет равен 4, а не 5, а если переделывает <= на < то -- в --high необходимо убрать.
Мaкс вне форума Ответить с цитированием
Старый 22.06.2018, 09:53   #3
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
А смысл переделывания <= на < если только переделывали лимит меньше на 1?
И теперь такую же ошибку выводит компилятор какую и я сделал в уме:
-5 -4 -3 -2 -1 0 1 2 3 4 0
Мaкс вне форума Ответить с цитированием
Старый 22.06.2018, 09:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы меня своими
Цитата:
Код:
       high++;
...
        upperBound = --high;
всё таки запутали.
зачем Вы это делаете?

далее.

Цитата:
Сообщение от Мaкс Посмотреть сообщение
при этом upperBound равен 4,
с чего это вдруг??

Цитата:
Код:
    // Построить массив по заданному размеру.
    public RangeArray(int low, int high)
    {
        high++;
        if (high <= low)
        {
            Console.WriteLine("Неверные индексы");
            high = 1; // создать для надежности минимально допустимый массив
            low = 0;
        }
        a = new int[high - low];
        Length = high - low;
        lowerBound = low;
        upperBound = --high;
        Console.WriteLine(" lowerBound = {0}", lowerBound);
        Console.WriteLine(" upperBound = {0}", upperBound);
    }
результат
Код:
 lowerBound = -5
 upperBound = 5
Длина массива ra: 11
Содержимое массива ra: -5 -4 -3 -2 -1 0 1 2 3 4 5
после увеличения на 1 верхней границы,
массив a становится длиной 11 элементов.


в чём вопрос?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2018, 09:55   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
И теперь такую же ошибку выводит компилятор какую и я сделал в уме:
ЗАБУДЬТЕ ВСЁ, что написал раньше!! я всё это удалил.

смотрите пост #4
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2018, 09:56   #6
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
в чём вопрос?
Вопрос решён, спасибо!
Мaкс вне форума Ответить с цитированием
Старый 22.06.2018, 09:56   #7
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Напомнили мне про ++
Мaкс вне форума Ответить с цитированием
Старый 22.06.2018, 09:57   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Похоже Вы полностью не читали код, поэтому не знаете, что в методе есть такое действие:
Код:
upperBound = --high;
похоже, что Вы тоже не читали код
выше есть
Цитата:
Сообщение от Мaкс Посмотреть сообщение
Код:
high++;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2018, 09:59   #9
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
похоже, что Вы тоже не читали код
[off]Жарко, ни черта не соображаю.[/off]

Последний раз редактировалось Мaкс; 22.06.2018 в 10:01. Причина: Попытка добавить тег off (не по теме)
Мaкс вне форума Ответить с цитированием
Старый 22.06.2018, 10:05   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию



кстати, не надо менять переменные. во-первых, это лишние строчки кода, во-вторых, шанс запутаться выше.

проще так:
Код:
    // Построить массив по заданному размеру.
    public RangeArray(int low, int high)
    {
        if (high < low)
        {
            Console.WriteLine("Неверные индексы");
            high = 1; // создать для надежности минимально допустимый массив
            low = 0;
        }
        a = new int[high + 1 - low];
        Length = a.Length;
        lowerBound = low;
        upperBound = high;
    }
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему-то таблица "неперспективные товары" пустая получается, не понимаю почему chet chou Microsoft Office Access 1 11.05.2017 19:19
Почему 0.01+0.06 не 0.07 SeRhy JavaScript, Ajax 2 30.05.2015 19:48
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
Почему? logok Общие вопросы C/C++ 2 12.04.2010 21:59