Смекни!
smekni.com

Основы алгоритмизации и программирования 2 (стр. 14 из 32)

В этом случае можно было бы использовать две разные переменные, написав уже знакомый нам код:

orientation myDirection;
double myDistance;

В таком подходе с использованием двух переменных нет ничего плохого, однако намного удобней (особенно если маршрутов много) хранить всю эту информацию в одном месте.

Описание структур Для описания структур используется ключевое слово struct:

struct <имяТипа> {
<объявлениеЧлена> }

В разделе <объявлениеЧлена> содержатся объявления переменных (они называются полями) практически в обычном формате. Объявление каждого члена имеет следующий вид:

<доступ> <тип> <имя>;

Для того чтобы код, обращающийся к структуре, имел доступ к ее полям, в разделе <доступ> следует использовать ключевое слово public (общий). Например:

struct route {

public orientation direction; public double distance; }

После того как структура описана, можно использовать ее для описания переменных соответствующего типа: route myRoute;

Для получения доступа к отдельным полям этой составной переменной следует использовать точку:

myRoute.direction = orientation.north;
myRoute.distance =2.5;

3.2.4.Массивы

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

Предположим, к примеру, что вам необходимо выполнить вычисления, в которых задействованы имена всех ваших друзей. Для этого можно воспользоваться обычными переменными типа string, например, так:

string friendNamel = "Robert Barwell"; string friendName2 = "Mike Parry"; string friendName3 = "Jeremy Beacock" ;

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

Альтернативной возможностью является использование массивов. Массив представляет собой список индексированных переменных.

Допустим, что имеется массив, в котором хранятся все три имени, приведенные выше, и которое называется friendNames. Тогда для получения доступа к отдельным элементам этого массива, просто указывая их индекс в квадратных скобках, как показано в следующем примере:

friendNames [<индекс>]

Индекс – это целое число, имеющее значение 0 для первого вхождения, 1 – для второго и т. д. Это означает, что у нас появляется возможность пройти все вхождения в цикле, например:

int i;

for (i = 0; i < 3; i++)

{

Console.WriteLine("Имя с индексом {0}: {1}", i, friendNames[i]); }

Каждый массив обладает единым базовым типом, т. е. все отдельные вхождения в массив имеют один и тот же тип. В данном случае массив friendNames имеет базовый тип string, поскольку он предназначается для хранения переменных типа string.

Вхождения массива часто называются элементами.

Объявление массивов

Массивы объявляются следующим образом:

<базовыйТип> [ ] <имя>;

В данном случае <базовыйТип> может быть произвольным типом, в том числе перечислимым или структурой.

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

int[] myIntArray;
myIntArray[10] = 5

;

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

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

int[] mylntArray = {5, 9, 10, 2, 99};

В данном случае описывается массив, состоящий их пяти элементов, и всем им присваивается целое значение. Второй способ предполагает использование следующего синтаксиса: int[] myIntArray = new int[5];

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

int [ ] myIntArray = new int[размерМассива];

При желании можно одновременно использовать оба метода int[] myIntArray = new int[5] {5, 9, 10, 2, 99};

В этом случае размеры массива должны совпадать с количеством элементов в списке. Следующая запись является недопустимой:

int[] myIntArray = new int[10] {5, 9, 10, 2, 99};

Здесь описывается массив, состоящий из 10 элементов, а определяются только 5 из них; компиляция этой записи не пройдет. Побочным эффектом такого положения вещей является то, что если мы описываем размерность массива с помощью переменной, то она должна являться константой. Например:

const int arraySize = 5;
int[] myIntArray = new int [arraySize] {5, 9, 10, 2, 99}

;

Если ключевое слово const будет пропущено, программа работать не будет.

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

int[] myIntArray;
myIntArray = new int[5]

;

Теперь вы уже знаете достаточно для того, чтобы попробовать написать некоторую программу 1. Создайте новое консольное приложение 2. Добавьте следующий код в Classl.cs.

static void Main(string[] args) {

string[] fnendNames = {"Robert Barwell", "Mike Parry", "Jeremy Beacock"}; int i;

Console.WriteLine("Here are {0} of my friends:", friendNames.Length); for (i=0; i < friendNames.Length; i++) { Console.WriteLine(friendNames[i] ) ; } }

3. Запустите программу (см. рис. справа).

Как это работает

В этом коде объявляется массив типа string, состоящий из трех значений, которые затем выводятся на консоль с помощью цикла for. Обратите внимание, что существует возможность узнать общее количество элементов массива посредством параметра friendNames.Length:

Console.WriteLme("Here are {0} of my friends:"; friendNames.Length) ; Это очень удобный способ определения размера массива.

При выводе значений массива в цикле for легко допустить ошибку. Например, попытаемся вместо оператора < использовать оператор < =, как показано ниже. for (i = 0; i <= friendNames.Length; i++) {

Console.WriteLine(friendNames[i]); }

Компиляция с последующим выполнением программы приведет к появлению окна с сообщением об ошибке: "Необрабатываемая исключительная ситуация типа 'выход индекса за пределы диапазона' в ….." (см. рис. слева).

В приведенном случае мы попытались получить доступ к friendNames[3]. Как вы помните, значения индексов массива начинаются с нуля, поэтому последним элементом данного массива является friendNames[2]. Обращение к элементам массива, выходящим за его границу, приведет к ошибке. На самом деле существует более удобный способ доступа ке всем элементам массива с помощью цикла foreach.

3.2.5.Циклы foreach

Цикл foreach позволяет обращаться ко всем элементам массива с помощью очень простого синтаксиса

foreach (<базовыйТип> <имя> in <массив>) {
// можно использовать <имя> для доступа к очередному элементу }

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

static void Main(string [] args) {

string[] friendNames = {"Robert Barwell", "Mike Parry","Jeremy Beacock"}; Console.WriteLme("Here are {0} of my friends:", friendNames.Length) ; foreach (string friendName in friendNames)

{

Console.WriteLine(friendName) } }

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

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

Например, написать такую программу нельзя:

foreach (string friendName in friendNames) { friendName = "Rupert the bear"; }

При попытке откомпилировать этот код будет выдано сообщение об ошибке.

3.2.6.Многомерные массивы

Многомерный массив – это объект, в котором для осуществления доступа к его элементам используется несколько индексов.

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