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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2018, 12:20   #1
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
Вопрос Где я ошибся?

Просьба проверить мой ход и код программы, и сказать где я ошибся?

Примечание: эти фрагменты кодов содержатся только в цикле for, он почти в самом конце.

1)В цикле for когда компилируется эта строка:
Код:
fs[i] = i * 10;
то результат выполнения строки или по другому значение с значением переменной i = 0 будет равно 0.

2)Когда компилируется эта строка:
Код:
if (fs.Error)
то будет результат будет определён по такому_принципу*:

true > 0
false <= 0

*Это для наглядности, программа просчитывает по немного другому методу.

Возможно кто то спросит: "Почему где - то я ошибся?", я рассчитывал и у меня результат программы не совпал с моим результатом (в уме).

Полный код программы:
Код:
using System;
class FailSoftArray {
    int[] a; // ссылка на базовый массив
             // Построить массив по заданному размеру.
    public FailSoftArray(int size)
    {
        a = new int[size];
        Length = size;
    }
    // Автоматически реализуемое и доступное только для чтения свойство Length.
    public int Length
    {
        get; private set;
    }
    // Автоматически реализуемое и доступное только для чтения свойство Error.
    public bool Error
    {
        get; private set;
    }
    // Это индексатор для массива FailSoftArray.
    public int this[int index]
    {
        // Это аксессор get.
        get
    {
        if (ok(index))
            {
                Error = false;
                return a[index];
            }
            else
            {
                Error = true;
                return 0;
            }
        }
        // Это аксессор set.
        set
        {
            if (ok(index))
            {
                a[index] = value;
                Error = false;
            }
            else Error = true;
        }
    }
    // Возвратить логическое значение true, если
    // индекс находится в установленных границах.
    private bool ok(int index)
    {
        if (index >= 0 & index < Length) return true;
        return false;
    }
}
// Продемонстрировать применение усовершенствованного
// отказоустойчивого массива.
class FinalFSDemo {
    static void Main()
    {
        FailSoftArray fs = new FailSoftArray(5);
        // Использовать свойство Error.
        for (int i = 0; i < fs.Length + 1; i++)
        {
            fs[i] = i * 10;
            Console.WriteLine(fs[i]);
            if (fs.Error)
                Console.WriteLine("Ошибка в индексе " + i);
        }
        Console.ReadKey();
    }
}
Мaкс вне форума Ответить с цитированием
Старый 20.06.2018, 12:44   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
то будет результат будет определён по такому_принципу
Нет. У була нет 3 состоянии. true|false и они будут проверяться.

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Возможно кто то спросит: "Почему где - то я ошибся?", я рассчитывал и у меня результат программы не совпал с моим результатом (в уме).
И какой же результат вы ожидали в уме? https://ideone.com/WancYp
p51x на форуме Ответить с цитированием
Старый 20.06.2018, 13:22   #3
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
Вопрос

Цитата:
Сообщение от p51x Посмотреть сообщение
Нет. У була нет 3 состоянии. true|false и они будут проверяться.
Это же я знаю? Не так выразился. Но почему у меня получился другой результат? У меня такой:
0
Ошибка в индексе 0
10
20
30
40
0
Ошибка в индексе 5

А компилировался так:

0
10
20
30
40
0
Ошибка в индексе 5

Это правильно, согласен, почему я ошибся? Вот так я рассуждал:
(Если что тут i было равно 0, и я заменил i на число)

Код:
fs[0] = 0 * 10; //Тут fs[0] = 0, а результат выполнения индексатора равен 0 и Error = true.
            Console.WriteLine(fs[0]); //Тут выводится значение массива fs с индексом 0
            if (fs.Error) //Так как fs.Error равен true, то выполняется ниже действие.
                Console.WriteLine("Ошибка в индексе " + 0); //Выводится "Ошибка в индексе 0"
Почему компилируется по другому?
Мaкс вне форума Ответить с цитированием
Старый 20.06.2018, 13:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
и Error = true
С какого перепугу?

Код:
0 >= 0 & 0 < 5 -> true -> return true
P.S. И лучше пораньше узнайте разницу между & и &&
p51x на форуме Ответить с цитированием
Старый 20.06.2018, 13:28   #5
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
0 >= 0 & 0 < 5 -> true -> return true
Ну так я и написал, похоже я Вас не понял.


Цитата:
Сообщение от p51x Посмотреть сообщение
P.S. И лучше пораньше узнайте разницу между & и &&
???
Мaкс вне форума Ответить с цитированием
Старый 20.06.2018, 13:32   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Ну так я и написал, похоже я Вас не понял.
ok вернул true, а значит:
Код:
a[index] = value;
Error = false;
откуда у вас Error = true взялось и все дальнейшие рассуждения?

Цитата:
???
Это два разных оператора и поведение у них чуть разное. Почитайте.
https://docs.microsoft.com/en-us/dot...s/and-operator
https://docs.microsoft.com/en-us/dot...l-and-operator
p51x на форуме Ответить с цитированием
Старый 20.06.2018, 13:35   #7
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Код:
if (ok(index)) //true и 0 это неправда, поэтому будет false, значит
            {
                a[index] = value; //До этого не дотрагиваемся!
                Error = false; //и до этого тоже!
            }
            else Error = true; //Вот то что нам надо! Error = true, не так ли?
Мaкс вне форума Ответить с цитированием
Старый 20.06.2018, 13:38   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
true и 0 это неправда, поэтому будет false, значит
Что за бред? Не значит и будет true. Вот ваш же код проверил:
Код:
0 >= 0 & 0 < 5 -> true & true = true -> return true
p51x на форуме Ответить с цитированием
Старый 20.06.2018, 13:38   #9
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

а единственное отличие укороченного оператора от обычного, то что если до оператора true то дальше не выполняется, пример:
Код:
bool a = false;
bool b = true;

a && b
a равно false значит дальше не дотрагиваемся до b.
Мaкс вне форума Ответить с цитированием
Старый 20.06.2018, 13:40   #10
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что за бред? Не значит и будет true.
Я про вот это:

Код:
if (ok(index))
ok = true, index = 0, true и 0 это не правда.
Мaкс вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где я ошибся в правильном ли я направление) Sopm Помощь студентам 5 31.12.2017 13:21
Подскажите где я ошибся destra1j Помощь студентам 1 25.05.2016 07:31
(PascalABC.NET)подскажите где я ошибся destra1j Помощь студентам 6 06.05.2016 15:58
Транслировал код с C++, где ошибся? Crystallon Общие вопросы Delphi 4 10.05.2012 02:31
Объясните пожалуйста, где и как ошибся Manchester Паскаль, Turbo Pascal, PascalABC.NET 10 09.02.2009 20:51