Массивы в параметрах процедур и функций

      Комментарии к записи Массивы в параметрах процедур и функций отключены

Задание №1. Ввод одномерного массива с помощью компонента StringGrid. Анализ элементов массива.

Для выполнения заданий №1 — №2 необходимо создать новое приложение.

Под вводом массива понимается процесс получения от пользователя (или из файла) значений элементов массива во время работы программы.

Лобовое решение задачи ввода элементов массива — для каждого элемента массива создать поле ввода. Однако, если требуется ввести достаточно большой массив, то такое решение неприемлемо.

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

1. Значок компонента StringGrid находится на вкладке Additional. Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. Добавьте компонент StringGrid на форму.

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

ColCount, RowCount — количество столбцов, строк соответственно.

FixedCols, FixedRows — количество фиксированных (во время работы приложения недоступны для ввода; по умолчанию окрашены в серый цвет) столбцов, строк соответственно.

DefaultColWidth, DefaultRowHeight — ширина столбцов, строк соответственно.

Options.goEditing — разрешает (true) или запрещает (false) вносить изменения в ячейки во время исполнения приложения.

Options.goTabs — разрешает (true) или запрещает (false) переходить на следующую ячейку с помощью клавиши Tab (во время исполнения приложения).

2. Сконструируйте форму, на которой: компонент StringGrid используется для ввода массива, Label1 — для вывода пояснительного текста, Label2 — для вывода результата, Button1 — для активизации выполнения действий. Форма может быть приблизительно такой:

3. Найдите в инспекторе объектов, какие свойства StringGrid необходимо изменить, чтобы получить такой же внешний вид этого компонента, как на картинке.

4. Объявите одномерный числовой массив соответствующей длины (столько же, сколько заготовлено ячеек в StringGrid1).

5. Присвойте элементам массива значения, расположенные в соответствующих ячейках компонента StringGrid1. Для этого необходимо воспользоваться свойством Cells компонента StringGrid1. Нумеруются строки и столбцы, начиная с 0. Каждая ячейка StringGrid1 находится на пересечении некоторого i-ого столбца и некоторой j-ой строки, то есть StringGrid1.Cells [i, j] – это значение, находящееся в соответствующей ячейке. В нашем случае строка одна (с индексом 0).

6. Чтение данных из компонента StringGrid в массив оформить в виде процедуры (назовем StrGridToArr), которая должна иметь следующие параметры: параметр-переменную типа массив (ключевое слово var), параметр-значение типа TStringGrid.

7. Решение задачи своего варианта также оформите в виде подпрограммы (процедуры или функции — на ваше усмотрение), которую нужно вызвать в обработчике события OnClick кнопки Button1 после вызова процедуры StrGridToArr чтения данных в массив.

8. Результат показать в Label2, используя свойство Caption и функции конвертирования (IntToStr, FloatToStr).

ЗАМЕЧАНИЕ: ЗАДАНИЯ МОЖЕТ СФОРМУЛИРОВАТЬ ВАШ ПРЕПОДАВАТЕЛЬ.

Задачи по вариантам:

№ 1. Найти сумму элементов массива, делящихся на 3.

№ 2. Найти произведение ненулевых элементов массива.

№ 3. Найти количество элементов, которые больше своего левого соседа.

№ 4. Найти минимальный элемент массива.

№ 5. Найти сумму положительных элементов массива.

№ 6. Найти произведение элементов массива, модуль которых меньше 7.

№ 7. Найти количество элементов, которые больше своего правого соседа.

№ 8. Найти сумму элементов массива, стоящих на четных позициях.

№ 9. Найти максимальный элемент массива.

№ 10. Найти сумму квадратов элементов в массиве.

№ 11. Найти произведение элементов массива, больших 5.

№ 12. Найти количество четных элементов массива.

Задание №2. Вывод элементов массива в строку и в StringGrid

