Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Delphi

.pdf
Скачиваний:
27
Добавлен:
13.04.2015
Размер:
1.18 Mб
Скачать

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

Ln(X: Double): Double – возвращает натуральный логарифм аргумента. Log101(X:Extended): Extended – возвращает десятичный логарифм X. Max1(X, Y) – возвращает наибольшее из двух чисел;

Min1(X, Y) – возвращает наименьшее из двух чисел; Sqr(X) – возвращает квадрат аргумента X.

Power1(X: Extended, Y: Extended): Extended – возвращает X в степени Y, IntPower1(X: Extended, Y: Integer): Extended – возвращает X в целой степени

Y. Работает быстрее чем Power;

Sqrt(X) – возвращает квадратный корень аргумента.

Dec(X[,n: LongInt]) – уменьшает значение аргумента X на величину n, т.е. Dec(X,n) эквивалентно X:=X-n. По умолчанию n=1.

Inc(x[,n: LongInt]) – увеличивает значение аргумента X на величину n, т.е. Inc(X,n) эквивалентно X:=X+n. По умолчанию n=1.

Для возведения

в степень, вместо процедуры Power, можно

использовать формулу

x y = e y ln x , которая не требует подключения

модуля Math и тем самым может сэкономить оперативную память.

3.3.6 Прочие полезные процедуры и функции

Odd(X: Integer): Boolean – возвращает True, если аргумент X нечётный, в противном случае – False.

Exit – завершает работу процедуры или функции, не дожидаясь её конца.

Halt – немедленно завершает работу приложения, оставляя освобождение всех ресурсов «на совесть» операционной системы. Метод Application.Terminate – корректно освобождает все ресурсы приложения и ставит его в Windows-очередь на завершение;

High(X) – возвращает максимальное значение номера элемента в X. Low(X) – возвращает минимальное значение номера элемента в X. Random: Double – возвращает случайное число в интервале [0,1).

Random(N: Integer): Integer – возвращает целое случайное число из [0,N).

ShellExecute2(Application.MainForm.Handle,nil,PChar('index.htm'),nil,- Pchar(CurrentPath),SW_ShowNormal) – запускает необходимое приложение в соответствии с типом указанного файла index.htm и открывает этот файл из каталога CurrentPath.

1Доступно при подключении модуля Math

2доступно через модуль ShellAPI

40

3.4 ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕСОВ

ShellExecute1(Application.MainForm.Handle,nil,PChar('notepad.exe'),nil,nil,- SW_ShowNormal) – пример запуска исполнимого файла – текстового редак-

тора Notepad из каталога Windows.

PlaySound1('<путь\файл wav>',0,snd_Async) – воспроизведение звуковых файлов типа *.vaw в фоновом режиме. Если последний параметр – snd_Loop, то файл воспроизводится бесконечно.

3.4 ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕСОВ

3.4.1 Оператор безусловного перехода (GoTo)

GoTo <метка>;

Оператор безусловного перехода GoTo передаёт управление оператору программы, перед которым стоит метка, указанная в операторе GoTo. Все метки должны быть описаны в разделе объявлений Label. Область действия оператора не может выходить за пределы блока, в котором описана метка.

П р и м е р 3.9

Label End1;

...

GoTo End1;

...

End1: x:=x+2; ...

Смотрите также пример 3.12.

3.4.2 Составной оператор (Begin … End)

Составной оператор – это последовательность операторов заключённая в операторные скобки Begin <операторы> End; Составной оператор используется для объединения нескольких операторов в виде одного в тех местах, где допустимо использование именно одного оператора. Эта ситуация характерна для операторов условного перехода и операторов циклов, которые рассматриваются в следующих разделах.

Всегда сразу же пишите и begin и end, причем оба слова с новой строки на одном уровне. Затем наполняйте их внутренними операторами с отступом в 2 пробела. Такой стиль написания программы существенно облегчает её понимание и снижает количество возможных ошибок.

1 доступно через модуль MMSystem

41

3ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

