- •1. Создание консольного приложения в среде Delphi
- •Var х,у,z:real;
- •Save changes to Unitl.Pas? (Сохранить изменения в Unitl.Pas?),
- •1. Из таблицы 3.1 взять условие задачи (вариант согласовать с преподавателем). Таблица 3.1
- •Var a1 :textfile; // a1 – текстовый файл
- •При открытии файла желательно использовать функцию
- •InitialDir типа String – определяет каталог, содержимое которого отображается при вызове окна диалога. Если каталог не задан, то отображается содержимое текущего каталога;
- •С войства компонентов
- •Контрольные вопросы
1. Из таблицы 3.1 взять условие задачи (вариант согласовать с преподавателем). Таблица 3.1
№ |
Функция |
№ |
Функция |
1 |
x[0;1], dx=0,1 |
16 |
|
2 |
|
17 |
|
3 |
|
18 |
|
4 |
x[0;1] и dx=0,1 |
19 |
|
5 |
|
20 |
x[0;1]; dx=0,1; Z0=1 |
6 |
|
21 |
|
7 |
|
22 |
x[0;1], dx=0,1 |
8 |
|
23 |
|
9 |
|
24 |
|
10 |
|
25 |
|
11 |
|
26 |
|
12 |
x[0;10], dx=1 |
27 |
|
13 |
|
28 |
|
14 |
|
29 |
|
15 |
|
30 |
|
2. Составьте блок-схему и создайте оконное приложение для расчета значений Z с использованием процедур или функций (см. лабораторную работу №1 и приведенный ниже пример).
Пример:
Вычислить
Блок-схема алгоритма с использованием процедуры (рис.3.1).
Р
ис.3.1
Программа 1 с использованием процедуры:
program p1;
{$APPTYPE CONSOLE}
uses SysUtils;
var а,b,c,tl,t2,t3,u:real;
procedure max(x,y:real;var z:real);
begin
if х>у then z := х else z := у
end;
begin
writeln('Enter а,b,с');
readln(a,b,c);
max(a,a+b,tl);
шах(а,b+c,t2);
max(a+b*c,a*c,t3);
u := (tl+t2)/(1+t3);
writeln('u=',u:7:3);
readln
end.
Блок-схема алгоритма с использованием функции (рис.3.2).
Р
ис.3.2
Программа 2 с использованием функции:
program p2;
{$APPTYPE CONSOLE}
uses SysUtils;
var а,b,c,u:real;
function max(x,y:real):real;
begin
if х>у then result := х else result := у
end;
begin
writeln('Enter а,b,с');
readln(a,b,c);
u := (max(a,a+b)+mах(а,b+c))/(1+max(a+b*c,a*c));
writeln('u=',u:7:3);
readln
end.
Контрольные вопросы:
1. При каких условиях целесообразно использовать подпрограммы?
2. Опишите структуру процедур и функций.
3. Каково назначение процедур и функций и различие в их записи?
4. Перечислите правила описания и определения функций.
5. Перечислите правила описания и определения процедур.
6. Как передаются параметры в подпрограмму?
7. Как согласуются формальные и фактические параметры?
8. Подробно опишите программный код, который разработан для выполнения лабораторной работы.
Лабораторная работа №15
ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ
СТРУКТУРИРОВАННЫХ ТИПОВ ДАННЫХ
Цель:
- изучить правила описания и определения массивов на языке Object Pascal;
- получить практические навыки программирования на языке Object Pascal и создания оконного приложения в среде Delphi .
Общие сведения:
Массив – это упорядоченная совокупность элементов одного и того же типа. Элементы массива имеют уникальные индексы. Каждый элемент массива однозначно определяется именем массива и собственным индексом.
Массивы подразделяются на статические и динамические.
Статические массивы - это фиксированное количество упорядоченных однотипных компонентов (элементов) с индексами. Статический массив объявляется следующим образом:
var <имя массива> :array [<тип индекса (индексов)>] of <тип элементов>;
Индексом массива может быть любой порядковый тип, на практике обычно применяется тип Integer.
Доступ к компонентам массива осуществляется указанием имени массива, за которым в квадратных скобках помещается значение индекса (индексов) компонента.
Задание статического двумерного массива осуществляется следующим образом:
var <имя массива> : array[1..N,1..M] of <тип элементов>;
Динамические массивы - это массив, в котором при объявлении указывается только тип его элементов. Размеры динамических массивов изменяются в ходе выполнения программы.
Объявить одномерный динамический массив можно следующим образом:
var <имя массива> :array of <тип>;
Длина массива задается при помощи процедуры SetLength:
SetLength(<имя массива>,N);
Данная команда отводит в памяти массив на N элементов с индексами от 0 до (N-1).
Индексами динамических массивов всегда являются целые числа. Начальный индекс – всегда 0.
Доступ к элементам динамического массива аналогичен доступу к элементам статического массива.
Многомерный динамический массив объявляется следующим образом:
var <имя массива> :array of array of <тип>;
Длина многомерного динамического массива задается при помощи процедуры SetLength:
SetLength(<имя массива>,N,M);
Динамический массив из памяти удаляется следующим образом:
<имя массива>:= nil;
Для организации операций ввода-вывода массивов следует использовать циклы.
Задание:
Из таблицы 4.1 взять условие задачи (вариант согласовать с преподавателем) Массив X[i,j] заполнить случайными числами, 5i7; 5j7.
Таблица 4.1
№ вар. |
Задание |
Диапазон Xij |
1 |
Вычислить и запомнить сумму и число положительных элементов каждого столбца массива. |
-5; 5 |
2 |
Записать на место отрицательных элементов массива нули. |
-3; 5 |
3 |
Вычислить сумму и число элементов под главной диагональю. |
5; 10 |
4 |
Найти среднеарифметическое значение элементов массива. |
0; 5 |
5 |
Вычислить среднеарифметическое значение элементов для каждой строки |
1; 7 |
6 |
Вычислить и запомнить сумму элементов каждого столбца массива. |
2; 9 |
7 |
Вычислить и запомнить сумму и число положительных элементов каждой строки массива. |
-5; 3 |
8 |
Вычислить сумму и число положительных элементов над главной диагональю. |
-3; 2 |
9 |
Найти наибольший элемент для каждой строки |
2; 6 |
10 |
Записать элементы строк массива в обратном порядке |
0; 4 |
11 |
Поменять элементы четных строк с нижними нечетными |
-4; 4 |
12 |
Записать на место положительных элементов массива единицы. |
-5; 4 |
13 |
Найти наибольший элемент для каждого столбца. |
2; 5 |
14 |
Найти наименьший элемент массива |
1; 6 |
15 |
Найти среднеарифметическое значение отрицательных элементов массива. |
-4; 6 |
16 |
Вычислить сумму и число положительных элементов под главной диагональю. |
-3; 1 |
17 |
Вычислить и запомнить сумму и число отрицательных элементов каждой строки массива. |
-4; 5 |
18 |
Вычислить сумму элементов главной диагонали |
-6; 1 |
19 |
Найти наименьший элемент каждой строки |
3; 6 |
20 |
Вычислить сумму и число отрицательных элементов над главной диагональю. |
-3; 4 |
21 |
Поменять элементы нечетных строк с верхними четными |
4; 7 |
22 |
Найти среднегеометрическое значение элементов массива. |
-2; 2 |
23 |
Вычислить среднеарифметическое значение элементов для каждого столбца |
1; 7 |
24 |
Найти наибольший элемент массива |
-6; 2 |
25 |
Вычислить сумму и число отрицательных элементов под главной диагональю. |
-7; 4 |
26 |
Записать элементы столбцов массива в обратном порядке |
2; 4 |
27 |
Вычислить и запомнить сумму и число отрицательных элементов каждого столбца массива. |
-6; 6 |
28 |
Вычислить сумму и число отрицательных элементов над главной диагональю. |
-6; 3 |
29 |
Найти наименьший элемент каждого столбца |
2; 7 |
30 |
Найти среднеарифметическое значение положительных элементов массива. |
-4; 6 |
2. Составьте блок-схему и создайте оконное приложение (см. приведенный ниже пример).
Пример:
В целочисленной матрице X(7,7) поменять местами первую и последнюю строки.
Решение:
Блок-схема алгоритма (рис.4.1).
1. Для нового проекта создайте новую папку.
2. Откройте новый проект, используя команду главного меню File|New Application.
3. Из страниц Standard и Additional на Form1 поместите четыре компонента Label, четыре компонента Edit, четыре компонента Button и два компонента String Grid (см. рис.4.2).
4. С помощью Инспектора Объектов свойствам компонентов StringGrid1 и StringGrid2
задайте следующие значения:
FixedCols = 0,
FixedRows = 0,
ColCount = 7,
RowCount = 7.
5. В Инспекторе Объектов для обеих таблиц выберите свойство Options и установите значение флага goEditing равным True.
Р
ис.4.1
Рис.4.2
6. Установите свойства компонентов Labell, Label2, Label3 и Label4:
Labell: TLabel Name = I_Label Caption=’imax=’ |
Label2: TLabel Name = J_Label Caption = ‘jmax=‘ |
Label2: TLabel Name = XN_Label Caption = ‘Xнач=‘ |
Label4: TLabel Name = XK_Label Caption = ‘Xкон=‘ |
7. Установите свойства Editl, Edit2, Edit3 и Edit4:
Editl: TEdit Name = I_Edit Text = ‘ ‘ |
Edit2: TEdit Name = J_Edit Text = ‘ ‘ |
Edit2: TEdit Name = XN_Edit Text = ‘ ‘ |
Edit2: TEdit Name = XK_Edit Text = ‘ ‘ |
8. Для компонентов Buttonl, Button2, Button3 и Button4 задайте значение свойства Caption равным: ‘Заполнить’, ‘Расчет’, ‘Очистка’ и ‘Выход’ соответственно.
9. Активизируйте кнопку Заполнить и создайте следующий обработчик события OnC]ick:
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
imax:=StrToInt(I_Edit.Text);
jmax:=StrToInt(J_Edit.Text);
xn:=StrToInt(XN_Edit.Text);
xk:=StrToInt(XK_Edit.Text);
for i:=0 to (imax-1) do
begin
for j:=0 to (jmax-1) do
begin
X[j,i]:=Random(xk-xn+1)+xn;
StringGrid1.Cells[j,i]:=IntToStr(X[j,i]);
end
end
end;
Нумерация строк и столбцов начинается с 0. В свойстве Cells[j,i] первый индекс обозначает номер столбца, а второй - номер строки.
10. Активизируйте кнопку Расчет и в заготовке обработчика события OnClick разместите следующий код:
procedure TForm1.Button2Click(Sender: TObject);
var d :integer;
begin
for j:=0 to (jmax-1) do
begin
d:=X[j,0];
X[j,0]:=X[j,(imax-1)];
X[j,(imax-1)]:=d;
StringGrid2.Cells[j,0]:=IntToStr(X[j,0]);
StringGrid2.Cells[j,(imax-1)]:=IntToStr(X[j,(imax-1)]);
for i:=1 to (imax-2)do
StringGrid2.Cells[j,i]:=StringGrid1.Cells[j,i];
end
end;
11. Для очистки первой и второй таблицы, полей ввода данных предназначена кнопка Очистка. Активизируйте её и в заготовку обработчика события поместите следующий код:
procedure TForm1.Button3Click(Sender: TObject);
begin
I_Edit.Clear;
J_Edit.Clear;
XN_Edit.Clear;
XK_Edit.Clear;
for i:=0 to (imax-1) do
begin
for j:=0 to (jmax-1) do
begin
StringGrid1.Cells[j,i]:=' ';
StringGrid2.Cells[j,i]:=' ';
end
end
end;
12. Активизируйте кнопку Выход и в обработчик события OnClick вставьте строку
Close;
13. Сохраните проект при помощи команды главного меню File|Save All и запустите его на выполнение.
Полный текст сформированного модуля lab_4.pas имеет вид:
unit lab_4;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;
type
TForm1 = class(TForm)
Button2: TButton;
Button3: TButton;
Button4: TButton;
I_Label: TLabel;
I_Edit: TEdit;
J_Label: TLabel;
J_Edit: TEdit;
Button1: TButton;
XN_Label: TLabel;
XK_Label: TLabel;
XN_Edit: TEdit;
XK_Edit: TEdit;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
X :array[0..6,0..6] of integer;
imax,jmax,i,j,xn,xk :integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
imax:=StrToInt(I_Edit.Text);
jmax:=StrToInt(J_Edit.Text);
xn:=StrToInt(XN_Edit.Text);
xk:=StrToInt(XK_Edit.Text);
for i:=0 to (imax-1) do
begin
for j:=0 to (jmax-1) do
begin
X[j,i]:=Random(xk-xn+1)+xn;
StringGrid1.Cells[j,i]:=IntToStr(X[j,i]);
end
end
end;
procedure TForm1.Button2Click(Sender: TObject);
var d :integer;
begin
for j:=0 to (jmax-1) do
begin
d:=X[j,0];
X[j,0]:=X[j,(imax-1)];
X[j,(imax-1)]:=d;
StringGrid2.Cells[j,0]:=IntToStr(X[j,0]);
StringGrid2.Cells[j,(imax-1)]:=IntToStr(X[j,(imax-1)]);
for i:=1 to (imax-2)do
StringGrid2.Cells[j,i]:=StringGrid1.Cells[j,i];
end
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
I_Edit.Clear;
J_Edit.Clear;
XN_Edit.Clear;
XK_Edit.Clear;
for i:=0 to (imax-1) do
begin
for j:=0 to (jmax-1) do
begin
StringGrid1.Cells[j,i]:=' ';
StringGrid2.Cells[j,i]:=' ';
end
end
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;
end.
Контрольные вопросы:
1. Какие структурированные типы данных используются в языке программирования Object Pascal?
2. Какие операторы языка используются для описания массивов?
3. В чем состоит особенность организации цикла при обработке массивов?
4. Укажите особенности ввода и вывода массивов.
5. Как получить случайное число с заданного интервала?
6. Приведите порядок размещения компонентов на форме.
7. Подробно опишите программный код, который разработан для выполнения лабораторной работы.
Лабораторная работа №16
ОБРАБОТКА ФАЙЛОВЫХ СТРУКТУР ДАННЫХ
Цель работы: овладение навыками алгоритмизации и программирования файловых структур данных; проектирование структуры файла; чтение данных из файла.
Общие сведения
Файл – это набор информации, имеющий имя. Object Pascal располагает средствами создания и обработки файлов различных типов. Чтобы получить доступ к файлу, нужно связать созданное в Delphi приложение с некоторым файлом для чтения или записи информации при помощи переменных файлового типа, объявленных как:
TextFile – текстовый файл;
File of <тип> – типизированный файл;
File – нетипизированный файл.
Пример описания файловых переменных:

,
,
,