Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие СS_Шульга.doc
Скачиваний:
48
Добавлен:
12.02.2015
Размер:
703.49 Кб
Скачать

Задание 4. Обработка стандартных исключений

Каждому студенту необходимо сформулировать задание для решения простейшей задачи, подразумевающей обработку по крайне мере двух типов стандартных исключений (см. таблицу 1). Согласовать задание с преподавателем. Составить и протестировать соответствующую программу. Обработчики исключений должны выводить на экран информацию, используя свойства класса Exception(см. таблицу 2).

Задание 5. Генерация исключений

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

Глава 5. Массивы в c#

Массив - самая распространенная структура данных, реализованная практически во всех языках программирования. Массив – это именованная последовательность однотипных элементов, расположенных в памяти компьютера последовательно. Тип элементов массива называют базовым. К любому элементу массива можно обращаться произвольным образом, так как он имеет определенный номер, называемый индексом. В языке C#, как и во многих других языках, индексы задаются целочисленным типом, индекс первого элемента массива равен 0. Количество элементов в массиве называет размерностью.

Массивы делятся на статические (число элементов массива известно в момент его объявления и память выделяется на этапе трансляции) и динамические (число элементов массива заранее не известно и память выделяется динамически в процессе выполнения программы).

Массивы в языке C# являются динамическими массивами. Массивы относятся к ссылочным типам, память им отводится динамически в хипе ("куче").

Элементами массива могут быть величины как значимых, так и ссылочных типов (в том числе массивы). Массив значимых типов хранит значения, массив ссылочных типов — ссылки на элементы.

Все массивы в языке C# имеют общий базовый класс Array, определённый в пространстве имен System.

В языке C# все массивы делятся на

одномерные массивы - single-dimensionalarrays

многомерные массивы (прямоугольные) - multidimensional arrays (rectangular arrays),

массивы массивов (ступенчатые) - array-of-arrays (jagged arrays).

Описание одномерного массива в C# в общем случае имеет следующий формат:

[атрибуты][модификаторы]тип[]имя[инициализрующий_список];

Простейшее описание одномерного массива имеет следующий вид:

тип [] имя [инициализрующий_список];

Обратите внимание, что в отличие от языка C квадратные скобки приписаны не к имени массива, а к типу. Они являются неотъемлемой частью определения класса, так что запись T[] следует понимать как класс одномерный массив с элементами типа T.

Такая характеристика массива как размерность к классу не относится, она является характеристикой переменных-экземпляров (объектов класса), каждый из которых является одномерным массивом со своим числом элементов, задаваемых в инициализирующем списке.

Имя (имя массива)– идентификатор языка, выбираемый программистом.

Если инициализирующий список отсутствует (говорят, инициализация отложена), то массив не формируется, а создается только ссылка на массив, имеющая неопределенное значение Null. Поэтому пока массив не будет реально создан и его элементы инициализированы, использовать его в вычислениях нельзя. Например, объявления двух массивов с отложенной инициализацией.

int[] a, b;

В качестве инициирующего списка можно использовать:

  1. явный список констант, заключенный в инструктивные скобки, например,

double[] с= {5.5, 6.6, 7.7};

В этом случае в памяти создается константный массив, с которым и связывается ссылка.

  1. конструкторы класса Array c помощью операции new, например

int[] d= new int[5];

int[] e= new int[]{1,2,3};

int[] f= new int[3]{1,2,3};

В этом случае в динамической памяти создается сам массив, элементы которого инициализируются константами соответствующего типа, и ссылка связывается с этим массивом.

При создании массива с помощью операции new после типа данных в квадратных скобках задается число, представляющее собой размерность массива. Это может быть как константа, так и любое выражение, преобразующееся к целому тип, значение которого неотрицательно. Например,

int n;

string buf = Console.ReadLine();

n = Convert.ToInt32(buf);

int[] g= new int[n*3];

Однако, если операция new используется с указанием размерности и с со списком констант, то размерность должна быть константой. Например,

int n = 10; int[] g= new int[n]; // допустимо

int n = 10; int[] g= new int[n]{1,2,3}; //недопустимо

const int n = 10; int[] g= new int[n]{1,2,3}; //допустимо

