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

17
Высшая школа экономики, Москва, 2013 www.hse.ru Язык программирования C# и платформа .NET. Многомерные массивы Массивы массивов Максименкова Ольга Вениаминовна Старший преподаватель Кафедра управления разработкой программного обеспечения

Upload: olga-maksimenkova

Post on 15-Jan-2017

443 views

Category:

Education


3 download

TRANSCRIPT

Page 1: 4. Многомерные массивы и массивы массивов в C#

Высшая школа экономики, Москва, 2013

www.hse.ru

Язык программирования C# и платформа

.NET.

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

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

Максименкова Ольга ВениаминовнаСтарший преподаватель

Кафедра управления разработкой программного обеспечения

Page 2: 4. Многомерные массивы и массивы массивов в C#

МНОГОМЕРНЫЕ МАССИВЫ

• Матрицы

• Обработка матриц

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 3: 4. Многомерные массивы и массивы массивов в C#

Одномерные массивы (напоминание)

Объявление ссылки

Описание с инициализацией

Описание и последующаяинициализация

int[ ] intArr; // ссылка на целочисленный массив

double[ ] arr; // ссылка на вещественный массив

int[ ] intArr = { 1, 3, -8, 19, 0, 11 };

double[ ] arr = { 3.14, 0.0, 0.5 };

int[ ] intArr; // ссылка

intArr = new int[5]; // выделение памяти

intArr[0] = -1;

intArr[1] = 12;

intArr[2] = 34;

intArr[3] = -23;

intArr[4] = 78;

int[ ] intArr; // ссылка

intArr = new int[5]; // выделение памяти

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

intArr[i] = i * i - 1;

Console.Write(intArr[i] + " ");

}

ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 4: 4. Многомерные массивы и массивы массивов в C#

Матрицы (двумерные массивы). Индексы элементов матриц

int m = 5, n = 5

int[ , ] matr = new int[n, m]

Главная диагональ

Побочная диагональ

n

m

0

1

2

n -1

0 1 2 m -1i

j

i = j

i > j

i < j

индексы

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 5: 4. Многомерные массивы и массивы массивов в C#

Способы инициализации элементов матрицы

int[,] matr = new int[3, 4] { { 0, 1, 3, 4 }, { 5, 6, 7, 8 }, { 9, -1, -2, -3 } };

double[,] mtr = new double[10,15];

for (int i = 0; i < 10; i++) // цикл перебора строк (первый индекс)

for (int j = 0; j < 15; j++) // цикл перебора столбцов (второй индекс)

mtr[i, j] = (double)i/(j+1);

Описание с инициализацией

int[,] matr = new int { { 0, 1, 3, 4 }, { 5, 6, 7, 8 }, { 9, -1, -2, -3 } };

Заполнение матрицы при помощи циклов

Так:

Или так:

double[,] mtr = new double[10,15];

Console.Write("Test: " + mtr[1,5]);

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

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

mtr[i, j] = (double)i/(j+1);Test: 0

double[,] mtr;

Console.Write("Test: " + mtr[1,5]);

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 6: 4. Многомерные массивы и массивы массивов в C#

Перебор элементов матрицы

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

Console.WriteLine();

for (int j = 0; j < 6; j++) //столбец

Console.Write(mtr[i, j] + "\t");

}

for(int j = 0; j < 6; j++) {

Console.WriteLine();

for (int i = 0; i < 5; i++) //строка

Console.Write(mtr[i, j] + "\t");

}

int[,] mtr = new int[5,6];

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

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

mtr[i, j] = 2*i+j;

Перебираем

строки во

внешнем цикле

Перебираем

столбцы во

внешнем цикле

0 1 2 3 4 5

2 3 4 5 6 7

4 5 6 7 8 9

6 7 8 9 10 11

8 9 10 11 12 13

0 2 4 6 8

1 3 5 7 9

2 4 6 8 10

3 5 7 9 11

4 6 8 10 12

5 7 9 11 13

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 7: 4. Многомерные массивы и массивы массивов в C#

Поэлементный вывод матрицы

int[,] mtr = new int[5,6];

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

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

mtr[i, j] = 2*i+j;

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

Console.WriteLine();

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

Console.Write(mtr[i, j] + "\t");

}

int nl = 0;

foreach (int item in mtr) {

if (nl++ % 6 == 0)

Console.WriteLine();

Console.Write(item + "\t");

}

foreach (int line[] in mtr)

foreach(int item in line)

Console.Write(item + "\t");

так -нельзя

Несоответствие типа!

Перебор двумя

циклами (по строкам

и стобцам)

Перебор одним

циклом: по всем

элементам

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 8: 4. Многомерные массивы и массивы массивов в C#

Обработка элементов матрицы

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

double[ , ] mtr = new double[N, M];

Random rnd = new Random();

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

for (int j = 0; j < M; j++) {

mtr[i, j] = rnd.Next(100)+rnd.NextDouble();

}

// элементы главной диагонали

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

mtr[i, i] = 0;

int N, M;

do {

Console.Write("Введите количество строк ");

} while(!int.TryParse(Console.ReadLine(), out N)|N < 0);

do {

Console.Write("Введите количество столбцов ");

} while (!int.TryParse(Console.ReadLine(), out M) | M < 0);

// поэлементный вывод

for (int i = 0; i < N; i++) {

for (int j = 0; j < M; j++) {

Console.Write("{0:f3}\t",mtr[i, j]);

}

Console.WriteLine();

}

Page 9: 4. Многомерные массивы и массивы массивов в C#

МАССИВЫ МАССИВОВ

• Инициализация

• Поэлементный ввод

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 10: 4. Многомерные массивы и массивы массивов в C#

Многомерные массивы. Инициализация элементов

int[ ][ ] matr = new int[3][ ] { new int[ ] { 0, 1, 3, 4 },

new int[ ] { 5, 6, 7, 8 },

new int[ ] { 9, -1, -2, -3 } };

int[ ][ ] matr = new int[3][ ];

matr[0] = new int[ ] { 0, 1, 3, 4 };

matr[1] = new int[ ] { 5, 6, 7 };

matr[2] = new int[ ] { -2, -3 };

Описание с инициализацией

Описание и последующая инициализация

Random rnd = new Random();

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

int M = rnd.Next(1, 6);

matr[i] = new int[M];

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

matr[i][j] = rnd.Next(101);

}

Заполнение массива массивов при помощи циклов

Random rnd = new Random();

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

int M = rnd.Next(1, 6);

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

matr[i][j] = rnd.Next(101);

}

ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 11: 4. Многомерные массивы и массивы массивов в C#

Поэлементный вывод многомерного массива

foreach (int[ ] str in matr) {

Console.WriteLine();

foreach (int item in str)

Console.Write(item + "\t");

}

foreach (int item in matr)

Console.Write(item + "\t");

for (int i = 0; i < matr.Length; i++) {

Console.WriteLine();

for (int j = 0; j < matr[i].Length; j++)

Console.Write(matr[i][j]+"\t");

}

int[ ][ ] matr = new int[3][ ] { new int[ ] { 0, 1, 3, 4 },

new int[ ] { 5, 6, 7, 8 },

new int[ ] { 9, -1, -2, -3 } };

Доступны и индексы и

значения элементов

Доступны только

значения элементов

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 12: 4. Многомерные массивы и массивы массивов в C#

using System;

class Program {

static void Main( ) {

double[ ][ ] mtr = new double[5][ ]; // количество элемнтов (массивов) 5

Random rnd = new Random();

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

mtr[i] = new double[6]; // каждый массив-строка размером 6

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

mtr[i][j] = rnd.NextDouble();

}

foreach (double[ ] lev1 in mtr) {

foreach (double lev2 in lev1)

Console.Write("{0:f3}\t", lev2);

Console.WriteLine();

}

}

}

Матрица представлена массивом массивов

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 13: 4. Многомерные массивы и массивы массивов в C#

using System;

class Program {

static void Main() {

int[ ][ ] triangle;

uint N; // количество уровней

do {

Console.Write("Задайте количество уровней: ");

} while(!uint.TryParse(Console.ReadLine(), out N));

triangle = new int[N][ ]; // в массиве будет N целочисленных массивов

for (int i = 0; i < triangle.Length; i++) { // перебор массивов

triangle[i] = new int[i + 1]; // каждый элемент массива - массив

for (int j = 0; j < triangle[i].Length; j++)

triangle[i][j] = i+1;

}

// вывод

foreach (int[ ] lev1 in triangle) {

foreach (int lev2 in lev1)

Console.Write(lev2 + " ");

Console.WriteLine();

}

}

}

Число элементов строки массива равно номеру строки

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 14: 4. Многомерные массивы и массивы массивов в C#

Массив массивов для коэффициентов треугольника паскаля

14

1

1 1

1 2 1

1 … 2 12

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 15: 4. Многомерные массивы и массивы массивов в C#

15

using System;

class Program {

static void Main( ) {

int[ ][ ] paskal; // ссылка на массив ссылок на массив

int n;

do Console.Write("Введите n: ");

while (!int.TryParse(Console.ReadLine(), out n) || n < 0);

paskal = new int[n + 1][ ]; // объект - массив пустых ссылок

Console.WriteLine("paskal.GetType()=" + paskal.GetType());

for (int i = 0; i < paskal.Length; i++) {

paskal[i] = new int[i + 1]; // объект - массив элементов типа int

paskal[i][0] = paskal[i][i] = 1;

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

paskal[i][j] = paskal[i - 1][j - 1] + paskal[i - 1][j];

}

foreach (int[ ] ar in paskal) { // перебор ссылок

foreach (int cnk in ar) // перебор элементов типа int

Console.Write("{0,4}", cnk);

Console.WriteLine();

}

}

ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 16: 4. Многомерные массивы и массивы массивов в C#

int[ ][,] arr; // каждый элемент массива - двумерный массив

int arrLength; // количество двумерных массивов в массиве

do {

Console.Write("Задайте количество двумерных массивов: ");

}while(!int.TryParse(Console.ReadLine(), out arrLength)||arrLength<1);

arr = new int[arrLength][,]; // массив из arrLenght двумерных

int dim1, dim2;

do {

Console.Write("Первое измерение: ");

} while (!int.TryParse(Console.ReadLine(), out dim1)||dim1<1);

do {

Console.Write("Второе измерение: ");

} while (!int.TryParse(Console.ReadLine(), out dim2) || dim2 < 1);

Random rnd = new Random();

for (int i = 0; i < arrLength; i++) {

arr[i] = new int[dim1, dim2]; // i-й элемент - матрица dim1xdim2

// заполняем каждую матрицу случайными числами от 20 до 50

for (int j = 0; j < arr[i].GetLength(0); j++)

for (int k = 0; k < arr[i].GetLength(1); k++)

arr[i][j, k] = rnd.Next(20, 51);

}

for (int i = 0; i < arr.Length; i++) {//вывод на экран массива двумерных массивов

for (int j = 0; j < arr[i].GetLength(0); Console.WriteLine(), j++)

for (int k = 0; k < arr[i].GetLength(1); k++)

Console.Write(arr[i][j, k] + "\t");

Console.WriteLine();

} ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.

Page 17: 4. Многомерные массивы и массивы массивов в C#

101000, Россия, Москва, Мясницкая ул., д. 20

Тел.: (495) 621-7983, факс: (495) 628-7931

www.hse.ru