Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курс лекций CS (первый семестр)

.pdf
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
2.69 Mб
Скачать

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

for (int i = 0; i < n; i++)

mas1[i] = ty.Next(100);

double[] mas2 = new double[2*n];

for (int i = 0; i < 2*n; i++)

mas2[i] = Math.Sqrt(ty.Next(100));

Vivod(mas1, n);

Vivod(mas2,2*n);

Console.WriteLine("Max in mas1={0}", MaxVal(mas1, n));

Console.WriteLine("Max in mas2={0}", MaxVal(mas2, 2*n));

}

}

}

Результат.

161

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Лекция №24.

Делегаты.

Делегатом называется тип, который позволяет хранить ссылки на функции. Несмотря на то, что звучит это несколько интригующе, механизм, лежащий в основе этой возможности, удивительно прост. Наиглавнейшее предназначение делегатов вряд ли удастся понять до тех пор, пока вы не познакомитесь с событиями и с их обработкой, однако рассмотрение самого понятия делегатов принесет огромную пользу. Когда позднее наступит время их использовать, они будут вам уже знакомы, что сделает некоторые сложные темы гораздо более легкими для понимания. Объявление делегатов во многом напоминает объявление функций; при этом отсутствует само тело функции, но добавляется ключевое слово delegate. Объявление делегата определяет сигнатуру функции, состоящую из возвращаемого типа и списка параметров.

delegate int myF(int a, double b);

После объявления делегата мы получаем возможность объявить переменную типа этого делегата. Мы можем затем инициализировать эту переменную, присвоив ей ссылку на произвольную функцию, обладающую сигнатурой, совпадающей с сигнатурой делегата. После всего этого мы получаем возможность вызывать эту самую функцию с помощью данной переменной делегата так, как если бы последняя сама являлась этой функцией. Обращение к функции через делегата записывается так же, как и обычный вызов функции, на которую он указывает. Просто вместо имени функции используется имя переменной-делегата на эту функцию.

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

delegate int myF(int a, double b);

162

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

static int Func(int r,double h)

{

return r*Math.Sign(h);

}

static void Main(string[] args)

{

myF myfunc = Func; Console.WriteLine("rez={0}", myfunc(5, -6.7));

Console.WriteLine("rez={0}", myfunc(15, 26.7));

}

}

}

Результат.

Инициализацию переменной делегата, можно организовать другим способом в стиле объектноориентированного программирования.

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

delegate int myF(int a, double b);

163

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

static int Func(int r,double h)

{

return r*Math.Sign(h);

}

static int Val(int y, double x)

{

return y - Math.Sign(x);

}

static void Main(string[] args)

{

bool b = false; myF myfunc;

if (b)

myfunc = new myF(Func);

else

myfunc = Val;

Console.WriteLine("rez={0}", myfunc(5, -6.7));

Console.WriteLine("rez={0}", myfunc(15, 26.7));

}

}

}

Результат.

Основное предназначение делегатов – это организация передачи параметра в функцию, который сам является функцией. Для этого необходимо передавать переменную - делегат другой функции в качестве параметра, что позволит этой функции использовать данного делегата для вызова функции, на

164

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

которую он ссылается, без необходимости определять вызываемую функцию до начала выполнения программы.

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

delegate double myF(double a, double b);

static double Func(double r,double h)

{

return r*Math.Sign(h);

}

static double Val(double y, double x)

{

return y - Math.Sign(x);

}

static double son(double a, double b, myF f)

{

return 2 * f(a, b);

}

static void Main(string[] args)

{

myF qw=Func;

Console.WriteLine("rez={0}", son(2.0,3.0,qw));

qw = new myF(Val);

165

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Console.WriteLine("rez={0}", son(2.0,3.0,qw));

}

}

}

Результат.

166

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Лекция №25.

Работа со строками.

Первые компьютеры использовались исключительно для управления числовыми значениями. Первые компьютеры нужны были лишь для вычисления траекторий полета ракет, и программирование преподавалось только на математических факультетах ведущих университетов. Сегодня большинство программ оперирует со строками намного больше, чем с числами. Обычно строки используются для обработки текстов, манипуляций с документами и создания Web-страниц. С# обеспечивает встроенную поддержку работы со строками.

Объявить переменную типа строки можно с помощью конструкции вида:

string имяПеременной;

Строку нужно инициализировать строковым литералом.

string myStroka;

myStroka = "privet";

или одной командой

string myStroka = "privet";

Указанная строка может содержать escape-последовательности.

myStroka = "privet\npoka";

Console.WriteLine(myStroka);

Помимо управляющих последовательностей, в С# предусмотрен также специальный префикс @ для дословного вывода строк вне зависимости от наличия в них управляющих последовательностей. Строки с этим префиксом называются “дословными” (verbatim strings).

167

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

string finalString = @"\n\tString file: 'C:\CSnarpProjects\Strings\string.cs'";

Console.WriteLine(finalString);

Применение префикса @ предоставляет возможность спокойно производить вывод любого количества служебных символов.

Переменная типа string — это всего лишь массив переменных типа char, доступных в режиме "только чтение".

char a = myStroka[0];

Однако присваивать отдельные символы таким способом нельзя. Для получения массива, доступного для записи, следует воспользоваться методом ToСharArray(), который возвращает переменную типа массива символов. Замечание. Все методы строк вызываются через оператор доступа (.).

char[] myMas = myStroka.ToCharArray();

Теперь мы можем выполнять манипуляции с массивом типа char обычным путем. Строки могут использоваться и в циклах foreach:

foreach (char ch in myMas)

Console.Write(ch);

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

168

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

int r=myStroka.Length;

Такое же свойство имеется у одномерных массивов, что позволяет организовывать цикл for для доступа к элементам массива.

Пример.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

string myStroka;

myStroka = "privet\npoka";

char[] myMas = myStroka.ToCharArray(); for (int i = 0; i < myMas.Length; i++)

myMas[i] = 'k';

foreach (char ch in myMas)

Console.Write(ch);

Console.WriteLine();

}

}

}

Результат.

169

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Если вы хотите после изменений содержимого массива опять его «загнать» в переменную строку, то необходимо использовать метод ToString().

myStroka = myMas.ToString();

Существуют два простых, но очень полезных метода: ToLower() и ToUpper(). Они позволяют переводить всю строку целиком в нижний и верхний регистр соответственно. Чтобы оценить пользу от них, представьте ситуацию, когда вы хотите убедиться в поступлении от пользователя какого-то ответа, например, строки "yes". Если мы переведем всю введенную строку в нижний регистр, то сможем воспринять и такие строки, как "YES", "Yes", "yeS" и т. д.:

string user = Console.ReadLine();

if (user.ToLower() == "yes")

//действия

Обратите внимание, что метод на самом деле не изменяет ту строку, к которой применяется. Напротив, использование этой команды для некоторой строки приводит к созданию новой строки, которую можно сравнить с какой-либо другой строкой или присвоить другой переменной. В роли этой переменной может выступать переменная, над которой выполняется данная операция:

user = user.ToLower();

Давайте посмотрим, что еще мы можем сделать для облегчения интерпретации ответов пользователя. Что произойдет в том случае, если пользователь случайно включил в начало или в конец своего ответа пробел? В таком варианте вышеприведенный код не сработает. Необходимо убрать из введенной строки все пробелы в начале и конце строки методом Trim():

string user = Console.ReadLine(); user = user.Trim();

if (user.ToLower() == "yes")

170