int[] g= new int[3]{1,2,3}; //допустимо

int[] g= new int[]{1,2,3}; //допустимо

Если массив не инициализирован при создании, то элементам присваиваются значения по умолчанию: нули для значимых типов и null для ссылочных.

Присвоить массиву список элементов после его создания невозможно, т.е. следующая запись недопустима

int[] d= new int[5]; d={1,2,3,4,5};

Обычно доступ к элементам массива осуществляется с помощью комбинации имя массива + индекс элемента следующим способом:

имя_массива[индекс элемента].

То есть, чтобы обратится к i- тому элементу массива а, используют запись а[i], при этом первый элемент массива имеет индекс 0.

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

Обработка элементов массива обычно организуется в цикле.

В языке С# определены 4 конструкции цикла.

for (список_инициализаторов; выражение- условие; список_операторов) тело_цикла

while (выражение- условие) тело_цикла

do тело_цикла while (выражение- условие);

foreach ( тип имя in выражение ) тело_цикла

Первые три цикла имеют такой же синтаксис как в языке С.

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

break (выход из цикла)

goto (безусловный переход на метку)

return (возврат из функции)

throw (генерации исключения)

continue (переход к следующей итерации)

Конструкция foreach повторяет группу вложенных операторов (тело цикла) для каждого элемента массива или коллекции объектов (коллекции объектов будут рассмотрены позднее). Удобство этого вида цикла заключается в том, что не требуется определять количество элементов в группе и выполнять их перебор по индексу. Имя в операторе foreach задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива (коллекции). В качестве выражения чаще всего применяется имя массива или коллекции объектов. В теле цикла, выполняются действия с переменной цикла. Тип переменной должен соответствовать типу элемента массива. Например,

int[] fibarray = new int[] {0, 1, 2, 3, 5, 8, 13};

foreach (int i in fibarray) System.Console.WriteLine(i);

Обычно конструкция foreach используется для «просмотра» массива или коллекции (получения необходимой информации о его (ее) элементах). Не рекомендуется использовать конструкцию foreach для добавления или удаления элементов исходной коллекции во избежание непредвиденных побочных эффектов. Если нужно добавить или удалить элементы исходной коллекции, следует использовать цикл for.

Для массивов определена операция присваивания как операция присваивания ссылок. Рассмотрим пример.

//объявление массивов с отложенной инициализацией

int[]u,v;

u = new int[3];

for(int i=0; i<3; i++) u[i] =i+1;

v=newint[4];

v=u; //допустимое присваивание

Это корректное ссылочное присваивание: хотя u и v имеют разное число элементов, но они являются объектами одного класса. В результате присваивания память, отведенная массиву v, освободится. Обе ссылки u и v будут теперь указывать на один и тот же массив, так что изменение элемента одного массива немедленно отражается на другом массиве.

Так как массивы в языке C# имеют общего предка - базовый класс Array, то на практике для работы с массивами используют свойства и методы данного класса, наиболее популярные из которых приведены в таблице 1 и таблице 2 соответственно.

Таблица 5.1.

Некоторые свойства класса Array

Имя

Описание

IsFixedSize

Получает значение, показывающее, имеет ли список Array фиксированный размер.

IsReadOnly

Получает значение, указывающее, доступен ли объект Array только для чтения

Length

Получает 32-разрядное целое число, представляющее общее число элементов во всех измерениях массива Array.

LongLength

Получает 64-разрядное целое число, представляющее общее число элементов во всех измерениях массива Array.

Rank

Получает ранг (размерность) объекта Array

Таблица 5.1.

Некоторые методы класса Array

Имя

Описание

BinarySearch(Array, Object)

Выполняет поиск заданного элемента во всем отсортированном одномерном массиве Array

Clear

Задает диапазон элементов массива Array равным нулю, false или null в зависимости от типа элемента.

Clone

Создает неполную копию массива Array.

Copy(Array, Array, Int32)

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 32-разрядное целое число.

CopyTo(Array, Int32)

Копирует все элементы текущего одномерного массива Array в заданный одномерный массив Array, начиная с указанного индекса в массиве назначения Array. Индекс задается как 32-разрядное целое число.

