При открытии файла желательно использовать функцию

Таблица 4.1

№ варианта Функция № варианта Функция
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

Пример разработки приложений в среде Delphi:

Задание:

Составить программу для вычисления

.

1. Создание консольного приложения в среде Delphi

Создать консольное приложение можно различными способами. Наиболее простой из них следующий.

После запуска среды Delphi в главном меню выберите команды File|New. В результате откроется окно так называемого репозитория (архива) Delphi, предназначенного для накопления типовых форм и проектов.

Далее щелчком мыши выберите пиктограмму с подписью «Console Application» и нажмите кнопку ОК. После этого раскроется окно файла проекта (он имеет расширение.dpr) или, другое название, главного модуля проекта.

Наберите в окне файла проекта текст программы для вычисления значения z:

program Project2;

{$APPTYPE CONSOLE}

uses SysUtils;

var х,у,z:real;

begin

writeln('Enter х,у');

readln(x,у);

z:= (sqr(х)+sin(2*х-1)+0.5)/sqrt(x*x+y*y+1e4);

writeln('z=',z:7:4);

readln

end.

Перед тем как запустить программу на выполнение, необходимо сохранить ее при помощи команды File|Save All. Каждый проект рекомендуется хранить в отдельной папке. По умолчанию файл проекта имеет имя Project2.dpr, а программа - Project2. Если сохранить файл проекта под другим именем, например MyProgram.dpr. Delphi автоматически изменит имя программы на MyProgram. Строки программного кода, которые формируются средой Delphi, редактировать нельзя, иначе появятся сообщения об ошибках.

После этого запустите проект на выполнение с помощью команд Run|Run, или нажатием функциональной клавиши <F9>, или выбором кнопки Run на инструментальной панели быстрых кнопок.

После успешной компиляции и запуска программы на выполнение на экране появится стандартное окно программы с символьной строкой 'Enter х,у'. Необходимо ввести значения x и y и нажать Enter. В результате появится значение переменной z. Для того чтобы завершить работу программы и вернуться в среду Delphi, необходимо повторно нажать клавишу Enter (т.к. процедура readln без параметров приостанавливает выполнение программы).

Если после запуска программы компилятор выдал сообщение об ошибке, то ее следует исправить. Затем вновь запустить программу на выполнение. Этот процесс повторяется до тех пор, пока все синтаксические ошибки не будут исправлены после чего программа запустится на выполнение.

Второй способ создания консольного приложения.

После запуска Delphi или выполнения команды File|New Application необходимо закрыть окно формы (окно с заголовком Forml) и окно модуля приложения (окно с заголовком Unitl.pas).

При закрытии окна модуля Delphi выводит запрос:

Save changes to Unitl.pas? (Сохранить изменения в Unitl.pas?),

на который надо ответить «Нет», т.е. нажать кнопку No. В результате на экране останется только главное окно Delphi (заголовок: Delphi - Projectl) и окно инспектора объектов (заголовок: Object Inspector), которое тоже можно закрыть. После этого следует выполнить команду Project|View Source. В результате откроется окно Projectl.dpr файла проекта.

Далее файл проекта следует сохранить. Если имя файла будет изменено, то это отразится также в заголовке программы. Затем необходимо убрать все строки, кроме строк, содержащих ключевые слова program, uses, begin и end. После этого можно набрать текст программы, приведенной выше.

В содержимом папки, в которой сохраняется проект, находятся следующие файлы:

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

- MyProgram.dof - файл опций проекта. В нем хранится информация, необходимая для установки опций проекта.

- MyProgram.dpr - файл проекта (главный модуль проекта).

- MyProgram.exe - файл приложения или исполняемый файл. Он будет создан компилятором, если в процессе компиляции не будет обнаружено синтаксических ошибок. Исполняемый файл является автономным исполняемым файлом, т.е. для его работы не требуются какие-либо другие файлы. Его можно запускать на выполнение как любую другую исполняемую программу из терминала.

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

