Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двумерные массивы.doc
Скачиваний:
10
Добавлен:
18.07.2019
Размер:
349.18 Кб
Скачать

Занятие 1. Двумерные массивы. Работа с элементами

План занятия

  • структура двумерного массива и его описание;

  • шаблон для решения задач на двумерные массивы;

  • экспериментальная работа с программами поиска макси­мального элемента в массиве, формирование значений эле­ментов одномерного массива, поиска элементов с опреде­ленными свойствами, заполнения массива по заданным правилам;

  • выполнение самостоятельной работы.

Массивы, положение элементов в которых описывается дву­мя индексами, называют двумерными. Логическая структура такого массива может быть представлена прямоугольной мат­рицей. Каждый элемент матрицы однозначно определяется ука­занием номера строки и номера столбца. Образом памяти компь­ютера в наших предыдущих рассуждениях был одномерный массив ячеек. Как происходит отображение логической струк­туры двумерного массива в физическую? Известны два способа: отображение строками и отображение столбцами. Двумерный массив на языке Турбо Паскаль определяется по-разному.

Примеры описания массивов:

Const MaxN=...; МaxМ=...;{*Максимальные значения количест­ва строк и столбцов двумерного массива.*}

Type ОМуArray =Array[l..MaxM] Of integer;{*0дномерный мас­сив из целых чисел.*}

TMyArray=Array[l..MaxN] Of ОМуArray;{*Одномерный мас­сив, элементами которого являются одномерные мас­сивы из целых чисел.*}

или

Type TMyArray=Array[l..MaxN,l..MaxM] Of Integer; {*Двумер­ный массив из целых чисел.*}

В учебнике отдается предпочтение второму способу описа­ния двумерного массива.

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

Отметим еще одну технологическую особенность работы, точ­нее напомним, ибо она уже рассматривалась. Экран должен быть разбит на три окна, которые одновременно обозримы. Из­менение значений во входном файле (не забывайте его записы­вать) и запуск программы приводят к изменению выходного файла. Эти изменения видны без дополнительных операций по переходу от одного окна к другому. Текущим должен быть ка­талог с файлами программы, Input.Txt и Output.Txt. Названия входного и выходного файлов, естественно, могут быть други­ми. (Работа с окнами)

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

Примечание

Обычно значения размерности массива вводят с клавиатуры, а сам массив — из файла. «Разрыв» по данным. Процедура TInit полно­стью обеспечивает ввод массива — это законченный фрагмент логи­ки с одной точкой входа и одной точкой выхода. Фрагмент работа­ет с конкретными данными и взаимодействует с остальной логикой по определенным правилам. Разрыв не логичен как по управле­нию, так и по данным. Структуризация задачи должна осуществ­ляться как по управлению, так и по данным, иначе какой же переход к объектно-ориентированному программированию? Если на уровне деклараций или формального ознакомления с конструкциями или инструкциями, то это не наш путь.

Экспериментальный раздел работы

1. Найти первый максимальный элемент массива и его индек­сы.

Процедура Append открывает существующий файл для добавле­ния в него информации. Описание —Append(Var f:Text). Пере­менная f является файловой переменной типа Text, которая должна быть связана с внешним файлом с помощью процедуры Assign. Процедура Append открывает существующий внешний файл, имя которого поставлено в соответствие переменной f. Если файл уже открыт, то сначала он закрывается, а затем от­крывается повторно. Указатель текущей позиции (вспомните головки чтения, записи в магнитофоне) при этом устанавлива­ется на конец данного файла.

Если сама процедура поиска первого максимального элемен­та массива вряд ли вызывает вопросы, то для вывода результа­та в файл Output.txt наших знаний не хватает. Мы можем пе­реопределить вывод и значение максимального элемента с его индексами выводить на экран. Для этого необходимо:

Assign(Output,'Con'); Rewrite(Output);

и написать оператор WriteLn(Max,' ‘,iMax,' ',jMax). Однако массив выводится в файл Output.txt, а результаты работы — на экран. Где логика?

Воспользуемся процедурой Append. Добавление к основной программе может иметь и такой вид:

Search (n,m,A,Max,iMax, jMax) ;

Append (Output) ;

WriteLn (Max:5,iMax:5,jMax:5);

Измените процедуру Search для поиска последнего максима­льного элемента, для поиска всех максимальных элементов и их индексов.

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

3. Определить, есть ли в массиве элемент, равный 0.

Недостаток функции SNeg. Пусть первый элемент массива Х[1,1] равен нулю. Просмотр массива продолжается, несмотря на его бессмысленность. Устранение неточности — «задача опре­деляет тип используемых конструкций повторения» — требует использования операторов While или Repeat — Until в функции Sneg. Проделайте это.

Домашнее задание: 1.1,1.2,1.3,2.1,2.3

4. Определить, является ли данный квадратный массив симмет­ричным относительно своей главной диагонали. Элементы на главной диагонали характеризуется совпадением значением индексов — i=j, на второй i=N-j+l, где N — размерность мас­сива.

Измените функцию так, чтобы симметричность массива про­верялась относительно второй диагонали. В предыдущем при­мере был рассмотрен недостаток функции SNeg. Он присущ и этой функции. Устраните его.

5. В массиве а размерностью n*m к элементам четных столбцов прибавить элемент первого столбца соответствующей строки.

Особенностью решения задач этого типа является возмож­ность изменения элемента, который должен использоваться в обработке. Например, прибавляем к элементам нечетных столб­цов. Модификация X[i,2*j-l] приведет к тому, что элементы 3, 5 и т. д. столбцов увеличатся на удвоенное значение элемен­тов первого столбца. Проведите корректное изменение процеду­ры Change.

То есть заполняется в виде «змейки».

6. Заполнить массив A размером n*m следующим образом, на­пример n=6 и m=8:

Правило заполнения. Если номер строки — нечетное число, то A[i,j]=(i-l )*m+j, иначе — A[i,j]=i*m

Заполните массив по следующим правилам.