Учебные материалы по математике | Практикум по delphi — работа с массивами | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Практикум по delphi — работа с массивами


Тема 4. Программирование с использованием массивов

Цель лабораторной работы: изучить свойства компонента TStringGrid. Написать программу с использованием массивов.

4.1. Работа с массивами

Массив есть упорядоченный набор однотипных элементов, объединенных под одним именем. Каждый элемент массива обозначается именем, за которым в квадратных скобках следует один или несколько индексов, разделенных запятыми, например: a[1], bb[I], c12[I, j*2], q[1,1,I*j-1].. В качестве индекса можно использовать любые порядковые типы за исключением LongInt.

Тип массива или сам массив определяются соответственно в разделе типов (Type) или переменных (Var) с помощью ключевого слова Array следующим образом:

Array [описание индексов] of <тип элемента массива>

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

Const N=20; // Задание максимального значения индекса;

Type TVector=array[1..N] of real; // Описание типа одномерного массива;

Var a:TVector; // А – массив типа Tvector;

Ss:array[1..10] of integer; // Ss – массив из десяти целых чисел;

Y:array[1..5,1..10] of char; // Y – двумерный массив символьного типа.

Элементы массивов могут использоваться в выражениях так же, как и обычные переменные, например:

F:=2*a[3]+a[ss[I]+1]*3;

A[n]:=1+sqrt(abs(a[n-1]));

4.2. Компонент TStringGrid

При работе с массивами ввод и вывод информации на экран удобно организовывать в виде таблиц. Компонент TStringGrid предназначен для отображения информации в виде двумерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну TEdit). Доступ к информации осуществляется с помощью свойства Cells[ACol, ARow: Integer]: string, где ACol, Arow — индекс элемента двумерного массива. Свойства ColCount и RowCount устанавливают количество строк и столбцов в таблице, а свойства FixedCols и FixedRows задают количество строк и столбцов фиксированной зоны. Фиксированная зона выделена другим цветом, и в нее запрещен ввод информации с клавиатуры.

4.3. Порядок выполнения задания

Задание: создать программу для определения вектора , где А — квадратная матрица размерностью NxN, а Y, B – одномерные массивы размерностью N. Элементы вектора Y определяются по формуле . Значения N вводить в компонент TEdit, А и B — в компонент TStringGrid. Результат, после нажатия кнопки типа TButton, вывести в компонент TStringGrid.

Панель диалога приведена на рис. 4.1.

Настройка компонента TStringGrid

Для установки компонента TStringGrid на форму необходимо на странице Additional меню компонентов щелкнуть мышью по пиктограмме . После этого щелкните мышью в нужном месте формы. Захватывая кромки компонента отрегулируйте его размер. В инспекторе объектов значения свойств ColCount и RowCount установите 2 (две строки и два столбца), а FixedCols и FixedRows установите 1 (один столбец и одна строка с фиксированной зоной). Т. к. компоненты StringGrid2 и StringGrid3 имеют только один столбец, то у них: ColCount= 1, RowCount=2, FixedCols=0 и FixedRows=1. По умолчанию в компонент TStringGrid запрещен ввод информации с клавиатуры, поэтому необходимо свойство Options goEditing для компонентов StringGrid1 и StringGrid2 установить в положение True.

Текст программы приведен ниже.

unit tem4;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Grids;

type

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit;

Button1: TButton;

Button2: TButton;

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

StringGrid3: TStringGrid;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const

Nmax=10; // Максимальная размерность массива

Type

Mas2 = array[1..Nmax,1..Nmax] of extended; // Объявление типа двумерного массива размерностью Nmax

Mas1 = array[1..Nmax] of extended; // Объявление типа одномерного массива размерностью Nmax

var

Form1: TForm1;

A : Mas2; // Объявление двумерного массива

B, Y : Mas1; // Объявление одномерных массивов

N, i,j : integer;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

N:=3; // Размерность массива

Edit1.Text:=FloatToStr(N);

{Задание числа строк и столбцов в таблицах}

StringGrid1.ColCount:=N+1;

