У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 8 ПРОГРАММИРОВАНИЕ ЗАДАЧ ОБРАБОТКИ ДВУМЕРНЫХ МАССИВОВ 1 Цель и порядок работы Ц

Работа добавлена на сайт samzan.net: 2015-07-05

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 4.4.2025

Лабораторная работа № 8

ПРОГРАММИРОВАНИЕ ЗАДАЧ  ОБРАБОТКИ  ДВУМЕРНЫХ МАССИВОВ

1 Цель и порядок работы

Цель работы - изучить операторы, используемые при организации вычислительных процессов обработки двумерных массивов данных, получить практические навыки в составлении подобных программ.

Порядок выполнения работы:

  •  ознакомиться с описанием лабораторной работы;
  •  получить задание у преподавателя по вариантам;
  •  разработать алгоритм решения задачи;
  •  написать программу, ввести программу, отладить и выполнить ее на ЭВМ;
  •  оформить отчет.

2 Общие сведения

2.1 Прямоугольные массивы

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

Чаще всего в программах используются простейшие многомерные массивы - двумерные массивы. В двумерном массиве позиция любого элемента определяется двумя индексами. Если представить двумерный массив в виде таблицы данных, то один индекс означает строку, а второй - столбец. Чтобы объявить двумерный массив целочисленных значений размером A x B, достаточно записать следующее:

int[,]имя_массива  = new int[A,B];

Чтобы получить доступ к элементу двумерного массива, необходимо указать оба индекса, разделив их запятой. Например, чтобы присвоить число Z элементу двумерного массива, позиция которого определяется координатами x и y, можно использовать следующую инструкцию:

имя_массива[x,y] = Z;

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

тип[,] имя_массива = {

{val, val, val, …, val}

{val, val val, …, val}

{val, val, val, …, val}

};

Здесь элемент val – значение инициализации. Каждый внутренний блок означает

строку. В каждой строке первое значение будет сохранено в первой позиции массива, второе значение - во второй и т.д.

Варианты описания двумерного массива:

тип[,] имя;

тип[.] имя = new тип [ разм_1, разм_2 ];

тип[.] имя = { список_инициализаторов };

тип[,] имя = new тип [,] { список_инициализаторов };

тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов };

Примеры описаний (один пример для каждого варианта описания):

int[ , ] а;                                                                         / / 1   элементов нет  

int[ , ] b = new int [2, 3];                                               / / 2   элементы равны 0

int[ , ]  с = {{1,  2,  3},   {4,  5,  6}};                            / / 3   new подразумевается

int[ , ] c = new int[ , ]] {{1. 2. 3).  {4, 5. 6}}:              / / 4  размерность вычисляется

int[ , ] d = new int[2,3 ]] {{1. 2. 3).  {4, 5. 6}}            / / 5  избыточное описание

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

а[1,4]               b[i,  j]               b[j, i]

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

Пример 1. Для целочисленной матрицы размером m*n вычислить сумму элементов в каждой строке (рис. 1).

Рисунок 1 - Матрица из m строк и n столбцов

Нахождение суммы элементов каждой строки требует просмотра матрицы по строкам. Схема алгоритма приведена на рис. 2, программа — в листинге 1.

Рисунок 2- Схема алгоритма к примеру 1

Листинг 1- Программа к примеру 1 

using System;

namespace ConsoleApplication1

{

 class Class1

 {

    static void Main()

      { const int m = 3, n = 4;          

        int[,] a = new int[m, n] {         

                     { 2, 2, 8, 9 },           

                     { 4, 5, 6, 2 },

                     { 7, 0, 1, 1 }

                   };

            Console.WriteLine("Исходный массив:");                     

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

             {

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

                  Console.Write( "  " + a[i, j]);                     

               Console.WriteLine();

             }

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

             {

                int sum =  0;

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

                   sum += a[i, j];                                

                Console.WriteLine("В строке {0}сумма элементов {1}",i, sum );

             }

           Console.Read();

      }

   }

}

