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

c#1_osnovy

.PDF
Скачиваний:
14
Добавлен:
26.03.2016
Размер:
698.93 Кб
Скачать
// количество положительных элементов в каждой строке // инициализация nP в каждой строке
// вывод элементов в строке // переход на новую строку

Прямоугольные массивы

Прямоугольный массив имеет более одного измерения. Чаще всего используются двумерные массивы.

Варианты описания двумерного массива:

тип[,] имя;

тип[,] имя = 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 можно использовать

в операциях объединения и сравнения с другими строками.

Добавление форматированной строки в конец строки
Получение или установка емкости буфера. Если устанавливаемое значение меньше текущей длины строки или больше максимального, генерируется исключение ArgumentOutOfRangeException
Вставка подстроки в заданную позицию Длина строки (количество символов) Максимальный размер буфера Удаление подстроки из заданной позиции
Замена всех вхождений заданной подстроки или символа новой подстрокой или символом
Добавление в конец строки. Разные варианты метода позволяют добавлять в строку величины любых встроенных типов: массивы символов, строки и подстроки типа string

Тип 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);

 

 

\W
\s
\S
\d
\D

Регулярные выражения

Регулярное выражение (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 разделяет текст на массив строк по заданному разделителю.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]