Equals(Object)

Определяет, равен ли заданный объект Object текущему объекту Object. (Унаследовано от Object.)

Exists<T>

Определяет, содержит ли заданный массив элементы, удовлетворяющие условиям указанного предиката.

Find<T>

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает первое найденное вхождение в пределах всего списка Array.

FindAll<T>

Извлекает все элементы, удовлетворяющие условиям указанного предиката.

FindIndex<T>(T[], Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого найденного вхождения в пределах всего списка Array.

FindLast<T>

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает последнее найденное вхождение в пределах всего списка Array.

ForEach<T>

Выполняет указанное действие с каждым элементом указанного массива.

GetLength

Получает 32-разрядное целое число, представляющее количество элементов в заданном измерении массива Array.

GetLowerBound

Получает нижнюю границу заданного измерения массива Array.

GetUpperBound

Получает верхнюю границу заданного измерения массива Array.

GetValue(Int32)

Получает значение, хранящееся в указанной позиции одномерного массива Array. Индекс задается как 32-разрядное целое число.

IndexOf(Array, Object)

Выполняет поиск заданного объекта внутри всего одномерного массива Array и возвращает индекс его первого вхождения.

Initialize

Инициализирует каждый элемент массива Array типа значения путем вызова конструктора по умолчанию для типа значений.

LastIndexOf(Array, Object)

Выполняет поиск заданного объекта и возвращает индекс его последнего вхождения внутри всего одномерного массива Array.

Resize<T>

Изменяет количество элементов в массиве до указанной величины.

Reverse(Array)

Изменяет порядок элементов во всем одномерном массиве Array на обратный.

SetValue(Object, Int32)

Присваивает значение элементу, находящемуся в указанной позиции одномерного массива Array. Индекс задается как 32-разрядное целое число.

Sort(Array)

Сортирует элементы во всем одномерном массиве Array.

ToString

Возвращает строку, которая представляет текущий объект. (Унаследовано от Object.)

TrueForAll<T>

Определяет, все ли элементы массива удовлетворяют условиям указанного предиката.

Многие из методов, указных в таблице 2 многократно переопределены. Подробнее со свойствами и метода класса Array можно познакомиться в библиотеке MSDN11.

Рассмотрим пример работы с массивами.

using System;

namespace array

{

class SamplesArray

{

static void PrintValues(Object[] myArr)

{

foreach (Object i in myArr)

{

Console.Write("\t{0}", i);

}

Console.WriteLine();

}

static void PrintValues(int[] myArr)

{

foreach (int i in myArr)

{

Console.Write("\t{0}", i);

}

Console.WriteLine();

}

staticvoidMain()

{

// Создание и инициалиция массивов типа intиobject.

int[] myIntArray = new int[5] { 1, 2, 3, 4, 5 };

Object[] myObjArray = new Object[5] { 26, 27, 28, 29, 30 };

// Вывод на экран элементов двух массивов.

Console.WriteLine("Initially,");

Console.Write("integer array:");

PrintValues(myIntArray);

Console.Write("Object array: ");

PrintValues(myObjArray);

// Копирование первых 2 элементов из массива myIntArray в массив myObjArray

System.Array.Copy(myIntArray, myObjArray, 2);

// Вывод на экран элементов двух массивов

Console.WriteLine("\nAfter copying the first two elements of the integer array to the Object array,");

Console.Write("integer array:");

PrintValues(myIntArray);

Console.Write("Object array: ");

PrintValues(myObjArray);

// Копирование последних 2 элементов из массива myObjArrayв массивmyIntArray.

System.Array.Copy(myObjArray, myObjArray.GetUpperBound(0) - 1, myIntArray, myIntArray.GetUpperBound(0) - 1, 2);

/*Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массивArray, начиная с заданного индекса назначения. Длина и индексы задаются как 64-разрядные целые числа.*/

// Вывод на экран элементов двух массивов

Console.WriteLine("\nAfter copying the last two elements of the Object array to the integer array,");

Console.Write("integer array:");

PrintValues(myIntArray);

Console.Write("Object array: ");

PrintValues(myObjArray);

Console.ReadKey();

}

}

/*

Результат выполнения программы.