Результаты работы программы:

Следует обратить внимание на то, что переменная sum обнуляется перед циклом просмотра очередной строки матрицы, поскольку для каждой строки его вычисление начинается заново.

2.2 Ступенчатые массивы

В ступенчатых массивах количество элементов в разных строках может различаться. В памяти ступенчатый массив хранится иначе, чем прямоугольный: в виде нескольких внутренних массивов, каждый из которых имеет свой размер. Кроме того, выделяется отдельная область памяти для хранения ссылок на каждый из внутренних массивов. Организацию ступенчатого массива иллюстрирует рис. 3.

Рисунок 3 - Ступенчатый массив

Описание ступенчатого массива:

тип[ ] [ ] имя;

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

int[ ] [ ] а = new int [3][ ];    / / выделение памяти под ссылки на три строки

        а[0]= new int [5];         / / выделение памяти под 0-ю строку (5 элементов)

        а[1] =new int [3];           / / выделение памяти под 1-ю строку (3 элемента)

        а[2] = new int [4];          / / выделение памяти под 2-ю строку (4 элемента)

Здесь а[0], а[1] и а[2] — это отдельные массивы, к которым можно обращаться по имени ниже (листинг 3) приведен пример работы со ступенчатым массивом с использованием выделения памяти под каждую строку.

Другой способ выделения памяти:

int[ ] [ ] а = { new int[5], new int[3], new int[4] };

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

a[1][2]              a[i][j]             a[j][i]

В остальном использование ступенчатых массивов не отличается от использования прямоугольных.

Пример 2. Поиск максимального элемента в двумерном массиве.

Решение поставленной задачи осуществляется с помощью цикла по параметру i, изменяющегося шагом +1 от 0 до m-1 с вложенным циклом по параметру j, изменяющемуся шагом +1 от 0 до n-1.  

Перед входом в цикл переменной max присваивается значение у[0,0] элемента массива. С каждым изменением параметра j происходит переход к новому элементу той же строки массива и сравнение его значения со значением переменной max.

Если значение элемента массива больше, то max присваивается значение элемента массива с текущим порядковым номером. Когда при данном значении параметра i завершается цикл по параметру j, происходит изменение параметра i и переход к новой строке двумерного массива.

Листинг 2- Программа к примеру 2

using System;

namespace ConsoleApplication1

{

   class Program

   {

       static void Main(string[] args)

       {

           const int m = 3, n = 4;

           int[,] y = new int[m, n] {         

                          { 2, 2, 8, 9 },           

                          { 4, 5, 6, 2 },

                          { 7, 0, 1, 1 }

                      };

           Console.WriteLine("Исходный массив:");

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

           {

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

                   Console.Write("  " + y[i, j]);

               Console.WriteLine();

           }

           int max=y[0,0];

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

           {

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

                    if (y[i, j] > max) max = y[i, j];

           }

               Console.WriteLine("Наибольший элемент в матрице "+ max);

           Console.Read();

       }

   }

}

Рисунок 3 - Схема алгоритма к примеру 2

Результаты работы программы:

В листинге 3 продемонстрировано применение элементов класса Аrrау при работе со ступенчатым массивом.

Листинг 3 - Использование методов класса Аrrау для обработки  ступенчатого массива

using System;

namespace ConsoleApplication3

{

   class Program

   {

       static void Main(string[] args)

       {

           int[][] a = new int[3][];

           a[0] = new int[5] { 4, 5, 8, 3, 6 };

           a[1] = new int[3] { 7, 9, 1 };

           a[2] = new int[4] { 6, 5, 3, 1 };

           Console.WriteLine("Исходный массив:");

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

           {

               for (int j = 1; j < a[i].Length; ++j)

                   Console.Write("  " + a[i][j]);

               Console.WriteLine();

           }

           Console.WriteLine(Array.IndexOf(a[0], 8));

       }

   }

}