Кроме перечисленных файлов, часто в папке размещается файл с расширением.~dpr, например MyProgram. ~dpr. Эго резервная копия файла проекта, которая создается при редактировании существующего файла проекта и содержит предыдущий вариант текста программы. Резервная копия используется, когда необходимо отказаться от внесенных в программу исправлений. При этом достаточно будет убрать символ «~» из имени файла.

2. Создание оконного приложения в среде Delphi

1. Необходимо создать новую папку, в которой будут размещены все файлы, входящие в проект (для каждого нового проекта создается отдельная папка). Создать новую папку можно также и в момент сохранения файлов, входящих в проект, используя кнопку Создание новой папки,имеющуюся в диалоговом окне сохранения файлов.

2. Создайте новый проект с помощью команд главного меню File|New Application или, если только что загружена среда Delphi, можно сразу приступать к созданию нового проекта.

3. Из страницы Standard Палитры Компонентов поместите на форму Forml следующие компоненты (рис.1.2):

Рис.1.2

4. Установите свойства формы, используя Инспектор Объектов:

Caption (Заголовок) = 'Расчет функции'

Height = 200

Width = 415

Left = 200

Тор = 170

Свойства Height и Width можно задать, изменяя размеры формы с помощью мыши. При этом автоматически будут изменяться указанные свойства, находящиеся в Инспекторе Объектов. Свойства Left и Тор можно задать, переместив форму с помощью мыши за ее заголовок приблизительно на середину экрана.

5. Установите свойства компонентов Labell, Label2 и Label3:

Labell: TLabel Name = Inf_Label Caption='Расчет значений функции Y(X)=(sqr(х)+sin(2*х-1)+ 0.5)/sqrt(x*x+y*y+1e4)’ Height = 25 Width = 360 Left = 25 Top = 5 AutoSize = False WordWrap = True Alignment = taCenter Font = Times New Roman Font Style = Bold Size = 12 Label2: TLabel Name = X_Label Caption = ‘X=‘ Height = 25 Width = 95 Left = 25 Top = 55 Font = Times New Roman Font Style = Normal Size = 12 Label3: TLabel Name = Y_Label Caption = ‘Y=‘ Height =25 Width = 95 Left = 25 Top = 95 Font = Times New Roman Font Style = Normal Size = 12

Размеры меток и их местоположение также регулируется вручную.

Для выравнивания компонентов используется панель инструментов Align (Выровнять), которая вызывается на экран дисплея с помощью команды View|Alignment Palette главного меню Delphi.

Выравнивать можно не только один компонент, но несколько компонентов одновременно. Для того чтобы выделить группу компонентов, необходимо при выделении удерживать нажатой клавишу Shift. Выравнивание компонентов автоматически изменяет значения свойств Left и Тор в Инспекторе Объектов.

6. Установите свойства Editl и Edit2:

Editl: TEdit Name = X_Edit Text = ‘ ‘ Height = 25 Width = 80 Left = 125 Top = 55 Edit2: TEdit Name = Y_Edit Text = ‘ ‘ Height = 25 Width = 80 Left = 125 Top = 95

7. Установите свойства компонента Memol:

Memol: TMemo

Name = Z_Memo

Height = 65

Width = 175

Left = 225

Top = 55

Lines = ‘ ‘

Для установления свойства Lines щелкните по кнопке с тремя точками. В появившемся окне String list editor удалите строку 'Memol'. Нажмите ОК.

8. Установите свойства кнопок Buttonl, Button2 и Button3:

Buttonl: TButton Name = Calculate_Button Caption='Расчет' Height = 25 Width = 105 Left = 25 Top = 135 Button2: TButton Name =Clear_Button Caption=’Очистка’ Height = 25 Width = 105 Left = 105 Top = 135 Button3: TButton Name = Exit_Button Caption='Выход' Height = 25 Width = 105 Left = 280 Top = 135

9. Двойным щелчком активизируйте кнопку Расчет. В результате окно редактора кода станет активным и будет содержать заготовку обработчика события OnClick. Добавьте в заготовку код для вычисления функции Z.

procedure TForm1.Calculate_ButtonClick(Sender: TObject);

var x,y,z:real;

begin

x:=StrToFloat(X_Edit.Text);

y:=StrToFloat(Y_Edit.Text);

