3 семинар


Запись урока:

Часть 1

[vk]http://vk.com/video_ext.php?oid=-66674957&id=167886014&hash=485c6ef5d7844e6f&hd=3[/vk]

Часть 2

[vk]http://vk.com/video_ext.php?oid=-66674957&id=167886016&hash=d5a74cd8c3f76bb9&hd=3[/vk]

Темы занятия:

  1. Сущность и основные принципы ООП (см. стр. 42 Шилдта или Википедия об ООП):
  1. Использование очередей – класс Queue. (см. Справочник C#)
  2. Классы: уровни доступности (см. Справочник C#), статические и нестатические методы (см. Справочник C#), интерфейсы (стр. 375 Шилдта)
  3. Делегирование (см. стр. 473 Шилдта) и лямбда-выражения (см. стр. 488 Шилдта).

Домашнее задание:

  1. Прочитать о следующих методах LINQ:
    • Take(), TakeWhile(), Skip(), SkipWhile();
  • First(), FirstOrDefault(), Min(), Max();
  • OrderBy(), OrderByDescending(), ElementAt();
  • ToList(), ToArray(), ToSet();
  • При желании – GroupBy().2. Написать тесты к классу SmmIndicator по аналогии с SmaIndicator. Тесты оформить в виде MSTest, если стоит полная версия Visual Studio или в виде самодельной функции)
  1. Разработать расширяющий метод (Extension method) для IEnumerable, выполняющий подсчёт выражения: КубическийКорень(Сумма(Аi * i)) Пример использования метода в коде: var mas = new [] {5,6,7,8,9}; double res = mas.MyMagicMethod(); // res == кубкорень(50 + 61 + 72 + 83 + 9*4);

Полезные материалы:

  1. Методы расширения.

Решение домашней задачи:

1. Тест для SmmIndicator:

static class MySmmIndicatorTest
    {
        public static void AddTestLength2()
        {
            var ind = new SmmIndicator(2);

            ind.Add(3);
            ind.Add(4);

            if (!ind.IsReady)
                throw new Exception();
            if (5m != ind.Value)
                throw new Exception();

            ind.Add(10);

            if (!ind.IsReady)
                throw new Exception();
            if (Math.Abs(116m - ind.Value * ind.Value) > 0.000001m)
                throw new Exception();
        }

        public static void AddTestLength3()
        {
            var ind = new SmmIndicator(3);

            ind.Add(3);
            ind.Add(4);
            ind.Add(5);

            if (!ind.IsReady)
                throw new Exception();
            if (Math.Abs(50m - ind.Value * ind.Value) > 0.000001m)
                throw new Exception();

            ind.Add(8);

            if (!ind.IsReady)
                throw new Exception();
            if (Math.Abs(105m - ind.Value * ind.Value) > 0.000001m)
                throw new Exception();
        }
    }

2. Расширяющий метод:

public static double MyMagicMethod(this IEnumerable<int> items)
        {
            //double sum = 0;
            //int index = 0;
            //foreach (var item in items)
            //{
            //    sum += item*index;
            //    index++;
            //}
            //return Math.Pow(sum, 1.0/3);

           
            // LINQ ~ SQL
            return Math.Pow(items.Select((a,i) => a*i).Sum(), 1.0 / 3);
        }

Вложения: Исходные коды


Теги:


Спасибо:


UsilaDobry

Фотография
Дата: 05.04.2013
Ответить


В ДЗ после 3-го семинара надо было изучить ряд методов класса IEnumerable, среди которых метод ToSet(). Его в библиотеке MSDN нет.

Спасибо:

IvanB

Фотография
Дата: 06.04.2013
Ответить


UsilaDobry: В ДЗ после 3-го семинара надо было изучить ряд методов класса IEnumerable, среди которых метод ToSet(). Его в библиотеке MSDN нет.

Несколько замечаний: Если быть точным, то IEnumerable не просто класс, а интерфейс (или чисто абстрактный класс). Нужно изучить не только интерфейс IEnumerable, а методы, которые перечислены в задании, а они реализованы не в IEnumerable (т.к. это интерфейс, в нем не может быть реализаций, а в данном случае и объявлений методов которые приведены в задании).

Ну в общем Вы правы, что метода ToSet() нет в стандартном .NET, в частности в версии 4.5. Это было специально добавлено в задание, чтобы ученики могли ориентироваться в .NET, получили некоторый опыт в этом.

Если все-таки необходимо преобразовать в коллекцию ISet<>, то можно воспользоваться готовыми расширениями LING, например MoreLINQ, или самому реализовать это расширение для IEnumerable<>.

Спасибо:

UsilaDobry

Фотография
Дата: 06.04.2013
Ответить


С чем может быть связано расхождение в значениях линий Болленжера в моем коде и в терминале Alfa-Direct? Мой код расчета:

        MeddleBB = sum / _buffer.Count;
        decimal variance = 0;
        foreach (int x in _buffer)
            variance += (decimal)Math.Pow((double)(x - MeddleBB), 2); 
        StdDev = (decimal) Math.Sqrt((double)(variance / (Length - 1)));
        TopBB = MeddleBB + (D * StdDev);
        LowerBB = MeddleBB - (D * StdDev);

В результате у меня получается на пятиминутках 01.04.2013 в 11:35 верхняя - 140814, средняя 140527, нижняя 140239. В терминале AD: верхняя - 140943; средняя - 140578; нижняя - 140212.

Спасибо:

IvanB

Фотография
Дата: 06.04.2013
Ответить


UsilaDobry: С чем может быть связано расхождение в значениях линий Болленжера в моем коде и в терминале Alfa-Direct? Два варианта, либо в Alfa-Direct этот индикатор реализован с каким-то нюансом, либо Вы ошиблись в алгоритме.

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy