Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред1 С#.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.8 Mб
Скачать

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

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

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

Двумерный массив такого вида объявляется следующим образом:

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

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

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

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

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

double[,] hillHeight = new double [3,4];

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

double[,] hillHeight = new {{1, 2, 3, 4 }, {2, 3, 4, 5 }, {3, 4, 5, 6}};

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

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

hillHeight[2, 1]

Теперь над этим элементом можно выполнять действия так же, как и над другими переменными.

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

double[,] hillHeight = new {{1, 2, 3, 4 }, {2, 3, 4, 5 }, {3, 4, 5, 6}};

foreach(double height in hillHeight)

{

Console.WriteLine(("{0}", height);

}

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

Типы задач обработки двумерных числовых массивов

Обработка двумерных массивов по строкам

Дана матрица А[M,N]. Определить номер первой ее строки, в которой сумма четных элементов совпадает с суммой нечетных.

Начало

Ввод размеров матрицы M и N

Ввод элементов матрицы А[M,N]

Флаг = нет

Для i от 0 До M

CуммаЧетных = 0

CуммаНечетных = 0

Для j от 0 До N

Если– четный, То

CуммаЧетных = CуммаЧетных + A[i,j]

Иначе

CуммаНечетных = CуммаНечетных + A[i,j]

Все-Если

Все-Для-j

Если CуммаЧетных = CуммаНечетных, То

Флаг = Да

Прервать Цикл

Все-Если

Все-Для-i

Если Флаг = Нет, То

Печать «Такой строки в матрице нет»

Иначе

Печать «Суммы совпадают в строке» + i

Все-Если

Конец

Обработка двумерных массивов по столбцам

Дана матрица А[M,N]. Поменять местами столбцы этой матрицы, которые имеют максимальное и минимальное произведение отрицательных элементов.

Начало

Ввод размеров матрицы M и N

Ввод элементов матрицы А[M,N]

МинПроизв = МаксимальноеЧисло

МаксПроизв = МинимальноеЧисло

СтолбМин = -1

СтолбМакс = -1

Для j от 0 До N

Произведение = 1

Для i от 0 До M

Если A[i,j] < 0, То

Произведение = Произведение * A[i,j]

Все-Если

Все-Для-i

Если Произведение < МинПроизв, То

МинПроизв = Произведение

СтолбМакс = j

Все-Если

Если Произведение > МаксПроизв, То

МаксПроизв = Произведение

СтолбМин = j

Все-Если

Все-Для-j

Если СтолбМакс = -1 И СтолбМин = -1, То

Печать «Отрицательных элементов в матрице нет»

Иначе Если СтолбМакс = СтолбМин, То

Печать «Отрицательные элементы только в одном столбце»

Иначе

Для i от 0 До M

Х = A[i, СтолбМакс]

A[i, СтолбМакс] = A[i, СтолбМин]

A[i, СтолбМин] = Х

Все-Для-i

Печать матрицы А[M,N]

Все-Если

Конец

Удаление строк или столбцов двумерного массива

Вставка строк или столбцов в двумерный массив

Квадратные матрицы и их обработка

Дана матрица А[N, N]. Заменить все нечетные элементы этой матрицы, лежащие ниже главной диагонали, на произведение четных элементов, расположенных выше главной диагонали.

Начало

Ввод размера матрицы N

Ввод элементов матрицы А[N,N]

Произведение = 1

Флаг = Нет

Для i от 0 До N

Для j от 0 До N

Если i < j И A[i,j] - четный, То

Произведение = Произведение * A[i,j]

Флаг = Да

Все-Если

Все-Для-j

Все-Для-i

Если Флаг = Нет, То

Печать «Четных выше диагонали в матрице нет»

Выход Из Программы

Все-Если

Флаг = Нет

Для i от 0 До M

Для j от 0 До N

Если A[i,j] - нечетный, То

A[i,j] = Произведение

Флаг = Да

Все-Если

Все-Для-j

Все-Для-i

Если Флаг = Нет, То

Печать «Нечетных ниже диагонали в матрице нет»

Иначе

Печать матрицы А[M,N]

Все-Если

Конец

Работа с текстовыми строками

Практически в любом языке программирования предусмотрен набор стандартных функций, предназначенных для работы с текстовыми строками. Эти функции позволяют объединять строки, выделять из строк фрагменты, менять строчные буквы на прописные и обратно, искать в строках другие строки и произвольные символы и т. д.

В языках С и C++ стандартные функции, обрабатывающие символы и строки, являются частью библиотеки транслятора. Фактически они уже стали частью этих языков и потому описываются во всех учебниках, посвященных С и C++.

Что же касается языка программирования С#, то для представления текстовых строк в библиотеке классов Microsoft .NET Framework имеется класс System.String. Вместе с набором операций, методов и индексаторов этот класс представляет собой мощное средство обработки строк.

Прежде чем приступить к изучению способов работы с текстовыми строками в С#, уточним, чем строки С# отличаются от строк, с которыми имеют дело программисты С и C++. Прежде всего, программы, составленные а языках С и C++, имеют непосредственный доступ к представлению текстовых строк, хранящихся в оперативной памяти компьютера. Такие программы могут, например, перезаписывать или изменять содержимое строк по месту их расположения.

Что же касается программ С#, то все операции с текстовыми строками выполняются только при помощи методов, предусмотренных в соответствующих классах библиотеки Microsoft .NET Framework.

Далее, программы С и C++ могут работать с различными представлениями текстовых строк, такими, как, например ASCII и UNICODE. В зависимости от представления (или, как еще говорят, кодировки) для хранения каждого символа строки может использоваться 1, 2 или несколько байт памяти. В языке С# текстовые строки представлены только в кодировке UNICODE, предполагающей представление одного текстового символа 2 байтами памяти.

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

string s = "abcdefghij";

Мы можем получить доступ к каждому символу строки и напечатать его с помощью такого цикла:

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

{

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

}

Этот цикл выводит 10 строк текста вроде следующих:

Element 0 = а

Element 1 = b

. . .

Element 9 = j

Однако строки не считаются массивами и присваивание

s[3] = 'х'; //Неверная попытка заменить букву d на букву х

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