Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Belova_TM

.pdf
Скачиваний:
56
Добавлен:
06.05.2015
Размер:
2.46 Mб
Скачать

Программирование с использованием двумерных массивов

101

Для работы с двумерными массивами обычно используются вложенные циклы. Часто применяется структура алгоритма вложенных циклов со счетчиками (рис. 6.1).

Тело

внутреннего

цикла

Рис. 6.1. Схема алгоритма вложенных циклов

Обнуление элементов двумерного массива можно выполнить, используя вложенные операторы for:

for K:=1 to 3 do for L:=1 to 5 do A[K,L]:=0;

Ввод значений элементов двумерного массива с клавиатуры и вывод на форму приложения можно осуществить с помощью компоненты TStringGrid страницы Additional, предназначенной для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. С помощью компоненты Edit, представляющей собой однострочный редактор текста, можно вводить и (или) отображать длинные текстовые строки на форме приложения.

Пример

{i – номер столбца; j – номер строки таблицы StringGrid1.} Edit1.text:=StringGrid1.Cells[i,j];

102

Программирование с использованием двумерных массивов

После выполнения этого оператора присваивания в поле Edit1.Text будет содержаться текст из ячейки таблицы StringGrid1.

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

Описание двумерного динамического массива целых чисел:

var

mas: array of array of integer;

Выполнять операции с динамическим массивом можно только после задания размеров этого массива процедурой

SetLength(mas, n1, n2);

Параметрами этой процедуры являются: mas – имя массива; n1 – количество строк; n2 – количество столбцов.

Нумерация элементов динамического массива начинается с нуля.

Пример. Обнулить элементы динамического двумерного массива, имеющего 5 строк и 5 столбцов:

var mas: array of array of real; i,j: integer;

begin SetLength(mas,5,5); for i:=0 to 4 do for j:=0 to 4 do mas[i,j]:=0;

end;

Пример программирования с использованием двумерного массива

Задание. Подсчитать сумму всех элементов в двумерном мас-

сиве А [4,5].

1. Разработка алгоритма (рис. 6.2):

а) входные данные: A – массив, состоящий из вещественных чисел;

б) выходные данные: sum – вещественная переменная, сумма всех элементов массива;

в) промежуточные данные: i, j – счетчики циклов.

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

Программирование с использованием двумерных массивов

103

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

A

sum:=0

i:=1,m

j:=1,n

sum:=

=sum+A[i,j]

sum

Рис.6.2. Схема алгоритма вычисления суммы элементов массива

2. Разработка формы (рис. 6.3, табл. 6.1):

104

Программирование с использованием двумерных массивов

Рис.6.3. Внешний вид формы

 

 

 

 

Таблица 6.1

 

 

Используемые компоненты

 

 

 

 

 

 

Имя

Страница

Настраиваемые

 

 

палитры

Значение

компонента

свойства

компонент

 

1.

Form1

Caption

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

2.

Label1

Standard

Caption

Введите элементы матри-

цы

 

 

 

 

3.

Label2

Standard

Caption

Сумма элементов равна

4.

Label3

Standard

Caption

 

5.

Button1

Standard

Caption

Рассчет

 

 

 

 

 

 

 

 

FixedCols

0

 

 

 

 

 

6.

StringGrid1

Additional

RowCount

4

FixedRows

0

 

 

 

 

 

 

Options

[goEditing, goTabs]

3. Текст программы: unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

TForm1 = class(TForm)

Программирование с использованием двумерных массивов

105

StringGrid1: TStringGrid; Label1: TLabel; Button1: TButton; Label2: TLabel;

Label3: TLabel;

procedure Button1Click(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); const m=4; n=5;

type

mas=array [0..m-1,0..n-1] of real;

var

i,j:integer; a:mas; sum:real;

begin

//ввод массива for i:=0 to m–1 do

