- •Экспериментальный раздел работы
- •1. Найти первый максимальный элемент массива и его индексы.
- •5. В массиве а размерностью n*m к элементам четных столбцов прибавить элемент первого столбца соответствующей строки.
- •7. Составить программу, запрашивающую координаты ферзя на шахматной доске и показывающую поля доски, находящиеся под боем.
Занятие 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.
То есть заполняется
в виде «змейки».
Правило заполнения. Если номер строки — нечетное число, то A[i,j]=(i-l )*m+j, иначе — A[i,j]=i*m