Папшев И.С., Черненький М.В., Гапанюк Ю.Е. - Методические указания к лабораторным работам (1076683), страница 3
Текст из файла (страница 3)
Файл: " + ReportFileName);}}}}7.5 Лабораторная работа 57.5.1 Вычисление расстояния Левенштейна с использованием алгоритмаВагнера-ФишераusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;namespace EditDistanceProject{public static class EditDistance{/// <summary>/// Вычисление расстояния Дамерау-Левенштейна/// </summary>public static int Distance(string str1Param, string str2Param){if ((str1Param == null) || (str2Param == null)) return -1;int str1Len = str1Param.Length;int str2Len = str2Param.Length;//Если хотя бы одна строка пустая, возвращается длина другой строкиif ((str1Len == 0) && (str2Len == 0)) return 0;if (str1Len == 0) return str2Len;if (str2Len == 0) return str1Len;//Приведение строк к верхнему региструstring str1 = str1Param.ToUpper();string str2 = str2Param.ToUpper();//Объявление матрицыint[,] matrix = new int[str1Len + 1, str2Len + 1];//Инициализация нулевой строки и нулевого столбца матрицыfor (int i = 0; i <= str1Len; i++) matrix[i, 0] = i;for (int j = 0; j <= str2Len; j++) matrix[0, j] = j;29//Вычисление расстояния Дамерау-Левенштейнаfor (int i = 1; i <= str1Len; i++){for (int j = 1; j <= str2Len; j++){//Эквивалентность символов, переменная symbEqual соответствуетm(s1[i],s2[j])int symbEqual = ((str1.Substring(i - 1, 1) == str2.Substring(j- 1, 1)) ? 0 : 1);int ins = matrix[i, j - 1] + 1; //Добавлениеint del = matrix[i - 1, j] + 1; //Удалениеint subst = matrix[i - 1, j - 1] + symbEqual; //Замена//Элемент матрицы вычисляется как минимальный из трех случаевmatrix[i, j] = Math.Min(Math.Min(ins, del), subst);//Дополнение Дамерау по перестановке соседних символовif ((i > 1) && (j > 1) &&(str1.Substring(i - 1, 1) == str2.Substring(j - 2, 1)) &&(str1.Substring(i - 2, 1) == str2.Substring(j - 1, 1))){matrix[i, j] = Math.Min(matrix[i, j], matrix[i - 2, j - 2]+ symbEqual);}}}//Возвращается нижний правый элемент матрицыreturn matrix[str1Len, str2Len];}}}7.6 Лабораторная работа 67.6.1 Фрагмент программы, реализующей работу с делегатамиusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;namespace Delegates{//Делегаты - аналог процедурного типа в Паскале.//Делегат - это не тип класса, а тип метода.//Делегат определяет сигнатуру метода (типы параметров и возвращаемогозначения).//Если создается метод типа делегата, то у него должна быть сигнатура как уделегата.//Метод типа делегата можно передать как параметр другому методу.30//Название делегата при объявлении указывается "вместо" названия методаdelegate int PlusOrMinus(int p1, int p2);class Program{//Методы, реализующие делегат (методы "типа" делегата)static int Plus(int p1, int p2) { return p1 + p2; }static int Minus(int p1, int p2) { return p1 - p2; }/// <summary>/// Использование обощенного делегата Func<>/// </summary>static void PlusOrMinusMethodFunc(string str, int i1, int i2, Func<int,int, int> PlusOrMinusParam){int Result = PlusOrMinusParam(i1, i2);Console.WriteLine(str + Result.ToString());// Func<int, string, bool> - делегат принимает параметры типа int иstring и возвращает bool// Если метод должен возвращать void, то используется делегат Action// Action<int, string> - делегат принимает параметры типа int и stringи возвращает void// Action как правило используется для разработки групповых делегатов,которые используются в событиях}/// <summary>/// Использование делегата/// </summary>static void PlusOrMinusMethod(string str, int i1, int i2, PlusOrMinusPlusOrMinusParam){int Result = PlusOrMinusParam(i1, i2);Console.WriteLine(str + Result.ToString());}static void Main(string[] args){int i1 = 3;int i2 = 2;PlusOrMinusMethod("Плюс: ", i1, i2, Plus);PlusOrMinusMethod("Минус: ", i1, i2, Minus);//Создание экземпляра делегата на основе методаPlusOrMinus pm1 = new PlusOrMinus(Plus);PlusOrMinusMethod("Создание экземпляра делегата на основе метода: ",i1, i2, pm1);//Создание экземпляра делегата на основе 'предположения' делегата//Компилятор 'пердполагает' что метод Plus типа делегатаPlusOrMinus pm2 = Plus;31PlusOrMinusMethod("Создание экземпляра делегата на основе'предположения' делегата: ", i1, i2, pm2);//Создание анонимного методаPlusOrMinus pm3 = delegate(int param1, int param2){return param1 + param2;};PlusOrMinusMethod("Создание экземпляра делегата на основе анонимногометода: ", i1, i2, pm2);PlusOrMinusMethod("Создание экземпляра делегата на основе лямбдавыражения 1: ", i1, i2,(int x, int y) =>{int z = x + y;return z;});PlusOrMinusMethod("Создание экземпляра делегата на основе лямбдавыражения 2: ", i1, i2,(x, y) =>{return x+y;});PlusOrMinusMethod("Создание экземпляра делегата на основе лямбдавыражения 3: ", i1, i2, (x, y) => x+y );////////////////////////////////////////////////////////////////Console.WriteLine("\n\nИспользование обощенного делегата Func<>");PlusOrMinusMethodFunc("Создание экземпляра делегата на основе метода:", i1, i2, Plus);string OuterString = "ВНЕШНЯЯ ПЕРЕМЕННАЯ";PlusOrMinusMethodFunc("Создание экземпляра делегата на основе лямбдавыражения 1: ", i1, i2,(int x, int y) =>{Console.WriteLine("Эта переменная объявлена вне лямбдавыражения: " + OuterString);int z = x + y;return z;});PlusOrMinusMethodFunc("Создание экземпляра делегата на основе лямбдавыражения 2: ", i1, i2,(x, y) =>{32return x + y;});PlusOrMinusMethodFunc("Создание экземпляра делегата на основе лямбдавыражения 3: ", i1, i2, (x, y) => x + y);////////////////////////////////////////////////////////////////Групповой делегат всегда возвращает значение типа voidConsole.WriteLine("Пример группового делегата");Action<int, int> a1 = (x, y) => { Console.WriteLine("{0} + {1} = {2}",x, y, x + y); };Action<int, int> a2 = (x, y) => { Console.WriteLine("{0} - {1} = {2}",x, y, x - y); };Action<int, int> group = a1 + a2;group(5, 3);Action<int, int> group2 = a1;Console.WriteLine("Добавление вызова метода к групповому делегату");group2 += a2;group2(10, 5);Console.WriteLine("Удаление вызова метода из группового делегата");group2 -= a1;group2(20, 10);Console.ReadLine();}}}7.6.2 Фрагмент программы, реализующей работу с рефлексиейusingusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;System.Reflection;namespace Reflection{class Program{/// <summary>/// Проверка, что у свойства есть атрибут заданного типа/// </summary>/// <returns>Значение атрибута</returns>public static bool GetPropertyAttribute(PropertyInfo checkType, TypeattributeType, out object attribute){bool Result = false;attribute = null;//Поиск атрибутов с заданным типомvar isAttribute = checkType.GetCustomAttributes(attributeType, false);if (isAttribute.Length > 0)33{Result = true;attribute = isAttribute[0];}return Result;}static void Main(string[] args){Type t = typeof(ForInspection);Console.WriteLine("Тип " + t.FullName + " унаследован от " +t.BaseType.FullName);Console.WriteLine("Пространство имен " + t.Namespace);Console.WriteLine("Находится в сборке " + t.AssemblyQualifiedName);Console.WriteLine("\nКонструкторы:");foreach (var x in t.GetConstructors()){Console.WriteLine(x);}Console.WriteLine("\nМетоды:");foreach (var x in t.GetMethods()){Console.WriteLine(x);}Console.WriteLine("\nСвойства:");foreach (var x in t.GetProperties()){Console.WriteLine(x);}Console.WriteLine("\nПоля данных (public):");foreach (var x in t.GetFields()){Console.WriteLine(x);}Console.WriteLine("\nСвойства, помеченные атрибутом:");foreach (var x in t.GetProperties()){object attrObj;if (GetPropertyAttribute(x, typeof(NewAttribute), out attrObj)){NewAttribute attr = attrObj as NewAttribute;Console.WriteLine(x.Name + " - " + attr.Description);}}Console.WriteLine("\nВызов метода:");//Создание объекта34//ForInspection fi = new ForInspection();//Можно создать объект через рефлексиюForInspection fi = (ForInspection)t.InvokeMember(null,BindingFlags.CreateInstance, null, null, new object[] { });//Параметры вызова методаobject[] parameters = new object[] { 3, 2 };//Вызов методаobject Result = t.InvokeMember("Plus", BindingFlags.InvokeMethod,null, fi, parameters);Console.WriteLine("Plus(3,2)={0}", Result);Console.ReadLine();}}}7.6.3 Реализация атрибутаusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;namespace Reflection{/// <summary>/// Класс атрибута/// </summary>[AttributeUsage(AttributeTargets.Property, AllowMultiple=false,Inherited=false)]public class NewAttribute : Attribute{public NewAttribute() {}public NewAttribute(string DescriptionParam){Description = DescriptionParam;}public string Description { get; set; }}}7.6.4 Пример инспектируемого классаusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;namespace Reflection{35/// <summary>/// Класс для исследования с помощью рефлексии/// </summary>public class ForInspection{public ForInspection() { }public ForInspection(int i) { }public ForInspection(string str) { }public int Plus(int x, int y) { return x + y; }public int Minus(int x, int y) { return x - y; }[NewAttribute("Описание для property1")]public string property1{get { return _property1; }set { _property1 = value; }}private string _property1;public int property2 { get; set; }[NewAttribute(Description = "Описание для property3")]public double property3 { get; private set; }public int field1;public float field2;}}8 Контрольные вопросы8.1 Лабораторная работа 11.
Каким образом реализуется консольный ввод-вывод в C#?2. Какие способы используются для преобразования строковых значенийв числовые?3. Что такое пространство имен (namespace) и для чего используютсяпространства имен?4. Какие операторы используются для организации условий?5.
Какие операторы используются для организации циклов?8.2 Лабораторная работа 21. Какие типы элементов может содержать класс в языке C#?362. В чем особенность абстрактных классов?3. Что такое интерфейс?4. В чем особенность виртуальных и абстрактных методов? Их сходства иразличия, отличия от обычных методов.5. Что такое свойство (property)?6. Что означает ключевое слово «base» при объявлении конструкторакласса?7.
От какого количества классов и интерфейсов может быть унаследованкласс в языке С#? С чем связана такая схема наследования?8.3 Лабораторная работа 31. Какие типы коллекций в языке С# Вы знаете?2. Чем отличаются обобщенные и необобщенные коллекции?3. В чем особенность использования коллекционного класса ArrayList?4.