1. Для ввода элементов массива используйте компоненты и процедуру StrGridToArr задания №1. На форму положите кнопку Button2 (для решения задания № 2).

2. Решение задачи своего варианта также оформите в виде подпрограммы (процедуры или функции — на ваше усмотрение), которую нужно вызвать в обработчике события OnClick кнопки Button2.

3. Чтобы показать результат в Label2, необходимо сначала сформировать строку, состоящую из значений элементов преобразованного массива, разделенных пробелом (если хотите элементы вывести в одну строку) или символом #13 — Enter (если выводите элементы списком), а затем присвоить полученную строку свойству Caption компонента Label2. Следует обратить внимание, что для того, чтобы наш массив выглядел, как список, свойству Label2.AutoSize нужно присвоить значение True (присвойте свойству Label2.AutoSize значение False и посмотрите, как будет работать программа).

ЗАМЕЧАНИЕ: ЗАДАНИЯ МОЖЕТ СФОРМУЛИРОВАТЬ ВАШ ПРЕПОДАВАТЕЛЬ.

Задачи по вариантам:

№ 1. Дан массив размера N (N — четное число). Поменять местами его первый элемент со вторым, третий — с четвертым и т. д.

№ 2. Осуществить циклический сдвиг элементов массива вправо на одну позицию (при этом A1 перейдет в A2, A2 — в A3, …, AN — в A1, где N — размер массива A).

№ 3. Возвести в квадрат все локальные минимумы (то есть числа, меньшие своих соседей) массива.

№ 4. Заменить каждый элемент массива на среднее арифметическое этого элемента и его соседей.

№ 5. Дан массив размера N (N — четное число). Поменять местами первую и вторую половины массива.

№ 6. Обнулить все локальные максимумы массива (то есть числа, большие своих соседей).

№ 7. Поменять местами минимальный и максимальный элементы массива.

№ 8. Поменять порядок элементов массива на обратный.

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

№ 10.Дан массив размера N (N — четное число). Переставить в обратном порядке элементы массива, расположенные в первой половине массива.

№ 11. Обнулить все отрицательные элементы массива.

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

4. Элементы преобразованного массива можно выводить по-другому. Положите на форму еще один компонент StringGrid2, который будет использоваться для вывода элементов массива после выполнения изменений, описанных в задаче. Для ввода элементов массива используйте компоненты и процедуру StrGridToArr задания №1. Вывод элементов массива в компонент StringGrid2 оформите в виде процедуры ArrToStrGrid, которая имеет входные параметры: открытый массив; параметр-переменную типа TStringGrid. Количество столбцов компонента StringGrid2 устанавливается в зависимости от размеров переданного массива.

5. На форму положите кнопку Button3. В обработчике обработчике события OnClick кнопки Button3 вызовите процедуры ввода StrGridToArr и вывода ArrToStrGrid.

Контрольные вопросы к заданиям №1-2.

1. Что такое массив?

2. Как описать статический массив? Приведите примеры.

3. Как обратиться к отдельному элементу массива?

4. Как проинициализировать массив?

5. Как обращаться к элементу компонента StringGrid?

6. Какие основные свойства компонента StringGrid вы использовали?

7. Расскажите о способах использования открытых массивов.

8. Каковы значения нижней и верхней границ открытого массива в подпрограмме?

Задание №3. Динамические массивы. Использование компонента Memo.

1. Компонент Memo позволяет вводить текст, состоящий из достаточно большого количества строк, поэтому его удобно использовать для ввода символьного массива. Компонент Memo добавляется в форму обычным образом. Значок компонента находится на вкладке Standard.

2. Создайте новый проект. Сконструируйте форму, на которой: компонент Memo1 используется для ввода массива, компонент Memo2 — для вывода полученного результата, компоненты Label1 и Label2 — для вывода пояснительного текста, Button1 — для чтения элементов в массив, Button2 — для выполнения действий, указанных в задаче. Форма может быть приблизительно такой, как на рисунке (см. далее):

