Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_po_informatike_delphi+++++++.pdf
Скачиваний:
31
Добавлен:
29.02.2016
Размер:
872.19 Кб
Скачать

31

Processing := Processing+[DelSomeSpace]; if EmptyLineCB.Checked then

Processing := Processing+[DelEmptyLine]; AssignFile(fIn,InEdit.Text);

Reset(fIn);

AssignFile(fOut,OutEdit.Text);

Rewrite(fOut);

while not Eof(fIn) do begin

readln(fIn,s);

if DelEndSpace in Processing then repeat

EndCycle := True; if Length(s)>0 then

if s[1]=' ' then begin

Delete(s,1,1); EndCycle := False;

end;

if Length(s)>0 then

if s[Length(s)]=' ' then begin

Delete(s,Length(s),1); EndCycle := False;

end;

until EndCycle;

if DelSomeSpace in Processing then begin

i := 1;

while i<Length(s) do

if (s[i]=' ') and (s[i+1]=' ') then Delete(s,i,1)

else inc(i);

end;

if (s<>'') or ((s='') and (not(DelEmptyLine in Processing))) then writeln(fOut,s);

end;

CloseFile(fIn);

CloseFile(fOut);

end;

2.15 Перечисляемый тип

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

<идентификатор> = (<элемент1> [,<элемент2> …])

32

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

Каждому элементу перечисляемого типа соответствует числовое значение: первому элементу – 0, второму – 1 и т.д.

Пример (определение числа дней в месяцах года):

procedure TForm1.Button1Click(Sender: TObject); type

Months = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); const

DayOfMonth : array[Months] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

NameMonths : array[Months] of string = ('январь','февраль','март','апрель','май','июнь', 'июль','август','сентябрь','октябрь','ноябрь','декабрь');

var

Year,n : integer; i : Months;

begin

Year := StrToInt(YearEdit.Text); DaysMemo.Clear;

for i := Jan to Dec do begin

n := DayOfMonth[i]; if i=Feb then

if ((Year mod 4=0) and (Year mod 100<>0)) or (Year mod 400=0) then

n := 29;

DaysMemo.Lines.Add(NameMonths[i]+' - '+IntToStr(n)); end;

end;

2.16 Тип-диапазон

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

<идентификатор> = <начало> .. <окончание>,

например

type

Less10 = 1..9; Letter = 'a'..'z';

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

33

Для определения минимального и максимального индексов типадиапазона можно воспользоваться функциями Low(X) и High(X), где X – переменная или сам тип.

Пример (определение количества дней в квартале не високосного года):

procedure TForm1.Button1Click(Sender: TObject); type

Months = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); First = Jan..Mar;

Second = Apr..Jun;

Third = Jul..Sep;

Fourth = Oct..Dec;

NumQuarter = 1..4; const

DayOfMonth : array[Months] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

var

i : Months;

Quarter : NumQuarter; Sum : integer;

begin

Quarter := StrToInt(QuarterEdit.Text); Sum := 0;

case Quarter of

Low(First) to High(First) do

1

: for i :=

2

Sum :=

Sum+DayOfMonth[i];

: for i :=

Low(Second) to High(Second) do

3

Sum :=

Sum+DayOfMonth[i];

: for i :=

Low(Third) to High(Third) do

4

Sum :=

Sum+DayOfMonth[i];

: for i :=

Low(Fourth) to High(Fourth) do

 

Sum :=

Sum+DayOfMonth[i];

end;

CountDayEdit.Text := IntToStr(Sum); end;

2.17 Функции и процедуры

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

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

procedure <идентификатор>[(<список формальных параметров>)];

34

function <идентификатор>[(<список формальных параметров>)] : <возвращаемый тип>;

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

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

При описании <списка формальных параметров> каждый из параметров может быть одного из трех типов:

параметр-переменная. Перед описанием такого параметра следует указывать ключевое слова var. Такой параметр напрямую передаются в подпрограмму, и его изменение в теле подпрограммы приводит к изменению фактического параметра, т.е. параметр-переменную можно использовать для возврата в основную программу видоизмененного значения. Параметр-переменная не может быть константой или результатом вычисления выражения;

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

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

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

begin … end;.

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

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

При использовании в качестве параметра подпрограммы массива, следует применять предварительное описание пользовательского типа, например:

35

type

Mas = array[1..100] of integer; procedure First(var A : Mas);

Запись procedure First(var A : array[1..100] of integer); не-

допустима.

Однако допустима запись procedure First(var A : array of integer);, в которой происходит использование так называемых открытых массивов, позволяющее передавать подпрограмме массивы переменной длины. Такой массив трактуется подпрограммой как одномерный массив с начальным индексом 0. Конечный индекс может быть определен с помощью функции High() (например, High(A)).

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

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

Пример (определение суммы элементов и среднего из положительных элементов для каждого из двух одномерных массивов):

procedure TForm1.Button1Click(Sender: TObject); type

Mas = array[1..100] of integer; var

Mas1,Mas2 : Mas; Count1,Count2,Sum,i : integer; Average : real;

function Summa(A : Mas; Count : integer) : integer; var

i,Sum : integer; begin

Sum := 0;

for i := 1 to Count do Sum := Sum+A[i];

Result := Sum; end;

function AveragePositive(A : Mas; Count : integer;

var Average : real) : boolean;

var

i,CountPositive : integer;

Temp : real; // Объяснить, зачем нужна begin

CountPositive := 0; Temp := 0;

for i := 1 to Count do if A[i]>=0 then

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