3.4.3Операторы условного перехода (If, Case)

Оператор If имеет следующую структуру:

If <условие> Then <оператор> [Else <оператор>];

где условие – это некоторое логическое выражение. Если оно является истинным, т.е. - True, то выполняется оператор (составной оператор), следующий за Then. Иначе, при наличии Else, выполняется оператор (составной оператор) следующий за Else. Если Else-часть отсутствует, то выполняется очередной оператор после If. Else-часть относится к ближайшей If-части.

Обращаем Ваше внимание, что в частях Then и Else может присутствовать только один оператор. Если Вы хотите там выполнить несколько операторов, то их необходимо оформить как один составной оператор, т. е. заключить в «операторные скобки» begin … end.

П р и м е р 3.10

Нахождение корней квадратного уравнения y = ax2 + bx + c :

var a,b,c,D,x,x1,x2: Double; begin

{ Ввод коэффициентов a,b,c квадратного уравнения... } D:=b*b-4*a*c; // вычисление дискриминанта

If D>0 then

Begin x1:=(-b+Sqrt(D))/(2*a); x2:=(-b-Sqrt(D))/(2*a);

{ вывод двух решений x1, x2 … } end

else {если D<=0} If D=0 then begin

x:=-b/(2*a);

{ вывод единственного решения x … } end

else { если D<0} { вывод комментария: Уравнение не имеет решений}

end;

Если оператор If содержит длинное сложное условие, то заключайте его в круглые скобки, это поможет компилятору правильно обработать If. Наиболее вероятные условия пишите слева, а менее вероятные – в elseчасти и во вложенных If.

42

3.4 ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕСОВ

Следующий условный оператор – Case. Он позволяет сделать выбор из множества вариантов без использования сложных вложенных конструкций из операторов If…else. Он имеет структуру:

Case <селектор> Of

<метка 1>: <Оператор>;

<метка 2>: <Оператор>;

...

[Else <Оператор>;]

End { конец Case };

Селектор – это выражение перечислимого1 типа, значение которого вычисляется и последовательно сравнивается с указанными метками, представляющими собой заранее определенные возможные значения селектора. При совпадении значения селектора с какой-либо меткой выполняется соответствующий оператор (составной оператор). Оператор, следующий за Else, выполняется в том случае, если значение селектора не совпало ни с одной из указанных меток.

П р и м е р 3.11

Var Operator: Char; X: Double;

Begin

{ Вввод значения переменной Operator… }

Case Operator Of

'p' : X:=X+5; {выполняется если значение Operator=’p’ } 'm' : X:=X-5; {выполняется если значение Operator=’m’ } 'c' : X:=X*5; {выполняется если значение Operator=’с’ }

end;

< Вывод значения X > end;

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

П р и м е р 3.12

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

Label Restart; Var I:Integer; begin

Restart:

1 целые, символьные, булевские

43

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

< Ввод целого значения переменной I … >

Case I Of

 

0

: < вывод комментария: 'I=0' >

2,4,6,8

: < 'Чётное положительное, меньше 10>

1,3,5,7,9

: < 'Нечётное положительное, меньше 10' >

Low(Integer)..-1

: < 'Отрицательное' >

10..High(Byte)

: < 'От 10 до 255' >

else begin

< Вывод: 'Число больше 255' … >

Close; {закрыть приложение} end;

GoTo Restart; // Повторить всё с начала

End;

Если begin следует за else, то их целесообразно писать на одной строке.

Задание 4.

Решение уравнений и неравенств

Цель задания

Получение навыков использования условных операторов.

Постановка задачи

Составить программу с использованием операторов If или Case для решения уравнений с различными вводимыми коэффициентами. Организовать анализ всех возможных некорректных решений и обеспечить вывод необходимых комментариев, включая вид уравнения и его решение. Программа не должна изобиловать простейшими операторами If без части Else или излишним количеством операторов GoTo. Интерфейс приложения разработайте по своему усмотрению.

Варианты задания:

 

1. a1x+b1y+c1=0

