Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Тема 5 Многомерные массивы, структуры в языке C#.
Лекция 17 МНОГОМЕРНЫЕ МАССИВЫ
17.1 Двумерные массивы
В языке С#, как и в других языках программирования, можно определять не только одномерные массивы (вектора), но и двумерные и многомерные массивы, количество элементов в которых ограниченно только объемом свободной памяти компьютера.
Трехмерное, а тем более многомерное представление информации обычно описывается только математически. Предположим, что некоторый предприниматель имеет 5 точек продажи своего товара. Информация о продаже 100 товаров по месяцам в течение года может быть представлена следующим трехмерным массивом:
int[ , ,] Tovar = new int[5,12,100];
где индекс 0..4 определяет точки продажи товара;
индекс 0..11 – месяц продажи;
индекс 0..99 – номер продаваемого товара.
При просмотре информации о продаже товара предприниматель должен получать ее на экране монитора в виде матрицы или таблицы, например – продажа товара в первой точке в течение года или продажа всех товаров по месяцам и т. д. Таким образом, необходимо преобразовать многомерный массив к виду двумерного массива, фиксируя значения некоторых индексов.
Технология работы с многомерными массивами и двухмерными массивами практически одинакова. Поэтому будем рассматривать работу с многомерным массивом на примере двумерного массива.
Задача 17.1 Сформировать матрицу 6Ч6 случайных целых чисел в диапазоне от минус 50 до 100. Напечатать ее. Вычислить и напечатать сумму всех положительных и отрицательных чисел. Найти и напечатать наибольший и наименьший элементы матрицы. В программе предусмотреть меню.
Исходный код программы:
using System;
namespace ConsoleApplication1
{
class Program
{
public static int sp, so;
public static void sozd(int[,] ma)
{
Random rnd = new Random();
Console. WriteLine("Матрица создана!!");
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
ma[i, j] = rnd. Next() % 101 - 50;
Console. Write(ma[i, j]+"\t");
}
Console. WriteLine();
}
}
public static void polotr(int[,] ma)
{
sp = 0; so = 0;
for (int i = 0; i < 6; i++)
for (int j = 0; j < 6; j++)
if (ma[i, j] < 0)
so = so + ma[i, j];
else sp = sp + ma[i, j];
Console. WriteLine("Сумма положительных чисел = {0}", sp);
Console. WriteLine("Сумма отрицательных чисел = {0}", so);
}
public static void maxmin(int[,] ma)
{
int maxi = -100, mini = 150;
for (int i = 0; i < 6; i++)
for (int j = 0; j < 6; j++)
{
if (maxi < ma[i, j]) maxi = ma[i, j];
if (mini > ma[i, j]) mini = ma[i, j];
}
Console. WriteLine("Максимальное число = {0}", maxi);
Console. WriteLine("Минимальное число = {0}", mini);
}
static void Main()
{
int[,] a = new int[6, 6];
int k = 0;
string buf;
while (k < 4)
{
Console. WriteLine("1 - Создать и напечатать матрицу
6х6");
Console. WriteLine("2 - Найти сумму положительных и
отрицательных чисел");
Console. WriteLine("3 - Найти максимальное и
минимальное числа матрицы");
Console. WriteLine("4 - Выход из программы");
Console. WriteLine("Введите пункт меню программы");
buf = Console. ReadLine();
k = Convert. ToInt32(buf);
switch (k)
{
case 1: sozd(a); break;
case 2: polotr(a); break;
case 3: maxmin(a); break;
default: break;
}
}
}
}
}
Работа программы:
1 - Создать и напечатать матрицу 6х6
2 - Найти сумму положительных и отрицательных чисел
3 - Найти максимальное и минимальное числа матрицы
4 - Выход из программы
Введите пункт меню программы
1
Матрица создана!!
-37 38 -10 38 -19 12
-19 -12 25 42 -22 -39
3 48 -22 -4 -10 45
11 9 40 -21 32 -8
-38 -33 -45 4 -30 2
4 -34 -49 8 -30 2
1 - Создать и напечатать матрицу 6х6
2 - Найти сумму положительных и отрицательных чисел
3 - Найти максимальное и минимальное числа матрицы
4 - Выход из программы
Введите пункт меню программы
2
Сумма положительных чисел = 363
Сумма отрицательных чисел = -482
1 - Создать и напечатать матрицу 6х6
2 - Найти сумму положительных и отрицательных чисел
3 - Найти максимальное и минимальное числа матрицы
4 - Выход из программы
Введите пункт меню программы
3
Сумма положительных чисел = 363
Сумма отрицательных чисел = -482
1 - Создать и напечатать матрицу 6х6
2 - Найти сумму положительных и отрицательных чисел
3 - Найти максимальное и минимальное числа матрицы
4 - Выход из программы
Введите пункт меню программы
При разработке алгоритма решения задачи выполнена ее декомпозиция – разбиение задачи на отдельные самостоятельные фрагменты. Таким образом, были выделены в отдельные задачи процессы создания и печати матрицы, процессы вычисления сумм положительных и отрицательных элементов матрицы и процессы нахождения максимального и минимального элементов матрицы. Реализация перечисленных задач с помощью отдельных статических методов позволило организовать в методе static void Main() меню программы, что делает исходный код программы простым и понятным.
17.2 Меню программы
В программе предусмотрен цикл работы с меню, окончание которого связано с выбором пункта меню – завершить программу или несуществующий пункт меню больше 4.
Непосредственно выбор того или иного метода реализации пункта меню осуществляется с помощью оператора switch – переключателя программы.
Оператор switch имеет следующий формат:
switch ( выражение)
{
case константа выбора_1 : [список операторов; ]
case константа выбора_2 : [список операторов; ]
. . .
[ default : список операторов; ]
}
Оператор switch состоит из двух частей. Первая часть оператора представляет собой служебное слово switch, за которым в круглых скобках находится выражение. Выражение может быть любого типа, для которого существует неявное преобразование к целочисленным типам или типа char (или строкового типа).
Вторая часть представляет собой возможные варианты продолжения программы с помощью оператора выбора case и соответствующей константе выбора. Если выражение за словом switch равно 2, то программа ищет оператор выбора case с константой выбора равной 2 и выполняет все стоящие за этой меткой операторы.
Если среди констант выбора операторов выбора нет метки совпадающей со значением выражения оператора switch, то программа переходит на выполнение операторов стоящих за служебным словом default (по умолчанию) или на выполнение оператора, стоящего в программе за оператором switch.
«Список операторов» должен заканчиваться оператором перехода, например, оператором break, goto или return.
Обычно последним в этом списке операторов находится оператор break, который завершает работу оператора switch. Это необходимо для запрещения перехода на выполнение следующего оператора выбора.
Оператор goto обычно используют для последовательного выполнения нескольких операторов выбора.
17.3 Многомерные массивы
По определению, массивы позволяют объединять переменные одного типа, в том числе и другие одномерные массивы. Объединяемые массивы, в свою очередь, могут содержать другие одномерные массивы и т. д. Такие объединения массивы массивов называют многомерные массивы.
Если размерность объединяемых массивов одинаковые, то такие многомерные массивы обычно называют «прямоугольными» массивами.
Если размерности объединяемых массивов различные, то такие многомерные массивы обычно называют «ломаными» (jagged) массивами.
Некоторые алгоритмы работы с прямоугольными массивами мы рассмотрели при решении предыдущей задачи на примере работы с матрицей.
Рассмотрим процессы создания и обработки элементов «ломаного» массива.
Задача 17.2 Предприниматель имеет 5 точек продажи своего товара. В каждой точке число различных товаров является случайным числом в диапазоне от 10 до 30 единиц. Стоимость каждого товара также является случайным числом и находится в диапазоне от 10 да 70 у. е. Определить, какое количество товаров реализуется во всех 5 точках и их общую стоимость.
Исходный код программы:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
//Объявление ломаного массива
int[][] mtovar = new int[5][];
int k = 0;
int j, kol, cto;
string buf;
Random rnd = new Random();
//Инициализация ломаного массива
for (int i = 0; i < 5; i++)
{
j = rnd. Next() % 21 + 10;
mtovar[i] = new int[j];
}
Console. WriteLine("Матрица создана!!");
kol = 0; cto = 0;
//Формирование и печать ломаного массива
for (int i = 0; i < 5; i++)
{
kol = kol + mtovar[i].Length;
for ( j = 0; j < mtovar[i].Length; j++)
{
mtovar[i][j] = rnd. Next() % 61 + 10;
cto = cto + mtovar[i][j];
Console. Write(mtovar[i][j]+" ");
}
Console. WriteLine();
}
Console. WriteLine();
Console. WriteLine("Количества реализуемых товаров =
{0}", kol);
Console. WriteLine("Их общая стоимость = {0}", cto);
Console. WriteLine("Для продолжения нажмите клавишу
Enter");
Console. ReadLine();
}
}
}
Работа программы:
Матрица создана!!
34 58 47 54 69 40 13 65 41 44 69 10 13 24 37 56 27 20 20 70 52 12 47 56 68
23 37 69 48 21 48 15 23 31 52 24 47 61 17 15 20 55 41
54 17 50 19 47 58 34 44 68 56 34 12 32 21 59 54 53 10
15 27 27 64 61 58 53 40 23 19 37 10 15 60 68
39 61 49 28 11 61 18 21 45 51
Количества реализуемых товаров = 86
Их общая стоимость = 3376
Для продолжения нажмите клавишу Enter
При объявлении ломаного массива размерность второго индекса не указывается, а сами индексы помещаются в квадратные скобки (разделитель запятая не используется), например:
int[][] mtovar = new int[5][];
Количество «столбцов» для каждой «строки» ломаного массива определяется динамически:
j = rnd. Next() % 21 + 10;
mtovar[i] = new int[j];
При обращении к элементам ломаного массива необходимо каждый индекс помещать в квадратные скобки, например:
mtovar[i][j] = rnd. Next() % 61 + 10;
17.4 Вопросы для проверки
17.4.1 Укажите правильный вариант объявления и инициализации двумерного массива
mas new int[5,4]; mas = new int[4,5]; int[,] mas = mew int[4, 5]; int[,] = mas new int[4,5] ; int[] = mas new int[5,4];17.4.2 Что делает следующей фрагмент программы?
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
Console. WriteLine(ma[i, j]+"\t");
}
выводит на экран монитора в строку все значения матрицы ma; выводит на экран монитора в столбец все значения матрицы ma; печатает пробелы на экране монитора; выводит на экран монитора значения матрицы ma по строкам; выводит на экран монитора значения матрицы ma по столбцам;17.4.3 Для чего предназначен оператор switch?
17.4.4 Для чего используется <выражение> в операторе switch<выражение>?
17.4.5 Почему действие метки case должно заканчиваться оператором break в операторе switch?
Продолжение темы 5 Многомерные массивы, структуры в языке C#.
Лекция 18 СТАНДАРТНЫЕ МАССИВЫ ЯЗЫКА C#
18.1 Класс массив Array
Объединение переменных в массивы широко используется в различных алгоритмах и системах обработки данных, например, реляционные базы данных или алгоритмы сортировки и поиска в поисковых массивах представленных различными списками и т. д. Поэтому многие среды визуального программирования содержат специальные классы для работы с массивами.
В языке C# для работы с массивами предназначен класс System. Array (класс Array в пространстве имен System).
Этот класс имеет статические свойства и методы, позволяющие их использовать как при работе с массивами, созданными с помощью методов этого класса, так и любыми массивами, созданными обычным способом.
Наиболее часто используемым свойством является свойство целого типа Length, позволяющее получать количество элементов в массиве. Например, количество элементов массива masi определяется как masi. Length.
Еще одно свойство целого типа Rank позволяет определять количество «измерений» (размерность) массива.
18.2 Основные методы класса Array
Наиболее часто используемые методы класса System. Array приведены в таблице 18.1.
Таблица 18.1 Методы класса System. Array
Метод | Описание |
Static int BinarySearch (Array, object, IComparer); | Метод двоичного поиска. Ищет в одномерном отсортированном массиве Array элемент object с помощью интерфейса IComparer и возвращает индекс элемента или отрицательное число, если элемент не найден |
public static void Clear (Array, Index, Length); | Очистка массива. Помещает в Length элементов одномерного массива Array, начиная с элемента Index, значения 0, false или null в зависимости от типа элементов |
public static void CopyTo (Array, Index); | Копирует из текущего одномерного массива все элементы в массив Array, начиная с индекса Index |
public static Array CreateInstance(Type ElementsType, int[] Lengths, int[] LowerBounds); | Создает многомерный массив из элементов типа ElementsType с количеством Lengths элементов по каждому измерению и с нижними границами индексов LowerBounds. Перегруженные методы позволяют создавать одно - и многомерные массивы с индексами, начинающимися с 0 |
public int GetLenght (Dimension); | Возвращает количество элементов массива по измерению Dimension |
public int GetLowerBound (Dimension); | Возвращает минимальное значение индекса по измерению Dimension |
public int GetUpperBound (Dimension); | Возвращает максимальное значение индекса по измерению Dimension |
public static void Reverse (Array); | Изменяет порядок следования элементов одномерного массива Array на обратный |
public static void Sort (Array); | Сортирует элементы одномерного массива Array |
18.3 Использование методов класса Array в программах
Рассмотрим процесс написания программы с использованием класса System. Array для решения чисто учебной задачи. При этом будут рассмотрены процессы создания массива методами класса и использование методов класса для обработки элементов этого массива и массива, созданного обычным способом.
Задача 18.1 Сформировать массив A 15 случайных целых чисел в диапазоне от минус 40 до 40. Напечатать массив. Выполнить сортировку всех элементов массива. Скопировать созданный массив в некоторый другой массив такой же размерности. Выполнить в нем бинарный поиск элемента по ключу, заданному в режиме диалога с программой. При написании программы использовать методы класса System. Array.
Исходный код программы:
using System;
namespace ConsoleApplication1
{
class Program
{
public static int[] ctl = { 15 };
public static int[] niz = { 1 };
public static Array masi = Array. CreateInstance(typeof(int), ctl, niz);
public static void sozd()
{
Random rnd = new Random();
Console. WriteLine("Массив создан: ");
for (int i = masi. GetLowerBound(0); i <= masi. Length; i++)
masi. SetValue((rnd. Next(81) - 40), i);
for (int i = masi. GetLowerBound(0); i <= masi. Length; i++)
Console. Write(masi. GetValue(i) + " ");
Console. WriteLine();
}
static void Main()
{
int[] a = new int[15];
int k = 0;
string buf;
sozd();
Console. WriteLine("Сортируем и печатаем массив: ");
Array. Sort(masi);
foreach (int i in masi)
Console. Write(i + " ");
Console. WriteLine();
Console. WriteLine("Копируем массив в обычный массив целых чисел: ");
Array. Copy(masi, a, masi. Length);
foreach (int i in a)
Console. Write(i + " ");
Console. WriteLine();
// Реверсируем массив a.
Array. Reverse(a);
Console. WriteLine("Реверсируем и печатаем новый массив: ");
foreach (int i in a)
Console. Write(i + " ");
Console. WriteLine();
// Выполняем бинарный поиск числа по ключу.
Console. WriteLine("Выполняем бинарный поиск числа в массиве по ключу");
Console. WriteLine("Введите ключ поиска");
buf = Console. ReadLine();
k = Convert. ToInt32(buf);
int idx = Array. BinarySearch(masi, k);
Console. WriteLine("Индекс значения равен = " + idx);
Console. WriteLine("Введите несуществующий ключ поиска");
buf = Console. ReadLine();
k = Convert. ToInt32(buf);
idx = Array. BinarySearch(masi, k);
Console. WriteLine("Индекс значения равен = " + idx);
Console. ReadLine();
}
}
}
Работа программы:
Массив создан:
12 3 39 31 -10 -32 -39 10 -11 -4 4 13 -10 -25 -8
Сортируем и печатаем массив:
-39 -32 -25 -11 -10 -10 -8 -4 3 4 10 12 13 31 39
Копируем массив в обычный массив целых чисел:
-39 -32 -25 -11 -10 -10 -8 -4 3 4 10 12 13 31 39
Реверсируем и печатаем новый массив:
39 31 13 12 10 4 3 -4 -8 -10 -10 -11 -25 -32 -39
Выполняем бинарный поиск числа в массиве по ключу
Введите ключ поиска
10
Индекс значения равен = 11
Введите несуществующий ключ поиска
11
Индекс значения равен = -13
С помощью метода Array. CreateInstance(typeof(int),ctl, niz); создаем одномерный массив masi на 15 элементов (определяем свойство Lengths равное переменной ctl) и с начальным индексом LowerBounds равным 1 (можно задавать индекс больше 1, но не 0).
В цикле for использовано masi. GetLowerBound(0) – начальное значение управляющей переменной равное 1 и masi. Length – конечное значение управляющей переменной равное 15.
for (int i = masi. GetLowerBound(0); i <= masi. Length; i++)
masi. SetValue((rnd. Next(81) - 40), i);
Обращение к элемента массива, созданного с помощью методов класса System. Array, возможно только с помощью методов этого класса – при записи masi. SetValue и masi. GetValue при чтении.
Выполняем сортировку массива статическим методом Array. Sort(masi);
и выводим его на экран монитора с помощью цикла foreach
foreach (int i in masi)
Console. Write(i + " ");
Console. WriteLine();
Копируем массив созданный методами класса System. Array в массив a, созданный обычным способом:
Array. Copy(masi, a, masi. Length);
Далее рассмотрено использование методов реверса и бинарного поиска класса System. Array для массива a.
Задача 18.2 Сформировать матрицу 5х5 случайных целых чисел в диапазоне от 0 до 20. Напечатать матрицу. Переписать матрицу в массив на 25 элементов, созданный обычным способом. Выполнить сортировку всех элементов этого массива. Выполнить обратную запись массива в матрицу и напечатать отсортированную матрицу.
Исходный код программы:
using System;
namespace ConsoleApplication1
{
class Program
{
public static Array masi = Array. CreateInstance(typeof(int), 5, 5);
public static void sozd()
{
int kk;
Random rnd = new Random();
Console. WriteLine("Матрица создана: ");
for (int i = 0; i <= 4; i++)
for (int j = 0; j <= 4; j++)
{
kk = rnd. Next(21);
masi. SetValue(kk, i, j);
}
for (int i = 0; i <= 4; i++)
{
for (int j = 0; j <= 4; j++)
Console. Write(masi. GetValue(i, j) + "\t");
Console. WriteLine();
}
}
static void Main()
{
int[] a = new int[25];
int k = 0;
string buf;
sozd();
Console. WriteLine("Переносим матрицу в массив и печатаем его: ");
int j = 0;
foreach (int i in masi)
{
Console. Write(i + " "); a[j] = i; j++;
}
Console. WriteLine();
Console. WriteLine("Сортируем и печатаем массив: ");
Array. Sort(a);
foreach (int i in a)
Console. Write(i + " ");
Console. WriteLine();
Console. WriteLine("Переносим массив в матрицу: ");
k = 0;
for (int i = 0; i <= 4; i++)
{
for ( j = 0; j <= 4; j++)
{
masi. SetValue(a[k], i, j); k++;
Console. Write(masi. GetValue(i, j) + "\t");
}
Console. WriteLine();
}
Console. ReadLine();
}
}
}
Работа программы:
Матрица создана:
6 14 19 11 10
10 18 16 6 4
13 3 5 6 3
15 7 7 13 20
19 7 6 2 19
Переносим матрицу в массив и печатаем его:
6 14 19 11 10 10 18 16 6 4 13 3 5 6 3 15 7 7 13 20 19 7 6 2 19
Сортируем и печатаем массив:
2 3 3 4 5 6 6 6 6 7 7 7 10 10 11 13 13 14 15 16 18 19 19 19 20
Переносим массив в матрицу:
2 3 3 4 5
6 6 6 6 7
7 7 10 10 11
13 13 14 15 16
18 19 19 19 20
В программе использованы методы класса System. Array для создания и обработки элементов двумерного массива. К сожалению, некоторые методы класса System. Array могут работать только с элементами одномерного массива, например, метод сортировки элементов, поэтому в программе использован распространенный прием – перезапись элементов двумерного массива в одномерный массив, выполнение обработки выбранным методом и обратная перезапись элементов из одномерного массива в двумерный массив.
18.4 Вопросы для проверки
18.4.1 Какое свойство в массиве типа Array позволяет определить количество элементов массива?
Items Count Capacity Index Length18.4.2 Что определяет свойство Rank в массиве типа Array?
Определяет тип элемента массива. Определяет указатель на элемент массива. Определяет указатель на массив в куче. Определяет размерность массива. Определяет максимальное значение в массиве.18.4.3 Для чего предназначен метод Array при работе с массивом типа Array?
18.4.4 Для чего предназначен метод BinarySearch при работе с массивом типа Array?
18.4.5 Какие классы языка C# предназначены для работы с массивами?