Необходимо обратить внимание на то, как внутри цикла по строкам определяется длина каждого  одномерного массива (длина каждой строки массива).

Результаты работы программы:

2.3 Оператор цикла с перебором foreach 

Цикл перебора  foreach используется для просмотра всех объектов из некоторой группы данных – коллекции. В языке С# определен ряд типов коллекций, например, коллекцией являются массивы.

Синтаксис записи цикла foreach:

foreach(тип имя_переменной in имя коллекции) выражение;

где тип и имя_переменной задают тип и имя итерационной переменной, которая в процессе итераций цикла foreach получает значения элементов коллекции, заданной своим именем.

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

Рассмотрим программу поиска максимального элемента в одномерном массиве.

Листинг 4 - Использование оператора цикла foreach для поиска наибольшего элемента одномерного массива

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main(string[] args)

       {

           const int n = 6;

           int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };

           Console.WriteLine("Исходный массив:");

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

               Console.WriteLine("\t" + a[i]);

           Console.WriteLine();

           int max = a[0];

           foreach (int x in a)

           {

               if (x > max)

                   max = x;

           }

           Console.WriteLine("Максимальный элемент = " + max);

           Console.Read();

       }

   }

}

Как видно из текста программы цикл foreach последовательно просматривает все элементы массива а и присваивает итерационной переменной х значение очередного элемента массива. Значение х в дальнейшем используется в операторе if для коррекции переменной max.

Результаты работы программы:

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

При работе с многомерными массивами цикл foreach возвращает элементы в порядке следования строк.

Листинг 5 - Использование оператора цикла foreach для поиска наибольшего элемента двумерного массива

using System;

namespace ConsoleApplication1

{

   class Program

   {

       static void Main(string[] args)

       {

           const int m = 3, n = 4;

           int[,] y = new int[m, n] {         

                          { 2, 2, 8, 9 },           

                          { 4, 5, 6, 2 },

                          { 7, 0, 1, 1 }

                      };

           Console.WriteLine("Исходный массив:");

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

           {

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

                   Console.Write("  " + y[i, j]);

               Console.WriteLine();

           }

           int max = y[0, 0];

           foreach (int x in y){

                   if (x > max) max = x;

           }

           Console.WriteLine("Наибольший элемент в матрице " + max);

           Console.Read();

       }

   }

}

Как  видно из текста программы использование одного оператора  foreach позволило заменить два вложенных оператора for в поиске наибольшего элемента двумерного массива.

Результаты работы программы:

