
- •Д.С.Ситкин
- •Информатика.
- •Программированиевdelphi
- •Лабораторныйпрактикум
- •Содержание
- •Введение
- •Основныепонятияпрограммирования
- •Этапыпрограммирования
- •Средаdelphi.Созданиепростейшегопроекта
- •Формаиеёсвойства
- •Компонентыформыиихсвойства
- •КомпонентLabeledEdit
- •Событиеипроцедураобработкисобытия
- •Пример1.1
- •Компиляцияизапускпроектанаисполнение
- •Структураисохранениепроекта
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Линейныйалгоритм
- •Типыданных
- •Константыипеременные
- •Арифметическиеоперации
- •Правилазаписитиповыхдействий
- •Структурапроцедурыобработкисобытия
- •Пример2.1
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Подпрограммы
- •Классификацияиструктураподпрограмм
- •Механизмработыподпрограммыиобменапараметрами
- •Пример3.1
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Структурамодуля
- •Созданиеиподключениемодуля
- •Пример4.1
- •Условныйоператор.Неполнаяформа
- •Условныйоператор.Полнаяформа
- •IfусловиеthenоператорS1elseоператорS2
- •Пример5.1
- •Пример5.2
- •Операторвыбора
- •Пример5.3
- •Содержаниеотчёта
- •Контрольныевопросы
- •Контрольсинтаксисавводимыхданных
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Алгоритмыповторений
- •Операторцикласпредварительнымусловием
- •Пример7.1
- •Операторцикласпараметром(сосчётчиком)
- •Пример7.2
- •Пример7.3
- •Операторцикласпоследующимусловием
- •Пример7.4
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Массивы
- •Объявлениемассива
- •Обработкамассивов
- •Пример8.1
- •Динамическиемассивы
- •Подпрограммасоткрытымпараметром-массивом
- •Пример8.2
- •Целесообразностьвыделенияпамятиподмассивы
- •Контрольсинтаксисаэлементовмассива
- •Задание
- •Обработкамногомерныхмассивов
- •Пример9.1
- •КомпонентStringGrid
- •Пример9.2
- •Сортировкамассивов
- •Пример9.3
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Внешниефайлы
- •Физическиеилогическиефайлы
- •Классификациялогическихфайлов
- •Процедурыифункцииобработкифайлов
- •Пример 10.1
- •КомпонентыOpenDialog иSaveDialog
- •Пример 10.2
- •Пример 10.3
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Олабораторнойработе
- •Информатика. Программированиев delphi
Механизмработыподпрограммыиобменапараметрами
Самопосебеописаниеподпрограммыникакихдействийнепроизводит, а формальные параметры не имеют значений. Чтобы вос-пользоваться подпрограммой, её нужно вызвать, задав конкретные,фактическиезначенияпараметров.Вызовподпрограммыимеетвид
имя_функции(фактическиепараметры) илиимя_процедуры(фактическиепараметры);
При вызове подпрограммы значения фактических параметров заме-няют формальные параметры в описании подпрограммы, и для фак-тическихпараметроввыполняютсядействия,которыебылиописаны
дляформальныхпараметров.Важнозапомнить:спискифактическихи формальных параметров должны быть согласованы между собой почислу, порядкуследованияитипузначений.
Параметры подпрограмм можно разделить на входные, которыепередают значения в подпрограмму и выходные, которые передаютрезультаты её работы обратно в вызывающий блок. Входные пара-метрыэто параметры-значения. По умолчанию все параметрыпа-раметры-значения.Онипередаютзначениявподпрограмму,могуттам изменяться, но обратно в вызывающий блок изменения не пере-даются. Выходные параметрыэто параметры-переменные. Они мо-гут передавать значения в подпрограмму, могут там изменяться и мо-гут передавать изменения обратно в вызывающий блок. Перед соот-ветствующимформальнымпараметромвзаголовкеподпрограммынужно поставитьсловоvar,например,
procedureMy_Procedure(x,y:real;varz:real);
здесьxиyпараметры-значения,аzпараметр-переменная,или
procedureMy_Procedure(varx,y:real;z:real);
здесьужеxиyпараметры-переменные,аzпараметр-значение.
Посколькупараметр-переменнаяспособенпередаватьзначенияв обе стороны, возникает соблазн во избежание путаницы «что кудапередаёт»всеформальные параметры сделатьтаковыми
procedureMy_Procedure(varx,y,z:real);
но параметр-переменная (в отличие от параметра-значения) не можетпередать в подпрограмму выражение или константу, а только отдель-ную переменную. Кроме того, передавая значение в подпрограммучерез параметр-переменную, и возвращая значение обратно через не-гоже,следует помнить,чтостароезначениебудетпотеряно.
Функция возвращает значение в вызывающий блок через своёимя, поэтому в описании функции параметры-переменные не вводят(исключения составляют случаи, когда функция должна вернуть бо-лее одного значения, т.к. к её имени можно привязать только одно).Имя процедуры не является носителем значения, поэтому, если про-цедура должны вернуть в вызывающий блок значение, то вводят па-раметр-переменную, если должна вернуть два значения, то вводят двапараметра-переменныхит.д.Такжезначениеввызывающийблокможновернутьизподпрограммычерезглобальнуюпеременную.
Пример3.1
Разработаемпроектыдлявычислениязначениявыражения
za
x25
a2
y25
(y2)25