3. При использовании компонента Memo для ввода массива значение каждого элемента массива следует вводить в отдельной строке и после ввода каждого элемента массива нажимать клавишу ввода.

4. Объявите динамический массив, выбрав необходимую область действия идентификатора.

5. Получить доступ к находящейся в поле Memo строке текста можно при помощи его свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля), например: Memol.Lines[0], где Memol — имя Memo-компонента, Lines — свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку текста, находящегося в поле Memo.

6. Чтение данных из компонента Memo в массив оформите в виде подпрограммы, которую нужно вызвать в обработчике события OnClick компонента Button1.

7. Решение задачи своего варианта также оформите в виде подпрограммы, которую нужно вызвать в обработчике события OnClick кнопки Button2.

8. Вывод данных из массива в компонент Memo оформите в виде подпрограммы. Для добавления элементов массива в Memo используйте метод Add свойства Lines. Например: Memo2.Lines.Add(). Вызовите подпрограмму вывода данных после их обработки в процедуре OnClick кнопки Button2.

ЗАМЕЧАНИЕ: ЗАДАНИЯ МОЖЕТ СФОРМУЛИРОВАТЬ ВАШ ПРЕПОДАВАТЕЛЬ.

Задачи по вариантам:

№ 1. Дан массив строк. Вывести на экран строки, которые являются правильными идентификаторами языка Delphi.

№ 2. Дан массив строк. Вывести на экран строки, которые встречаются в массиве только один раз.

№ 3. Дан массив строк. Удалить одинаковые строки, оставив их первые вхождения.

№ 4. Дан массив строк. Вывести на экран строки в обратном порядке.

№ 5. Дан массив строк. Вывести на экран строки, которые встречаются в массиве больше одного раза.

№ 6. Дан массив строк. Осуществить циклический сдвиг элементов массива вниз на одну позицию (при этом нулевой элемент перейдет в первый, первый — во второй, …, последний — в нулевой).

№ 7. Дан массив строк. Вывести на экран строки, начинающиеся с прописной буквы.

№ 8. Дан массив строк. Вывести на экран строки, поместив вначале все строки, расположенные на четной позиции, а затем, в обратном порядке, все строки, расположенные на нечетной позиции.

№ 9. Дан массив строк. Вывести на экран, добавив после каждой строки пустую строку.

№ 10. Дан массив строк. Вывести на экран строки, начинающиеся со строчной буквы.

№ 11. Дан массив строк. Осуществить циклический сдвиг элементов массива вверх на одну позицию (при этом последний элемент перейдет в предпоследний, …, нулевой — в последний).

№ 12. Дан массив строк. Вывести на экран строки, поместив вначале все строки, расположенные на нечетной позиции, а затем, в обратном порядке, все строки, расположенные на четной позиции.

Контрольные вопросы к заданию №3.

1. Какой массив называется динамическим?

2. Как объявить динамический массив? Приведите примеры.

3. Как выделить память для динамического массива? Как освободить память после использования динамического массива?

4. Какие встроенные функции используются при работе с динамическими массивами?

5. Как осуществляется доступ к элементам динамического массива?

Задание №4. Работа с двумерными массивами (матрицами)

1. Создайте новый проект для заданий №4 — №5. Сконструируйте форму, на которой: компонент StringGrid1используется для ввода матрицы, Label1, Label2 — для вывода пояснительного текста и результата, Button1- для выполнения действий, указанных в задаче. Форма может быть приблизительно такой, как на рисунке:

2. Чтение элементов массива из компонента типа TStringGrid в двумерный массив оформите в виде процедуры StrGridToArr2.

3. Решение задачи своеговарианта также оформите в виде функции.

4. В обработчике события OnClick кнопки Button1 нужно: вызвать процедуру чтения StrGridToArr2; вызвать подпрограмму, реализующую задачу вашего варианта; вывести результат в компонент Label2.

