2017 ПРОГРАММНАЯ ИНЖЕНЕРИЯ ПИб-3курс ЛЕК=12шт Л/Р=8шт СРС=97ч 1) тут рейтинг группы/оценки - goo.gl/lNnbFt 2) гугл-папка с примерами реализаций - goo.gl/hHvGtQ 3) тут файл HELPME, это подсказки во время ЛабРаб - goo.gl/f2RuDo 4) ИТ-Хакатон - goo.gl/F1B74u критерии оценивания - https://yadi.sk/d/EyVoof9L3HXuXm 5) презентации лекций: лекция про ИИ - goo.gl/4vd6Dv лекция про Кодирование - goo.gl/iHMdpL |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Тема 2 - обязательная (ЛабРаб сдавать - собеседование), нужно знать: - класс, объект, наследование, инкапсуляция, - поля, свойства, методы, private, protected, public От оценки по этой теме зависит итоговая оценка за ЭКЗАМЕН... Читать и вспоминать в учебнике по ООП !!! |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ЛЕКЦИИ ПИб-3 язык C# - основная тема ООП - ссылка на учебник: https://pcoding.ru/pdf/oop.pdf - ссылка на презентацию с основными понятиями ООП: http://clck.ru/9uu6E - setup C#2008: https://yadi.sk/d/7RP1NrKwrSMrw требования: - посещать лекции, так как без них не понять что и как делать * до лабораторки: - дома тренироваться самому по примерам с лекции * на лабораторке: 1 пара - показываете то, что сами можете, повторяя мои примеры с лекций 2 пара - делаете свой проект (если первую пару успешно преодолели) проект постепенно будет накапливать те технологии, что мы изучаем итоговая оценка за дисциплину: 3 - если в течение семестра смогли сдавать примеры с лекций на 1 паре 4 - если смогли сделать свой проект 5 - если смогли сделать так, чтобы я допустил к выступлению на IT-хакатоне в конце мая 2 - во всех остальных случаях Экзамен в форме собеседования (только для тех, кого не удовлетворила оценка выше) возможные темы проектов: - парсер сайтов (погоды, телепрограммы, курсов валют, интернет-магазинов) с рассылкой на почтовые адреса или вконтакте - пакетное скачивание файлов (с сайта академии расписание заочки) по расписанию - экспертная система самообучающаяся в ходе диалога с пользователем - программа, которая может залить текст в картинку и обратно декодировать - программа, которая берет данные из XML-файла и формирует HTML-файл - программа по обработке QR-кода - игра с динамическими компонентами - и т.д. -------------------------------------------------------------------------------- ПАПКА examples ---программы: Poslov.rar https://yadi.sk/d/1cWrnCH43GD2bZ EksSist.rar https://yadi.sk/d/-dS0n_Dv3Fc9c3 MemoryCSharp.rar https://yadi.sk/d/bGRZtNwg3EehSp anti_shake.rar https://yadi.sk/d/lEFjOS7H3Eehdm anti_shake_with_dll.rar - это совместно с подключаемыми заголовочными файлами https://yadi.sk/d/NWDas1Qm3Ehjj2 Memory.rar это Python https://yadi.sk/d/ViUTOM3J3Eehir Balls.rar это Python https://yadi.sk/d/UZIWiVpb3EehqB ---библиотеки: 1) SmallBasicLibrary.dll - https://yadi.sk/d/qHBkwFyw3EefzS требования к этой библиотеке изложены тут: https://www.microsoft.com/ru-ru/download/details.aspx?id=46392 самое главное .Net Framework 4.5 (если установлено ниже, то не работает) скачать инсталлятор .Net Framework 4.5 можно от издателя тут: https://www.microsoft.com/ru-RU/download/details.aspx?id=30653 НО... в VS 2008 не поддерживается .NET версии старше, чем 3.5 2) MessagingToolkit.QRCode.dll - https://yadi.sk/d/T-aBKoW23H7Lio для создания программ по обработке QR-кода -------------------------------------------------------------------------------- !!! некоторые возможные контрольные задания по созданию методов в dll: - индекс массы тела - смотри в сети (вводим рост и вес, возвращает диагноз) - конвертер: градусы-фаренгейты, мили-километры, быйты-кбайты-Мбайты-Гбайты - проверить на Счастливый билет (шестизначное число) - проверить на Палиндром - исправление раскладки клавиатуры (что тут написано: xnj nen yfgbcfyj) ЛАБОРАТОРНЫЕ ЗАНЯТИЯ лаб 1 Техническое задание Разработать динамическую библиотеку с классом Conv, который содержит два статических метода DecToBin (из десятичного в двоичное) и BinToDec (из двоичного в десятичное). Каждый метод реализован в виде функции с одним входным строковым аргументом и возвращает ответ в виде строки. Если входная строка не является целым числом, то возвращается - "error input". Допустимый диапазон десятичных чисел [0..1024]. Основная программа сделана в виде приложения Windows Worms: одно текстовое поле и две кнопки (перевести в двоичное, перевести в десятичное). Исходное значение берется из текстового поля и ответ возвращается в текстовое поле по образцу: private void button1_Click(object sender, EventArgs e) { textBox1.Text = Conv.DecToBin(textBox1.Text); } private void button2_Click(object sender, EventArgs e) { textBox1.Text = Conv.BinToDec(textBox1.Text); } смотрите пример реализации: https://yadi.sk/d/PP9TMYJs3EnpD8 тут 3 варианта реализации: - программа на CSharp + dll с классом Conv - программа на CSharp + стиль Metro + dll с классом Conv - программа на Delphi + dll с классом Conv (будет работать после регистрации в системе утилитой RegAsm.exe - читайте ReadMe из папки) лаб 2 Техническое задание -1- дома изучить Главу №6 учебника ООП - ссылка в начале этого файла -2- повторить пример из главы, добиться его работоспособности и принести показать на занятии -3- на основе примера самостоятельно, по аналогии создать иерархию классов: ___базовый класс: Живое (атрибуты: возраст/скрытый) (методы: установить возраст, получить возраст) ___производный (от Живое) класс - 1 уровень: Человек (атрибуты: Фамилия, Имя, Отчество, Пол) (методы: получить инициалы, получить пол в виде слова, получить возраст - зависит от пола) ___производный (от Человек) класс - 2 уровень: Работник (атрибуты: отдел, телефон, стаж, зарплата) (методы: установить ставку зарплаты, получить зарплату - зависит от стажа) ___производный (от Живое) класс 1 уровень: Ork_B (методы: получить возраст - возвращает как двоичное число, установить возраст - принимает как десятичное число) производный (от Живое) класс 1 уровень: Ork_D (методы: установить возраст - принимает как двоичное число, получить возраст - возвращает как десятичное) Внимание: - у Ork-ов используйте разработанную вами ранее на ЛабРаб_№1 библиотеку по переводу числа Десятичное<-->Двоичное лаб 3 Техническое задание (до 11 марта, так как я в отпуске, вопросы через вконтакт) Работа с динамическими компонентами - используем классы для создания объектов во время работы приложения сравниваем два языка: Delphi vs C# - изучите видео Создание компонентов во время выполнения приложения: http://itvop.vov.ru/delphi/video.htm - скачайте там же пример к этому видео и исследуйте его (это на Delphi) - на сайте войдите на вкладку Программная инженерия / Динамические компоненты (http://itvop.vov.ru/pdf/dinamic.pdf) - сравните реализацию динамических компонентов в Delphi и C# - отдохните и поиграйте в игру, использующую динамические компоненты: MemoryCSharp https://yadi.sk/d/bGRZtNwg3EehSp - реализуйте на C# игру в составление поговорок из слов с проверкой правильности по образцу (скачать: https://yadi.sk/d/1cWrnCH43GD2bZ) лаб 4 Техническое задание Разработать Windows Forms Application для парсинга ТВ-программы на текущий день для нескольких каналов (5-6 по своему желанию, например, СТС, Рен-ТВ, Россия 1 и т.п.) лаб 5 Техническое задание Разработать Windows Forms Application - "Экспертную систему" с динамической библиотекой (dll), реализующей поиск на бинарном дереве решений. Глубина бинарного дерева от 3-х до 5-ти. Тема: по согласованию с преподавателем. Вот тут смотрите примеры готовых реализаций: EksSist.rar https://yadi.sk/d/-dS0n_Dv3Fc9c3 Исходники для dll-библиотеки смотрите тут (170.txt) ниже (несколько разных вариантов). Сдавать нужно программу со СВОЕЙ собственной библиотекой. лаб 6 Техническое задание Программа по пакетной обработке файлов с QR-кодами и с некоторой обработкой в dll-библиотеке. 0) сделать программу как в учебнике в Главе 12. // заранее до занятия 1) повторить программу с лекции (см. Лек_09). // заранее до занятия 2) Задание на dll буду уточнять в индивидуальном порядке прямо на занятии. лаб 7 Техническое задание Искусственный интеллект и проблемы распознавания образов Разработать программу (на основе моей с лекции - упрощенный вариант, смотри далее), которая будет распознавать три символа. Символы выбираете сами любые, но не те, что у меня в матрицах весов. За основу брать программу с Лекции № 10. Сам код ниже в этом файле. Особенности задания слушайте на лекции. Образцы реализаций с матрицами весов смотрите в гугл-папке (папка decode) скачать тут: https://goo.gl/hHvGtQ Там упрощенная программа (.NET 3.5) и полная программа (.NET 4.5.2) _ упрощенное приложение сделаете сами: на форме две button и один pictureBox _ файлы с матрицами из моего примера (можно взять изменить, удалить, добавить) _ сам код упрощенной программы ниже (нужно не только скопировать, но и подключить события): лаб 8 Техническое задание Шифрование в графике Разработать программу, которая будет шифровать текст в рисунок и обратно декодировать. Особенности задания слушайте на лекции. Образцы реализаций и пример кода смотрите в гугл-папке (папка codeDEcode, ссылка в начале этого файла). Внимательно читайте README.txt и комментарии в коде... Пример кода (упрощенный, для одного символа) есть и в этом файле - см. лекцию № 11. !!! больше нет лабораторок !!! СОДЕРЖАНИЕ ЛЕКЦИЙ _____________________________________________ _____________________________________________ лекция 01 Консольные приложения вопросы: C# изменения в версиях консольное приложение - что, как и зачем Main - аргументы и без аргументов cmd.exe запустить консольную программу из приложения виндовс форм: методы перегрузка аргументы по значению по ссылке необязательные по умолчанию сделать класс: внутри Programm / отдельно и использовать его сделать динамическую библиотеку и использовать её (подключить ссылку) _____________________________________________ _____________________________________________ лекция 02 Методы и передача параметров вопросы (основные: поля, свойства, конструкторы, методы): Main - аргументы и без аргументов cmd.exe запустить консольную программу из WFA Process.Start("name.exe", args); функции или методы аргументы методов и ключевые слова ref out по значению (перевод чисел) по ссылке (палиндром) методы перегрузка конструктор поле или свойство _____________________________________________ _____________________________________________ лекция 03 Абстрагирование и инкапсуляция вопросы (основные: пространство имен, модификаторы доступа, поля, конструкторы, методы): Класс Точка функция -> метод модификаторы private public модификатор static + нерассмотренные вопросы 1 и 2 лекции - передача параметров в программу извне - запуск консольной программы другой программой _____________________________________________ _____________________________________________ лекция 04 Динамические компоненты вопросы / основные: 1. Передача аргументов по значению по ссылке 2. Стек и куча 3. Динамические компоненты (методичка http://itvop.vov.ru/pdf/dinamic.pdf) _____________________________________________ _____________________________________________ лекция 05 Абстрагирование и инкапсуляция вопросы / основные: 1. передача аргументов по значению по ссылке 2. динамические компоненты _____________________________________________ _____________________________________________ лекция 06 Экспертные системы вопросы / основные: 1. структура хранения дерева решений 2. WFA 3. dll _____________________________________________ _____________________________________________ лекция 07 Наследование вопросы / основные: 1. static 2. protected 3. дочерние классы _____________________________________________ _____________________________________________ лекция 08 Перегрузка методов вопросы / основные: 1. override 2. методы парсинга 3. парсинг ТВ _____________________________________________ _____________________________________________ лекция 09 Перегрузка методов вопросы / основные: 1. override 2. методы парсинга 3. парсинг ТВ ПРИМЕРЫ С ЛЕКЦИЙ ==================== Лек_01 ==================== using System; //если так - using static System.Console; //то можно без класса - WriteLine(Pow(3)); class Program { static int Pow(int x, int y = 2) { int result = 1; for (int i = 0; i < y; i++) { result *= x; } return result; } static void Main() //static void Main(string[] args) { Console.WriteLine(Pow(3)); Console.WriteLine(Pow(3,3)); Console.WriteLine(Pow(y: 4, x: 2)); Console.ReadKey(); //do { } while (ReadKey(true).KeyChar != (char)27); } } static void Main(string[] args) { Console.Clear(); int x = Convert.ToInt32(args[0]); int y = Convert.ToInt32(args[1]); WriteLine(Pow(x, y)); ReadKey(); } --- using System; using System.IO; using static System.Console; class Program { static int Pow(int x) { int result = 1, y = 2; for (int i=0; i 0) _y = y; else _y = 1; } // тут ошибка set { if (value > 0) _y = value; else _y = 1; } } // конструкторы public mmm() { this.x = 2; _y = 6; } public mmm(int b) { _y = b; } public mmm(int x, int b) { this.x = x; _y = b; } // методы public double power() { return Math.Pow(x, _y); } } static double pwr(int a, int b) { return Math.Pow(a, b); } static void Main(string[] args) { mmm e = new mmm(); mmm t = new mmm(2, 5); mmm w = new mmm(2, 5); t.y = -2; //t.x = 3; Console.WriteLine(t.y); Console.WriteLine(t.power()); } } и сравним, наконец, со статическим полем using System; class Program { public class mmm { // поля public int x; private int _y; public static int z; // свойства public int y { get { return _y; } set { if (value > 0) _y = value; else _y = 1; } } // конструкторы public mmm() { this.x = 2; _y = 6; z = 0; } public mmm(int b) { _y = b; z = 0; } public mmm(int x, int b, int z) { this.x = x; _y = b; // this.z = z; // так только для объектов mmm.z = z; } // методы public double power() { return mmm.z + Math.Pow(x, _y); } } static double pwr(int a, int b) { return Math.Pow(a, b); } static void Main(string[] args) { mmm e = new mmm(); mmm t = new mmm(2, 5, 3); mmm w = new mmm(2, 5, 0); // эту оставим - будет 3 // если закомментим = 5 t.y = -2; //t.x = 3; Console.WriteLine(t.y); Console.WriteLine(t.power()); } } ==================== Лек_03 ==================== демонстрация out ref using System; class Program { static void gen_o(int count, out int[] arr) { int[] a = new int[count]; Random r = new Random((int)DateTime.Now.Ticks); for (int i = 0; i < a.Length; i++) a[i] = r.Next(0, count); arr = a; } static void gen_r(int count, ref int[] a) { Array.Resize(ref a, count); Random r = new Random((int)DateTime.Now.Ticks); for (int i = 0; i < a.Length; i++) a[i] = r.Next(0, count); } static void Main() { int count = 9; int[] arr; gen_o(count, out arr); foreach (int x in arr) Console.Write("{0,5}", x); Console.WriteLine(); count /= 2; gen_r(count, ref arr); foreach (int x in arr) Console.Write("{0,5}", x); Console.WriteLine(); Console.ReadKey(true); } } --- поля и свойства | конструкторы и методы using System; class Program { class Anum { // поля public int x; private int _y; // свойства public int y { get { return _y; } set { if (value > 0) _y = value; else _y = 1; } } // конструкторы public Anum() { this.x = 2; this._y = 3; } public Anum(int x, int y) { this.x = x; this.y = y; } // методы public double power() { return Math.Pow(x, y); } public void print() { Console.WriteLine(power()); } } static void Main() { Anum a = new Anum(); a.print(); Anum b = new Anum(2, -4); b.print(); b.y = -5; b.print(); Console.ReadKey(true); } } --- читаем пишем текстовый файл using System; using System.IO; using System.Text; class Program { static bool provline(out string line) { line = ""; return true; } static void Main(string[] args) { string FileInp = "input.txt"; string FileOut = "output.txt"; StreamReader sr = new StreamReader(FileInp, Encoding.UTF32); StreamWriter sw = new StreamWriter(FileOut, false, Encoding.UTF8); //string txt = sr.ReadToEnd(); //Console.WriteLine(txt); //sw.Write(txt); sw.WriteLine(DateTime.Now.ToLongTimeString()); string line; while ( (line = sr.ReadLine()) != null) { sw.WriteLine(line); } sr.Close(); sw.Close(); } } --- using System; using System.IO; using System.Text; class Program { static bool provline(out string line) { line = ""; return true; } static void Main(string[] args) { string FileInp = "input.txt"; string FileOut = "output.txt"; StreamReader sr = new StreamReader(FileInp); Encoding code = sr.CurrentEncoding; StreamWriter sw = new StreamWriter(FileOut, false, code); string line = sr.ReadLine(); while (line != null) { sw.WriteLine(line); line = sr.ReadLine(); } //string line; //do //{ // line = sr.ReadLine(); // sw.WriteLine(line); //} while (line != null); sr.Close(); sw.Close(); } } --- // дата время DateTime thisDay = DateTime.Now; string line; //line = thisDay.Date.ToString("d"); line = thisDay.ToLongDateString(); line = thisDay.ToLongTimeString(); //line = thisDay.Hour.ToString() + ":" + thisDay.Minute.ToString(); --- работа с интернет-страницами и сетевыми документами пакетное скачивание файлов по расписанию парсер сайта с сохранением в txt // необходимо подключить using System.IO; using System.Net; using System.Text; // качаем один файл в заданную папку string PathApp = Directory.GetCurrentDirectory(); WebClient wc = new WebClient(); string FileLoad = "http://itvop.vov.ru/pdf/dinamic.pdf"; int PosLast = FileLoad.LastIndexOf('/'); string PathSave = "SaveFromWeb"; string FileName = FileLoad.Substring(PosLast, FileLoad.Length - PosLast); string FileSave = PathApp + "/" + PathSave + "/" + FileName; wc.DownloadFile(FileLoad, FileSave); // или так WebClient webClient = new WebClient(); webClient.DownloadFile("http://pgsha.ru:8008/shedules/%C8%F1%E1-2012.xls", "12.xls"); // сохраняем содержимое html-странички как файл в заданную папку string PathApp = Directory.GetCurrentDirectory(); WebClient wc = new WebClient(); string FileLoad = "http://itvop.vov.ru/170.txt"; string Source = wc.DownloadString(FileLoad); string PathSave = "SaveFromWeb"; int PosLast = FileLoad.LastIndexOf('/'); string FileName = FileLoad.Substring(PosLast, FileLoad.Length - PosLast); string FileSave = PathApp + "/" + PathSave + "/" + FileName; File.WriteAllText(FileSave, Source); // или так - через Запрос-Ответ: string http = "http://itvop.vov.ru/170.txt"; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(http); WebResponse webResponse = httpWebRequest.GetResponse(); Stream responseStream = webResponse.GetResponseStream(); Encoding Code = Encoding.GetEncoding("UTF-8"); StreamReader sr = new StreamReader(responseStream, Code); string result = sr.ReadToEnd(); // html-страница в виде одной строки sr.Close(); File.WriteAllText("OutPut.txt", result, Encoding.GetEncoding(1251)); // с рассылкой по адресам: string smtpServer = "smtp.yandex.ru"; string from = ""; string password = ""; string mailto = ""; string caption = ""; string message = result; string attachFile = NameFile; MailMessage mail = new MailMessage(); mail.From = new MailAddress(from); mail.To.Add(new MailAddress(mailto)); mail.Subject = caption; mail.Body = message; mail.Attachments.Add(new Attachment(attachFile)); SmtpClient client = new SmtpClient(); client.Host = smtpServer; client.Port = 587; client.EnableSsl = true; client.Credentials = new NetworkCredential(from.Split('@')[0], password); client.DeliveryMethod = SmtpDeliveryMethod.Network; client.Send(mail); mail.Dispose(); ------- пример организации парсера новостей с yandex.ru (без использования регулярных выражений) сначала вспомогательные функции: static string GetSubString(string src, string Begin, string End, ref int pos) { // получить подстроку pos = src.IndexOf(Begin, pos) + Begin.Length; int count = src.IndexOf(End, pos) - pos; return src.Substring(pos, count) + "\r\n"; } static void ConvFormat(ref string src) { // сменить кодировку строки Encoding srcFormat = Encoding.GetEncoding("utf-8"); byte[] Bytes = srcFormat.GetBytes(src); src = Encoding.GetEncoding(1251).GetString(Bytes); } далее основная работа в main-функции: string PathApp = Directory.GetCurrentDirectory(); WebClient wc = new WebClient(); string FileLoad = "https://yandex.ru/"; string Source = wc.DownloadString(FileLoad); string PathSave = "SaveFromWeb", FileName = "news.txt"; string FileSave = PathApp + "/" + PathSave + "/" + FileName; string[] titles = new string[] { "Новости мира", "Новости Перми" }; string nl = "\r\n"; ConvFormat(ref titles[0]); ConvFormat(ref titles[1]); int pos = 0; string result = "", a, b; for (int j = 0; j < 2; j++) { result += titles[j] + nl + nl; pos = Source.IndexOf("ol class=\"list b-news-list\"", pos); pos = Source.IndexOf("li class=\"list__item\"", pos); for (int i = 0; i < 5; i++) { a = GetSubString(Source, "", ref pos); result += b + a + "\r\n"; } } File.WriteAllText(FileSave, result, Encoding.GetEncoding(1251)); продолжение - пример организации парсера новостей с yandex.ru с использованием регулярных выражений только основная функция с "грязным кодом": string[] labels = new string[] { "USD ЦБ", "EUR ЦБ", "OIL нефть"}; WebClient wc = new WebClient(); string Source = wc.DownloadString("https://yandex.ru/"); // 58,91 string otbor = "([0-9]+,+[0-9]+)"; //string result = Regex.Match(Source, otbor).Groups[1].Value; string result = ""; DateTime thisDay = DateTime.Today; string td = thisDay.Date.ToString("d"); result += td + "\r\n\r\n"; StreamWriter file = new StreamWriter("news.txt", true, Encoding.GetEncoding(1251)); int index = 0; foreach (Match m in Regex.Matches(Source, otbor)) { //result += m.Groups[1].Value + "\t" + ConvFormat(labels[index]) + "\r\n"; file.WriteLine(m.Groups[1].Value + "\t" + ConvFormat(labels[index])); index++; } file.Close(); //File.WriteAllText("news.txt", result, Encoding.GetEncoding(1251)); ----- пример для Windows Forms Application - парсинг ТВ-программы using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net; using System.IO; namespace WFA_parse { public partial class Form1 : Form { struct ch_info { public string name, num; } string[] chls; List chs = new List(); ch_info ch_temp; string result = ""; public Form1() { InitializeComponent(); comboBox1.Items.Clear(); chls = File.ReadAllLines("input.txt",Encoding.Default); foreach (string val in chls) { string[] temp = val.Split('\t'); comboBox1.Items.Add(temp[1]); ch_temp.name = temp[1]; ch_temp.num = temp[0]; chs.Add(ch_temp); } comboBox1.Text = "сделайте выбор"; } static string GetSubString(string src, string Begin, string End, ref int pos) { // получить подстроку pos = src.IndexOf(Begin, pos) + Begin.Length; int count = src.IndexOf(End, pos) - pos; return src.Substring(pos, count); } private void button1_Click(object sender, EventArgs e) { WebClient wc = new WebClient(); wc.Encoding = Encoding.GetEncoding("UTF-8"); string chanel = comboBox1.Text; foreach (var z in chs) if (z.name == chanel) { string a = "", b = ""; string t1 = "", ref pos); b = GetSubString(Source, t2, "", ref pos); b = b.Replace(""", "\""); result += a + "\t" + b + "\r\n"; } while (Source.IndexOf(t1, pos)>0); textBox1.Text = result; this.Text += " - готово"; break; } } private void button2_Click(object sender, EventArgs e) { //File.WriteAllText("output.txt", result, Encoding.GetEncoding("UTF-8")); File.WriteAllText("output.txt", textBox1.Text, Encoding.GetEncoding(1251)); } } } ----- пример команды new и добавление обработчиков событий public partial class Form1 : Form { List