2. ax2+bx+c=0

 

a2x+b2y+c2=0

 

3. ax2+b>0

4. ax2+b<=0

5. ax2+bx+c>0

6. ax2+bx+c<=0

7.

ax2+b=0

8. a1x+b1<0

 

 

a2x+b2<0

9.

a1x+b1>=0

10. a1x+b1<0

44

3.5 ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ

a2x+b2>=0

a2x+b2>0

Контрольные вопросы для сдачи лабораторной работы:

1.Зачем нужен оператор Begin...End?

2.Как интерпретируется часть Else при нескольких операторах If ?

3.Как работает оператор Case?

4.Как указать диапазон или множество возможных значений селектора?

5.Какой приоритет имеют операции при вычислении выражений?

3.5 ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ

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

3.5.1 Оператор цикла с параметром (For)

Оператор цикла For применяется для повторения заданного числа раз некоторого программного кода. Он имеет следующую структуру:

For <переменная>:=<начальное значение> Тo <конечное> Do <оператор>;

Управляющая переменная (параметр цикла) – это идентификатор перечислимого типа (целого, символьного или логического), который изменяется в теле цикла (оператор после Do) c шагом 1 от начального значения до конечного значения. Данные значения могут быть выражениями, соответственно целого, символьного и логического типа. Внутри цикла начальное, конечное значения и сам параметр цикла изменять нельзя. Если начальное значение больше чем конечное, то цикл не выполняется (пропускается). Войти в цикл можно только через его начало, а выйти – либо по достижению параметром своего конечного значения, либо по GoTo, либо по Break (см. ниже). При выходе из цикла параметр цикла сохраняет своё последнее значение.

45

an-1
an-1

3 ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

Для организации цикла с шагом -1 необходимо использовать конструкцию:

For <переменная>:=<нач. значение> DownTo <конечное> Do <оператор>;

 

П р и м е р 3.13

Var

 

S,I

:Integer;

P

:Double;

C

:Char;

L,L_end

:Boolean;

Begin

S:=0; P:=1;

For I:=5 To Trunc (P* 10+3.5) div 2 Do { I от 5 до 6 }

Begin

S:=S+I; Inc(S,2);

End; { после этого цикла S=15}

S:=0;

 

 

For I:=10 DownTo 9 Do

S:=S+I*2; { после этого цикла S=38 }

P:=0;

 

 

For C:='A' To 'D' Do

P:=P-0.5; { после этого цикла P=-2 }

S:=0;

L_end:=True;

 

For L:=False To L_end Do S:=S+1; { S=2 }

End;

 

 

3.5.2

Оператор цикла с предусловием (While)

Оператор цикла While имеет следующую структуру:

While <выражение> Do <оператор>;

Оператор (составной оператор) в теле цикла выполняется, пока значение выражения остаётся истинным. Проверка истинности осуществляется перед каждым выполнением очередного цикла.

В качестве примера рассмотрим программу вычисления sin(x) с точностью ε=10-6 по формуле Маклорена: Sin(x)=x-x3/3!+x5/5!-... Введём параметр n=1,3,5,..., тогда очередной элемент an ряда Маклорена запишется через предыдущий следующим образом: an = – x2/[(n-1)n]. Теперь остаётся просуммировать все элементы ряда до условия |an|≤ε.

П р и м е р 3.14

Const Eps=1E-6;

46

3.5 ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ

Var x,Sum,a: Double; N: Integer;

Begin

< ввод значения x >

Sum:=x; a:=x; N:=1; While Abs(a)>Eps Do

Begin

Inc(N,2); a:=-a*Sqr(x)/((N-1)*N); Sum:=Sum+a;

End;

< вывод значения суммы Sum >

End;

3.5.3 Оператор цикла с постусловием (Repeat)

Оператор цикла Repeat имеет следующую структуру:

Repeat

<операторы>; Until <выражение>;

Тело цикла (операторы между Repeat и Until) выполняется до тех пор, пока выражение имеет значение False. Проверка истинности выражения осуществляется после каждого выполнения тела цикла.

