c#1_osnovy
.PDFПрямоугольные массивы
Прямоугольный массив имеет более одного измерения. Чаще всего используются двумерные массивы.
Варианты описания двумерного массива:
тип[,] имя;
тип[,] имя = new тип [ разм_1, разм_2 ];
тип[,] имя = { списки _значений };
тип[,] имя = new тип [,] { списки_значений };
тип[,] имя = new тип [ разм_1, разм_2 ] { списки_значений };
Примеры описаний: |
|
int[,] a; |
// элементов нет |
int[,] b = new int[2, 3]; |
// элементы равны 0 |
int[,] c = { {1, 2, 3}, {4, 5, 6} }; |
// new подразумевается |
int[,] c = new int[,] { {1, 2, 3}, {4, 5, 6} }; |
// размерность вычисляется |
int[,] d = new int[2,3] { {1, 2, 3}, {4, 5, 6} }; |
// избыточное описание |
∙К элементу двумерного массива обращаются,
указывая номера строки и столбца, на пересечении которых он расположен:
a[1, 4] |
b[i, j] |
b[j, i] |
Компилятор воспринимает как номер строки первый индекс,
как бы он ни был обозначен в программе.
Пример:
Заполнить двумерный прямоугольный массив (матрицу) размером 3 х 4 заданными целыми числами; определить: среднее арифметическое всех элементов; количество положительных элементов в каждой строке
int m = 3, n = 4; // формирование массива int[,] a = { { -1,-2, 8, 9 }, {7, 5, -6, 2 }, { 8, -4, -1, -3 } };
for ( int i = 0; i < m; i++ )
{for ( int j = 0; j < n; j++ )
Console.Write( "{0,5}", a[i,j] );
Console.WriteLine(); }
int nP;
for ( int i = 0; i < m; i++ ) { nP = 0;
for ( int j = 0; j < n; j++ )
if ( a[i, j] > 0 ) |
nP++ ; |
// подсчет nP в каждой строке |
Console.WriteLine("В строке {0} |
{1} положительн", i, nP); } |
|
double sum = 0; |
|
|
foreach ( int x in a ) |
sum += x; |
// cумма всех элементов |
Console.WriteLine( "Среднее арифметическое ={0:f4}", sum / m / n );
Ступенчатые массивы
Вступенчатых (jagged массивах количество элементов
вразных строках может различаться.
Впамяти ступенчатый массив хранится иначе, чем прямоугольный:
ввиде нескольких внутренних массивов,
каждый из которых имеет свой размер (массив массивов) . Кроме того, выделяется отдельная область памяти для хранения ссылок на каждый из внутренних массивов.
Описание ступенчатого массива |
тип[][] имя; |
Под каждый из массивов, составляющих ступенчатый массив, |
|
память требуется выделять явным образом: |
|
int[][] a = new int[3][]; |
// память под ссылки на 3 строки |
a[0] = new int[5]; |
// память под 0-ю строку (5 эл-в) |
a[1] = new int[3]; |
// память под 1-ю строку (3 эл-та) |
a[2] = new int[4]; |
// память под 2-ю строку (4 эл-та) |
Или: int[][] a = { new int[5], new int[3], |
new int[4] |
}; |
|
||
Обращение к элементу ступенчатого массива: |
a[0][3] |
a[1][2] a[i][j] |
|||
Пример: работа со ступенчатым массивом |
|
|
|
|
|
int[][] a = new int[3][]; |
|
// формирование: 3 массива–строки |
|||
a[0] = new int [5] { 24, 50, 18, 3, 16 }; |
|
|
|
||
a[1] = new int [3] { 7, 9, -1 }; |
|
|
|
|
|
a[2] = new int [4] { 6, 15, 3, 1 }; |
|
|
|
|
|
for ( int i = 0; i < a.Length; i++ ) |
// вывод c использованием |
for |
|||
{ for ( int j=0; j < a[i].Length; j++) |
|
|
|
|
|
Console.Write( "{0,4}", a[i][j] ); |
|
|
|
|
|
Console.WriteLine(); |
} |
|
|
|
|
foreach ( int [] mas1 in a ) |
|
// вывод c использованием |
foreach |
||
{ foreach ( int x in mas1 ) |
|
|
|
|
|
Console.Write( "{0,4 }“, x ); |
|
|
|
|
|
Console.WriteLine(); |
} |
|
|
|
|
|
// поиск элемента с числом 15 в третьей строке |
||||
Console.WriteLine( Array.IndexOf( a[2], 15 ) ); |
индекс = 1 |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
Обработка ошибок. Исключения
Контроль ввода
∙Контроль формата данных - “умный” парсинг (TryParse)
int a; if ( !int.TryParse(Console.ReadLine(), out a) ) Console.WriteLine("Неверный формат ");
Console.WriteLine(a);
∙Контроль допустимых значений - “умные” свойства (set – get).
Контроль операций и результатов
∙ Локальная проверка в методах с помощью условий. if ( a < 0 )
Console.WriteLine("Неверное значение < 0"); Console.WriteLine(a);
Примерная схема обработки ошибок исходных данных
Пример: Проверка пароля с ограничением числа попыток string pasw = ”qwert”, str = ”” ; int maxКvo = 3, k = 0; do
{ Console.WriteLine( "Введите пароль: " ); str = Console.ReadLine(); k++;
if (str == pasw )
{ Console.WriteLine(”входите”) ; return str; }
}
while (k <= maxКvo);
Контроль критических ситуаций (часто непредвиденных)
Обработка ошибок Возможные действия при ошибке:
∙прервать выполнение программы;
∙возвратить значение, означающее «ошибка»;
∙вывести сообщение об ошибке и вернуть вызывающей программе
∙ |
некоторое приемлемое значение, которое позволит ей продолжать работу; |
Сгенерировать (catch – поймать) и обработать исключение. |
∙Исключения генерирует: - либо система выполнения,
либо программист (с помощью оператора throw)
Обработка исключений
Исключительная ситуация, или исключение — это возникновение непредвиденного или аварийного события, которое может порождаться некорректным использованием команд или аппаратуры.
Например: деление на ноль, обращение по несуществующему адресу памяти.
Исключения позволяют логически разделить вычислительный процесс на две части:
— обнаружение аварийной ситуации, — и ее обработка.
Синтаксис: try
{ контролируемый блок } catch
{ блок обработки исключения } finally
{блок завершения }
∙В контролируемый блок try включаются потенциально опасные фрагменты программного кода.
Все функции, прямо или косвенно вызываемые из этого блока, также считаются ему принадлежащими.
∙В одном или нескольких блоках обработки исключений catch
описывается, как обрабатываются ошибки различных типов:
catch (тип имя) { обработчик } catch (тип) { обработчик } catch { обработчик }
∙Необязательный блок завершения finally выполняется
независимо от того, возникла ли ошибка в контролируемом блоке или нет.
Механизм обработки исключений
∙Функция или операция, в которой возникла ошибка, генерирует исключение;
∙Выполнение текущего блока прекращается, отыскивается соответствующий обработчик исключения, ему передается управление.
∙Если обработчик не найден, вызывается стандартный обработчик.
∙Выполняется блок finally, если он присутствует.
Некоторые стандартные исключения
ArithmeticException Ошибка в арифметических операциях или преобразованиях
(предок DivideBeZeroException и OverFlowException)
DivideByZeroException |
Попытка деления на ноль |
|
FormatException |
Попытка передать в метод |
|
|
аргумент неверного формата |
|
IndexOutOfRangeException |
Индекс массива выходит за границы диапазона |
|
InvalidCastException |
Ошибка преобразования типа |
|
OutOfMemoryException |
Недостаточно памяти для создания нового объекта |
|
OverFlowException |
Переполнение при выполнении |
|
|
арифметических операций |
|
StackOverFlowException |
Переполнение стека |
Пример1: проверка ввода-вывода
string[] dw = { "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" }; Console.Write("Введите номер дня недели (0 - 6) ");
try { |
|
|
|
|
|
int i = int.Parse(Console.ReadLine()); |
|
|
|
||
Console.WriteLine("{0}, до Вс {1} дней", dw[i], 6-i |
); |
||||
} |
|
|
|
|
|
catch (IndexOutOfRangeException) { |
|
|
|
||
Console.WriteLine("Ошиблись номером"); |
} |
|
|||
catch (FormatException) { |
|
|
|
|
|
Console.WriteLine("Введено не число"); |
} |
|
|||
catch { Console.WriteLine("Непонятная ошибка"); |
} |
||||
Пример2: проверка деления на 0 |
|
|
|
|
|
try { |
|
|
|
|
|
Console.Write("Введите U |
"); |
int U = int.Parse(Console.ReadLine()); |
|||
Console.Write("Введите R |
"); |
int R = int.Parse(Console.ReadLine()); |
|||
double I = U/R; |
|
// сравни |
I = (double)(U/R); (double)U / R; |
||
Console.WriteLine("Сила тока I = {0:f2}", I); |
} |
|
|||
catch (DivideByZeroException e) { |
|
|
|
||
Console.WriteLine(e.Message); } |
// Попытка деления на нуль |
catch (FormatException ex) {
Console.WriteLine(ex.Message); } //Входная строка имела неверный формат catch { Console.WriteLine("Произошла какая-то ошибка"); }
Типичная последовательность обработки исключений try { контролируемый блок }
catch ( DivideByZeroException )
{обработка деления на 0 } catch ( OverflowException )
{обработка переполнения }
catch (IndexOutOfRangeException)
{обработка неверного индекса массива } catch (FormatException)
{обработка неверного формата }
catch
{ обработка всех остальных исключений }
Оператор throw
Синтаксис: throw [ выражение ];
Некоторые свойства класса Exception
Message |
текстовое описание ошибки (только для чтения) |
Source |
имя объекта, сгенерировавшего ошибку |
TargetSite |
метод, сгенерировавший ошибку |
InnerException |
ссылка на исключение, послужившее причиной текущего |
Работа со строками: классы String и StringBuilder
Тип string предназначен для работы со строками в кодировке Unicode.
Ему соответствует базовый класс System.String библиотеки .NET. Создание строки:
string s; |
// перемен объявлена, инициализация отложена |
string st = "строка"; |
// инициализация строковым литералом |
string u = new string(“ “, 20); |
// с помощью конструктора |
char[] a = { 'e', 'n', 'd' }; |
// создание массива символов |
|
string v = new string( a ); |
// строка из массива символов |
|
||
Операции для строк |
|
|
|
|
|
∙ |
присваивание = |
проверка на равенство == |
на неравенство |
!= |
|
∙ |
обращение по индексу [ ] |
сцепление (конкатенация) строк |
+ |
oСтроки равны, если имеют одинаковое количество символов и совпадают посимвольно.
oОбращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения. Cтроки типа string - неизменяемый тип данных.
oМетоды, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые «старые» копии автоматически удаляются сборщиком мусора.
Некоторые методы класса String
Compare Сравнение двух строк в алфавитном порядке. Разные реализации метода позволяют сравнивать строки с учетом и без учета регистра и особенностей национального представления дат и т. д.
CompareOrdinal |
Сравнение двух строк по кодам символов. Разные реализации |
|
метода позволяют сравнивать строки и подстроки |
CompareTo |
Сравнение текущего экземпляра строки с другой строкой |
Concat |
Конкатенация строк. |
|
Метод допускает сцепление произвольного числа строк |
Copy |
Создание копии строки |
Format |
Форматирование с заданными спецификаторами формата |
IndexOf, LastIndexOf,…Определение индексов первого и последнего вхождения |
|
|
заданной подстроки или любого символа из заданного набора |
Insert |
Вставка подстроки в заданную позицию |
Join |
Слияние массива строк в единую строку. |
|
Между элементами массива вставляются разделители (см. далее) |
Length |
Длина строки (количество символов) |
Remove |
Удаление подстроки из заданной позиции |
Replace |
Замена всех вхождений заданной подстроки |
|
или символа новой подстрокой или символом |
Split |
Разделение строки на элементы, используя заданные разделители. |
|
Результаты помещаются в массив строк |
Substring |
Выделение подстроки, начиная с заданной позиции |
Пример 1:
string s = "прекрасная королева"; Console.WriteLine(s); // вывод string sub = s.Substring(3).Remove(12, 2) ; Console.WriteLine(sub);
string[] mas = s.Split(' '); foreach (string s2 in mas)
Console.WriteLine(s2);
string joined = string.Join(" !!! моя ", mas); Console.WriteLine(joined);
Пример 2: работа с текстом из файла
StreamReader inputFile = new StreamReader("example.txt"); string txt = inputFile.ReadToEnd();
char[] delim = ".,;:!?\n\xD\" ".ToCharArray();
string[] words = txt.Split(delim, StringSplitOptions.RemoveEmptyEntries); foreach (string wrd in words) Console.WriteLine(wrd); Console.WriteLine("Cлов в тексте: " + words.Length);
// вывод слов, оканчивающихся на «а»:
foreach (string wrd in words)
if (wrd[wrd.Length-1] == 'а') Console.WriteLine(wrd);
Спецификаторы формата для строк
C или c Вывод значений в денежном (currency) формате. F или f Вывод значений с фиксированной точностью.
G или g Формат общего вида.
P или p Вывод числа в процентном формате
Примеры форматирования строк |
|
|
double a = 12.234; |
int b = 29; |
|
Console.WriteLine("a = {0,6:C} b = {1,2:X}", a, b ); |
a = 12,23p. |
b = 1D |
Console.WriteLine("a={0,6:0.##} b={1,5:0.# ' руб'}",a,b); |
a=12,23 b=29 руб |
|
Console.WriteLine("a = {0:F3} b = {1:D3}", a, b); |
a = 12,234 |
b = 029 |
Console.WriteLine("a = " + a.ToString("C")); |
a = 12,23p. |
|
Пустые строки и строки null
∙Пустая строка — экземпляр объекта System.String, содержащий 0 символов:
string s = "";
Для пустых строк можно вызывать методы класса System.String .
∙Строки со значениями null не ссылаются на экземпляр объекта System.String, попытка вызвать метод для строки null
вызовет исключение NullReferenceException. Однако строки null можно использовать
в операциях объединения и сравнения с другими строками.
Тип StringBuilder
Класс StringBuilder определен в пространстве имен System.Text. Позволяет изменять значение своих экземпляров.
При создании экземпляра обязательно использовать new и конструктор,
например:
StringBuilder a = new StringBuilder(); StringBuilder b = new StringBuilder("Privet"); StringBuilder c = new StringBuilder(100); StringBuilder d = new StringBuilder("Privet", 100 );
StringBuilder e = new StringBuilder("Privet", 1, 3, 100 );
Сравнение скорости выполнения конкатенации 50 000 строк: string ~ 1 мин., StringBuilder ~ 1 сек.
Некоторые свойства и методы класса StringBuilder Append
AppendFormat
Capacity
Insert
Length
MaxCapacity
Remove
Replace
ToString |
Преобразование в строку типа string |
|
|
Пример: Использование StringBuilder |
|
|
|
Console.Write("Введите зарплату: "); |
|
|
|
double zar = double.Parse(Console.ReadLine()); |
|
|
|
StringBuilder str = new StringBuilder("зарплата: "); |
// создание объекта |
||
str.AppendFormat("{0,6} руб, за год {1,6} руб", zar, zar*12); |
// формат |
||
Console.WriteLine(str); |
|
|
|
str.Replace("руб", "тыс.$"); |
// замена р. на тыс. $ |
||
Console.WriteLine("А лучше было бы: " + str); |
|
|
Регулярные выражения
Регулярное выражение (regular expression) — шаблон, по которому выполняется поиск соответствующего ему фрагмента текста
Примеры: |
тег html: |
<\w+> |
|
номер телефона: |
[0-9]{3}-[0-9]{2}-[0-9]{2} |
|
или |
\d{3}-\d{2}-\d{2} |
Регулярные выражения предназначены для обработки текстовой информации и обеспечивают: поиск в тексте по заданному шаблону;
редактирование, замену и удаление подстрок; формирование итоговых отчетов по результатам поиска
Язык описания регулярных выражений содержит символы двух видов: обычные и метасимволы.
∙Обычный символ представляет в выражении сам себя.
∙Метасимвол представляет :
класс символов |
например: любая цифра \d или буква \w |
|
уточняющий символ |
например: |
^ $ |
квантификатор (повторитель) например: + |
{3}… |
Примеры: шаблон для поиска в тексте
∙слова «язык» записывается обычными буквами: «язык»
∙двух идущих подряд цифр состоит из двух метасимволов: \d\d
∙ |
фрагментов вида Вариант 1, … Вариант 9 имеет вид Вариант \d |
∙фрагментов вида Вариант 1, Вариант 23, Вариант 719 имеет вид Вариант \d+
Метасимволы
Класс символов
. (точка) любой символ, кроме \n
[] любой одиночный символ из последовательности внутри скобок.
[^] любой одиночный символ, не входящий в последовательность внутри скобок. \w любой алфавитно-цифровой символ, т.е. символ из множества прописных
и строчных букв и десятичных цифр любой не алфавитно-цифровой символ, то есть символ, не входящий
в множество прописных и строчных букв и десятичных цифр любой пробельный символ, напр, пробел, табуляция (\t, \v), перевод строки (\n, \r), новая страница (\f)
любой не пробельный символ, то есть символ, не входящий в множество пробельных любая десятичная цифра
любой символ, не явдяющийся десятичной цифрой
|
Уточняющие метасимволы |
^ |
следует искать только в начале строки |
$ |
следует искать только в конце строки |
\b |
начинается или заканчивается на границе слова (т.е. между символами, |
|
соответствующими \w и \W) |
\B |
не должен встречаться на границе слова |
Повторители
* 0 или более повторений предыдущего элемента + 1 или более повторений предыдущего элемента ? 0 или 1 повторений предыдущего элемента {n} ровно n повторений предыдущего элемента
{n,} по крайней мере n повторений предыдущего элемента {n,m} от n до m повторений предыдущего элемента
Для задания повторителя не для отдельного символа, а для последовательности применяется группирование (c помощью круглых скобок).
Примеры простых регулярных выражений |
|
|
|
o целое число (возможно, со знаком): |
|
[-+]?\d+ |
|
o вещественное число (может иметь знак |
|
||
|
и дробную часть, отделенную точкой): |
[-+]?\d+\.?\d* |
|
o |
номер автомобиля: |
\d{4}[AВЕIKMHOPCTX]{2}-[1-7] |
|
o |
ip-адрес (упрощенно): |
(\d{1,3}\.){3}\d{1,3} |
|
o |
адрес e-mail |
\w+\@\w+\.\w{2,4} |
Поддержка регулярных выражений в .NET
∙Регулярные выражения в .NET реализуются несколькими классами пространства имен System.Text.RegularExpressions.
∙Основной класс – Regex.
Реализует подсистему обработки регулярных выражений. Подсистеме требуется предоставить:
o Шаблон (регулярное выражение), соответствия которому требуется найти. o Текст, который необходимо проанализировать с помощью шаблона.
Использование класса Regex
∙Обработчик регулярных выражений выполняет синтаксический разбор шаблона регулярного выражения,
а также операции, сопоставляющие шаблон с анализируемой строкой.
∙Обработчик можно использовать одним из двух способов:
oС помощью вызова статических методов класса Regex. Параметры метода содержат входную строку и шаблон.
oС помощью создания объекта Regex
посредством передачи регулярного выражения в конструктор класса.
Методы класса Regex
∙IsMatch определяет, встречается ли в тексте шаблон регулярного выражения.
∙Match и Matches извлекают из текста одно или все вхождения, соответствующие шаблону.
o Метод Match возвращает объект Match, с информацией о совпадении.
o Метод Matches возвращает коллекцию MatchCollection, в которую входят объекты Match для всех совпадений в проанализированном тексте.
∙Replace заменяет соответствующий шаблону фрагмент текста на заданный.
∙Split разделяет текст на массив строк по заданному разделителю.