гдеxиyпеременные,aконстанта
с использованием
подпрограмм.Ввыражениивидныповторяющиеся
действия,выполняемые
вдробях:впервойдробинадпеременнойx,вовторойнадперемен-нойyивтретьейнадвыражениемy2.Чтобымногократнонепро-писыватьвпрограммномкодеодниитежедействия,нодляразныхвеличин,целесообразноразработатьподпрограмму.Онабудетвы-полнятьтиповоедляданноговыражениядействие,аименновычис-
лятьзначениедробивида(t2+5)/( +5),гдеtнекоторыйформаль-
ный (абстрактный) параметр, который показывает, что должно бытьвыполнено над подставленным в подпрограмму реальным, т.е. факти-ческим параметром. Трижды вызвав подпрограмму с фактическимипараметрамиx,затемy,затемy2,вычислимзначения трёхдробей.
Нарис.3.1и3.2представленыблок-схемыалгоритмоввыпол-нениятиповогодействияиосновноговычислениясоответственно.
Рис.3.1 Рис.3.2
Реализуем разработанные алгоритмы в проекте. Форму с компо-нентами и событие, связанное с расчётом, оставим теми же, как и впредыдущей работе. Оформим нашу пользовательскую подпрограммусначалакакфункцию,прописавеёвмодулепроектапослесловаimplementation, но до процедуры обработки события. А в этой про-цедуре процессы вычисления трёх дробей опишем не как в предыду-щейработе,атриждывызвавфункцию.Назовемеё,например,
«drob». Значение дроби, которое будет вычислять функция, относитсяк вещественному типу, как и формальный параметрt, поэтому в заго-ловке функции укажем вещественный тип дляtи для значения, выра-батываемогофункцией(вконцезаголовка),например,«real».
implementation
{$R*.dfm}
functiondrob(t:real):real;//заголовокпользовательскойфункции
constc=5;//объявлениелокальнойконстанты
vart1,t2:real;//объявлениелокальныхпеременных
begin //начало раздела операторов пользовательской функцииt1:=sqr(t)+c; //промежуточные расчёты внутри функцииt2:=sqrt(abs(t))+c; //промежуточные расчёты внутри функцииdrob:=t1/t2;//присвоениеименифункциизначения(результата)
end;//конецпользовательскойфункции
procedureTForm1.Button1Click(Sender:TObject);
consta=3;
varx,y,z,z1,z2,z3:real;
begin
x:=StrToFloat(Edit1.Text);//считываниезначенияxизEdit1y:=StrToFloat(Edit2.Text);//считываниезначенияyизEdit2z1:=drob(x);//вызовыфункциии
z2:=drob(y); //присвоение её значенийz3:=drob(y-2); //промежуточнымпеременнымz:=a*z1+sqr(a)*z2+z3;//итоговыевычисления
Label3.Caption:='z='+FloatToStr(z);//выводзначенияzвLabel3
end;//конецпроцедурыобработкисобытия
end.//конецмодуляпроекта
Имя функцииноситель значения, в данном случае это число. Умно-жить одно число на другое или сложить их допустимо, поэтому мож-но былосразузаписать z:=a*drob(x)+sqr(a)*drob(y)+drob(y-2);.
Оформимтеперьнашуподпрограммукакпроцедуру.
implementation
{$R*.dfm}
proceduredrob(t:real;vard:real);//добавленпараметр-переменнаяd
constc=5;vart1, t2:real;begin
t1:=sqr(t)+c;t2:=sqrt(abs(t))+c;
d:=t1/t2;//результатприсваиваетсятеперьпараметру-переменнойd
end;
procedureTForm1.Button1Click(Sender:TObject);
consta=3;
varx,y,z,z1,z2,z3:real;
begin
x:=StrToFloat(Edit1.Text);y:=StrToFloat(Edit2.Text);
drob(x, z1);//вызовы процедуры отдельными операторамиdrob(y, z2);//без операторов присвоения, т.к. имя процедурыdrob(y-2, z3); //не несёт в себе значения (в данном случае числа)z:=a*z1+sqr(a)*z2+z3;
Label3.Caption:='z='+FloatToStr(z);
end;end.
Отметим отличия в описаниях, все они вытекают из главногоотличия процедуры от функции: с именем процедуры не связываетсязначение, её имя не является носителем значения. Во-первых, в заго-ловкенашейподпрограммынеуказантипзначения,вырабатываемого
процедурой. Введён второй формальный параметрdкак параметр-переменная (перед ним стоитvar) для передачи результатов работыпроцедуры в вызывающий блок, т.к. через имя процедуры его не пе-редать (результат присвоен параметруd, а неdrob). Во-вторых, вызовdrobосуществляется отдельным оператором без присвоений значенийпромежуточным переменным. Фактических параметров стало два, какстало и формальных. Теперь результат работы подпрограммы (число)содержится не в имениdrob(как было с функцией), а в параметреzi.Записьвида«z:=a*drob(x,z1)+sqr(a)*drob(y,z2)+drob(y-2,z3);»или
«z1:=drob(x);»теперьбудутошибками.