z:=(sqr(x)+sin(2*x-1)+0.5)/sqrt(x*x+y*y+1e4);

Z_Memo.Lines.Add('Результат:');

Z_Memo.Lines.Add('z='+FloatToStrF(z,ffGeneral,7,2));

end;

10. Нажмите клавишу <F12> и вернитесь в форму. Двойным щелчком активизируйте кнопку Очистка и в обработчик события OnClick вставьте строки:

X_Edit.Clear;

Y_Edit.Clear;

Z_Memo.Clear;

11. Нажмите клавишу <F12> и вернитесь в форму. Двойным щелчком активизируйте кнопку Выход и в обработчик события OnClick вставьте строку

Close;

12. Сохраните программу перед запуском. Для сохранения проекта необходимо выполнить команду главного меню File|Save All. Имена файла проекта и модуля должны быть различными.

В главном меню Delphi имеются также другие команды для сохранения:

Save - сохранить текущий модуль;

Save As - сохранить текущий модуль под новым именем;

Save Project As - сохранить текущий проект под новым именем.

После сохранения проекта запустите его на выполнение, используя функциональную клавишу <F9>.

Для расчета значения функции z введите x и y и нажмите кнопку Расчет. Для очистки нажмите кнопку Очистка. Для выхода из приложения нажмите кнопку Выход.

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

Unitl.pas - файл модуля, используемый для хранения программного кода;

Unit1.dfm - файл, содержащий описание формы;

Unit1.dcu - откомпилированный файл модуля;

р21.res - файл, содержащий используемую проектом пиктограмму и прочие ресурсы.

Полный текст сформированного модуля Unitl.pas имеет вид:

unit Unit1;

interface

uses

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

StdCtrls;

type

TForm1 = class(TForm)

Inf_Label: TLabel;

Label2: TLabel;

X_Edit: TEdit;

Z_Memo: TMemo;

Calculate_Button: TButton;

Clear_Button: TButton;

Exit_Button: TButton;

Label3: TLabel;

Y_Edit: TEdit;

procedure Calculate_ButtonClick(Sender: TObject);

procedure Clear_ButtonClick(Sender: TObject);

procedure Exit_ButtonClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Calculate_ButtonClick(Sender: TObject);

var x,y,z:double;

begin

x:=StrToFloat(X_Edit.Text);

y:=StrToFloat(Y_Edit.Text);

z:=(sqr(x)+sin(2*x-1)+0.5)/sqrt(x*x+y*y+1e4);

Z_Memo.Lines.Add('Результат:');

Z_Memo.Lines.Add('z='+FloatToStrF(z,ffGeneral,7,2));

end;

procedure TForm1.Clear_ButtonClick(Sender: TObject);

begin

X_Edit.Clear;

Y_Edit.Clear;

Z_Memo.Clear;

end;

procedure TForm1.Exit_ButtonClick(Sender: TObject);

begin

Close;

end;

end.

Контрольные вопросы:

1. Кратко опишите внешний вид среды Delphi.

2. Какие виды помощи представляет Delphi, как ее получить?

3. Как создать консольное приложение в среде Delphi?

4. Как создать оконное приложение в среде Delphi?

5. Приведите порядок размещения любого компонента на форме.

6. Как изменить геометрические размеры размещенного компонента?

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

8. Каким образом оформляется программа, в каком порядке записываются разделы описаний и определений?

9. Назовите типы данных. Как задать тип данных в программе?

10. Как осуществить форматированный вывод действительных чисел?

11. Как компилировать, связать и выполнить программу средствами RAD?

12. Подробно опишите программный код, который разработан для выполнения лабораторной работы.

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

ПРОГРАММИРОВАНИЕ ТИПОВЫХ АЛГОРИТМОВ ВЫЧИСЛЕНИЙ

Цель:

- изучить операторы языка Object Pascal;

- получить практические навыки программирования на языке Object Pascal и создания оконного приложения в среде Delphi.

Общие сведения:

1. Составной оператор – это группа операторов, заключенная в операторные скобки begin…end. Операторы, входящие в составной, выполняются в порядке их написания. Точка с запятой предназначена для разделения операторов, т.е. не входит в состав оператора.