П р и м е р 3.15

Вывод целых чисел от 0 до 10

Var k:Integer;

Begin k:=0;

Repeat

ListBox1.Add(IntToStr(k=,k)); k:=k+1;

Until k>10;

End;

3.5.4 Процедуры Break и Continue в операторах циклов

Процедура Break позволяет досрочно выйти из цикла, не дожидаясь выполнения условия выхода. Процедура Continue позволяет начать новую итерацию цикла, прерывая выполнение текущей итерации.

47

3ЯЗЫК ПРОГРАММИРОВАНИЯ Object Pascal

3.5.5Обработка событий в циклах (ProcessMessage)

Если во время выполнения цикла должно контролироваться какоелибо событие, например, нажатие клавиши “Stop”, то необходимо предпринять специальные меры.

Дело в том, что любые действия пользователя и приложения (щелчок мыши, перемещение окна, выделение памяти, ошибка вычислений и т.п.) вынуждают Windows отправлять приложению сообщение о том, что произошло в системе. В Delphi большинство сообщений преобразуется в события языка Object Pascal, перечень которых можно найти в инспекторе объектов.

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

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

Если Вы запрограммируете бесконечный цикл, то не сможете его остановить никакими сообщениями. Ваше приложение «зависнет», оно не будет реагировать ни на какие клавиши. Такое зависание может нарушить работу всей операционной системы. Закрыть зависшее приложение иногда можно с помощью трех клавиш Alt+Ctrl+Del. Если это не помогает, – тогда надо использовать кнопку горячего перезапуска системы – Reset.

Для принудительной обработки очереди сообщений необходимо выполнить соответствующий метод компонента Application:

Application.ProcessMessage;

После чего можно проконтролировать состояние какого-либо события, например, нажатие желанной клавиши “ Стоп”.

3.6ОПИСАНИЯ ТИПОВ

Вразделе 3.1 Вы познакомились с простыми стандартными типами данных. Поскольку они стандартные, то их типы не надо было описывать. Язык Pascal позволяет программисту самому вводить, практически, любые типы переменных. Это очень удобное и мощное свойство для любого языка программирования. Сложные, нестандартные типы данных надо специ-

48

3.6 ОПИСАНИЯ ТИПОВ

ально описывать до объявления переменных этих типов, чтобы компилятор, после встречи слова var знал, как их размещать в памяти.

3.6.1 Перечислимый и скалярный типы. Отрезок типа

Ранее используемые переменные имели простые типы: вещественный

(Double, Extended), строковый (String) и скалярный (Smallint, Integer, Int64, Byte, Word, LongWord, Char, Boolean), значения которого можно пронумеровать.

Перечислимые (порядковые) типы – это стандартные и нестандартные скалярные типы. Они могут вводиться пользователем в виде упорядоченного множества идентификаторов, перечисляющих все возможные значения нового типа данных:

Type <идентификатор типа>=(<идентификатор 1>,..., <идентификатор N>);

После описания типа данных необходимо объявить идентификаторы переменных данного типа:

Var <идентификаторы переменных> : <идентификатор типа>;

Первый идентификатор всегда имеет порядковый номер 0. Например,

Type TColor=(colRed,colGreen,colBlue);

Идентификаторы констант colRed, colGreen, colBlue имеют тип TColor. Порядковый номер colRed равен 0, т.е. Ord(colRed)=0. Идентификаторы констант перечислимого типа принято начинать с 2-3 малых букв из названия их тапа.

Пр и м е р 3.16 (Применение перечислимых данных)

//В расчетах могут использоваться 3 вида ф-ций:

Type TFunctions=(funF1,funF2,funF3);

...

var f: TFunctions; begin

...

Case RadioGroup1.ItemIndex Of // ввод выбранной функции

0:f:=funF1;

1:f:=funF2;

2:f:=funF3;

end;

...

Case f Of // вычисление выбранной функции funF1: begin {вычислить функцию F1}... end;

49

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