StringGrid1.RowCount:=N+1;

StringGrid2.RowCount:=N+1;

StringGrid3.RowCount:=N+1;

{Ввод в левую верхнюю ячейку таблицы названия массива}

StringGrid1.Cells[0,0]:=’Массив A:’;

StringGrid2.Cells[0,0]:=’Массив B:’;

StringGrid3.Cells[0,0]:=’Массив Y:’;

{Заполнение верхнего и левого столбцов поясняющими подписями}

for i:=1 to N do begin

StringGrid1.Cells[0,i]:=’ i= ‘+IntToStr(i);

StringGrid1.Cells[i,0]:=’ j= ‘+IntToStr(i);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

N:=StrToInt(Edit1.Text);

{Задание числа строк и столбцов в таблицах}

StringGrid1.ColCount:=N+1;

StringGrid1.RowCount:=N+1;

StringGrid2.RowCount:=N+1;

StringGrid3.RowCount:=N+1;

{Заполнение верхнего и левого столбцов поясняющими подписями}

for i:=1 to N do begin

StringGrid1.Cells[0,i]:=’ i= ‘+IntToStr(i);

StringGrid1.Cells[i,0]:=’ j= ‘+IntToStr(i);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

var s: extended;

begin

{Заполнение массива А элементами из таблицы StringGrid1}

for i:=1 to N do

for j:=1 to N do

A[i, j]:=StrToFloat(StringGrid1.Cells[j, i]);

{Заполнение массива B элементами из таблицы StringGrid2}

for i:=1 to N do

B[i]:=StrToFloat(StringGrid2.Cells[0,i]);

{Умножение массива А на массив В}

for i:=1 to N do begin

s:=0;

for j:=1 to N do s:=s+A[i, j]*B[j];

Y[i]:=s;

{Вывод результата в таблицу StringGrid3}

StringGrid3.Cells[0,i]:=FloatToStrf(y[i],fffixed,6,2);

end;

end;

end.

4.4. Индивидуальные задания

Во всех заданиях по теме «Массивы» скалярные переменные вводить с помощью компонента TEdit с соответствующим пояснением в виде компонента TLabel. Скалярный результат выводить в виде компонента TLabel. Массивы представлять на форме в виде компонентов TStringGrid, в которых 0-й столбец и 0-ю строку использовать для отображения индексов массивов. Вычисления выполнять, после нажатия кнопки типа TВutton.

1. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 в противном случае.

2. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k–й строки матрицы упорядочены по убыванию, и значение 0 в противном случае.

3. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 в противном случае.

4. Задана матрица размером NxM. Определить k – количество “особых” элементов матрицы, считая элемент “особым”, если он больше суммы остальных элементов своего столбца.

5. Задана матрица размером NxM. Определить k – количество “особых” элементов матрицы, считая элемент “особым”, если в его строке слева от него находятся элементы, меньшие его, а справа – большие.

6. Задана символьная матрица размером NxM. Определить k — количество различных элементов матрицы (т. е. повторяющиеся элементы считать один раз).

7. Дана матрица размером NxM. Упорядочить ее строки по неубыванию их первых элементов.

8. Дана матрица размером NxM. Упорядочить ее строки по неубыванию суммы их элементов.

9. Дана матрица размером NxM. Упорядочить ее строки по неубыванию их наибольших элементов.

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

11. Для матрицы размером NxM вывести на экран все ее седловые точки. Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот.

12. В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.

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

14. В матрице размером NxM поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением.

15. Из матрицы n-го порядка получить матрицу порядка n-1 путем удаления из исходной матрицы строки и столбца, на пересечении которых расположен элемент с наибольшим по модулю значением.

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

17. Дан массив, содержащий от 1 до k символов, за которым следует точка. Вывести этот текст в обратном порядке.

18. Дан непустой массив из цифр. Вывести на экран цифру, наиболее часто встречающуюся в этом массиве.

19. Отсортировать элементы массива X по возростанию.

20. Элементы массива X расположить в обратном порядке.

21. Элементы массива X циклически сдвинуть на k позиций влево.

