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

Курс лекций CS (первый семестр)

.pdf
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
2.69 Mб
Скачать

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

int n=5;

int[] myIntArray = new int [n];

При желании можно одновременно использовать оба метода:

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

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

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

Здесь описывается массив, состоящий из 10 элементов, а определяются только 5 из них; компиляция этой записи не пройдет.

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

const int arraySize=5;

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

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

int[] myIntArray;

mylntArray = new int[5];

91

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Массив в C# нумеруется, начиная с 0. Чтобы определить элемент массива в С# используется запись с индексом в квадратных скобках. Индекс должен только целого типа. Индекс последнего элемента на единицу меньше, чем размер массива.

Например:

a[0] – первый элемент массива a

a[4] – последний элемент массива a

Можно использовать индексы и присваивать значения элементам массива индивидуально и присваивать массив массиву поэлементно.

Пример.

int [] a=new int [5];

for(int i=0;i<5;i++)

a[i]=i+1;

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

int [] b=new int[5];

for(int i=0;i<5;i++)

b[i]=a[i];

Пример. Рассмотрим массив действительных чисел a[n]. Пусть требуется переставить элементы этого массива так, чтобы после перестановки они были упорядочены по неубыванию: a[0] a[1]… a[n-1]. Для решения этой задачи можно применить алгоритм Сортировки выбором: найти элемент массива, имеющий наименьшее значение, переставить его с первым элементом, затем проделать то же самое, начав со второго элемента и т.д.

Решение.

using System;

using System.Collections.Generic;

92

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

const int n=5;

double[] a = new double[n]; double min;

int k;

Console.WriteLine("Введите 5 элементов массива a:"); for (int i=0;i<n;i++)

a[i]=Convert.ToDouble(Console.ReadLine()); for(int j=0;j<n-1;j++)

{

min=a[j];

k=j;

for(int i=j+1;i<n;i++)

if (a[i]<min)

{

min=a[i];

k=i;

}

a[k]=a[j];

a[j]=min;

93

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

}

for(int i=0;i<n;i++)

Console.WriteLine("a[{0}]={1}",i,a[i]);

Console.ReadLine();

} } }

Результат.

Эту же задачу можно решить при помощи другого алгоритма Сортировки обменами: последовательным просмотром чисел a[0], …, a[n-1] найти наименьшее i такое, что a[i]>a[i+1]. Поменять местами a[i] и a[i+1], возобновить просмотр с элемента a[i+1] и т.д. Тем самым наибольшее число передвинется на последнее место. Следующие просмотры начинать опять сначала, уменьшая на единицу количество просматриваемых элементов. Массив будет упорядочен после просмотра, в котором участвовали только первый и второй элемент.

Решение.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

94

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

const int n=5;

double[] a = new double[n]; double min;

Console.WriteLine("Введите 5 элементов массива a:"); for (int i=0;i<n;i++)

a[i]=Convert.ToDouble(Console.ReadLine()); for (int j = 0; j < n - 1; j++)

{

for (int i = 0; i < n - j - 1; i++) if (a[i] > a[i + 1])

{

min = a[i]; a[i] = a[i + 1]; a[i + 1] = min;

}

}

for(int i=0;i<n;i++) Console.WriteLine("a[{0}]={1}",i,a[i]);

Console.ReadLine();

} } }

Результат.

95

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Циклы foreach.

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

foreach (<базовыйТип> <имя> in <массив>)

{

// можно использовать <имя> для доступа к очередному элементу

}

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

foreach (double myEl in a)

Console.WriteLine(myEl);

Результат.

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

96

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

Лекция №15.

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

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

int [,] rty;

Описания массивов с большим числом размерностей требуют больше запятых.

int [, , , ] rty;

Так объявляется четырехмерный массив.

Для присваивания значений используется аналогичный синтаксис, причем размерности отделяются одна от другой запятыми. Для того чтобы объявить и инициализировать обсуждавшийся выше двумерный массив rty с базовым типом int, размерностью 3 на 4, необходима следующая строка:

int [,] rty = new int [3,4] ;

Этот оператор описывает двумерный массив, который можно себе представить как таблицу, состоящую из 3 строк и 4 столбцов.

Доступ к каждому измерению открывается своим индексом. Например, rty[2, 3] – значение элемента, лежащего на пересечении третьей строки и четвертого столбца. (Напоминание: отсчет начинается с 0 и что первая цифра относится к вложенному массиву.)

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

int [,] rty = {{1, 2, 3, 4 } , {2, 3, 4, 5 } , {3, 4, 5, 6}};

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

Для работы с элементами многомерного массива необходимо использовать вложенные циклы. Например, ввод элементов массива rty:

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

97

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

for (int j = 0; j < 4; j++)

rty[i, j] = Convert.ToInt32(Console.ReadLine());

Двумерный массив, у которого количество столбцов равно количеству строк называется квадратичной матрицей. У квадратичной матрицы есть главная диагональ, у которой номер строки i равен номеру столбца j, т.е. для диагональных элементов матрицы a[i,j] равносильна запись a[i,i]. Кроме того, имеется побочная диагональ, для которой номер столбца j=n-i-1, т.е. для таких элементов матрицы а[i, n-i-1].

Пример. Определить сумму всех элементов матрицы размера 3 на 3, расположенных выше главной диагонали.

Решение.

using System;

using System.Collections.Generic; using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int [,] a= new int [3,3]; int i,j;

Console.WriteLine("Введите 9 элементов матрицы"); for(i=0;i<3;i++)

for (j=0;j<3;j++) a[i,j]=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Вы ввели матрицу вида:"); for (i = 0; i < 3; i++)

98

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

{

for (j = 0; j < 3; j++) Console.Write("{0}\t", a[i, j]);

Console.Write('\n');

}

int s=0;

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

for(j=i;j<3;j++) //включая диагональные элементы; j=i+1- не

включая

s=s+a[i,j]; Console.WriteLine("Сумма элементов={0}", s); Console.ReadLine();

}

}

}

Результат.

Массивы массивов.

Многомерные массивы, которые мы рассматривали, называются прямоугольными, поскольку у них каждая "строка" имеет один и тот же размер. Однако существует возможность использовать ступенчатые (jagged) массивы, у которых "строки" могут быть неодинакового

99

Кафедра теоретической механики ИМЭМ ОНУ им. И.И.Мечникова

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

Синтаксис, применяемый для объявления массивов массивов, подразумевает использование в объявлении массива нескольких пар квадратных скобок, например:

int[][] lntArray;

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

lntArray = new int[2][]; lntArray [0] = new int[3]; lntArray [1] = new int[4];

Можно также воспользоваться видоизмененной формой литерального присваивания:

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

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

int[] [] dTo10 = {new int[] {1},

new int[] {1,2}, new int[] {1, 3}, new int[] {1, 2, 4}, ; new int [] {1, 5}, new int[] {1, 2, 3, 6}, new int[] {1,7},

new int [] {1, 2, 4, 8}, new int [] {1, 3 , 9}, new int[] {1, 2, 5, 1}};

100