Показаны сообщения с ярлыком toStudents. Показать все сообщения
Показаны сообщения с ярлыком toStudents. Показать все сообщения

четверг, 14 апреля 2016 г.

FORMATIVE: Обобщённые методы и перечисления C#

Вопрос студента сегодня пришёлся очень ко двору и в тему семинара (обобщения). Разбирались не долго, но мне вперёд наука: обращать внимание на дьявола в деталях.

У студента в курсовой работе 20 перечислений (Enum). Ему очень хотелось получать целочисленное значение, связанное с константой перечисления. Казалось бы какие сложности, явное приведение типа к int и всё. Но нет, проблема была не в этом. Имя константы получалось из строки, поэтому сначала надо было выбрать нужную константу, а затем уже получить её целочисленный код.

Естественно, проблема элементарно гуглится, и находится уйма ответов.

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

Поскольку я помнила про 20 перечислений, то выбрала обобщённый метод для получения константы перечисления по её имени. Пример с цветами консоли.

class Program {
        // получение константы перечисления по её названию
        public static T EnumParse(string str) {
            return (T)Enum.Parse(typeof(T), str, true);
        }
        static void Main(string[] args) {            
            ConsoleColor myColor;
            foreach (string s in str) {
                try { 
                    myColor = EnumParse(s);
                    Console.ForegroundColor = myColor;
                    Console.WriteLine(s);
                }
                catch (ArgumentException ex) {
                    continue; // переходим к следующему элементу
                }
                
            }
           // получение номера константы перечисления   
           // int x = (int)myColor;
           //  Console.Write(x);
        }
    }
}


понедельник, 16 ноября 2015 г.

суббота, 31 октября 2015 г.

LINKS: подборка ссылок по XML комментариям в коде C#


Практически в любом первом-втором занятие по программированию (языку программирования) говорят о комментировании. По случаю, собрала ссылки для студентов по XML-комментариям в C#-коде. Немного, но вполне представительно.

Сначала общее, об оформлении кода в принципе:
C# Coding Conventions (C# Programming Guide) (https://msdn.microsoft.com/en-us/library/ff926074.aspx)

Русскоязычные источники  [RU]
Статья с хабра: XML документация в C# (http://habrahabr.ru/post/41514/) и ссылки из комментариев к этой статьи (для особенно ленивых):