ЗАМЕЧАНИЕ: ЗАДАНИЯ МОЖЕТ СФОРМУЛИРОВАТЬ ВАШ ПРЕПОДАВАТЕЛЬ.

Задачи по вариантам:

№ 1. Найдите минимум из всех сумм элементов матрицы по столбцам.

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

№ 3. Если матрица квадратная, проверьте ее на симметричность. Если матрица не является квадратной, функция должна возвращать значение false.

№ 4. Найдите минимум из всех максимумов по строкам матрицы.

№ 5. Найдите количество всех элементов матрицы, значения которых — нечетные числа, принадлежащие отрезку [-15; 15].

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

№ 7. Найдите максимум из всех минимумов по столбцам матрицы.

№ 8. Найдите след (сумму элементов главной диагонали) матрицы, если матрица квадратная. Если матрица не является квадратной, функция должна возвращать значение 0.

№ 9. Найдите разность между максимальным и минимальным элементами матрицы.

№ 10. Найдите максимум из всех произведений элементов матрицы по строкам.

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

№ 12. Найдите количество всех элементов матрицы, модуль которых равен максимальному элементу матрицы.

Задание №5. Преобразование двумерного динамического массива. Вывод в компонент StringGrid.

1. На форму добавьте компоненты: StringGrid2- для вывода полученного результата (преобразованного массива); Label3 — для вывода пояснительного текста к StringGrid2; Button2- для выполнения действий, указанных в задаче. Форма может быть приблизительно такой, как на рисунке:

2. Вывод элементов преобразованного массива в компонент типа TStringGrid оформите в виде процедуры Arr2ToStrGrid.

3. Решение задачи своего варианта оформите в виде процедуры. ВНИМАНИЕ: Задачу реализуйте для динамического двумерного массива.

4. В обработчике события OnClick кнопки Button2 нужно: вызвать процедуру чтения StrGridToArr2; вызвать подпрограмму, реализующую задачу вашего варианта; вызвать процедуру вывода Arr2ToStrGrid.

ЗАМЕЧАНИЕ: ЗАДАНИЯ МОЖЕТ СФОРМУЛИРОВАТЬ ВАШ ПРЕПОДАВАТЕЛЬ.

Задачи по вариантам:

№ 1.Процедура нахождения средних арифметических для каждой строки матрицы.

№ 2.Процедура удаления всех строк матрицы, сумма элементов которых меньше заданного числа В.

№ 3.Процедура, добавляющая к матрице столбец, каждый элемент которого равен сумме всех элементов соответствующей строки исходной матрицы.

№ 4.Процедура сортировки всех строк матрицы по элементам последнего столбца.

№ 5.Процедура, добавляющая к матрице строку, каждый элемент которой равен максимуму из всех элементов соответствующего столбца исходной матрицы.

№ 6.Процедура: В матрице удалите все столбцы, в которых есть элементы, меньшие 3.

№ 7.Процедура: Найти суммы элементов матрицы в каждой строке и удалите те строки, суммы элементов которых меньше K (задано пользователем).

№ 8.Процедура: Создать новую матрицу, содержащую все строки исходной матрицы, первый элемент которых равен числу K (задано пользователем).

№ 9.Процедура вставки строки в матрицу на указанное место.

№ 10.Процедура: Создать новую матрицу, содержащую все столбцы исходной матрицы, которые имеют элементы, меньшие 3.

№ 11.Процедура: В матрице поменяйте местами две указанные (пользователем) строки.

№ 12.Процедура транспонирования матрицы.

Дополнительное задание. Генерация целочисленного массива

Простейшая схема генерации целочисленного массива:

1. Инициализация генератора случайных чисел.

Процедура Randomize. Эта процедура инициализирует (запускает) генератор случайных чисел. Процедуру надо вызывать в программе один раз. Без инициирования генератора случайных чисел обращения к соответствующим функциям выбора случайного числа всегда будут давать один и тот же результат.

2. Получение случайного числа.