for j:=0 to n–1 do a[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

sum:=0;

for i:=0 to m-1 do for j:=0 to n-1 do sum:=sum+a[i,j];

//вывод результата

Label3.Caption:=FloatToStr(sum);

end;

end.

Контрольные вопросы к главе 6

106Программирование с использованием двумерных массивов

1.Какие свойства компонента StringGrid нужно настроить для ввода и вывода элементов двумерного массива?

2.Написать фрагмент программы ввода двумерного целочисленного массива, в котором 5 строк и 10 столбцов.

3.Написать фрагмент программы вывода двумерного вещественного массива, в котором 5 строк и 6 столбцов.

4.Дать описание трехмерного целочисленного массива.

5.Дать описание динамического четырехмерного целочисленного массива с использованием разделов описания type и var.

6.Заданы массивы:

var

A, B: array[1..15,0..8] of real;

Какие операции над этими массивами как над единым целым допустимы в системе Delphi?

7.Ввести квадратную вещественную матрицу 4-го порядка, элементы которой заданы построчно, и распечатать ее по столбцам.

8.Сколько элементов содержит каждый из описанных ниже массивов?

var

MB: array [ A .. C ,1..3] of real;

MC: array [FALSE..TRUE] of array [1..5] of char; MD: array [1..5,0..4] of integer;

9. Присвоить нулевые значения всем элементам массива:

А: array [ K .. Z ] of real.

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

11.Какие значения должны принимать счетчики циклов для перебора элементов квадратного массива, лежащих выше главной диагонали?

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

Программирование с использованием двумерных массивов

107

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

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

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

Задания к лабораторной работе № 6

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

2.Дана вещественная матрица размером NxM. Упорядочить

еестроки по возрастанию их первых элементов.

3.Дана вещественная матрица размером NхM. Упорядочить

еестроки по возрастанию суммы их элементов.

4.Дана вещественная матрица размером NхM. Упорядочить

еестроки по возрастанию наибольших элементов.

5.Определить, является ли заданная целочисленная квадратная матрица порядка N симметричной относительно главной диагонали.

6.Среди тех строк целочисленной матрицы размером NхM, которые содержат только нечетные элементы, найти строку с максимальной суммой модулей элементов.

7.Среди тех столбцов целочисленной матрицы размером NхM, которые содержат только такие элементы, значения которых по модулю не превышают 10, найти столбец с минимальным произведением элементов.

8.Даны целые числа А1,...,А10, целочисленная квадратная матрица порядка N. Заменить нулями в матрице те элементы, для которых имеются равные числа среди А1,...,А10.

9.В двумерном массиве целых чисел поменять местами строки, симметричные относительно середины массива (горизонтальной линии).

108Программирование с использованием двумерных массивов

10.В двумерном массиве целых чисел поменять местами столбцы, симметричные относительно середины массива (вертикальной линии).

11.Даны две вещественные квадратные матрицы порядка N. Получить новую матрицу прибавлением к элементам каждого столбца первой матрицы минимального элемента соответствующего столбца второй матрицы.

12.В данной вещественной квадратной матрице порядка N найти наибольший по модулю элемент. Получить квадратную матрицу порядка N–1 путем выбрасывания из исходной матрицы строки и столбца, на пересечении которых расположен элемент с найденным значением.

13.В данной вещественной квадратной матрице порядка N найти наименьший по модулю элемент. Получить квадратную матрицу порядка N–1 путем выбрасывания из исходной матрицы строки и столбца, на пересечении которых расположен элемент с найденным значением.

14.Дана вещественная матрица размером NхM, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент.

15.Дана вещественная матрица размером NхM, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наименьший по модулю элемент.

16.Дана целочисленная квадратная матрица порядка N. Найти

вкаждой строке наибольший элемент и поменять его местами с элементом, расположенным на главной диагонали.

17.Дана целочисленная квадратная матрица порядка N. Найти

вкаждой строке наименьший элемент и поменять его местами с элементом, расположенным на вспомогательной диагонали.

18.Дана вещественная матрица размером NхM. Определить числа В1,..,Вn, равные значениям средних арифметических элементов строк.

19.Дана вещественная матрица размером NхM. Определить числа В1,..,Bm, равные значениям средних арифметических элементов столбцов.

Программирование с использованием двумерных массивов

109

20.Дана вещественная матрица размером NхM. Определить числа В1,..,Вm, равные среднему арифметическому значению максимального и минимального элементов каждого столбца.

21.Все элементы с наибольшим по модулю значением в целочисленной квадратной матрице порядка N заменить нулями.

22.В данной вещественной квадратной матрице порядка N найти сумму элементов строки, в которой расположен элемент с наименьшим значением. Предполагается, что такой элемент единственный.

23.Дана вещественная матрица размером NхM. Определить числа В1,..,Вn, равные произведениям элементов строк.

24.Дана вещественная матрица размером NхM. Определить числа В1,..,Вn, равные произведению минимального и максимального элементов столбцов матрицы.

25.Дана вещественная матрица размером NхM. Определить числа В1,..,Вn, равные произведению минимального и максимального элементов строк матрицы.

26.Дана вещественная матрица размером NхM. Определить числа В1,..,Вn, равные максимальным значениям элементов строк, и С1,..,Сm, равные минимальным значениям элементов столбцов.

27.Дана целочисленная квадратная матрица порядка N, в которой встречаются одинаковые по значению элементы. Найти элементы, имеющие различные значения.

7.ПРОГРАММИРОВАНИЕ В СИСТЕМЕ DELPHI

СИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ

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

Две формы подпрограмм

Если в программе встречаются повторяющиеся фрагменты, то целесообразно эти фрагменты оформить как подпрограмму. Подпрограммы представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именем. Упоминание этого имени в тексте программы называется вызовом подпрограммы. Подпрограмма обычно содержит описания идентификаторов: констант, типов, переменных и вложенных в нее подпрограмм. Все идентификаторы, описанные внутри подпрограммы, локализуются в ней. В разделе описания подпрограмм могут встретиться описания подпрограмм низшего уровня, в них – описания других подпрограмм и т. д. Все имена в пределах подпрограммы, в которой они объявлены, должны быть уникальными. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. При взаимодействии подпрограмм одного уровня иерархии вступает в силу основное правило Object Pascal: любая подпрограмма перед её использованием должна быть описана.

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

Использование подпрограмм позволяет уменьшить объем памяти, занимаемый кодом программы в целом. Однако время выполнения программы при этом несколько возрастает, так как появляются временные издержки на вызов подпрограмм и возврат из подпрограмм.