Англоязычные источники [EN]
XML Documentation Comments (C# Programming Guide) (https://msdn.microsoft.com/en-us/library/b2s063f7.aspx)

Soft
Sandcastle - Documentation Compiler for Managed Class Libraries (http://sandcastle.codeplex.com/)

пятница, 17 июля 2015 г.

EDUPRACTICE: Представление графов в памяти компьютера

Второй день на школе учителей был посвящён представлению графов в памяти компьютера. Я действовала из соображения, что мы хотим помочь преподавателям подготавливать школьников к участию в олимпиадном программировании. Поэтому в презентацию включала способы "улучшить", "подкрутить", "повысить эффективность". Благо базовая книга была удачной.
 Презентация дня прилагается:
 
Работа над ошибками (зафиксируем, чтобы не забыть к следующему году):

  1.  Одного дня на разбор основ (и как получилось не основ) C++ очень мало. Не смотря на то, что от занятий был явный прок, физически и слушателям и преподавателям очень сложно работать в режиме жёсткого ограничения времени и при этом наличии кучи материала. Достаточно много из того, что я считала важным, осталось за бортом. 
  2.  Работа с графами потребовала повторения знаний и навыков работы со структурой данных список (односвязный и двусвязный). Собственно, именно это занятие очень просилось между первым и вторым, но перерывчик был уж больно небольшой, и занятия у меня там не было. 

 Итак, была б моя воля, я бы поставила себе ещё одно занятие после основ C++. И, конечно, намного удобнее и эффективнее было бы не проводить лекцию, а затем семинары, а работать в формате мастерской (мастер-класса), в этом году компьютерные классы не были доступны с утра до вечера. Так что получилось, так как получилось. Надеюсь, что я смогла выжать максимум.

среда, 1 июля 2015 г.

EDUPRACTICE: С++ за 4 пары. Буду помнить

Вчерашний день я буду помнить :). Школа учителей подарила мне отличную возможность рассказать о языке программирования C++ в двух лекциях и двух семинарах. Без пролога и эпилога.

Учителя наших школ очень разные, пишут на разных языках, поэтому в итоге я поставила задачу сама себе: определить и рассказать чем С отличается от С++, отбросив С и, сконцентрировавшись только на С++. Думаю, что если бы у меня было дня 2-3, рассказ получился бы не такой сжатый.

Презентация прилагается:

среда, 27 мая 2015 г.

LINKS: Visual Studion 2013 и GitHub

Сегодня возникла необходимость загрузить работу студента на GitHub. Подобрались ссылочки по теме.
Как отправить из VS2013 файлы на GitHub

Use Visual Studio with Git
(https://msdn.microsoft.com/ru-ru/library/hh850437.aspx)

Git и Visual Studio: как правильно приготовить (http://habrahabr.ru/company/microsoft/blog/216037/)
Setting Up GitHub to work with Visual Studio 2013 Step-by-Step

Оформление README.md
Markdown Basics 
Markdown Cheatsheet 
Описание особенностей Markdown для на GitHub в статье GitHub Flavored Markdown (https://help.github.com/articles/github-flavored-markdown/)

вторник, 19 мая 2015 г.

LINKS: Оформление кода C#, нужно ли что-то выдумывать для авто-реализуемых свойств?

Написала авто-реализуемое свойство и задумалась, а не появились ли какие-нибудь супер-пупер требования по их именования. Полезла смотреть, судя по странице на MSDN
Auto-Implemented Properties (C# Programming Guide) [https://msdn.microsoft.com/ru-ru/library/bb384054.aspx]
свойства - они и в Африке свойства.

Нашлась занятная блог-статья Wouter de Kort про авто-реализуемые свойства:
Desugaring auto-implemented properties [http://wouterdekort.blogspot.ru/2013/10/desugaring-auto-implemented-properties.html]

Ещё по дороге попалась куча ссылок разных видов про оформление C# и не C#-кода.
Top 7 Coding standards & Guideline documents for C#/.NET developers by Anoop Madhusudanan [http://www.amazedsaint.com/2010/11/top-6-coding-standards-guideline.html]
C# coding conventions
[https://msdn.microsoft.com/en-us/library/ff926074.aspx]
C# coding standards and naming conventions
[http://www.dofactory.com/reference/csharp-coding-standards]

PDF
С# coding style guide, ver. 3.0 by Mike Kruger [http://www.icsharpcode.net/TechNotes/SharpDevelopCodingStyle03.pdf]
C# coding standards for .NET by Lanc Hunt
[http://se.inf.ethz.ch/old/teaching/ss2007/251-0290-00/project/CSharpCodingStandards.pdf]

Mono
Coding guidelines [http://www.mono-project.com/community/contributing/coding-guidelines/]

При работе со студентами такая вещь, как стандарт оформления кода - вещь полезная. А ссылки — нужная :)

среда, 8 апреля 2015 г.

TRAINING: Event handling, C#

В этом году по событиям удалось провести два семинара: в первом разобрались с событиями, дописывали код. Второй сделали полностью практическим с возможностью написать весь код самостоятельно.
Задача, которая вызвала больше всего трудностей:
В библиотеке классов описать:
1. Тип-делегат
public delegate void ChainLenChanged(double r);

2. Класс Bead - бусина
2.1. Поле r – вещественное число, радиус бусины
2.2. Конструктор с вещественным параметром – радиус бусины. Если радиус – меньше или равен нулю, конструктор создаёт исключение ArgumentOutOfRangeException
3. Класс Chain – цепочка бусин
3.1. Поле l – вещественное число - длина нити, на которую нанизаны бусины
3.2. Поле beads – список List, составленный из бусин, нанизанных на нить
3.3. Событие ChainLenChangedEvent, определённое типом-делегатом ChainLenChanged
3.4. Свойство L. Обеспечивает доступ к полю – длина нити. При изменении длины нити активируется событие ChainLenChangedEvent
3.5. Конструктор с двумя параметрами – вещественной длиной нити len и целым числом N бусин в цепочке. Создание бусин выполняет вспомогательный метод CreateBeads(). Радиус бусин одинаков и равен целому
3.6. Метод CreateBeads() – создаёт объекты-бусины и добавляет их методы-обработчики в список обработчиков события ChainLenChangedEvent
4. Добавить в код событие, возникающее при изменении N - количества бусин на нити, предполагается, что длина нити не изменяется, а размеры бусин «подстраиваются» под длину нити так, чтобы занять её.
4.1. В обработчике этого события добавить код (в классе Bead)
4.1.1. Пересчёта и изменения радиуса бусин
5. Добавить в код событие, возникающее при изменении радиуса бусин
6. Подписать объект Chain на события 5
6.1. В обработчике пересчитывать количество бусин, которые могут поместиться на нити заданной длины, удалять/добавлять бусины
Тестирование кода выполните в консольном приложении.
(*) Создайте оконное приложение, в поле pictureBox визуализируйте цепочку бусин. Добавьте возможность изменения параметров цепочки и бусин. Свяжите изменения в интерфейсе с изменениями бусин и цепочки.
UPD: На Blogger нашла подробный пост по использованию событий.Developer's notes. Использование событий в C# Терминология мне не очень нравится, но вряд ли это может быть сильной придиркой к посту в блоге.

четверг, 26 марта 2015 г.

FORMATIVE: Нашлась причина вопроса, из предыдущего поста

Вопрос из предыдущего поста появился на занятиях после проведения десятиминутной самостоятельной работы. Когда фантазия по вариантам на "летучку" иссякла, я сделала заготовку для вершины двусвязного списка.
using System;

public class Node {
    double weigth; // вес вершины
    Node next; // следующая вершина
    Node prev; // предыдущая вершина
    // свойства

    public double Weigth { get { return weigth; } }
    // конструктор с параметром - вес вершины
    public Node(double weigth) {
        if (weigth >= 0) {
            this.weigth = weigth;
            next = null;
            prev = null;
        }
        else throw new ArgumentOutOfRangeException("Должен быть не меньше нуля!");
    }
    
    // добавить вершину после текущей addAfter
    
}

class Program {
    static void Main(string[] args) {
        Node head = new Node(0);
        Node curr = head;
        int N = 33;
        // добавляем N вершин с случайными 
        // весами из диапазона от [0;1)
        Random rnd = new Random();
        for (int i = 0; i < N; i++) {
            curr.addAfter(new Node(rnd.NextDouble()));
            curr = curr.Next;
        }
        curr.addAfter(new Node(1));
        curr = head;
        // вывод списка на экран
        do {
            Console.WriteLine("{0:f3}", curr.Weigth);
            curr = curr.Next;
        } while (curr != null);
    }
}

И задание: В файле HandOuts_56.4.1.cs Класс Node представляет вершину двусвязного списка, поля класса – следующая и предыдущая вершина (Справка: у первой вершины списка ссылка на предыдущую вершину равна null, у последней ссылка на следующую равна null). Вершины связаны между собой отношением агрегации. Дополните описание класса: 1. кодом свойств Next и Prev, возвращающих ссылки на предыдущую и следующую вершину 2. методом addAfter() с параметром – Node – вершиной добавляемой после текущей. Остальной код консольного приложения оставьте без изменений.