2. Условный оператор IF предназначен для реализации разветвляющегося вычислительного процесса. В общем виде оператор записывается следующим образом:

If <логическое выражение> then <оператор1> else <оператор2>;

Сокращенная форма записи оператора имеет вид:

If <логическое выражение> then <оператор1>;

3. Оператор выбора CASE позволяет выбрать и выполнить один оператор из нескольких. В общем случае оператор case имеет следующий вид:

case <выражение> of

<список_меток_1>: <оператор1>;

<список_меток_2>: <оператор2>;

…………………………………….

<список_меток_N>: <операторN>;

else

<оператор>

end;

4. Оператор перехода GOTO - это простой оператор, передающий управление в программе на другой оператор, перед которым стоит метка, указанная в операторе goto. В общем виде оператор записывается следующим образом:

goto <метка>;

С помощью goto нельзя передавать управление внутрь сложных операторов (if, case, операторы циклов), а также из вызывающей программы в подпрограмму. Данный оператор следует использовать в исключительных ситуациях.

5. Операторы циклов

5.1. Оператор цикла FOR организует выполнение последовательности операторов заранее известное число раз. Существуют два варианта оператора:

1) с увеличением счетчика:

for <счетчик>:= <начальное значение> to <конечное значение> do <оператор>;

2) с уменьшением счетчика:

for <счетчик>:= <начальное значение> downto <конечное значение> do <оператор>;

где <счетчик> - параметр цикла;

<начальное значение> и <конечное значение> - выражения, которые должны быть совместимыми для присваивания с параметром цикла;

<оператор> - это оператор, который выполняется в цикле и образует так называемое тело цикла.

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

5.2. Оператор цикла с предусловием WHILE имеет следующий формат:

while <логическое выражение> do <оператор>;

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

5.3. Оператор цикла с постусловием REPEAT имеет следующий формат:

repeat <оператор1>; <оператор2>;...; <операторN> until

<логическое выражение>;

Условие выхода из цикла проверяется в конце цикла, поэтому операторы, образующие тело цикла, выполняются по крайней мере один раз.

Задание:

1. Из таблицы 2.1 взять условие задачи (вариант согласовать с преподавателем).

Таблица 2.1

Функция Функция
  xÎ[0;7] и dx=1   xÎ[0;5] и dx=0,5
  xÎ[-2;4] и dx=0.5   xÎ[1;4] и dx=0,4
  xÎ[-3;5] и dx=1   xÎ[-1;3] и dx=0,4
  xÎ[-1;2] и dx=0,2   xÎ[-3;1] и dx=0,3
  xÎ[-2;4] и dx=0,5   xÎ[-4;0] и dx=0,5
  xÎ[0;7] и dx=1   xÎ[1;4] и dx=0,5
  xÎ[-4;4] и dx=1   xÎ[-1;3] и dx=0,3
  xÎ[-1;3] и dx=0,5   xÎ[1;7] и dx=0,6
  xÎ[0;5] и dx=1   xÎ[0;3] и dx=0,3
  xÎ[0;7] и dx=1   xÎ[0;7] и dx=0,8
  xÎ[-3;7] и dx=1   xÎ[1;4] и dx=0,4
  xÎ[0;5] и dx=0,5   xÎ[1;2,5] и dx=0,2
  xÎ[-1;3] и dx=0,4   xÎ[0;3p/2] и dx=p/4
  xÎ[-2;5] и dx=1   xÎ[0;7] и dx=1
  xÎ[-5;5] и dx=1   xÎ[4;7] и dx=0,4

2. Составьте блок-схему и создайте оконное приложение в среде Delphi для расчета значений функции Y(X) (см. лабораторную работу №1 и приведенный ниже пример).

Пример:

Задание:

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

Блок-схема алгоритма (рис.2.1):


Рис.2.1

Программа на языке Object Pascal:

program pr_1;

{$APPTYPE CONSOLE}

uses SysUtils;

var xn,xk,dx,y,x:real;

v:integer;

begin

write('Введите Xn Xk dX:');

readln(xn,xk,dx);

x:=xn;

while x<=xk do

begin