22. Элементы массива X циклически сдвинуть на n позиций вправо.

23. Преобразовать массив X по следующему правилу: все отрицательные элементы массива перенести в начало, а все остальные – в конец, сохраняя исходное взаимное расположение, как среди отрицательных, так и среди остальных элементов.

24. Элементы каждого из массивов X и Y упорядочены по неубыванию. Объединить элементы этих двух массивов в один массив Z так, чтобы они снова оказались упоряченными по неубыванию.

25. Дан массив из k символов. Определить, симметричен ли он, т. е. читается ли он одинаково слева направо и справа налево.

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

27. Определить количество инверсий в этом массиве X (т. е. таких пар элементов, в которых большее число находится слева от меньшего: xi>xj при i<j).

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

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

30. Определить сколько различных символов входит в заданный текст, содержащий не более k символов и оканчивающийся точкой (в сам текст точка не входит).

Тема 5. Программирование с использованием строк

Цель лабораторной работы: изучить правила работы с компонентами TListBox и TСomboBox. Написать программу работы со строками.

5.1. Типы данных для работы со строками

5.1.1. Короткие строки типа ShortString и String[N]

Короткие строки имеют фиксированное количество символов. Строка ShortString может содержать 255 символов. Строка String[N] может содержать N символов, но не более 255. Первый байт этих переменных содержит длину строки.

5.1.2. Длинная строка типа String

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

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

5.1.3. Широкая строка типа WideString

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

5.1.4. Нуль-терминальная строка типа PChar

Представляет собой цепочку символов, ограниченную символом #0. Максимальная длина строки ограничена только доступной программе памятью. Нуль-терминальные строки широко используются при обращениях к API-функциям Windows (API – Application Program Interface – интерфейс прикладных программ).

5.1.5. Представление строки в виде массива символов

Строка может быть описана как массив символов. Если массив имеет нулевую границу, он совместим с типом PChar.

Var

MasS : array[1…100] of Char;

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

5.2. Компонент TListBox

Компонент TListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк. Объект Items (TString) хранит строки, находящиеся в списке. Для определения номера выделенного элемента используется свойство ItemIndex.

5.3. Компонент TComboBox

Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TЕdit, поэтому практически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text как в TEdit, а для работы со списком выбора — свойство Items как в TListBox. Cуществует Пять модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора.

5.4. Компонент TBitBtn

Компонент TBitBtn расположен на странице Additonal палитры компонентов и представляет собой разновидность стандартной кнопки TBotton. Его отличительная особенность – наличие растрового изображения на поверхности кнопки, которое определяется свойством Clyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Нажатие любой из них, кроме bkCustom и bkHelp закрывает модальное окно и возвращает в программу результат mr*** (например bkOk — mrOk). Кнопка bkClose закрывает главное окно и завершает работу программы.

5.5. Обработка событий

Обо всех происходящих в системе событиях, таких как создание формы, нажатие кнопки мыши или клавиатуры и т. д., ядро Windows информирует окна путем посылки соответствующих сообщений. Среда DELPHI позволяет принимать и обрабатывать большинство таких сообщений. Каждый компонент содержит обработчики сообщений на странице Events инспектора объектов.

Для создания обработчика события необходимо раскрыть список компонентов в верхней части окна инспектора объектов и выбрать необходимый компонент. Затем, на странице Events, нажатием левой клавиши мыши, выбрать обработчик и дважды щелкнуть по его левой (белой) части. В ответ DELPHI активизирует окно текста программы и покажет заготовку процедуры обработки выбранного события.

Каждый компонент имеет свой набор обработчиков событий, однако некоторые из них присуши большинству компонентов. Наиболее часто применяемые события представлены в табл. 5.1.

Таблица 5.1

Событие

Описание события

OnActivate

Форма получает это событие при активации

OnCreate

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

Окончание табл. 5.1

OnKeyPress

