МНОГОМЕРНЫЕ МАССИВЫ. РВАНЫЕ МАССИВА ПЛАН ВВЕДЕНИЕ 1. МАССИВЫ В ЯЗЫКЕ C# 2. МНОГОМЕРНЫЕ МАССИВЫ 3. РВАНЫЕ МАССИВЫ (СТУПЕНЧАТЫЕ) ЗАКЛЮЧЕНИЕ СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ ВВЕДЕНИЕ Язык несомненных С# как средство достоинств. Он обучения хорошо программированию организован, строг, обладает рядом большинство его конструкций логичны и удобны. Развитые средства диагностики и редактирования кода делают процесс программирования приятным и эффективным. Немаловажно, что С# является не учебным, а профессиональным языком, предназначенным для решения широкого спектра задач, и в первую очередь - в быстро развивающейся области создания распределенных приложений. Поэтому базовый курс программирования, построенный на основе языка С#, позволит студентам быстрее стать востребованными специалистами-профессионалами. Целью исследования, проводимого в рамках настоящей курсовой работы, является разработка и реализация на языках высокого уровня алгоритмов решения задач, представленных в задании курсовой работы. Объектами исследования настоящей курсовой работы являются методы и технологии разработки программных продуктов. Предметами исследования настоящей курсовой работы являются методы, алгоритмы и приёмы разработки программ обработки двумерных массивов, файлов, строк. Информационной базой исследования является учебная литература по информатике и программированию, техническая документация по языку С# инструментальной среды MS Visual Studio 2010. МАССИВЫ В ЯЗЫКЕ C# Массив - это составной объект, состоящий из элементов одного типа. Простейшей разновидностью массива является одномерный массив, который можно рассматривать как информационную модель вектора в многомерном пространстве. Чтобы определить переменную для одномерного массива, нужно указать тип элементов массива и имя переменной массива: тип [] имя; В результате такого объявления для переменной массива выделяется ячейка в области оперативной памяти - «стек» (stack) . Эта ячейка предназначена для хранения адреса элементов массива. Сами элементы массива хранятся в другой области оперативной памяти, которая называется «куча» (heap) . Для резервирования в этой области используется оператор new , после которого указывается тип элементов массива и число этих элементов в квадратных скобках: new тип [размер]; Значением оператора new является адрес области для хранения элементов массива. Этот адрес может быть присвоен переменной массива. Вместо оператора new можно перечислить в фигурных скобках значения элементов массива: компилятор подсчитает их количество, определит тип, выделит необходимую область в куче и инициализирует элементы массива указанными в фигурных скобках значениями. При использовании оператора new элементы массива инициализируются автоматически. Массивы в языке C # являются статическими, то есть число элементов массива нельзя изменить в процессе выполнения программы. Однако с помощью оператора new можно выделить для элементов массива другую область в памяти с другим количеством элементов. Прежняя область памяти в куче при этом объявляется «мусором» и посредством «сборщика мусора» впоследствии передается в область свободной памяти. Из-за особенности выделения памяти для элементов массива их относят к ссылочным типам ( reference types ). Все рассмотренные ранее типы относятся к типам значений ( value types ). Для значений переменных этих типов выделяются ячейки памяти непосредственно в стеке. using System; class Test { public static void Main() { int[] a; int[] b = new int[5]; int[] c = { 0, 1, 4, 9, 16 }; a = new int[5]; for (int j = 0; j < c.Length; j++) Console.Write(c[j] + "\t"); Console.WriteLine(); } } Многомерные массивы 1. Какой массив называется многомерным? Многомерный массив – это массив, который имеет два и более измерений. Для доступа к элементу многомерного массива используется комбинация из двух и более индексов. 2. Какая общая форма объявления многомерного массива? Общая форма объявления многомерного массива следующая: тип[,...,] имя_массива = new тип[размер1, размер2, ..., размерN]; где тип – непосредственно тип элементов массива; размер1, размер2, размерN – размерность каждого измерения массива. Значение N означает, что массив N-мерный. 3. Пример объявления и использования двумерного массива вещественных чисел размером 3×4 В примере объявляется двумерный массив вещественных чисел, которые имеют тип float // объявление и использование массива вещественных чисел размером 3*4 float[,] M = new float[3, 4]; // выделить память для массива // заполнение массива произвольными значениями for (int i = 0; i < 3; i++) for (int j = 0; j < 4; j++) M[i, j] = (float)(i * 0.2 + j * 0.3); // запись значений в отдельные ячейки массива M[0, 1] = 0.35f; M[2, 2] = 1.45f; 4. Пример объявления и использования трехмерного массива целых чисел размером 3×4×5 // объявление трехмерного массива целых чисел размером 3*4*5 ulong[, ,] A; // описать переменную (ссылку) типа "трехмерный массив целых чисел" A = new ulong[3, 4, 5]; // выделить память для массива // записать в отдельные ячейки массива значение A[0, 2, 3] = 232; A[0, 0, 1] = 300; A[2, 3, 1] = 20000; 5. Как выглядит общая форма инициализации многомерного массива? Инициализация массива позволяет записать значения в ячейки массива в момент его объявления в программе. Общая форма инициализации многомерного массива имеет следующий вид: тип[,] имя_массива = { { значение, значение, ..., значение }, { значение, значение, ..., значение }, ... { значение, значение, ..., значение } }; 6. Пример инициализации двумерного массива размером 5×3. Элементы массива имеют тип char тип – тип элементов массива; значение – значение, которыми инициализируются элементы массива. // инициализация двумерного массива char[,] M = { { 'A', 'B', 'C', 'D', 'E' }, { '8', '-', '=', '>', '+' }, { '~', 'U', '&', '\\', '@' } }; 7. Пример инициализации трехмерного массива целых чисел размером 2×3×4 // инициализация трехмерного массива целых чисел short[, ,] B = { { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }, { { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } } }; 8. Что такое ступенчатый массив? Какая общая форма объявления ступенчатого массива? Двумерные массивы могут быть двух видов: прямоугольный массив в виде таблицы; ступенчатый массив. В этом массиве количество элементов каждой строки (массива) может отличаться. Ступенчатый массив еще называют массивом массивов. Общая форма объявления ступенчатого массива: тип [][] имя_массива = new тип[размер][]; где тип – тип элементов массива; размер – количество строк в массиве. 9. Пример объявления и использования ступенчатого массива // ступенчатые массивы // объявление массива из 4-х строк, элементы которого имеют тип ulong ulong[][] A = new ulong[4][]; // выделение памяти для каждой строки A[0] = new ulong[5]; // в строке с индексом 0 есть 5 элементов A[1] = new ulong[3]; // в строке с индексом 1 есть 3 элемента A[2] = new ulong[6]; A[3] = new ulong[4]; // демонстрация доступа к элементам массива A A[0][0] = 2003; A[0][4] = 199008; A[1][2] = 302909; A[3][3] = 10000000; for (int i = 0; i < 6; i++) A[2][i] = (ulong)(i * i * i); Как видно из примера, доступ к элементам ступенчатого массива происходит иначе чем в прямоугольном массиве. 10. В каких случаях целесообразно использовать ступенчатые массивы? Ступенчатые массивы являются эффективными в случаях, если у двумерных прямоугольных массивов есть много элементов, которые вообще не используются. Это позволяет сэкономить память за счет выделения только необходимого объема памяти (количества элементов) для каждой строки ступенчатого массива. На рисунке 1 отображено преимущество применения ступенчатых массивов в сравнении с прямоугольными. Продемонстрирована возможная экономия памяти в случае, когда данные представляются прямоугольным массивом в котором все элементы некоторых строк (0, 2, 3, 4) не используются. Способ 1. Объявление прямоугольного массива с именем M. // объявление прямоугольного массива int[,] M = new int[5,100]; // выделяется 500 ячеек типа int Способ 2. Объявление ступенчатого массива. // объявление ступенчатого массива int[][] M = new int[5][]; // выделяется 50+100+30+60+40 = 280 ячеек типа int M[0] = new int[50]; M[1] = new int[100]; M[2] = new int[30]; M[3] = new int[60]; M[4] = new int[40]; Рис. 1. Пример экономии памяти с помощью ступенчатого массива из 5 строк в сравнении с прямоугольным массивом размером 5×100 11. Каким образом реализовать массив двумерных массивов? Пример В примере реализуется массив двумерных массивов с именем M. Массив имеет 10 строк. В каждой строке формируется двумерный массив размером 3×4. // объявление массива из 10 двумерных массивов вещественных чисел, каждый из которых имеет размер 3*4 float[][,] M; // объявление переменной типа "массив двумерных массивов" // выделение памяти для 10 двумерных массивов типа float M = new float[10][,]; // выделение памяти для каждого массива размером 3*4 for (int i = 0; i < 10; i++) M[i] = new float[3, 4]; // заполнение массивов произвольными значениями for (int i = 0; i < 10; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 4; k++) M[i][j, k] = i * 10 + j * 3 + k; // заполнить конкретные ячейки M[0][2, 1] = 20.44f; M[2][0, 2] = 100.08f; Рваные массивы (ступенчатые) Двумерный массив можно представить в виде таблицы, в которой длина каждой строки остается неизменной по всему массиву. Но в C# можно также создавать специальный тип двумерного массива, называемый ступенчатым массивом. Ступенчатый массив представляет собой массив массивов, в котором длина каждого массива может быть разной. Следовательно, ступенчатый массив может быть использован для составления таблицы из строк разной длины. Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого массива служит следующая общая форма: тип [][] имя массива = new тип[размер] []; где размер обозначает число строк в массиве. Память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной. Давайте рассмотрим пример использования ступенчатого массива: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int i = 0; // Объявляем ступенчатый массив int[][] myArr = new int[4][]; myArr[0] = new int[4]; myArr[1] = new int[6]; myArr[2] = new int[3]; myArr[3] = new int[4]; // Инициализируем ступенчатый массив for (; i < 4; i++) { myArr[0][i] = i; Console.Write("{0}\t",myArr[0][i]); } Console.WriteLine(); for (i = 0; i < 6; i++) { myArr[1][i] = i; Console.Write("{0}\t", myArr[1][i]); } Console.WriteLine(); for (i = 0; i < 3; i++) { myArr[2][i] = i; Console.Write("{0}\t", myArr[2][i]); } Console.WriteLine(); for (i = 0; i < 4; i++) { myArr[3][i] = i; Console.Write("{0}\t", myArr[3][i]); } Console.ReadLine(); } } } int [] [] jagged = new int[4][]; jagged [0] = new int[6]; jagged [1] = new int[2]; jagged [2] = new int[4]; jagged [3] = new int[11]; После создания «рваного» массива в программе выводится на печать индекс максимального четного значения в массиве. Конкретно не получается определить максимальный четный элемент. Из наработок есть только это: C# int[][] jagged = new int[4][]; jagged[0] = new int[6]; jagged[1] = new int[2]; jagged[2] = new int[4]; jagged[3] = new int[11]; int[] mas = new int[100]; for (int i = 0; i < 6; i++) { jagged[0][i] = i; if (jagged[0][i] % 2 == 0) jagged[0][i] = mas[i]; } for (int i = 0; i < 2; i++) { jagged[1][i] = i; } for (int i = 0; i < 4; i++) { jagged[2][i] = i; } for (int i = 0; i < 11; i++) { jagged[3][i] = i; ЗАКЛЮЧЕНИЕ При выполнении настоящей курсовой работы были освоены основные принципы разработки алгоритмов и программ, методы отладки и решения задач на ЭВМ в различных режимах. Так же были разобраны основы системного программирования и основы объектно-ориентированного подхода к программированию. В процессе решения поставленных задач курсовой работы использовались прикладные системы программирования и необходимые методы решения заданий. Иинструментальной средой разработки программ стала MS Visual Studio 2010. В первом задании курсовой работы были рассмотрены такие методы решения задач как матрицы. Заданная матрица элементов должна быть заполнена определенным образом и выведена на экран. При выполнении данного задания использовались массивы и соответствующие расчеты. Условием второго задания курсовой работы было ннайти наименьший номер члена последовательности, для которого выполняется условие an- an-1 <е. При решении поставленной задачи использовался цикл с предусловием. В третьем задании курсовой работы были рассмотрены строки. При выполнении данного задания были применены необходимые операции со строками, а именно строковый массив, нахождение длины строки и т.д. Темой четвертого задания курсовой работы стала работа с методами. При выполнении задания была составлена программа вызова метода с помощью которого было решено условие данного задания. Темой заключительного задания курсовой работы была работа с файлами. При решении задания использовались одномерные массивы. По окончанию курсовой работы можно сказать, что нами были изучены и закреплены следующие задачи: -ставить задачу и разрабатывать алгоритм её решения; -использовать прикладные системы программирования; -разрабатывать основные программные документы; -работать с современными системами программирования, включая объектноориентированные; -языками процедурного и объектно-ориентированного программирования, навыками разработки и отладки программ не менее, чем на одном из алгоритмических процедурных языков программирования высокого уровня, -методами и средствами разработки и оформления технической документации. СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 1. Павловская Т. А. C#. Программирование на языке высокого уровня: Учебник для вузов. - СПб.: БХВ-Петербург. 2007. 2. Попов И. И., Партыка Т. Л. Языки программирования: Учебное пособие. - М.: ФОРУМ: ИНФРА-М, 2008. 3. Голицина О. Л., Попов И. И. Основы алгоритмизации и программирования: Учебное пособие. - М.: ФОРУМ: ИНФРА-М, 2005. 4. Фаронов В. В., Создание приложений с помощью C#: Руководство программиста. - М.: Эксмо, 2008. 5. Свердлов С. З. Языки программирования и методы трансляции. Учебное пособие. - СПб.: Питер, 2007. 6. Павловская Т. А. С/С++ Программирование на языке высокого уровня. - СПб.: Питер, 2005. 7. Нортроп Тони, Уилдермьюс Шон, Райан Билл. Основы разработки приложений на платформе Microsoft .Net Framework. Учебный курс Microsoft / Пер. с англ. - М.: «Русская редакция», СПб.: «Питер», 2007. СОДЕРЖАНИЕ ВВЕДЕНИЕ 1. МАССИВЫ В ЯЗЫКЕ C#.....................................................................2 2. МНОГОМЕРНЫЕ МАССИВЫ............................................................3 3. РВАНЫЕ МАССИВЫ (СТУПЕНЧАТЫЕ)........................................13 ЗАКЛЮЧЕНИЕ.......................................................................................17 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ............................18