v:=0;

writeln;

write(' X = ',x:5:3);

if not((x<0) and (x>0)) and not((x<1) and (x>1)) then

begin

if (x<0) then

begin

if (cos(pi/2-x)<>0) then

begin

y:=x/sin(pi/2-x)/cos(pi/2-x);

v:=1;

end;

end

else

begin

if (x<1) then

begin

y:=cos(x)/sin(sqrt(x));

v:=2;

end

else

begin

y:=1/(x*x-1);

v:=3;

end;

end;

end;

if v<>0 then write(' Y = ',y:5:4,' V = ',v)

else write(' Y не определено');

x:=x+dx;

end;

readln;

end.

Контрольные вопросы:

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

2. Назовите назначение и правила организации ветвлений в программе.

3. Назовите назначение и правила организации цикла.

4. По какой формуле можно подсчитать количество итераций цикла?

5. При каких условиях заканчивается цикл?

6. Чем отличаются циклы с предусловием и постусловием?

7. Назовите основные правила организации вложенных циклов.

8. Подробно опишите программный код, который разработан для выполнения лабораторной работы.

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

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

Цель:

- изучить правила описания и определения процедур и функций языка Object Pascal;

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

Общие сведения:

Программу можно представить в виде отдельных подпрограмм, которые могут взаимодействовать между собой. Каждая подпрограмма описывается один раз, при необходимости к ней можно многократно обращаться. В Object Pascal существуют два вида подпрограмм: функция и процедура. Используемые функции и процедуры должны быть описаны в разделе описания функций и процедур.

Описания подпрограмм включают в себя заголовок подпрограммы, разделы описаний (меток, констант, типов, переменных, а также дополнительных функций и процедур, являющихся локальными по отношению к данной подпрограмме), тело процедуры. В заголовке подпрограммы за ключевым словом (function или procedure) указываются имя подпрограммы, а в скобках - список формальных параметров со своими описаниями. В отличие от процедуры в заголовке функции должен быть определен тип результата, передаваемого функцией.

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

Функции используются для вычисления одного значения. Общий вид записи функции:

function F (q1:T1; q2:T2;…):T;

<Разделы определений и описаний локальных параметров и подпрограмм>

begin

p1;

p2;

¼

end;

где F - имя функции; qi - имена формальных параметров; Т - тип имени функции; Ti - типы параметров; pi - операторы тела функции.

Обращение к функции записывается в правой части оператора присваивания, при этом указывается имя и в скобках — фактические параметры в виде F (b1, b2,...), где bi - фактические параметры.

Процедуры используются при получении нескольких результатов. Общий вид записи процедуры:

procedure F (q1:T1; q2:T2;…var q3:T3);

<Разделы определений и описаний локальных параметров и подпрограмм>

begin

p1;

p2;

¼

end;

где F - имя процедуры; qi - имена формальных параметров; Ti - типы параметров; pi - операторы тела подпрограммы.

Обращение к процедуре осуществляется оператором процедуры в виде

F(b1, b2,...);

где F - имя подпрограммы; bi - имена фактических параметров.

Задание:

1. Из таблицы 3.1 взять условие задачи (вариант согласовать с преподавателем).

Таблица 3.1

Функция Функция
  , x Î[0;1], d x =0,1   , , x Î[0;1], d x =0,1
  , , x Î[0;1] и d x =0,1   , ; x Î[0;1], d x =0,1
  , , x Î[20;30], d x =1   , ; x Î[1;2], d x =0,1
  , , x Î[0;1] и d x =0,1   , , x Î[0;1], d x =0,1
  , Z0=10, , x Î[10;20], d x =1   , ; x Î[0;1]; d x =0,1; Z0=1
  , , x Î[10;20], d x =1   , , x Î[0;1], d x =0,1
  , , x Î[0;1], d x =0,1   , , x Î[0;1], d x =0,1
  , , x Î[0;1], d x =0,1   , ; x Î[0;1], d x =0,1
  , , , x Î[0;1], d x =0,1   , ; x Î[0;1], d x =0,1
  , , x Î[0;1], d x =0,1   , , x Î[0;1], d x =0,1
  , , x Î[0;1], d x =0,1   , , x Î[0;1], d x =0,1
  , , x Î[0;10], d x =1   , , x Î[0;1], d x =0,1
  , , x Î[1;2], d x =0,1   , x Î[0;1], d x =0,1
  , , , x Î[0;1], d x =0,1   , ; x Î[0;1], d x =0,1
  , , x Î[0;1], d x =0,1   , ; x Î[0;1], d x =0,1

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;

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