3. Варианты заданий для самостоятельной работы

  1.  Дана (построчно) вещественная матрица размером 7x4. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.

  1.  Найти S сумму элементов квадратной матрицы A из заштрихованной области.

  1.  Найти S сумму элементов квадратной матрицы A из заштрихованной области массива A.

  1.  Дана вещественная матрица размером 7×7, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, и столбца с наименьшим элементом.
  2.  Найти S сумму элементов квадратной матрицы A из заштрихованной области.

  1.  По двумерному массиву массиву А получить одномерный массив В, присвоив его k-му элементу значение TRUE, если выполнено указанное ниже условие, и значение FALSE иначе: все элементы k-го столбца массива А нулевые.
  2.  Найти S  сумму элементов квадратной матрицы A из заштрихованной области.

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом::

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Найти S сумму элементов из заштрихованной области двумерного массива A.

  1.  Найти S сумму элементов из заштрихованной области двумерного массива A.

  1.  По двумерному массиву А получить одномерный массив В, присвоив его k-му элементу значение TRUE, если выполнено указанное ниже условие, и значение FALSE иначе: элементы k-й строки массива А упорядочены по убыванию.VAR 
  2.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  Заполнить целочисленный массив А, не вводя значения его элементов с клавиатуры, следующим образом:

  1.  По двумерному массиву А получить одномерный массив В, присвоив его k-му элементу значение TRUE, если выполнено указанное ниже условие, и значение FALSE иначе: k-я строка массива А симметрична.
  2.  Дана вещественная матрица размером 5×6. Упорядочить ее строки по неубыванию их первых элементов.
  3.  Дана вещественная матрица размером 5×6. Упорядочить ее строки по неубыванию суммы их элементов.
  4.  Дана вещественная матрица размером 5×6. Упорядочить ее строки по неубыванию их наибольших элементов.
  5.  Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером 10×15 напечатать индексы всех ее седловых точек.
  6.  Определить, является ли заданная целая квадратная матрица 10-го порядка симметричной (относительно главной диагонали).
  7.  Определить, является ли заданная целая квадратная матрица 10-го порядка ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.
  8.  Определить, является ли заданная целая квадратная матрица 9-го порядка магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы.
  9.  Дана целочисленная матрица размера n×n. В каждой строке выбрать минимальный элемент. И среди этих минимальных значений выбрать максимальное.
  10.  Дана действительная матрица размера m×n. Определить число отрицательных элементов в каждой строке.
  11.  Получить целочисленную матрицу размером m×n, в которой элементы в четных строках и столбцах положительные, а остальные отрицательные.
  12.  В целочисленной матрице порядка n×n указать индексы всех элементов, имеющих наибольшее значение в столбцах.
  13.  Получить вещественную матрицу a размером n×n, если первая и вторая строка задается формулой a[i,j]=2j+3/(2+j). А каждая следующая строка есть сумма двух предыдущих.
  14.  В действительной матрице размером 6×9 поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением.
  15.  Дана целочисленная матрица размером m×n. Получить сумму наибольшего значения элементов матрицы и наименьшего в этой же строке.
  16.  В действительной матрице размером m×n найти сумму элементов столбца, содержащего наименьший элемент матрицы.
  17.  Дана вещественная матрица размером n×m. Найти сумму наибольших значений элементов ее строк.
  18.  Дана вещественная матрица размером m×n. Найти среднее арифметическое наибольшего и наименьшего значений ее элементов.
  19.  Все максимальные элементы в столбцах вещественной матрицы размером m×n заменить нулями.
  20.  Дана целочисленная матрица порядка m×n. Заменить нулями элементы, расположенные выше главной диагонали и квадратами значения элементов ниже главной диагонали.
  21.  Дана целочисленная матрица размером m×n и целые числа k и l. Определить минимум в столбцах матрицы, имеющих номера k и l.
  22.  Дана целочисленная матрица размером n×n. Определить, на каком месте располагаются одинаковые элементы, симметричные главной диагонали.
  23.  Дана целочисленная матрица размером m×n. Найти среднее арифметическое каждого из столбцов с четными номерами.
  24.  Дана вещественная матрица размером m×n. Найти новую матрицу, полученную путем деления всех элементов исходной матрицы на ее максимальный элемент.
  25.  Дана вещественная матрица размером m×n. Указать все строки, которые не содержат отрицательных элементов.
  26.  Дана вещественная матрица размером m×n. Все отрицательные числа заменить на -1, положительные на +1, а нулевые оставить без изменения.
  27.  Дана вещественная матрица размером m×n. Напечатать номер строки, которая содержит первый из отрицательных элементов.
  28.  Дана целочисленная матрица размером m×n. Найти сумму всех элементов, расположенных левее столбца, содержащего первый отрицательный элемент.
  29.  Даны целые числа k, l и целочисленная матрица размером m×n. Поменять местами столбцы с номерами k и l.
  30.  Дана целочисленная матрица размером m×n. Удалить из этой матрицы строку с номером k(k<m).
  31.  Дана вещественная матрица размером m×n. В строках, содержащих отрицательный элемент, определить максимальный элемент.
  32.  Дана целочисленная матрица размером m×n. В каждой строке сменить знак максимального по модулю элемента на противоположный.
  33.  Дана целочисленная матрица размером m×n. Последний отрицательный элемент каждого столбца заменить нулем.
  34.  Дана целочисленная матрица размером m×n. Положительные элементы умножить на первый элемент соответствующей строки, а отрицательные на последний, то есть положительные элементы первой строки умножаем на первый элемент первой строки, а отрицательные на последний элемент также первой строки, то же самое и с остальными строками.
  35.  Дана целочисленная матрица размером m×n. Заменить все элементы строки с номером k и столбца с номером 1 на противоположные по знаку (элемент, стоящий на пересечении, не изменять).
  36.  Дана целочисленная матрица размером m×n. К элементам столбца k1 прибавить элементы столбца k2.
  37.  Даны два двумерных массива одинаковой размерности. Создать третий массив той же размерности, каждый элемент которого равен сумме соответствующих элементов первых двух.
  38.  Даны два двумерных массива А и В одинаковой размерности. Создать массив С, где каждый элемент равен 1 (True), если соответствующие элементы А и В имеют одинаковый знак, иначе элемент равен 0 (False).
  39.  Дан двумерный массив размерностью 4×6, заполненный целыми числами с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен количеству элементов соответствующей строки, больших данного числа.
  40.  Дан двумерный массив размером n×m, заполненный случайными числами. Определить, есть ли в данном массиве столбец, в котором имеются одинаковые элементы.
  41.  Дан двумерный массив размерностью 5×6, заполненный целыми числами с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен наибольшему по модулю элементу соответствующего столбца.
  42.  Дан двумерный массив размером n×m, заполненный случайными числами. Определить, есть ли в данном массиве строка, в которой имеется два максимальных элемента всего массива.
  43.  Дан двумерный массив размером n×m, заполненный случайными числами. Определить, есть ли в данном массиве столбец, в котором равное количество положительных и отрицательных элементов.
  44.  Дан двумерный массив размерностью 6×5, заполненный целыми числами с клавиатуры. Сформировать одномерный массив, каждый элемент которого равен первому четному элементу соответствующего столбца, если такого нет, то равен нулю.
  45.  Дан двумерный массив размером n×m, заполненный случайными числами. Определить, есть ли в данном массиве строка, содержащая больше положительных элементов, чем отрицательных.
  46.  Дан двумерный массив размером n×m. Вставить после столбцов с максимальными элементами столбец из нулей.
  47.  Дан двумерный массив размером n×m. Вставить между средними строками первую строку.
  48.  Дан двумерный массив размером n×m. Удалить все столбцы, в которых первый элемент больше последнего.

  1.  Содержание отчета

4.1. Титульный лист.

4.2. Краткое теоретическое описание.

4.3. Задание на лабораторную работу, включающее математическую формулировку задачи.

4.4. Результаты выполнения работы, включающие схему алгоритма, тексты программ, результаты вычислений.

PAGE   \* MERGEFORMAT 116


EMBED Word.Picture.8  

a00

a02

a03

a10

a11

a12

a13

a23

22

a21

a20

a01

0

n -1

0

m-1

m

n

a[1]

[0]

a[1]

a

a[0]

[1]

0           1

массив

1

0

Ссылки

на строки




1. Эволюция и образование вселенной и галактики.html
2. Тематика самостоятельных лабораторных работ по направлению 230100
3. Excel
4. к в графическом виде результаты становятся более наглядными и понятными
5. а непрерывного совершенствования знаний и навыков членов общества выполняющие важнейшую роль в социализац
6. Отрасль кролиководства в Татарстане
7. Промышленное производство в Республике Беларусь в 90-х годах двадцатого века
8. Обоснование амортизационной политики предприятий
9. 214. В данной главе дается то что логически следовало бы излагать позднее.html
10. ЧП на НТВ- зарегистрируйтесь на форуме ЧП войдите и создайте Ваше сообщение подробно расскажите о том что