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

Delphi_part2

.pdf
Скачиваний:
9
Добавлен:
01.03.2016
Размер:
951.59 Кб
Скачать

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

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

Описание этого типа массива дадим в интерфейсной части модуля. Оно может выглядеть так.

unit UnitArrayDop;

interface

type TArray100= array[1..100] of integer;

7.2.2 Процедуры создания, ввода и вывода массивов

Несмотря на различие задач, решаемых этими процедурами, у них будет две одинаковых особенности.

Первая состоит в том, что в каждую из этих процедур будет передаваться имя массива. В тех случаях, когда процедура используется для создания массива, его следует передавать через var, то есть «по имени». Если же массив передается для вывода, то его следует передавать через const.

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

7.2.2.1 Процедура создания случайного массива

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

procedure createRandomArray(var a:TArray100; count, modul:integer ); var i:integer;

begin randomize;

for i:=1 to count do a[i]:=random(modul); end;

7.2.2.2 Процедура ввода массива из строки текста

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

11

//Считывание массива из строки символов

procedure getArrayFromStr(var a:TArray100; var count:integer; const s:String); var wordEndPos : integer; w : String[20];

begin count := 0;

while length(Trim(s))>0 do begin

//Удаляем пробелы s:=Trim(s);

//Находим позицию конца очередного слова wordEndPos:=Pos(' ',s); // Ищем пробел

if wordEndPos = 0 // Пробела не нашли, then // значит конец слова это конц строки

wordEndPos := length(s)

else // Конец слова левее пробела wordEndPos := wordEndPos -1;

//Копируем слово в переменную w

w:= Copy (s,1,wordEndPos);

//и удаляем его из строки

Delete (s,1,wordEndPos);

//Увеличиваем счетчик слов на 1 count := count + 1;

//Преобразуем слово в число и записываем в массив a[count]:=strToInt(w);

end; // Конец цикла поиска слов и формирования массива end; // Конец цикла поиска слов и формирования массива

7.2.2.3 Процедура ввода массива из компонента TMemo

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

//Считывание массива из Memo

12

procedure getArrayFromMemo(var a:TArray100; var count:integer;

mem: TMemo);

var i: integer; begin

//Узнаем количество строк count := Mem.Lines.Count;

// Поочередно обрабатываем строки

for i := 0 to count - 1 do a[i+1]:= strToInt(Mem.Lines[i]); end;

7.2.2.4 Процедура ввода массива с помощью функции InputBox

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

//Считывание массива из InputBox

procedure getArrayFromInputBox(var a:TArray100; var count:integer); var i:integer; w:String;

begin

w:= InputBox('Ввод массива типа TArray100', 'Сколько элементов ввести', '5');

count := strToInt(w); for i := 1 to count do begin

w:= InputBox(format('Ввод массива из %d элементов', [count]), 'Введите элемент № '+intToStr(i), '0');

a[i]:= strToInt(w);

end;

end;

7.2.2.5 Функция преобразования массива в строку символов

Функция формирует из чисел массива строку, в которой числа разделены пробелами. Эта строка может быть выведена в showMessage, компоненты TEdit, TLabel, и другие подобные компоненты.

Для работы функции передается ссылка на массив и его размер.

13

Возвращает функция – строку.

//Преобразование массива в строку

function ArrayToStr(const a:TArray100; count:integer):string; var i: integer;

begin

result := '';

for i:=1 to count do result := result + ' ' + intToStr(a[i]); end;

7.2.2.6 Процедура вывода массива в компонент TMemo

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

//Вывод массива в MEMO

procedure showArrayInMemo(const a:TArray100; count:integer; mem:TMemo); var i:integer;

begin mem.clear;

for i := 1 to count do begin

mem.Lines.Append(intToStr(a[i]));

end; end;

7.2.3 Обработка массивов

Операции с массивами также целесообразно оформить в виде процедур и функций. Эти подпрограммы добавлены в модуль UnitArrayDop.

7.2.3.1 Функция вычисления суммы элементов массива

В функцию передается ссылка на массив и его размер. Возвращает функция сумму элементов массива.

//Вычисление суммы элементов

function sumArray(const a:TArray100; count:integer):integer;

14

var i:integer; begin

result:=0;

for i:=1 to count do result := result + a[i]; end;

7.2.3.2 Процедура определения минимального, максимального, и их индексов в массиве

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

//Вычисление максимального и минимального и их индексов procedure minMax(const a:TArray100; count:integer;

var min, max, iMax, iMin: integer); var i: integer;

begin

min := a[1]; max := a[1]; for i := 1 to count do

if a[i] > max then begin max := a[i]; iMax := i; end

else if a[i] < min then begin

min := a[i]; iMin := i; end;

end;

7.2.3.3 Функция определения позиции элемента в массиве

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

15

//Определение позиции элемента

function posInArray(element: integer; const a: TArray100; count: integer): integer;

var i: integer; begin

Result := 0;

For i := 1 to count do if a[i] = element then begin

result := i; exit;

end; end;

7.2.3.4 Процедура удаления элементов из массива

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

//Удаление элемента из массива