Задание:

1. Из таблицы 4.1 взять условие задачи (вариант согласовать с преподавателем) Массив X[i,j] заполнить случайными числами, 5£ i £7; 5£ j £7.

Таблица 4.1

№ вар. Задание Диапазон Xij
  Вычислить и запомнить сумму и число положительных элементов каждого столбца массива. -5; 5
  Записать на место отрицательных элементов массива нули. -3; 5
  Вычислить сумму и число элементов под главной диагональю. 5; 10
  Найти среднеарифметическое значение элементов массива. 0; 5
  Вычислить среднеарифметическое значение элементов для каждой строки 1; 7
  Вычислить и запомнить сумму элементов каждого столбца массива. 2; 9
  Вычислить и запомнить сумму и число положительных элементов каждой строки массива. -5; 3
  Вычислить сумму и число положительных элементов над главной диагональю. -3; 2
  Найти наибольший элемент для каждой строки 2; 6
  Записать элементы строк массива в обратном порядке 0; 4
  Поменять элементы четных строк с нижними нечетными -4; 4
  Записать на место положительных элементов массива единицы. -5; 4
  Найти наибольший элемент для каждого столбца. 2; 5
  Найти наименьший элемент массива 1; 6
  Найти среднеарифметическое значение отрицательных элементов массива. -4; 6
  Вычислить сумму и число положительных элементов под главной диагональю. -3; 1
  Вычислить и запомнить сумму и число отрицательных элементов каждой строки массива. -4; 5
  Вычислить сумму элементов главной диагонали -6; 1
  Найти наименьший элемент каждой строки 3; 6
  Вычислить сумму и число отрицательных элементов над главной диагональю. -3; 4
  Поменять элементы нечетных строк с верхними четными 4; 7
  Найти среднегеометрическое значение элементов массива. -2; 2
  Вычислить среднеарифметическое значение элементов для каждого столбца 1; 7
  Найти наибольший элемент массива -6; 2
  Вычислить сумму и число отрицательных элементов под главной диагональю. -7; 4
  Записать элементы столбцов массива в обратном порядке 2; 4
  Вычислить и запомнить сумму и число отрицательных элементов каждого столбца массива. -6; 6
  Вычислить сумму и число отрицательных элементов над главной диагональю. -6; 3
  Найти наименьший элемент каждого столбца 2; 7
  Найти среднеарифметическое значение положительных элементов массива. -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 – нетипизированный файл.

Пример описания файловых переменных:

var a1:textfile; // a1 – текстовый файл

а2:file of integer;

a3:file of char; // а2 и a3 – типизированные файлы

а4:file; // а4 – нетипизированный файл

Файловую переменную перед использованием необходимо связать с внешним файлом процедурой

AssignFile (<файловая переменная>, <имя файла>);

где <файловая переменная> – имя переменной файлового типа, объявленной в программе; <имя файла> – символьная строка, содержащая имя файла. Если файл находится в одной папке с обрабатывающей его программой, то указывается только имя файла, если в другой – полный путь к файлу.

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

Reset (<файловая переменная>);

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

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

Rewrite (< файловая переменная >);

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

Если процедура Rewrite открывает текстовый файл, то он становится доступным только для записи. Для типизированных и нетипизированных файлов, открытых процедурой Rewrite, допускается выполнять операции чтения и записи в файл.

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

Append (<файловая переменная>);

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

Открытый файл закрывается с помощью процедуры

CloseFile (<файловая переменная>);

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

При открытии файла желательно использовать функцию

FileExists(<имя файла>);

где <имя файла> – это символьная строка, содержащая имя файла на внешнем запоминающем устройстве. Если файл существует, то функция возвращает true, если нет – false.