Возникает при нажатии кнопки на клавиатуре. Параметр Key имеет тип Char и содержит ASCII-код нажатой клавиши (клавиша Enter клавиатуры имеет код #13, клавиша Esc — #27 и т. д.). Обычно это событие используется в том случае, когда необходима реакция на нажатие одной из клавиш

OnKeyDown

Возникает при нажатии клавиши на клавиатуре. Обработчик этого события получает информацию о нажатой клавише и состоянии клавиш Shift, Alt и Ctlr, а также о нажатой кнопке мыши. Информация о клавише передается параметром Key, который имеет тип Word

OnKeyUp

Является парным событием для OnKeyDown и возникает при отпускании ранее нажатой клавиши

OnClick

Возникает при нажатии кнопки мыши в области компонента

OnDblClick

Возникает при двойном нажатии кнопки мыши в области компонента

5.6. Порядок выполнения индивидуального задания

Задание: написать программу подсчета числа слов в произвольной строке. В качестве разделителя может быть любое число пробелов. Для ввода строк и работы с ними использовать TComboBox. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close.

Панель диалога будет иметь вид (рис. 5.1).

Текст программы приведен ниже.

unit tema5;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons;

type

TForm1 = class(TForm)

Label2: TLabel;

Label3: TLabel;

BitBtn1: TBitBtn;

ComboBox1: TComboBox;

Label1: TLabel;

procedure FormActivate(Sender: TObject);

procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);

procedure ComboBox1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

// Обработка события активизации формы

procedure TForm1.FormActivate(Sender: TObject);

begin

ComboBox1.SetFocus; // Передача фокуса ComboBox1

end;

// Обработка события нажатия левой клавиши мыши

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13 then begin // Если нажата клавиша Enter, то…

ComboBox1.Items. Add(ComboBox1.Text); // Строка из окна редактирования

// заносится

в список выбора

ComboBox1.Text:=»; // Очистка окна редактирования

end;

end;

procedure TForm1.ComboBox1Click(Sender: TObject);

var st : string;

n, i,nst, ind: integer;

begin

n:=0; // Содержит число слов

ind:=0;

nst:=ComboBox1.ItemIndex; // Определение номера выбранной строки

st:=ComboBox1.Items[nst]; // Занесение выбранной строки в переменную st

for i:=1 to Length(st) do begin // Просмотр всех символов строки st

case ind of

0 : if st[i]<>’ ‘ then begin // Если встретился символ после пробела

ind:=1;

n:=n+1; // Число слов увеличивается на единицу

end;

1 : if st[i]=’ ‘ then ind:=0; // Если встретился пробел после символов

end;

end;

Label3.Caption:=IntToStr(n); // Вывод числа слов в Label3

end;

end.

5.7. Индивидуальные задания

Во всех заданиях исходные данные вводить с помощью компонента TEdit в компонент TListBox либо с помощью свойства Text в свойство Items компонента TComboBox. Скалярный результат выводить c помощью компонента TLabel. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close. Для расчетов вводить несколько различных строк.

1. Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или несколькими пробелами. Найти количество групп с пятью символами.

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

3. Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе.

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

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

6. Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т. е. начинается со знака “+” или “-“ и внутри подстроки нет букв, запятых и точек).

7. Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой

8. Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой

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

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

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

12. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова, накрывающего k-ю позицию (если на k-ю позицию попадает пробел, то номер предыдущего слова).

13. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая длиной k-символов (если на k-ю позицию попадает слово, то его следует отнести ко второй строке, дополнив первую пробелами до k-позиций).

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

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

16. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. В каждом слове заменить первую букву на прописную.

17. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Удалить первые k слов из строки, сдвинув на их место последующие слова строки.

18. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами i— и j-е слова.

19. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами первую и последнюю буквы каждого слова.

20. Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Заменить буквы латинского алфавита на соответствующие им буквы русского алфавита.

21. Дана строка символов SS…S, в которой могут встречаться цифры, пробелы, буква “E” и знаки “+”, “-“. Известно, что первый символ Sявляется цифрой. Из данной строки выделить подстроки, разделенные пробелами. Определить, является ли первая подстрока числом. Если да, то выяснить: целое или вещественное число, положительное или отрицательное.

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020