procedure delElem(element: integer; var a: TArray100; var count: integer); var i, j: integer;

begin

i := 1;

while i <= count do begin

if a[i] = element then begin

count := count - 1;

for j := i to count do a[j] := a[j+1];

end

else i := i + 1;

end;

16

end;

7.2.3.5 Процедура переворота массива

В этой процедуре элементы массива, симметрично расположенные относительно середины, меняются местами.

//Переворот массива

procedure trans(var a: TArray100; count: integer); var tmp, i: integer;

begin

for i := 1 to count div 2 do begin

tmp := a[i];

a[i] := a[count – i + 1]; a[count – i + 1]:=tmp;

end; end;

7.2.3.6 Процедура циклического сдвига части элементов массива влево

В этой процедуре элементы массива с индексами от i1 до i2 сдвигаются влево на 1 элемент, а элементы с индексами i1 и i2 меняются местами. Если i1 =1, а i2 равно размеру массива, то сдвигается весь массив.

//Сдвиг массива влево

procedure shiftLeft(var a: TArray100; count, i1, i2: integer); var tmp, i: integer;

begin

if i2 > count then i2 := count; tmp := a[i1];

for i := i1 + 1 to i2 do a[i-1] := a[i]; a[i2] := tmp;

end;

17

7.2.3.7 Процедура формирования массива накопленных значений

Эта процедура создает новый массив, такой же длины, как и исходный, но в этом массиве каждый элемент равен сумме элементов в исходном массиве от первого до текущего элемента.

//Формирование массива накопленных значений

procedure accum(const a: TArray100; var b: TArray100; count: integer); var i: integer;

begin

b[1] := a[1];

for i := 2 to count do b[i] := b[i-1] + a[i]; end;

7.3 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

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

Главное меню проекта должно включать следующие пункты: создание массива, числовые характеристики, формирование нового массива.

На форме должны быть поля для ввода количества элементов массива и модуля для элементов массива (ограничителя величины числа).

Вывод числовых характеристик на усмотрение разработчика. Компоненты для хранения исходного массива и массива, получаемого в

результате обработки, должны соответствовать варианту задания.

Глобальные переменные для хранения массива и количества данных в нем использовать не следует.

При выполнении каждого пункта меню всю необходимую информацию считывать с формы.

При разработке проекта можно использовать процедуры и функции модуля UnitArrayDop.

7.4 СОДЕРЖАНИЕ ОТЧЕТА

Наименование работы

Цель работы

Краткое описание основных понятий, связанных с массивами

Тексты процедур и функций, написанных самостоятельно

Контрольные примеры работы пунктов проекта

Результаты выполнения пунктов проекта в виде копий экранов

Выводы

18

Таблица 7.1 – Задания на лабораторную работу

 

 

 

 

 

 

 

 

Создание

Хранение

Числовые

Получение нового

Вывод

 

исходного

исходного

характеристики

массива

нового

 

массива

массива

 

 

массива

0

Random

TEdit

Размах элементов

Удаление четных

TMemo

 

 

 

(max-min)

элементов из

 

 

 

 

 

массива

 

1

InputBox

TMemo

Разность сумм

Оборот

TEdit

 

 

 

элементов в четных и

массива

 

 

 

 

нечетных позициях

 

 

2

Random

TEdit

Определение позиций

Вставка элемента в

TLabel

 

 

 

четных элементов

заданную позицию

 

3

InputBox

TLabel

Определение позиций

Удаление заданного

Show

 

 

 

элементов, которые

элемента из массива

Message

 

 

 

меньше среднего

 

 

 

 

 

арифметического

 

 

4

Random

TMemo

Разность сумм четных

Заданное число

Show

 

 

 

и нечетных элементов

циклических

Message

 

 

 

 

сдвигов влево

 

5

InputBox

TLabel

Количество

Вставка суммы

TMemo

 

 

 

четных и нечетных

элементов в начало

 

 

 

 

элементов

массива

 

6

Random

TMemo

Средние

Заданное число

TEdit

 

 

 

арифметические

циклических

 

 

 

 

четных и нечетных

сдвигов вправо

 

 

 

 

Элементов

 

 

7

InputBox

TMemo

Поиск позиции

Вставка среднего

TLabel

 

 

 

заданного элемента

арифметического

 

 

 

 

 

значения в

 

 

 

 

 

середину массива

 

8

Random

TLabel

Количество элементов

Вначале нечетные,

Show

 

 

 

больше и меньше

затем четные

Message

 

 

 

среднего

 

 

 

 

 

 

 

 

9

InputBox

TEdit

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

Минимальный в

TMemo

 

 

 

больше и меньше

начало, макси-

 

 

 

 

среднего

мальный в конец

 

19

КОНТРОЛЬНЫЕ ВОПРОСЫ

Определение понятия массив

Объявление статических массивов

Поиск максимального или минимального элемента в массиве

Нахождение суммы и среднего арифметического для элементов массива

Переворот массива

Циклические сдвиги элементов массива вправо и влево

Вставка элемента в массив

Удаление элемента из массива

Написать реализацию одного из вариантов из таблицы 7.1

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]