Текстовый файл – последовательность символов, сгруппированных в строки произвольной длины, где каждая строка заканчивается символом конца строки – EOLN (символ перевода каретки CR (#13), за которым, возможно, следует символ перевода строки LF (#10)). Заканчивается файл символом конца файла EOF (end-of-file, #26).

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

rеаd(f,х,у,z); {прочитать из файла, связанного с файловой переменной f, значения переменных х,у,z}

readln(f,а); {прочитать из файла, связанного с файловой переменной f, значение в переменную а и перейти к следующей строке}.

Вывод данных в произвольный текстовый файл производится процедурами write и writeln, у которых первой в списке параметров указана соответствующая файловая переменная.

Например,

write(fi,'s=',s) {осуществляет вывод в файл, связанный с файловой переменной fi, символьной строки 's=' и значение переменной s}.

Процедура writeln (fi); выводит пустую строку в файл, связанный с файловой переменной fi.

Пример.

Составить программу для нахождения суммы двух одинаковых квадратных матриц произвольного размера. Ввод исходных данных осуществить из текстового файла inp.txt. Результаты вывести в файл result.tхt.

Решение

Для создания текстового файла inp.txt, содержащего размер матриц n, а также сами матрицы а и b, можно использовать любой текстовый редактор. Используемые файлы inp.txt и result.txt размещены в одной папке с исполняемым файлом программы. Поэтому в процедурах AssignFile указаны только имена файлов без пути доступа к ним.

Программа

program pl; {$APPTYPE CONSOLE} uses SysUtils; type mas=array of array of integer; var а,b,c:mas; gl,g2,n,i,j:integer; fl,f2:TextFile; begin AssignFile(fl,'inp.txt'); AssignFile(f2,'result.txt'); Reset(fl); Rewrite(f2); readln(fl,n); SetLength(a,n,n); SetLength(b,n,n); SetLength(c,n,n); gl:= 0; g2:= n-1; for i:= gl to g2 do begin for j:= gl to g2 do read(fl,a[i,j]); readln(fl); end; for i:= gl to g2 do begin for j:= g1 to g2 do read(fl,b[i,j]); readln(fl) end; CloseFile(fl); for i:= gl to g2 do for j:= g1 to g2 do c[i,j]:= a[i,j]+b[i,j]; writeln(f2,'Result array'); for i:= g1 to g2 do begin for j:= gl to g2 do write(f2,c[i,j]:2); writeln(f2) end; CloseFile(f2); writeln('Program terminated'); readln end.

При работе с текстовыми файлами положение текущей позиции в файле контролируется функциями:

function Eof [(var F: FileText)]: Boolean;

возвращает значение true, если достигнут конец текстового файла, связанного с файловой переменной F.

function Eoln [(var F: FileText)]: Boolean;

возвращает значение true, если достигнут конец строки в текстовом файле, связанного с файловой переменной F.

function SeekEof [(var F: FileText) ]: Boolean;

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

function SeekEoln [(var F: FileText)]: Boolean;

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

Используя функции Eof и Eoln, можно организовать ввод массивов.

Пример. Пусть fa – файловая переменная, связанная с текстовым файлом, содержащим только массив а. Тогда этот массив можно ввести следующим образом:

……………………

I:=0;

while not(eof(fa)) do

begin

j:= 0;

while not(eoln(fa)) do

begin

read(fa,a[i,j]);

j:= j+1;

end;

readln(fa);

i = i+1;

end;

……………………

Если текстовый файл содержит символьное представление числовых данных, то вместо функций Eof и Eoln лучше использовать SeekEof и SeekEoln.

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

Для чтения данных из типизированного файла применяется процедура read. Для записи в типизированный файл используется процедура write. При использовании процедуры read или write, указатель файла перемещается к следующему по порядку элементу файла. Процедуры readln и writeln, используемые для текстовых файлов, для типизированных файлов не применяются.

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

procedure Seek (var F; N: Longint);

перемещает текущую позицию (указатель) в типизированном файле, связанном с файловой переменной F к требуемому компоненту с номером N. Нумерация компонентов в файле начинается с нуля.

function FilePos(var


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: