4. Многомерные массивы и массивы массивов в c#
TRANSCRIPT
Высшая школа экономики, Москва, 2013
www.hse.ru
Язык программирования C# и платформа
.NET.
Многомерные массивы
Массивы массивов
Максименкова Ольга ВениаминовнаСтарший преподаватель
Кафедра управления разработкой программного обеспечения
МНОГОМЕРНЫЕ МАССИВЫ
• Матрицы
• Обработка матриц
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
Одномерные массивы (напоминание)
Объявление ссылки
Описание с инициализацией
Описание и последующаяинициализация
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, Максименкова О.В.
Матрицы (двумерные массивы). Индексы элементов матриц
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, Максименкова О.В.
Способы инициализации элементов матрицы
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, Максименкова О.В.
Перебор элементов матрицы
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, Максименкова О.В.
Поэлементный вывод матрицы
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, Максименкова О.В.
Обработка элементов матрицы
ФПК учителей НИУ ВШЭ 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();
}
МАССИВЫ МАССИВОВ
• Инициализация
• Поэлементный ввод
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
Многомерные массивы. Инициализация элементов
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, Максименкова О.В.
Поэлементный вывод многомерного массива
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, Максименкова О.В.
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, Максименкова О.В.
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, Максименкова О.В.
Массив массивов для коэффициентов треугольника паскаля
14
1
1 1
1 2 1
1 … 2 12
…
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
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, Максименкова О.В.
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, Максименкова О.В.
101000, Россия, Москва, Мясницкая ул., д. 20
Тел.: (495) 621-7983, факс: (495) 628-7931
www.hse.ru