Функция Random. Заголовок выглядит следующим образом:

function Random [ ( Range: Integer) ];

Если обращаться к функции без параметров, то она вернет значение типа Real в диапазоне: 0

3. Заполнение массива.

for i:= 1 to 50 do A[i]:=Random(10);// A[i]I[0;9]

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

for i:= 1 to 50 do a[i]:=Random(20)-10; // A[i]I[-10;9]

Задачи по вариантам:Сгенерировать и вывести на экран целочисленный массив. Генерацию массива оформите в виде процедуры, которая должна иметь параметр-переменную типа массив (ключевое слово var). Решите одну из следующих задач.

№ 1. Вывести на экран элементы массива в обратном порядке.

№ 2. Найти номера двух ближайших элементов из массива (то есть элементов с наименьшим модулем разности) и вывести эти номера в порядке возрастания.

№ 3. Вывести на экран элементы массива, стоящие на нечетных позициях.

№ 4. Вывести на экран все локальные минимумы массива (локальный минимум — это элемент, который меньше любого из своих соседей).

№ 5. Найти два соседних элемента массива, сумма которых минимальна. Вывести эти элементы в порядке возрастания их индексов.

№ 6. Вывести на экран элементы, которые больше своего правого соседа.

№ 7. Вывести на экран четные элементы массива в порядке возрастания их индексов.

№ 8. Вывести на экран элементы массива, которые принадлежат промежутку [3; 15).

№ 9. Вывести на экран элементы, которые больше своего левого соседа.

№ 10. Вывести на экран все локальные максимумы массива (локальный максимум — это элемент, который больше любого из своих соседей).

№ 11. Найти два соседних элемента массива, сумма которых максимальна. Вывести эти элементы в порядке возрастания их индексов.

№ 12. Вывести на экран номера элементов массива, меньших 10.

Приложение. Массивы

Массив — последовательный список определенного количества элементов. Все элементы в массиве принадлежат к одному типу данных. Массивы бывают статическими и динамическими.

Статические массивы

Объявление массива: array [indexType1, …, indexTypeN] of baseType,

Каждый indexType – это порядковый тип (обычно явно задается поддиапазон целых чисел). Число элементов массива в каждом измерении задается соответствующим порядковым типом. Количество элементов массива равно произведению количеств элементов во всех измерениях.

Словосочетание array of является зарезервированным. Квадратные скобки после слова array являются требованием синтаксиса, а после слова of — тип элементов массива.

Примеры.

type TStates = array[1..50] of string; TCoordinates = array[1..3] of Integer;var States: TStates; { 50 strings } Symbols: array[0..80] of Char; { 81 characters }const Coordinates: TCoordinates = (10, 20, 5); { 3 integers }

Чтобы получить доступ к отдельному элементу массива, нужно в квадратных скобках указать его индекс, например Symbols[3]

Объявленные выше массивы являются одномерными, так как имеют только один индекс. Одномерные массивы обычно используются для представления линейной последовательности элементов. Если при описании массива задано два индекса, массив называется двумерным, если n индексов — n-мерным.

Двумерные массивы используются для представления таблицы (матрицы).

Пример объявления таблицы, содержащей 5 столбцов (колонок) и 20 строк:

var Table: array[1..5] of array[1..20] of Double;То же самое можно записать в более компактном виде:varTable: array[1..5, 1..20] of Double;

Чтобы получить доступ к отдельному элементу многомерного массива, нужно указать значение каждого индекса, например, Table[2][10]или в более компактной записи Table[2, 10].

Для массивов определены встроенные функции — Low, High, Length, аргумент которых — имя массива. Функция Low возвращает нижнюю границу, а High — верхнюю границу, Length — количество элементов (длину) этого массива.

Массивы в параметрах процедур и функций

Массивы, как и другие типы данных, могут выступать в качестве параметров процедур и функций.

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

Паскаль с нуля [ч7]. Одномерные массивы.