Автор работы: Пользователь скрыл имя, 28 Марта 2012 в 11:49, курс лекций
Лекции по дисциплине "Программирование"
Лекция 1. Состав языка Типы данных Переменные и операции
Лекция 2. Линейные программы
Лекция 3. Простейшие операторы. Операторы ветвления
Лекция 4. Операторы цикла и передачи управления
Лекция 5. Обработка исключительных ситуаций
Лекция 6. Классы: основные понятия Описание класса
Лекция 7. Параметры методов
Лекция 8. Конструкторы и свойства
Лекция 9. . Массивы
Лекция 10. Символы и строки
Лекция 11 Дополнительные возможности методов. Индексаторы
Лекция 12. Операции класса. Деструкторы
Лекция 13. Наследование классов
Лекция 14. Интерфейсы
Лекция 15. Стандартные интерфейсы .NET
Лекция 16. Структуры и перечисления
Лекция 17. Делегаты
Лекция 18. События
В листинге 11.3 продемонстрировано применение элементов класса Array при работе с одномерным массивом.
Листинг 11.3. Использование методов класса Array с одномерным массивом
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
int[] a = { 24, 50, 18, 3, 16, -7, 9, -1 };
PrintArray( "Исходный массив:", a );
Console.WriteLine( Array.IndexOf( a, 18 ) );
Array.Sort(a);
PrintArray( "Упорядоченный массив:", a );
Console.WriteLine( Array.BinarySearch( a, 1 8) );
}
public static void PrintArray( string header, int[] a )
{
Console.WriteLine( header );
for ( int i = 0; i < a.Length; ++i )
Console.Write( "\t" + a[i] );
Console.WriteLine();
}
}
}
Методы Sort, IndexOf и BinarySearch являются статическими, поэтому к ним обращаются через имя класса, а не экземпляра, и передают в них имя массива. Двоичный поиск можно применять только для упорядоченных массивов. В классе Class1 описан вспомогательный статический метод PrintArray, предназначенный для вывода массива на экран.
Результат работы программы:
Исходный массив:
24 50 18 3 16 -7 9 -1
2
Упорядоченный массив:
-7 -1 3 9 16 18 24 50
5
Оператор foreach применяется для перебора элементов в специальным образом организованной группе данных. Массив является именно такой группой. Удобство этого вида цикла заключается в том, что нам не требуется определять количество элементов в группе и выполнять их перебор по индексу: мы просто указываем на необходимость перебрать все элементы группы. Синтаксис оператора:
foreach ( тип имя in выражение ) тело_цикла
Имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива выражение (в качестве выражения чаще всего применяется имя массива или другой группы данных). В простом или составном операторе, представляющем собой тело цикла, выполняются действия с переменной цикла. Тип переменной должен соответствовать типу элемента массива.
Например, пусть задан массив:
int[] a = { 24, 50, 18, 3, 16, -7, 9, -1 };
Вывод этого массива на экран с помощью оператора foreach выглядит следующим образом:
foreach ( int x in a ) Console.WriteLine( x );
Этот оператор выполняется так: на каждом проходе цикла очередной элемент массива присваивается переменной х и с ней производятся действия, записанные в теле цикла.
В листинге 11.4 решается та же задача, что и в листинге 11.1, но с использованием цикла foreach. Обратите внимание, насколько понятнее стала программа.
Листинг 11.4. Работа с одномерным массивом с использованием цикла foreach
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
int[] a = { 3, 12, 5, -9, 8, -4 };
Console.WriteLine( "Исходный массив:" );
foreach ( int elem in a )
Console.Write( "\t" + elem );
Console.WriteLine();
long sum = 0; // cумма отрицательных элементов
int num = 0; // количество отрицательных элементов
foreach ( int elem in a )
if ( elem < 0 )
{
sum += elem;
++num;
}
Console.WriteLine( "sum = " + sum );
Console.WriteLine( "num = " + num );
int max = a[0]; // максимальный элемент
foreach ( int elem in a )
if ( elem > max ) max = elem;
Console.WriteLine( "max = " + max );
}
}
}
При создании массива, состоящего из элементов ссылочного типа, память выделяется только под ссылки на элементы, а сами элементы необходимо разместить в хипе явным образом. В качестве примера создадим массив из объектов некоторого класса Monster:
using System;
namespace ConsoleApplication1
{
class Monster { ... }
class Class1
{ static void Main()
{
Random rnd = new Random();
const int n = 5;
Monster[] stado = new Monster[n]; // 1
for ( int i = 0; i < n; ++i ) // 2
{
stado[i] = new Monster( rnd.Next( 1, 100 ),
}
foreach ( Monster x in stado ) x.Passport(); // 3
}
}
}
Результат работы программы:
Monster Crazy0 health = 18 ammo = 94
Monster Crazy1 health = 85 ammo = 75
Monster Crazy2 health = 13 ammo = 6
Monster Crazy3 health = 51 ammo = 104
Monster Crazy4 health = 68 ammo = 114
Лекция 10. Символы и строки
Символы и строки
Обработка текстовой информации является, вероятно, одной из самых распространенных задач в современном программировании, и C# предоставляет для ее решения широкий набор средств: отдельные символы, массивы символов, изменяемые и неизменяемые строки и регулярные выражения.
Символьный тип char предназначен для хранения символов в кодировке Unicode. Символьный тип относится к встроенным типам данных C# и соответствует стандартному классу Char библиотеки .NET из пространства имен System. В этом классе определены статические методы, позволяющие задать вид и категорию символа, а также преобразовать символ в верхний или нижний регистр и в число. Некоторые методы приведены в таблице 12.1, с остальными можно ознакомиться по учебнику.
Таблица 12.1. Некоторые методы класса System.Char Метод | Описание |
GetNumericValue | Возвращает числовое значение символа, если он является цифрой, и –1 в противном случае |
IsControl | Возвращает true, если символ является управляющим |
IsDigit | Возвращает true, если символ является десятичной цифрой |
IsLetter | Возвращает true, если символ является буквой |
IsLower | Возвращает true, если символ задан в нижнем регистре |
IsUpper | Возвращает true, если символ записан в верхнем регистре |
IsWhiteSpace | Возвращает true, если символ является пробельным (пробел, перевод строки и возврат каретки) |
Parse | Преобразует строку в символ (строка должна состоять из одного символа) |
ToLower | Преобразует символ в нижний регистр |
MaxValue, MinValue | Возвращают символы с максимальным и минимальным кодами (эти символы не имеют видимого представления) |
В листинге 12.1 продемонстрировано использование этих методов.
Листинг 12.1. Использование методов класса System.Char
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
try
{
char b = 'B', c = '\x63', d = '\u0032'; // 1
Console.WriteLine( "{0} {1} {2}", b, c, d );
Console.WriteLine( "{0} {1} {2}",
char.ToLower(b), char.ToUpper(c), char.GetNumericValue(d) );
char a;
do
{
Console.Write( "Введите символ: " );
a = char.Parse( Console.ReadLine() );
Console.WriteLine( "Введен символ {0}, его код – {1}",
if (char.IsLetter(a)) Console.WriteLine("Буква");
if (char.IsUpper(a)) Console.WriteLine("Верхний рег.");
if (char.IsLower(a)) Console.WriteLine("Нижний рег.");
if (char.IsControl(a)) Console.WriteLine("Управляющий
if (char.IsNumber(a)) Console.WriteLine("Число");
if (char.IsPunctuation(a)) Console.WriteLine("Разделитель
} while (a != 'q');
}
catch
{
Console.WriteLine( "Возникло исключение" );
return;
}
}
}
}
Массив символов, как и массив любого иного типа, построен на основе базового класса Array. Применение этих методов позволяет эффективно решать некоторые задачи. Простой пример приведен в листинге 12.2.
Листинг 12.2. Работа с массивом символов
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
char[] a = { 'm', 'a', 's', 's', 'i', 'v' }; // 1
char[] b = "а роза упала на лапу азора".ToCharArray(); // 2
PrintArray( "Исходный массив а:", a );
int pos = Array.IndexOf( a, 'm' );
a[pos] = 'M';
PrintArray( "Измененный массив а:", a );
PrintArray( "Исходный массив b:", b );
Array.Reverse( b );
PrintArray( "Измененный массив b:", b );
}
public static void PrintArray( string header, Array a )
{
Console.WriteLine( header );
foreach ( object x in a ) Console.Write( x );
Console.WriteLine( "\n" );
}
}
}
Результат работы программы:
Исходный массив а:
massiv
Измененный массив а:
Massiv
Исходный массив b:
а роза упала на лапу азора
Измененный массив b:
ароза упал ан алапу азор а
Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом C#. Ему соответствует базовый класс System.String библиотеки .NET.
Создать строку можно несколькими способами:
string s; // инициализация отложена
string t = "qqq"; // инициализация строковым литералом
string u = new string(' ', 20); // конструктор создает строку из 20 пробелов
char[] a = { '0', '0', '0' }; // массив для инициализации строки
string v = new string( a ); // создание из массива символов
Для строк определены следующие операции:
присваивание (=);
проверка на равенство (==);
проверка на неравенство (!=);
обращение по индексу ([]);
сцепление (конкатенация) строк (+).
Несмотря на то, что строки являются ссылочным типом данных, на равенство и неравенство проверяются не ссылки, а значения строк. Строки равны, если имеют одинаковое количество символов и совпадают посимвольно.
Обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Это связано с тем, что строки типа string относятся к так называемым неизменяемым типам данных. Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые «старые» копии автоматически удаляются сборщиком мусора.
В классе System.String предусмотрено множество методов, полей и свойств, позволяющих выполнять со строками практически любые действия. Некоторые элементы класса приведены в таблице 12.2, с остальными можно ознакомитсья по учебнику.
Таблица 12.2. Некоторые элементы класса System.String Название | Вид | Описание |
Compare | Статический метод | Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки и подстроки с учетом и без учета регистра и особенностей национального представления дат и т. д. |
Concat | Статический метод | Конкатенация строк. Метод допускает сцепление произвольного числа строк |
Copy | Статический метод | Создание копии строки |
Format | Статический метод | Форматирование в соответствии с заданными спецификаторами формата (см. далее) |
IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny | Методы | Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора |
Insert | Метод | Вставка подстроки в заданную позицию |
Join | Статический метод | Слияние массива строк в единую строку. Между элементами массива вставляются разделители (см. далее) |
Length | Свойство | Длина строки (количество символов) |
Split | Метод | Разделение строки на элементы, используя заданные разделители. Результаты помещаются в массив строк |
Substring | Метод | Выделение подстроки, начиная с заданной позиции |
ToCharArray | Метод | Преобразование строки в массив символов |
ToLower, ToUpper | Методы | Преобразование символов строки к нижнему или верхнему регистру |