3 Операторы управления - ucoz · 3.2 Оператор присваивания...

68
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 96 3 Операторы управления В этой главе изложена методика составления алгоритмов с помо- щью блок-схем и описаны основные операторы языка: условный опе- ратор if, оператор выбора case, операторы цикла while..do, repeat..until, for..do. Приводится большое количество при- меров составления программ различной сложности. 3.1 Основные конструкции алгоритма Как правило, созданию программы предшествует разработка ал- горитма 36 . Алгоритм — это четкое описание последовательности дей- ствий, которые необходимо выполнить для того, чтобы при соответ- ствующих исходных данных получить требуемый результат. Одним из способов представления алгоритма является блок-схема. При ее со- ставлении все этапы решения задачи изображаются с помощью раз- личных геометрических фигур. Эти фигуры называют блоками и, как правило, сопровождают надписями. Последовательность выполнения этапов указывают при помощи стрелок, соединяющих эти блоки. Типичные этапы решения задачи изображаются следующими гео- метрическими фигурами: блок начала (конца) (рис. 3.1). Надпись внутри блока: «начало» («конец»); блок ввода (вывода) данных (рис. 3.2). Надпись внутри блока: ввод (вывод) и список вводимых (выводимых) переменных; блок решения, или арифметический (рис. 3.3). Внутри блока за- писывается действие, вычислительная операция или группа опе- раций; условный блок (рис. 3.4). Логическое условие записывается вну- три блока. В результате проверки условия осуществляется выбор одного из возможных путей (ветвей) вычислительного процесса. Рассмотренные блоки позволяют описать три основные конструк- ции алгоритма: линейный, разветвляющийся и циклический про- цессы. 36 Алгоритм - от algorithmi, algorismus, первоначально латинская транслитерация имени математика аль-Хорезми.

Upload: others

Post on 18-Aug-2020

23 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 96

3 Операторы управленияВ этой главе изложена методика составления алгоритмов с помо-

щью блок-схем и описаны основные операторы языка: условный опе-ратор if, оператор выбора case, операторы цикла while..do, repeat..until, for..do. Приводится большое количество при-меров составления программ различной сложности.

3.1 Основные конструкции алгоритмаКак правило, созданию программы предшествует разработка ал-

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

Типичные этапы решения задачи изображаются следующими гео-метрическими фигурами:

• блок начала (конца) (рис. 3.1). Надпись внутри блока: «начало» («конец»);

• блок ввода (вывода) данных (рис. 3.2). Надпись внутри блока: ввод (вывод) и список вводимых (выводимых) переменных;

• блок решения, или арифметический (рис. 3.3). Внутри блока за-писывается действие, вычислительная операция или группа опе-раций;

• условный блок (рис. 3.4). Логическое условие записывается вну-три блока. В результате проверки условия осуществляется выбор одного из возможных путей (ветвей) вычислительного процесса.

Рассмотренные блоки позволяют описать три основные конструк-ции алгоритма: линейный, разветвляющийся и циклический про-цессы.

36 Алгоритм - от algorithmi, algorismus, первоначально латинская транслитерация имени математика аль-Хорезми.

Page 2: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 97

Рисунок 3.1: Блок начала (конца) ал-горитма

Рисунок 3.2: Блок ввода (вывода)

Рисунок 3.3: Арифмети-ческий блок

Рисунок 3.4: Услов-ный блок

Линейный процесс — это конструкция, представляющая собой последовательное выполнение двух или более блоков (рис. 3.5).

Разветвляющийся процесс задает выполнение одного или другого оператора в зависимости от выполнения условия (рис. 3.6).

Циклический процесс задает многократное выполнение оператора или группы операторов (рис. 3.7).

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

Рассмотрим операторы языка программирования Free Pascal, реа-лизующие основные конструкции алгоритма.

Рисунок 3.5: Линейный процесс

Рисунок 3.6: Разветвляю-

щийся процесс Рисунок 3.7: Цикли-

ческий процесс

3.2 Оператор присваиванияОператор присваивания в языке Free Pascal состоит из двух сим-

волов: двоеточия и знака равенства. Символы := всегда пишут слитно. Пробелы допускаются перед символом двоеточия и после символа ра-венства.

В общем случае оператор присваивания имеет вид:имя_переменной := значение;

Page 3: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 98

где значение – это выражение, переменная, константа или функция. Выполняется оператор так. Сначала вычисляется значение выраже-ния, указанного в правой части оператора, а затем его результат запи-сывается в область памяти (переменную), имя которой указано слева. Например, запись a:=b означает, что переменной а присваивается значение b.

Типы переменных a и b должны совпадать или быть совмести-мыми для присваивания, то есть тип, к которому принадлежит пере-менная b, должен находиться в границах типа переменной а.

3.3 Составной операторСоставной оператор – группа операторов языка Free Pascal,

отделенных друг от друга точкой с запятой, начинающихся со служеб-ного слова begin и заканчивающихся служебным словом end:

beginоператор_1;...оператор_nend;Транслятор воспринимает составной оператор как один оператор.

3.4 Условные операторыВ языке Free Pascal одна из основных конструкций алгоритма,

разветвляющийся процесс, реализована двумя условными оператора-ми: if и case. Рассмотрим каждый из них.

3.4.1 Условный оператор if…then…elseПри решении большинства задач порядок вычислений зависит от

определенных условий, например, от исходных данных или от проме-жуточных результатов, полученных на предыдущих шагах програм-мы. Для организации вычислений в зависимости от какого-либо усло-вия в языке Free Pascal используется условный оператор if…then…else, который в общем виде записывается так:

if условие then оператор_1 else оператор_2;где if…then…else – зарезервированные слова, условие – выраже-ние логического типа37, оператор_1 и оператор_2 – любые опера-торы языка Free Pascal.37 Логическое выражение может принимать одно из двух значений: истина или ложь.

Page 4: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 99

Работа условного оператора организована следующим образом. Сначала вычисляется выражение, записанное в условии. Если оно имеет значение истина (True), то выполняется оператор_1. В про-тивном случае, когда выражение имеет значение ложь (False), опе-ратор_1 игнорируется и управление передается оператору_2. Ал-горитм, который реализован в условном операторе if…then…else, представлен на рис. 3.8.

Рисунок 3.8: Алгоритм условного опе-ратора if...then...else

Например, чтобы сравнить значения переменных x и y, нужно со-здать следующий программный код:

write('x='); readln(x);write('y='); readln(y);if x=y thenwriteln('значение x равно значению y')else writeln('значение x не равно значению y');Если в задаче требуется, чтобы в зависимости от значения усло-

вия выполнялся не один оператор, а несколько, их необходимо заклю-чать в операторные скобки как составной оператор:

if условие thenbegin

оператор_1;оператор_2;…

end

Page 5: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 100

elsebegin

оператор_1;оператор_2;…

end;Альтернативная ветвь else в условном операторе может отсут-

ствовать, если в ней нет необходимости:if условие then оператор;

илиif условие thenbegin

оператор_1;оператор_2;…оператор_n;

end;В таком «усеченном» виде условный оператор работает так: опе-

ратор (группа операторов) либо выполняется, либо пропускается, в зависимости от значения выражения, представляющего условие. Ал-горитм этого условного процесса представлен на рис. 3.9.

Рисунок 3.9: Алго-ритм условного оператора if без альтернативной

ветви else

Пример применения условного оператора, без альтернативной ветви else может быть та-ким:

write('x=');readln(x);write('y=');readln(y);z:=0;{Значение c изменяется только при условии,что x не равно y.}if (x<>y) then z:=x+y;{Вывод на экран значения перемен-ной z выполняется в любом случае.}writeln('Значение z=',z);

Page 6: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 101

Условные операторы могут быть вложены друг в друга. При вло-жениях условных операторов всегда действует правило: альтернатива else считается принадлежащей ближайшему if, имеющему ветвь else. Например, в записи

if условие_1 thenif условие_2 then

оператор_Аelse оператор_Б;

оператор_Б относится к условию_2, а в конструкцииif условие_1 then begin

if условие_2 then оператор_А;

endelse оператор_Б;

он принадлежит оператору if с условием_1.Для сравнения переменных в условных выражениях применяют

операции отношения: =, <>, <, >, <=, >=. Условные выражения со-ставляют с использованием логических операций and, or и not. В языке Free Pascal приоритет операций отношения меньше, чем у ло-гических операций, поэтому составные части сложного логического выражения заключают в скобки.

Допустим, нужно проверить, принадлежит ли переменная х ин-тервалу [a, b]. Условный оператор будет иметь вид:

if (x>=a) and (x<=b) then…. Запись

if x>=a and x<=b then… не верна, так как фактически будет вычисляться значение выражения

x>= (a and x) <=b.

Рассмотрим использование оператора if на примерах38.ЗАДАЧА 3.1. Дано вещественное число x. Для функции, график

которой приведен на рис. 3.10, вычислить y=f(x).

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

Page 7: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 102

Рисунок 3.10: Графическое представление задачи 3.1

Аналитически функцию, представленную на рис. 3.10, можно записать так:

y x ={ 4, x−21, x1

x2 , −2x1Составим словесный алго-

ритм решения этой задачи: 1. Начало алгоритма.2. Ввод числа x (аргумент функции).

Рисунок 3.11: Блок-схема ал-горитма решения задачи 3.1

3. Если значение x меньше либо равно -2, то переход к п. 4, иначе переход к п. 5.4. Вычисление значения функции: y=4, переход к п. 8. 5. Если значение x больше либо равно 1, то переход к п. 6, иначе переход к п. 7.6. Вычисление значения функции: y=1, переход к п. 8. 7. Вычисление значения функции: y=x2. 8. Вывод значений аргумен-та x и функции y. 9. Конец алгоритма.Блок-схема, соответствующая описанному алгоритму, представ-лена на рис. 3.11.

Текст программы на языке Free Pascal будет иметь вид:var x,y: real; begin write('x='); readln(x); if x<=-2 then y:=4 else if x>=1 then y:=1 else y:=sqr(x); writeln('x=',x:5:2,' y=',y:5:2);end.

Page 8: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 103

ЗАДАЧА 3.2. Даны вещественные числа x и y. Определить при-надлежит ли точка с координатами (x; y) заштрихованной части плос-кости (рис. 3.12).

Как показано на рис. 3.12, плос-кость ограничена линиями x=-1, x=3, y=-2 и y=4. Значит точка с координа-тами (x; y) будет принадлежать этой плоскости, если будут выполняться следующие условия: x ≥ -1, x≤3, y ≥ -2 и y ≤ 4. Иначе точка лежит за пре-делами плоскости.Блок-схема, описывающая алгоритм решения данной задачи, представле-на на рис. 3.13. Текст программы к задаче 3.2 приведен далее.

Рисунок 3.12: Графическое представление задачи 3.2

Рисунок 3.13: Алгоритм решения задачи 3.2

Page 9: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 104

var x,y:real;

beginwrite('x='); readln(x);write('y='); readln(y);if (x>=-1) and (x<=3) and (y>=-2) and (y<=4)

thenwriteln('Точка принадлежит плоскости')

elsewriteln('Точка не принадлежит плоскости');

end.ЗАДАЧА 3.3. Написать программу решения квадратного уравне-

ния ax2+bx+c=0. Исходные данные: вещественные числа а, b и с – коэффициенты

квадратного уравнения.Результаты работы программы: вещественные числа x1 и x2 –

корни квадратного уравнения либо сообщение о том, что корней нет.Вспомогательные переменные: вещественная переменная d, в ко-

торой будет храниться дискриминант квадратного уравнения.Составим словесный алгоритм решения этой задачи.1. Начало алгоритма.2. Ввод числовых значений переменных а, b и с.3. Вычисление значения дискриминанта d по формуле

d=b2−4ac .4. Если d<0, то переход к п.5, иначе переход к п.6.5. Вывод сообщения Вещественных корней нет и пере-

ход к п.8.

6. Вычисление корней x1=−bd2a

и x2=−b−d2a

.

7. Вывод значений x1 и x2 на экран.8. Конец алгоритма.Блок-схема, соответствующая этому описанию, представлена на

рис. 3.14.Текст консольной программы, которая реализует решение квад-

ратного уравнения:

Page 10: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 105

Рисунок 3.14: Алгоритм решения квадратного урав-нения

{Описание переменных.}var a,b,c,d,x1,x2: real;begin {Ввод коэффициентов квадратного уравнения.}writeln('Введите коэффициенты уравнения');readln(a,b,c);{Вычисление дискриминанта.}

Page 11: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 106

d:=b*b-4*a*c;{Если дискриминант отрицателен,}if d<0 then

{то вывод сообщения, что корней нет,}writeln('Корней нет')

elsebegin

{иначе вычисление корней x1, x2}x1:=(-b+sqrt(d))/2/a;x2:=(-b-sqrt(d))/(2*a);{и вывод их на экран.}writeln('X1=',x1:6:3, ' X2=',x2:6:3)

endend.ЗАДАЧА 3.4. Составить программу нахождения действительных

и комплексных корней квадратного уравнения ax2+bx+c=0. Исходные данные: вещественные числа а, b и с – коэффициенты

квадратного уравнения.Результаты работы программы: вещественные числа x1 и x2 –

действительные корни квадратного уравнения либо x1 и x2 – действи-тельная и мнимая части комплексного числа.

Вспомогательные переменные: вещественная переменная d, в ко-торой будет храниться дискриминант квадратного уравнения.

Можно выделить следующие этапы решения задачи:1. Ввод коэффициентов квадратного уравнения a, b и c.2. Вычисление дискриминанта d по формуле d=b2−4ac .3. Проверка знака дискриминанта. Если d≥0, то вычисление

действительных корней:

x1=−bd2a

и x2=−b−d2a

и вывод их на экран. При отрицательном дискриминанте выводится сообщение о том, что действительных корней нет, и вычисляются

комплексные корни39 −b2a

i ∣d∣2a

, −b2a

−i ∣d∣2a

.

У обоих комплексных корней действительные части одинаковые,

39 Комплексные числа записываются в виде a+ib, где a – действительная часть комплексного числа, b – мнимая часть комплексного числа, i – мнимая единица −1 .

Page 12: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 107

а мнимые отличаются знаком. Поэтому можно в переменной x1 хра-

нить действительную часть числа −b2a , в переменной x2 – модуль

мнимой части ∣d∣2a

, а в качестве корней вывести x1+ix2 и x1-ix2.

На рис. 3.15 изображена блок-схема решения задачи.

Рисунок 3.15: Алгоритм решения задачи 3.4

Page 13: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 108

Описание блок-схемы, изображенной на рис. 3.15. Блок 1 предна-значен для ввода коэффициентов квадратного уравнения. В блоке 2 осуществляется вычисление дискриминанта. Блок 3 осуществляет проверку знака дискриминанта, если дискриминант отрицателен, то корни комплексные, их расчет происходит в блоке 4 (действительная часть корня записывается в переменную x1, модуль мнимой – в пере-менную x2), а вывод – в блоке 5 (первый корень x1+ix2, второй – x1-ix2). Если дискриминант положителен, то вычисляются действи-тельные корни уравнения (блоки 6, 7) и выводятся на экран (блок 8).

Текст программы, реализующей поставленную задачу:var a,b,c,d,x1,x2: real;begin writeln('Введите коэффициенты уравнения');readln(a,b,c);d:=b*b-4*a*c;if d<0 then begin{Если дискриминант отрицателен, то вывод сообщения,что действительных корней нет, и вычислениекомплексных корней.}

writeln('Действительных корней нет');{Вычисление действительной части

комплексных корней.}x1:=-b/(2*a);{Вычисление модуля мнимой части

комплексных корней.}x2:=sqrt(abs(d))/(2*a);writeln('Комплексные корни уравнения ',

a:1:2,’x^2+’,b:1:2,’x+’,c:1:2,’=0’);{Вывод значений комплексных корней в виде x1±ix2}writeln(x1:1:2,'+i*(',x2:1:2,')');writeln(x1:1:2,'-i*(',x2:1:2,')');

endelsebegin

{иначе вычисление действительных

Page 14: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 109

корней x1, x2}x1:=(-b+sqrt(d))/2/a;x2:=(-b-sqrt(d))/(2*a);{и вывод их на экран.}writeln('Действительные корни уравнения ',

a:1:2,’x^2+’,b:1:2,’x+’,c:1:2,’=0’);writeln('X1=',x1:1:2, ' X2=',x2:1:2)

end end.ЗАДАЧА 3.5. Составить программу для решения кубического

уравнения ax3+bx2+cx+d=0.Кубическое уравнение имеет вид ax 3bx2cxd=0 (3.1)После деления на a уравнение (3.1) принимает канонический вид:

x3rx2sxt=0 (3.2)

где r= ba , s= c

a , t= da . В уравнении (3.2) сделаем замену

x= y− r3 и получим приведенное уравнение: y3 pyq=0 (3.3),

где p=3s−r2

3, q=2r3

27− rs

3t .

Число действительных корней приведенного уравнения (3.3) за-

висит от знака дискриминанта (табл. 3.1): D= p3

3

q2

2

.

Таблица 3.1. Количество корней кубического уравненияДискриминант Количество

действительных корнейКоличество

комплексных корнейD0 1 2D0 3 -

Корни приведенного уравнения могут быть рассчитаны по форму-лам Кардано:

y1=uv

y2=−uv

2 u−v

2i3 (3.4)

y3=−uv

2−u−v

2i3

Page 15: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 110

где u= 3−q2 D , v= 3−q

2−D .

При отрицательном дискриминанте уравнение (3.1) имеет три действительных корня, но они будут вычисляться через вспомогатель-ные комплексные величины. Чтобы избавиться от этого, можно воспользоваться формулами:

y1=2 3 cos 3 ,

y2=2 3cos 32

3 , y3=2 3 cos

34

3 , (3.5)

где =−p3

27 , cos=−q2

.

Таким образом, при положительном дискриминанте кубического уравнения (3.3) расчет корней будем вести по формулам (3.4), а при отрицательном – по формулам (3.5). После расчета корней приведен-ного уравнения (3.3) по формулам (3.4) или (3.5) необходимо по фор-

мулам xk= yk−r3

, k=1,2 ,3... перейти к корням заданного кубиче-

ского уравнения (3.1). Блок-схема решения кубического уравнения представлена на

рис.3.16 - 3.17.

Рисунок 3.16: Алгоритм ре-шения кубического уравнения

Page 16: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 111

Рисунок 3.17: Алгоритм решения кубического уравнения (продол-жение)

Описание алгоритма решения кубического уравнения (рис. 3.16 - 3.17). В блоке 1 вводятся коэффициенты кубического уравнения, в

Page 17: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 112

блоках 2-3 рассчитываются коэффициенты канонического и приведен-ного уравнений. Блок 4 предназначен для вычисления дискриминан-та. В блоке 5 проверяется знак дискриминанта кубического уравне-ния. Если он отрицателен, то корни вычисляются по формулам (3.5) (блоки 6-7). При положительном значении дискриминанта расчет идет по формулам (3.4) (блок 9, 10). Блоки 8 и 11 предназначены для выво-да результатов на экран.

Текст программы приведен далее40.vara,b,c,d,r,s,t,p,q,ro,fi,x1,x2,x3,u,v,h,g:real;begin{Ввод коэффициентов кубического уравнения.}write('a=');readln(a);write('b=');readln(b);write('c=');readln(c);write('d=');readln(d);{Расчет коэффициентов канонического

уравнения по (3.2).}r:=b/a; s:=c/a; t:=d/a;{Вычисление коэффициентов

приведенного уравнения (3.3).}p:=(3*s-r*r)/3;q:=2*r*r*r/27-r*s/3+t;{Вычисление дискриминанта

кубического уравнения.}d:=(p/3)*sqr(p/3)+sqr(q/2);{Проверка знака дискриминанта,ветка then реализует формулы (3.5),ветка else – формулы (3.4)}if d<0 thenbegin

ro:=sqrt(-p*p*p/27);40 При расчете величин u и v в программе предусмотрена проверка значения подкоренного выраже-

ния.

Если −q2∓D0, то u= 3−q

2D ,а v=3−q

2−D .

Если −q2∓D0, то u=−3∣−q

2D∣, а v=−3∣−q

2−D∣ .

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

Page 18: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 113

{Следующие два оператора реализуют расчет угла fi, сначала вычисляется величина косинуса угла, затем вычисляетсяего арккосинус через арктангенс.}fi:=-q/(2*ro);fi:=pi/2-arctan(fi/sqrt(1-fi*fi));{Вычисление действительных корней уравнения x1, x2 и x3}x1:=2*exp(1/3*ln(ro))*cos(fi/3)-r/3;x2:=2*exp(1/3*ln(ro))*

cos(fi/3+2*pi/3)-r/3;x3:=2*exp(1/3*ln(ro))*

cos(fi/3+4*pi/3)-r/3;writeln('x1=',x1:1:3,

' x2=',x2:1:3,' x3=',x3:1:3);endelsebegin

{Вычисление u и v с проверкой знака подкоренного выражения. }

if -q/2+sqrt(d)>0 thenu:=exp(1/3*ln(-q/2+sqrt(d)))

elseif -q/2+sqrt(d)<0 then

u:=-exp(1/3*ln(abs(-q/2+sqrt(d))))else

u:=0;if -q/2-sqrt(d)>0 then

v:=exp(1/3*ln(-q/2-sqrt(d)))else

if -q/2-sqrt(d)<0 thenv:=-exp(1/3*ln(abs(-q/2-sqrt(d))))

else v:=0;

{Вычисление действительного корня кубического уравнения.}

x1:=u+v-r/3;{Вычисление действительной и

Page 19: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 114

мнимой частей комплексных корней.}h:=-(u+v)/2-r/3;g:=(u-v)/2*sqrt(3);writeln('x1=',x1:1:3,' x2=',h:1:3,'+i*',

g:1:3,' x3=',h:1:3,'-i*',g:1:3);endend.ЗАДАЧА 3.6. Заданы коэффициенты a, b и с биквадратного урав-

нения ах4+bх²+с=0. Найти все его действительные корни.Входные данные: a, b, c.Выходные данные: х1, х2, х3, х4.Для решения биквадратного уравнения необходимо заменой y=x2

привести его к квадратному уравнению аy2+by+с=0 и решить это уравнение.

Опишем алгоритм решения этой задачи (рис. 3.18):

1. Ввод коэффициентов биквадратного уравнения a, b и c (блок 1).

2. Вычисление дискриминанта уравнения d (блок 2).3. Если d < 0 (блок 3), вывод сообщения, что корней нет (блок

4), а иначе определяются корни соответствующего квадратного урав-нения y1 и y2 (блок 5).

4. Если y1<0 и y2<0 (блок 6) , то вывод сообщения, что кор-ней нет (блок 7).

5. Если y1≥0 и y2≥0 (блок 8), то вычисляются четыре корня по формулам ± y1 ,± y2 (блок 9) и выводятся значения корней (блок 10).

6. Если условия 4) и 5) не выполняются, то необходимо прове-рить знак y1. Если y1≥0 (блок 11), то вычисляются два корня по фор-муле ± y1 (блок 12), иначе ( если y2≥0) вычисляются два корня по формуле ± y2 (блок 13). Вывод вычисленных корней (блок 14).

Page 20: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 115

Рисунок 3.18: Алгоритм реш

ения биквадратного уравнения

Page 21: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 116

Текст программы на языке Free Pascal с комментариями:var

a,b,c,d,x1,x2,x3,x4,y1,y2: real;begin{Ввод коэффициентов уравнения.}writeln('Введите коэффициенты уравнения');readln(a,b,c);{Вычисление дискриминанта.}d:=b*b-4*a*c;{Если он отрицателен,}if d<0 then

{вывод сообщения «Корней нет»}writeln('Корней нет')

{Если дискриминант ≥0,}else{Описание переменных:a,b,c – коэффициенты биквадратного уравнения,d – дискриминант,x1,x2,x3,x4 – корни биквадратного уравнения,y1,y2 – корни уравнения ay^2+by+c=0.}begin

{вычисление корней квадратного уравнения.}y1:=(-b+sqrt(d))/2/a;y2:=(-b-sqrt(d))/(2*a);{Если оба корня квадратного уравнения <0,}if (y1<0) and (y2<0) then

{вывод сообщения «Корней нет».}writeln('Корней нет')

{Если оба корня квадратного уравнения ≥0,}else if (y1>=0) and (y2>=0) thenbegin

{вычисление четырех корней уравнения.}x1:=sqrt(y1); x2:=-x1;x3:=sqrt(y2); x4:=-sqrt(y2);{Вывод корней уравнения на экран.}writeln('X1=',x1:6:3,' X2=',x2:6:3);writeln('X3=',x3:6:3,' X4=',x4:6:3);

end

Page 22: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 117

{Если не выполнились оба условия 1. y1<0 И y2<02. y1>=0 И y2>=0,

то проверяем условие y1>=0}else if (y1>=0) then{Если оно истинно}begin

x1:=sqrt(y1); x2:=-x1;writeln('X1=',x1:6:3,' X2=',x2:6:3);

endelse{Если условие y1>=0 ложно, то}begin

x1:=sqrt(y2); x2:=-x1;writeln('X1=',x1:6:3,' X2=',x2:6:3);

endendend.

3.4.2 Оператор варианта case Оператор варианта case необходим в тех случаях, когда в зави-

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

case переменная ofнабор_значений_1: оператор_1;набор_значений_2: оператор_2;…набор_значений_N: оператор_Nelseальтернативный_операторend;Оператор работает следующим образом. Если переменная при-

нимает значение из набора_значений_1, то выполняется опера-тор_1. Если переменная принимает значение из набора_значе-ний_2, то выполняется оператор_2 и так далее. Если перемен-ная не принимает значений из имеющихся наборов, то выполняется альтернативный_оператор, расположенный после ключевого слова else.

Page 23: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 118

Тип переменной должен быть только перечислимым (включая char и boolean), диапазоном или целочисленным. Набор_значе-ний – это конкретное значение управляющей переменной или выра-жение, при котором необходимо выполнить соответствующий опе-ратор, игнорируя остальные варианты. Значения в каждом наборе должны быть уникальны, то есть они могут появляться только в од-ном варианте. Пересечение наборов значений для разных вариантов является ошибкой.

Альтернативная ветвь else может отсутствовать, тогда оператор имеет вид:

case переменная ofнабор_значений_1: оператор_1;набор_значений_2: оператор_2;…набор_значений_N: оператор_N;end;Кроме того, в операторе case допустимо использование состав-

ного оператора. Например:case переменная ofнабор_значений_1: begin

оператор_A; оператор_B;

end;набор_значений_2: begin

оператор_C; оператор_D; оператор_E;

end;…набор_значений_N: оператор_N;end;ЗАДАЧА 3.7. Вывести на печать название дня недели, соответ-

ствующее заданному числу D, при условии, что в месяце 31 день и первое число – понедельник.

Для решения задачи воспользуемся операцией mod, позволяющей вычислить остаток от деления двух чисел, и условием, что 1-е число – понедельник. Если в результате остаток от деления (обозначим его R)

Page 24: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 119

заданного числа D на семь будет равен единице, то это понедельник, двойке – вторник, тройке – среда и так далее. Следовательно, при по-строении алгоритма необходимо использовать семь условных опера-торов, как показано рис. 3.19.

Решение задачи станет значительно проще, если при написании программы воспользоваться оператором варианта:

var d:byte;beginwrite('Введите число D='); readln(D);{Вычисляется остаток от деления D на 7.}

Рисунок 3.19: Алгоритм решения задачи 3.7

Page 25: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 120

case D mod 7 of {В зависимости от полученного значения}{на печать выводится название дня недели}1: writeln('ПОНЕДЕЛЬНИК');2: writeln('ВТОРНИК');3: writeln('СРЕДА');4: writeln('ЧЕТВЕРГ');5: writeln('ПЯТНИЦА');6: writeln('СУББОТА');0: writeln('ВОСКРЕСЕНЬЕ');end;end.

В предложенной записи оператора варианта отсутствует ветвь else. Это объясняется тем, что переменная R может принимать толь-ко одно из указанных значений, т.е. 1, 2, 3, 4, 5, 6 или 0.

ЗАДАЧА 3.8. По заданному номеру месяца m вывести на печать название времени года.

Для решения данной задачи необходимо проверить выполнение четырех условий. Если заданное число m равно 12, 1 или 2, то это зима, если m попадает в диапазон от 3 до 5, то – весна, лето определя-ется принадлежностью числа m диапазону от 6 до 8 и, соответственно, при равенстве переменной m 9, 10 или 11 – это осень. Понятно, что область возможных значений переменной m находится в диапазоне от 1 до 12 и если пользователь введет число, не входящее в этот интер-вал, то появится сообщение об ошибке. Для этого в операторе case программы предусмотрена альтернативная ветка else.

Var m:byte;beginwrite('Введите номер месяца m='); readln(m);{Проверка допустимых значений переменной m.}case m of

{В зависимости от значения m на печать}{выводится название времени года.}12,1,2: writeln('ЗИМА');3..5: writeln('ВЕСНА');6..8: writeln('ЛЕТО');9..11: writeln('ОСЕНЬ')

Page 26: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 121

{Если значение переменной m выходит за пределы области допустимых значений, то выдается сообщение об ошибке.}

else writeln('ОШИБКА ПРИ ВВОДЕ!!!');

endend. 3.5 Обработка ошибок. Вывод сообщений в среде

LazarusПонятно, что чем меньше в программе ошибок, тем она лучше. В

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

Если пользователь допустил ошибку, например, при вводе дан-ных, его необходимо проинформировать об этом. Для этого можно воспользоваться функцией MessageDlg, которая выводит сообще-ние в отдельном окне. В общем виде функцию записывают так:MessageDlg(сообщение, тип_сообщения,

[список_кнопок], справка);где

• сообщение – текст, который будет отображен в окне сообще-ния;

• тип_ сообщения – определяет внешний вид окна (табл. 3.2);• список_кнопок – константы (перечисляются через запятую),

определяющие тип кнопок окна сообщения (табл. 3.3);• справка – номер окна справочной системы, которое будет вы-

ведено на экран, если нажать F1, параметр равен нулю, если ис-пользование справки не предусмотрено.

Таблица. 3.2. Тип окна сообщения.Параметр Тип окна сообщения

mtInformation информационноеmtWarning предупредительноеmtError сообщение об ошибкеmtConfirmation запрос на подтверждениеmtCustom обычное

Page 27: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 122

Таблица. 3.3. Тип кнопки в окне сообщения.Константа Кнопка в окне сообщения

mbYes ДаmbNo НетmbOk ОкmbCancel ОтменаmbAbort ПрерватьmbRetry ПовторитьmbIgnore ПропуститьmbHelp Помощь

Вернемся к задаче решения квадратного уравнения (задача 3.3). Нами был рассмотрен алгоритм решения этой задачи и написана про-грамма на языке программирования Free Pascal. Реализуем эту задачу в среде Lazarus. Создадим новый проект41 (рис. 3.20).

Рисунок 3.20: Форма для ре-шения квадратного уравнения

Для организации ввода коэф-фициентов уравнения внедрим на форму четыре объекта типа над-пись (Label1, Label2, Label3, Label4) и три поля ввода (Edit1, Edit2, Edit3). Корни уравнения или сообщение об их отсутствии будем выводить в надпись Label542.

Все действия по вычислению корней квадратного уравнения бу-дут выполняться при нажатии кнопки Button1.

При вводе данных в программе могут возникнуть следующие ошибки:

•в поле ввода оказалась строка, которую невозможно преобразо-вать в число;

•значение коэффициента a равно нулю43.Для того чтобы не допустить подобных ошибок необходимо

контролировать данные, вводимые пользователем. Применим для этой цели встроенную процедуру Val(S,X,Kod), которая преоб-разовывает строку S в целое или вещественное число X. Если преоб-

41 Подробно о создании проекта см. в первой главе.42 На этапе конструирования формы Label5.Visible:=false.43 В этом случае при вычислении корней произойдет деление на ноль.

Page 28: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 123

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

procedure TForm1.Button1Click(Sender: TObject);var a,b,c,d,x1,x2: real;kod1,kod2,kod3:integer;begin //Ввод значений коэффициентов уравнения.//Из поля ввода Edit1 считывается строка //символов и преобразовывается в вещественное//число, если преобразование прошло успешно, //то kod1=0 и полученное число записывается //в переменную a.val(Edit1.Text,a,kod1);val(Edit2.Text,b,kod2);val(Edit3.Text,c,kod3);//Если преобразования прошли успешно, тоif (kod1=0) and (kod2=0) and (kod3=0) then

//проверить чему равен первый коэффициент.//Если значение первого коэффициента //равно нулю, тоif a=0 then

//выдать соответствующее сообщение.MessageDlg('Введите не нулевое значение а', mtInformation,[mbOk],0)

else //иначе перейти к решению уравненияbegin

d:=b*b-4*a*c;Label5.Visible:=true;if d<0 then

Label5.Caption:='В уравнении'+chr(13)+'нет действительных корней'

elsebegin

Page 29: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 124

x1:=(-b+sqrt(d))/2/a;x2:=(-b-sqrt(d))/(2*a);

Label5.Caption:='X1='+FloatToStr(x1)+chr(13)+'X2='+FloatToStr(x2);

end;end

else //Преобразование не выполнено, //выдать сообщение.

MessageDlg('Введите числовое значение',mtInformation,[mbOk],0);

end;Результаты работы программы показаны на рис. 3.21 - 3.24.

Рисунок 3.21: Обработка ошибки ввода данных — коэффи-

циент a равен 0

Рисунок 3.22: Обработка ошибки ввода данных - в поле ввода строка, которую невоз-можно преобразовать в число

(коэффициент равен символу B)

Рисунок 3.23: Решение квад-ратного уравнения 3x2+4x+5=0

(корней нет) Рисунок 3.24: Вычисление

корней квадратного уравнения

Page 30: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 125

Метод обработки ошибок ввода, изложенный в этом примере, не единственный. Можно попытаться контролировать символы, поступа-ющие в поля ввода. Набор символов, которые могут быть преобразо-ваны в число, невелик. Это все цифры от 0 до 9, знак минус и символ запятой. Кроме того, пользователь должен иметь возможность удалять символы из поля ввода. Для этого ему понадобится клавиша BackSpace (#8 – символ с кодом восемь). Представим набор пере-численных символов в виде множества, и если окажется, что введен-ный символ не принадлежит ему, то будем выводить сообщение об ошибке при вводе.

Возможность контролировать ввод символов обеспечивает собы-тие OnKeyPress. Если выделить компонент Edit2 и на вкладке инспектора объектов дважды щелкнуть возле события нажатия клави-ши OnKeyPress, то будет создана процедура обработки этого собы-тия. Текст процедуры с комментариями:

//Обработка события ввод символа в поле Edit2.procedure TForm1.Edit2KeyPress(Sender: TObject;

var Key: Char);begin //Если символ не принадлежит //множеству допустимых символов,тоif not(Key in [#8,',','-','0'..'9']) thenbegin //выдать сообщение и

MessageDlg('Введите числовое значение',mtInformation,[mbOk],0);

Abort; //прервать выполнение подпрограммы.end; end; 3.6 Операторы циклаЦиклический процесс, или просто цикл, – это повторение одних и

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

итерацией понимают повторение какой-либо математической операции, использующее результат предыдущей аналогичной операции. В программировании итерация — это организация обработки данных, при котором действия повторяются многократно, не приводя при этом к вызовам самих себя (http://ru.wikipedia.org/wiki/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F).

Page 31: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 126

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

В языке Free Pascal для удобства программиста предусмотрены три оператора, реализующих циклический процесс: while, repeat…until и for.

3.6.1 Оператор цикла с предусловием while .. doНа рис. 3.25 изображена блок-схема алгоритма цикла с предусло-

вием. Оператор, реализующий этот алгоритм в языке Free Pascal, име-ет вид:

while выражение do оператор;здесь while .. do – зарезервированные слова языка Free Pascal, выражение – логическая константа, переменная или логическое вы-ражение, оператор – любой допустимый оператор языка.

Работает оператор while следующим образом. Вычисляется зна-чение выражения. Если оно истинно (True), выполняется опера-тор. В противном случае цикл заканчивается, и управление передает-ся оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выраже-ние ложно (False), цикл не выполнится ни разу.

Рисунок 3.25: Алго-ритм циклической

структуры с предусло-вием

Если в цикле надо выполнить более од-ного оператора, необходимо использовать составной оператор:

while условие dobegin

оператор_1;оператор_2;…оператор_n;

end;

Рассмотрим пример. Пусть необходимо вывести на экран значения функции

y=esin x cos x на отрезке [0;π] с шагом 0.1. Применим цикл с предусловием:

Page 32: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 127

var x,y:real;begin{Присваивание параметру цикла стартового значения.}x:=0;{Цикл с предусловием.}while x<=pi do {Пока параметр цикла

не превышает конечное значение,выполнять тело цикла.}

begin{Вычислить значение y.}y:=exp(sin(x))*cos(x);{Вывод на экран пары х и y.}writeln('x=', x,' y=', y);{Изменение параметра цикла - переход к следующему значению x.}x:=x+0.1;

end; {Конец цикла.}end.В результате работы данного фрагмента программы на экран по-

следовательно будут выводиться сообщения со значениями перемен-ных x и y:

x= 0; y=1x= 0.1; y=1.0995…x= 3.1; y=-1.0415 3.6.2 Оператор цикла с постусловием repeat … untilЕсли в цикле с предусловием проверка условия осуществляется

до тела цикла, то в цикле с постусловием условие проверяется после тела цикла (см. рис. 3.26). Сначала выполняются операторы, являю-щиеся телом цикла, после чего проверяется условие, если последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если условие станет истинным.

В языке Free Pascal цикл с постусловием реализован конструкци-ей

repeatоператор;until выражение;

Page 33: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 128

здесь repeat .. until – зарезервированные слова языка Free Pascal, выражение – логическая константа, переменная или логиче-ское выражение, оператор – любой допустимый оператор языка.

Рисунок 3.26: Алгоритм цикла с постусловием

Если тело цикла состоит более чем из одного оператора, то цикл с постусловием имеет вид:

repeatоператор_1;оператор_2;.............оператор_N;until выражение;

Работает цикл следующим образом. В начале выполняется опе-ратор, представляющий собой тело цикла. Затем вычисляется значе-ние выражения. Если оно ложно (False), оператор тела цикла выполняется еще раз. В противном случае цикл завершается, и управ-ление передается оператору, следующему за циклом.

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

Если применить цикл с постусловием для создания подпрограм-мы, которая выводит значения функции y=esin x cos x на отрезке [0;π] с шагом 0.1, получим:

var x,y:real;begin{Присваивание параметру цикла стартового значения.}x:=0;{Цикл с постусловием.}repeat {Начало цикла}

y:=exp(sin(x))*cos(x);writeln('x=',x,' y=',y);x:=x+0.1; {Изменение параметра цикла.}

until x>pi; {Закончить работу цикла,

Page 34: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 129

когда параметр превысит конечное значение.}end.

3.6.3 Оператор цикла for … doОператоры цикла с условием обладают значительной гибкостью,

но не слишком удобны для организации «строгих» циклов, которые должны быть выполнены заданное число раз. Оператор цикла for … do используется именно в таких случаях:

for i:= in to ik do оператор;for i:= ik downto in do оператор;

где оператор – любой оператор языка, i, in и ik — переменная целочисленного или перечислимого типов.

Переменную i называют параметром цикла. Переменные in и ik — диапазон изменения параметра цикла: in — начальное значе-ние, а ik — конечное значение параметра цикла.

Шаг изменения цикла for всегда постоянен и равен интервалу между двумя ближайшими значениями типа параметра цикла (при це-лочисленном значении параметра цикла шаг равен 1).

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

for i:= in to ik do begin

оператор_1;оператор_2;...........оператор_n;

end;Опишем (рис.3.27) алгоритм работы цикла for … do:1. Параметру цикла i присваивается начальное значение in.2. Если значение параметра цикла превосходит конечное зна-

чение (i>ik), то цикл завершает свою работу. В противном случае выполняется пункт 3.

3. Выполняется оператор.4. Значение параметра цикла i изменяется на соответствую-

щий шаг и осуществляется переход к п.2 и т. д.Понятно, что этот алгоритм представляет собой цикл с предусло-

вием.

Page 35: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 130

Рисунок 3.27: Алгоритм работы цикла for...do

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

Рисунок 3.28: Представление цикла for...do с по-мощью блок-схемы

Фрагмент подпрограммы, приведенный далее, демонстрирует применение цикла for:

var i:integer; c:char;begin

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

Page 36: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 131

{Вывод на экран чисел от 1 до 10.}for i:=1 to 10 do writeln(i);{Вывод на экран чисел от 10 до -10.}for i:=10 downto -10 do writeln(i);{Вывод на экран символов от a до r.}for c:='a' to 'r' do writeln(c);

end;Вернемся к задаче вывода значений функции y=esin x cos x на

отрезке [0;π] с шагом 0.1. Как видим, здесь количество повторений цикла явно не задано. Однако это значение, можно легко вычислить. Предположим, что параметр цикла х принимает значения в диапазоне от xn до xk, изменяясь с шагом dх, тогда количество повторений тела цикла можно определить по формуле:

n= xk−xndx

1 , (3.6)

округлив результат деления до целого числа. Следовательно, фраг-мент программы вывода значений функции y=esin x cos x на от-резке [0;π] с шагом 0.1 будет иметь вид:

var i,n:integer; x,y:real;begin{Количество повторений цикла:}{n=(xk-xn)/dx+1; xk=pi, xn=0, dx=0.1}n:=round((pi-0)/0.1)+1;x:=0; {Начальное значение аргумента.}{Цикл с известным числом повторений,}{i – параметр цикла, изменяется от 1 до n с шагом 1.}for i:=1 to n dobegin {Начало цикла.}

{Вычисление значения функции }y:=exp(sin(x))*cos(x);{для соответствующего значения аргумента.}writeln('x=',x,' y=',y);x:=x+0.1; {Вычисление нового

значения аргумента.}end; {Конец цикла.}end.

Page 37: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 132

3.7 Операторы передачи управленияОператоры передачи управления принудительно изменяют поря-

док выполнения команд. В языке Free Pascal таких операторов пять: goto, break, continue, exit и halt.

Оператор goto метка, где метка обычный идентификатор, применяют для безусловного перехода, он передает управление опе-ратору с меткой:

метка: оператор;46.Операторы break и continue используют только внутри цик-

лов. Так, оператор break осуществляет немедленный выход из цик-лов repeat, while, for и управление передается оператору, нахо-дящемуся непосредственно за циклом. Оператор continue начинает новую итерацию цикла, даже если предыдущая не была завершена.

Оператор exit осуществляет выход из подпрограммы.Оператор halt прекращает выполнение программы.

3.8 Решение задач с использованием цикловРассмотрим использование циклических операторов на конкрет-

ных примерах.ЗАДАЧА 3.9. Найти наибольший общий делитель (НОД) двух на-

туральных чисел А и В.Входные данные: А и В. Выходные данные: А – НОД.Для решения поставленной задачи воспользуемся алгоритмом Ев-

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

Таблица 3.4. Поиск НОД для чисел А=25 и В=15.Исходные

данныеПервый

шагВторой

шагТретий

шагЗначение

НОДдля А и В равно 5

А=25 А=10 А=10 А=5В=15 В=15 В=5 В=5

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

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

Page 38: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 133

есть тело цикла повторяется до тех пор, пока А не равно В. Следова-тельно, при создании программы воспользуемся циклом while … do.

Рисунок 3.29: Алгоритм поиска наибольшего общего делителя двух

чиселПрограмма на языке Free Pascal, реализующая задачу 3.9:var a,b:word;beginwriteln('введите два натуральных числа');write('A='); readln(A);write('B='); readln(B);{Если числа не равны, выполнять тело цикла.}while a<>b do{Если число А больше, чем В, то уменьшить его значение на В,}if a>b then

a:=a-b{иначе уменьшить значение числа В на А.}else

b:=b-a;writeln('НОД=',A);end.

Page 39: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 134

ЗАДАЧА 3.10. Вычислить факториал числа N (N!=1⋅2⋅3 …⋅N).

Рисунок 3.30: Алгоритм вычисления факториала

Входные данные: N – целое число, факториал которого необходимо вычис-лить.

Выходные данные: factorial – значение факториала числа N, произведе-ние чисел от 1 до N, целое число.

Промежуточные переменные: i – па-раметр цикла, целочисленная перемен-ная, последовательно принимающая зна-чения 2, 3, 4 и так далее до N. Блок-схема приведена на рис. 3.30.

Итак, вводится число N. Переменной factorial, предназначенной для хране-ния значения произведения последова-тельности чисел, присваивается началь-ное значение, равное единице. Затем ор-ганизуется цикл, параметром которого выступает переменная i.

Если значение параметра цикла меньше или равно N, то выполня-ется оператор тела цикла, в котором из участка памяти с именем factorial считывается предыдущее значение произведения, умно-жается на текущее значение параметра цикла, а результат снова поме-щается в участок памяти с именем factorial.

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

Теперь рассмотрим текст программы вычисления факториала на языке Free Pascal.

Var factorial, n, i:integer;begin

write('n='); readln(n);factorial:=1; for i:=2 to n do

factorial:=factorial*i;writeln(factorial);

end.

Page 40: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 135

ЗАДАЧА 3.11. Вычислить an , где n – целое положительное число.

Рисунок 3.31: Ал-горитм возведения ве-

щественного числа в целую степень

Входные данные: a – вещественное число, которое необходимо возвести в целую поло-жительную степень n. Выходные данные: p (вещественное число) – результат возведе-ния вещественного числа a в целую поло-жительную степень n. Промежуточные данные: i – целочисленная переменная, принимающая значения от 1 до n с шагом 1, параметр цикла.

Блок-схема приведена на рис. 3.31.Известно, что для того чтобы получить

целую степень n числа a, нужно умножить его само на себя n раз. Результат этого умножения будет храниться в участке памя-ти с именем p. При выполнении очередного цикла из этого участка предыдущее значе-ние будет считываться, умножаться на осно-вание степени a и снова записываться в уча-сток памяти p. Цикл выполняется n раз.

В таблице 3.5 отображен протокол выполнения алгоритма при возведении числа 2 в пятую степень: a=2, n=5.

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

Таблица 3.5. Процесс возведения числа a в степень ni 1 2 3 4 5P 1 2 4 8 16 32

Далее приведен текст программы, составленной для решения по-ставленной задачи.

Var a,p:real; i,n:word;begin

write('Введите основание степени a=');readln(a);write('Введите показатель степени n=');readln(n);p:=1;

Page 41: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 136

for i:=1 to n do p:=p*a;writeln('P=',P:1:3);

end.ЗАДАЧА 3.12. Вычислить сумму натуральных четных чисел, не

превышающих N.Входные данные: N – целое число.Выходные данные: S – сумма четных чисел.Промежуточные переменные: i – параметр цикла, принимает

значения 2, 4, 6, 8 и так далее, также имеет целочисленное значение.При сложении нескольких чисел необходимо накапливать ре-

зультат в определенном участке памяти, каждый раз считывая из этого участка предыдущее значение суммы и прибавляя к нему следующее слагаемое. Для выполнения первого оператора накапливания суммы из участка памяти необходимо взять такое число, которое не влияло бы на результат сложения. Перед началом цикла переменной, предна-значенной для накапливания суммы, необходимо присвоить значение нуль (s=0).

Блок-схема решения этой задачи представлена на рис. 3.32.Так как параметр цикла i изменяется с шагом 2, в блок–схеме, построен-ной для решения данной задачи, использован цикл с предусловием, который реализуется при составлении программы с помощью опера-тора while … do:

var n,i,S:word;begin

write('n=');readln(n);S:=0; i:=2;while i<=n dobegin

S:=S+i;i:=i+2;

end;writeln('S=',S);

end.

Page 42: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 137

Рисунок 3.32: Алгоритм вы-числения суммы четных на-

туральных чиселЭту же задачу можно решить иначе, используя цикл for … do:

var n,i,S:word;

beginwrite('n='); readln(n);

Page 43: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 138

S:=0;for i:=1 to n do{Если остаток от деления параметра цикла на 2 равен 0, то это число четное, значит, происходит накапливание суммы.}if i mod 2 = 0 then

S:=S+i;writeln('S=',S);

end.В таблице 3.6 приведены результаты тестирования программы

для n=7. Таблица 3.6. Суммирование четных чиселi 1 2 3 4 5 6 7S 0 0 2 2 6 6 12 12

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

ЗАДАЧА 3.13. Дано натуральное число N. Определить К – коли-чество делителей этого числа, не превышающих его (Например, для N=12 делители 1, 2, 3, 4, 6. Количество K=5).

Входные данные: N – целое число.Выходные данные: целое число K – количество делителей N.Промежуточные переменные: i – параметр цикла, возможные

делители числа N.В блок-схеме, изображенной на рис. 3.33, реализован следующий

алгоритм: в переменную K, предназначенную для подсчета количе-ства делителей заданного числа, помещается значение, которое не влияло бы на результат(k=0).

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

Параметр цикла меняется от 1 до N/2 c шагом 1. Если заданное число делится нацело на параметр цикла, это означает, что i является делителем N, и значение переменной K следует увеличить на единицу. Цикл необходимо повторить N/2 раз.

Текст программы, соответствующий описанному алгоритму, при-веден далее.

Page 44: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 139

Рисунок 3.33: Алгоритм подсчета делителей нату-

рального числа

var N,i,K:word;beginwrite('N=');readln(N);K:=0;for i:=1 to N div 2 do{Если N делится нацело на i, то}if N mod i= 0 then{увеличить счетчик на один.}k:=k+1;writeln(' K=',K);end.

В таблице 3.7 отображены результаты тестирования алгоритма при определении делителей числа N=12.

Таблица 3.7. Определение количества делителей числа Ni 1 2 3 4 5 6K 0 1 2 3 4 4 5

ЗАДАЧА 3.14. Дано натуральное число N. Определить, является ли оно простым. Натуральное число N называется простым, если оно делится нацело без остатка только на единицу и N. Число 13 – про-стое, так как делится только на 1 и 13, N=12 не является простым, так как делится на 1, 2, 3, 4, 6 и 12.

Входные данные: N – целое число.Выходные данные: сообщение.Промежуточные данные: i – параметр цикла, возможные дели-

тели числа N.Алгоритм решения этой задачи (рис. 3.34) заключается в том, что

необходимо определить, есть ли у числа N делители среди чисел от 2 до N/2. Если делителей нет — число простое.

Page 45: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 140

Рисунок 3.34: Алгоритм определения проситого числа

Предположим, что число N является простым (pr:=true). Организуем цикл, в котором пере-менная i будет изменяться от 2 до N/2.

В цикле будем проверять, де-лится ли N на i. Если делится, то мы нашли делитель, N не является простым (Pr:=false). Проверка остальных делителей не имеет смысла, поэтому покидаем цикл. В алгоритме предусмотрено два выхода из цикла. Первый – есте-ственный, при исчерпании всех значений параметра, а второй — досрочный. После выхода из цикла надо про-верить значение Pr. Если Pr=true, то число N — простое, иначе N не является простым чис-лом. При составлении программы на языке Free Pascal досрочный выход из цикла удобно выполнять при помощи оператора break.

Текст программы:var N,i:integer; Pr:boolean;begin

write('N='); readln(N);Pr:=true; {Предположим, что число простое.}for i:=2 to N div 2 do{Если найдется хотя бы один делитель, то}if N mod i = 0 thenbegin

Pr:=false; {число простым не является}break; {досрочный выход из цикла.}

Page 46: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 141

end;{Проверка значения логического параметра и}if Pr then{вывод на печать соответствующего сообщения.}

writeln('Число ',N,' - простое')else

writeln('Число ',N,' простым не является');end.

ЗАДАЧА 3.15. Определить количество простых чисел в интерва-ле от N до M, где N и M – натуральные числа, причем N ≤ M.

Алгоритм решения данной задачи представлен на рис. 3.35.

Рисунок 3.35: Алгоритм определения про-стых чисел в заданном интервале

Page 47: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 142

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

Далее для каждого числа из указанного интервала (параметр i принимает значения от N до M) происходит проверка. Если число яв-ляется простым, то количество простых чисел k увеличивается на единицу. Подробно определение простого числа описано в задаче 3.14.

Программа на языке Free Pascal, реализующая алгоритм подсчета количества простых чисел в заданном диапазоне:

var N,M,i,j,k: longint; Pr:boolean;beginrepeat

write('N='); readln(N);write('M='); readln(M);

until (N>0) and (M>0) and (N<M);k:=0; {Количество простых чисел}{Параметр i принимает значения от N до M}for i:=N to M do begin

{Определение простого числа.}Pr:=true;for j:=2 to i div 2 do

if i mod j = 0 thenbegin

Pr:=false; reak;

end;{Если число простое, увеличиваем количество на 1.}if Pr then k:=k+1;

end;if k=0 then writeln('Простых чисел нет')else writeln('Простых чисел в диапазоне ',k);end.

Page 48: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 143

ЗАДАЧА 3.16. Дано натуральное число N. Определить количе-ство цифр в числе.

Входные данные: N – целое число.Выходные данные: kol – количество цифр в числе.Промежуточные данные: M – переменная для временного хране-

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

определить, сколько раз заданное число можно разделить на десять нацело. Например, пусть N=12345, тогда количество цифр kol = 5. Результаты вычислений сведены в таблицу 3.8.

Таблица 3.8. Определение количества цифр числаkol N

1 123452 12345 div10=12343 1234 div 10=1234 123 div 10=125 12 div 10=1

1 div 10=0Алгоритм определения количества цифр в числе представлен на

рис. 3.36.Текст программы, реализующей задачу, можно записать так:var M,N:longint; kol:word;begin{Так как речь идет о натуральных числах, при вводе предусмотрена проверка. Закончить цикл, если вве-дено положительное число, иначе повторить ввод.}repeat

write('N=');readln(N);until N>0;M:=N; {Сохранить значение переменной N. }kol:=1; {Пусть число состоит из одной цифры.}while M div 10 > 0 do{Выполнять тело цикла, пока число делится на 10.}begin

kol:=kol+1; {Счетчик количества цифр.}M:=M div 10; {Изменение числа.}

end;writeln('kol=', kol); end.

Page 49: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 144

Рисунок 3.36: Алго-ритм определения количе-

ства цифр в числе

ЗАДАЧА 3.17. Дано натуральное число N. Определить, содержит ли это число нули и в каких разрядах они расположены (например, число 1101111011 содержит ноль в третьем и восьмом разрядах).

Входные данные: N – целое число. Выходные данные: pos – пози-ция цифры в числе. Промежуточные данные: i – параметр цикла, M – переменная для временного хранения значения N.

В связи с тем что разряды в числе выделяются начиная с послед-него, то для определения номера разряда в числе, необходимо знать количество цифр в числе47. Таким образом, на первом этапе решения задачи необходимо определить kol – количество цифр в числе. Затем начинаем выделять из числа цифры, если очередная цифра равна нулю, вывести на экран номер разряда, который занимает эта цифра. Процесс определения текущей цифры числа N=12345 представлен в таблице 3.9.

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

Page 50: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 145

Таблица 3.9. Определение текущей цифры числаi Число М Цифра Номер позиции1 120405 120405 mod 10= 5 62 12040 div10=1204 12040 mod 10 = 0 53 1204 div 10=120 1204 mod 10 = 4 44 120 div 10=12 120 mod 10 = 0 35 12 div 10=1 12 mod 10 = 2 26 1 div = 0 1 div 10 = 1 1

Блок-схема алгоритма решения данной задачи показана на рис. 3.37.

Текст программы, реализующей данный алгоритм:var M,N:longint; i,pos,kol:word;begin{Так как речь идет о натуральных числах,}{при вводе предусмотрена проверка.}{Закончить цикл, если введено}{положительное число, иначе повторить ввод}repeat

write('N=');readln(N);

until N>0;//Определение kol - количества разрядов.M:=N; {Сохранить значение переменной N. }kol:=1; {Пусть число состоит из одной цифры.}while M div 10 > 0 do{Выполнять тело цикла,}{пока число делится нацело на 10.}begin

kol:=kol+1; {Счетчик количества цифр.}M:=M div 10; {Изменение числа.}

end;writeln('kol=', kol);M:=N;pos:=0; {Пусть в числе нет нулей.}

Page 51: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 146

Рисунок 3.37: Алгоритм решения задачи 3.17

Page 52: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 147

for i:=1 to kol dobegin{Выделение цифры из числа и сравнение ее с 0.}

if (M mod 10 = 0) thenbegin

pos:=kol-i+1; {Позиция нуля в числе.}writeln('Ноль в ', pos, '-м разряде.');

end;M:=M div 10; {Изменение числа.}

end;if pos=0 then

writeln('Число не содержит цифру 0.');end. 3.9 Ввод данных из диалогового окна в среде LazarusОкно ввода – это стандартное диалоговое окно, которое появляет-

ся на экране в результате вызова функции InputBox. В общем виде оператор ввода данных с использованием этой функции записывают так:имя:=InputBox(заголовок_окна,подсказка,значение);

где•заголовок_окна – строка, определяющая название окна;•подсказка – текст поясняющего сообщения;•значение – строка, которая будет находиться в поле ввода при

появлении окна на экране;•имя — переменная строкового типа, которой будет присвоено

значение из поля ввода;После выполнения фрагмента программыvar S:string;beginS:=InputBox('ЗАГОЛОВОК ОКНА','Подсказка: введите исходные данные',

'Данное значение');end;

появится окно, представленное на рис. 3.38. У пользователя есть воз-можность изменять текст в поле ввода. Щелчок по кнопке ОК приве-

Page 53: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 148

Рисунок 3.38: Окно ввода

дет к тому, что в переменную, ука-занную слева от оператора присваи-вания, будет занесена строка, нахо-дящаяся в поле ввода. В данном слу-чае в переменную S будет записана строка 'Данное значение'. Щелчок по кнопке Cancel закроет окно ввода.

Учитывая, что функция InputBox возвращает строковое значе-ние, при вводе числовых данных применяют функции преобразования типов:

var S:string; gradus,radian:real;beginS:=InputBox('Ввод данных','Введите величину угла в радианах','0,000');gradus:=StrToFloat(S);radian:=gradus*pi/180;MessageDlg('Величина угла в градусах'+FloatToStr(radian),MtInformation,[mbOk],0);end;Можно применять диалоговое окно при решении задач, обрабаты-

вающих некоторые числовые последовательности. Рассмотрим несколько таких задач.

ЗАДАЧА 3.18. Поступает последовательность из N веществен-ных чисел. Определить наибольший элемент последовательности.

Входные данные: N – целое число; Х – вещественное число, опре-деляет текущий элемент последовательности.

Выходные данные: Max – вещественное число, элемент последо-вательности с наибольшим значением.

Промежуточные переменные: i – параметр цикла, номер вводи-мого элемента последовательности.

Алгоритм поиска наибольшего элемента в последовательности следующий (рис. 3.39). В памяти компьютера отводится ячейка, например с именем Max, в которой будет храниться наибольший эле-мент последовательности – максимум.

Page 54: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 149

Рисунок 3.39: Алгоритм по-иска наибольшего числа в после-

довательности

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

Разместим на форме объект типа надпись Label1 и кнопку Button1 (рис. 3.40).

Щелчок по кнопке приведет к выполнению приведенной далее процедуры. procedure Tform1.Button1Click( Sender: TObject);var i,N:integer; max,X:real; S:string;begin//Ввод количества элементов //последовательности.S:=InputBox('Ввод',48 Для поиска наименьшего элемента последовательности (минимума) предполагают, что первый

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

Page 55: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 150

'Введите количество элементов в последовательно-сти.','0');N:=StrToFloat(S);//Ввод первого элемента последовательности.

S:=InputBox('Ввод элементов последовательности','Введите число.','0');

X:=StrToFloat(S);//Предположим, что 1-й элемент максимальный.max:=X;//Параметр цикла принимает стартовое //значение i=2, т.к. первый элемент уже введен.for i:=2 to N dobegin//Ввод следующих элементов последовательности.

S:=InputBox('Ввод элементов последовательности','Введите число.','0');X:=StrToInt(S);//Если найдется элемент превышающий //максимум, записать его в ячейку Max – //теперь он предполагаемый максимум.if X>max then max:=X;

end;//Вывод наибольшего элемента.MessageDlg('Значение наибольшего элемента - '+FloatToStr(max),MtInformation,[mbOk],0);end;Результаты работы программы представлены на рис. 3.40 - 3.42.

Рисунок 3.40: Второе окно диа-лога к задаче 3.18

Page 56: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 151

Рисунок 3.41: Третье окно диа-лога к задаче 3.18

Рисунок 3.42: Результат рабо-ты программы к задаче 3.18

ЗАДАЧА 3.19. Вводится последовательность целых чисел, 0 – ко-нец последовательности. Найти наименьшее число среди положи-тельных, если таких значений несколько49, определить, сколько их.

Блок-схема решения задачи приведена на рис. 3.43.Далее приведен текст подпрограммы с подробными комментария-

ми50. Подпрограмма выполняется при обращении к кнопке Button1, предварительно размещенной на форме.

procedure TForm1.Button1Click(Sender: TObject);var

N,k,min:integer;S:string;

begin//Ввод первого элемента последовательности.S:=InputBox('Ввод элементов последовательно-

сти', 'введите число. 0 – конец последовательно-сти','0');

N:=StrToInt(S);

49 Предположим, вводится последовательность чисел 11, -3, 5, 12, -7, 5, 8,-9, 7, -6, 10, 5,0.Наимень-шим положительным числом является 5. Таких минимумов в последовательности 3.

50 Алгоритм поиска максимального (минимального) элемента последовательности подробно описан в задаче 3.18.

Page 57: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 152

Рисунок 3.43: Алгоритм поиска минимального по-ложительного числа в последовательности

//Предположим, что положительных чисел//нет – K=0. В переменной K будет храниться //кол-во минимумов среди положительных чисел.k:=0;

Page 58: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 153

//Пока введенное число не равно нулю, //выполнять тело цикла.while N<>0 dobegin//Является ли введенное число положительным?

if N>0 thenbegin

//Если N>0 и K=0, поступил 1-й //положительный элемент, предположим, //что он минимальный Min=N, соответственно//количество минимумов равно 1.

if k=0 thenbegin

k:=1;min:=N;

end//Если элемент не первый, сравниваем//его с предполагаемым минимумом, если//элемент меньше, записываем его в Min.//Соответственно количество //минимумов равно 1.else if N<min then

beginmin:=N;k:=1;

end//Если элемент равен минимуму, //увеличиваем количество минимальных//элементов на 1.else if N=min then k:=k+1;

end;//Ввод следующего элемента.S:=InputBox('Ввод элементов последователь-

ности', 'введите число. 0 – конец последовательно-сти','0');

N:=StrToInt(S);end; //конец циклаif k<>0 then

Page 59: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 154

//Если значение счетчика не равно нулю, //выводим значение минимального элемента и //количество таких элементов,MessageDlg('MIN = '+IntToStr(min)+' K='+IntToStr(k),MtInformation,[mbOk],0)

else //в противном случае сообщаем, //что положительных чисел нет.MessageDlg('Положительных чисел нет',

MtInformation,[mbOk],0);end;ЗАДАЧА 3.20. Определить, сколько раз последовательность из N

произвольных чисел меняет знак.Чтобы решить задачу, нужно попарно перемножать элементы по-

следовательности. Если результат произведения пары чисел – отрица-тельное число, значит, эти числа имеют разные знаки.

Пусть k — количество смен знака последовательности равно 0. Пусть в переменной А храниться текущий элемент последовательно-сти, а в переменой В – предыдущий. Введем N — количество элемен-тов последовательности. Организуем цикл (переменная i меняется от 1 до N). В цикле будем делать следующее: вводим очередной элемент последовательности (A), если это первый элемент последовательно-сти (i=1), то сравнивать его не с чем, и просто переписываем пере-менную A в переменную B (B:=A). Если это не первый элемент по-следовательности (i≠1), то проверяем знак произведения A⋅B (те-кущего и предыдущего элементов последовательности). Если произ-ведение <0, то счетчик k увеличиваем на 1. После чего не забываем в переменную B записать A.

Блок-схема алгоритма приведена на рис. 3.44.Разметим на форме два объекта типа надпись Label1 и Label2,

объект поле ввода Edit1 и кнопку Button1 (рис. 3.45). Текст под-программы, которая будет выполнена при обращении к кнопке, приве-ден далее.

procedure TForm1.Button1Click(Sender: TObject);var

N,A,B,i,k:integer; S:string;

Page 60: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 155

Рисунок 3.44: Алгоритм к задаче 3.20beginN:=StrToInt(Edit1.Text);S:=InputBox('Ввод элементов последовательно-

сти', 'Введите число. 0 – конец последовательно-сти','0');

A:=StrToInt(S);k:=0;for i:=1 to N dobegin

S:=InputBox('Ввод элементов последователь-ности', 'введите число. 0 –конец последовательно-

Page 61: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 156

сти','0');A:=StrToInt(S);if (i<>1) thenif A*B<0 then

k:=k+1;B:=A;

end;MessageDlg('K = '+IntToStr(k),

MtInformation,[mbOk],0);end;Результаты работы программы представлены на рис. 3.46-3.47.

Рисунок 3.45: Первое окно диалога к задаче 3.19

Рисунок 3.46: Второе окно диалога к задаче 3.19

Рисунок 3.47: Результат

работы про-граммы к за-

даче 3.19

3.10 Задачи для самостоятельного решенияИзобразите блок-схему решения задачи и напишите программу.

3.10.1 Разветвляющийся процессДано вещественное число а. Для функции y=f(x), график которой

приведен ниже, вычислить f(а). Варианты заданий представлены на рис. 3.48 -3.55.

Page 62: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 157

Рисунок 3.48: Задание 1

Рисунок 3.49: Задание 2

Рисунок 3.50: Задание 3

Page 63: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 158

Рисунок 3.51: Задание 4

Рисунок 3.52: Задание 5

Рисунок 3.53: Задание 6

Page 64: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 159

Рисунок 3.54: Задание 7

Рисунок 3.55: Задание 8

Даны вещественные числа x и y. Определить принадлежит ли точ-ка с координатами (x; y) заштрихованной части плоскости. Варианты заданий представлены на рис. 3.56 - 3.63.

Рисунок 3.56: Задание 9 Рисунок 3.57: Задание 10

Page 65: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 160

Рисунок 3.58: Задание 11 Рисунок 3.59: Задание 12

Рисунок 3.60: Задание 13 Рисунок 3.61: Задание 14

Рисунок 3.62: Задание 15 Рисунок 3.63: Задание 16

Page 66: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 161

Решить следующие задачи:17. Задан круг с центром в точке О(x0, y0) и радиусом R0 и точка

А(x1, y1). Определить, находится ли точка внутри круга.18. Определить, пересекаются ли параболы у=аx2+bx+c и

у=dx2+mx+n. Если пересекаются, то найти точку пересечения.19. Определить, пересекаются ли линии у=аx3+bx2+сx+d и

у=kx3+mx2+nx+p. Если пересекаются, найти точку пересечения.20. Задана окружность с центром в точке О(x0, y0) и радиусом R0 ,

найти точки пересечения линии с осью абсцисс.21. Задана окружность с центром в точке О(x0, y0) и радиусом R0,

найти точки пересечения линии с осью ординат. 22. Определить, пересекаются ли линии у=bx2+сx+d и у=kx+m.

Если пересекаются, найти точки пересечения.23. Задана окружность с центром в точке O(0,0) и радиусом R0 и

прямая y=ax+b. Определить, пересекаются ли прямая и окружность. Если пересекаются, найти точку пересечения.

24. Найти точки пересечения линии у= аx2+bx+c с осью абсцисс.25. Определить, пересекаются ли линии у=аx4+bx3+сx2+dx+f и

у=bx3+mx2+dx+p. Если пересекаются, найти точку пересечения. 3.10.2 Циклический процесс1. Вычислить сумму натуральных нечетных чисел, не превышаю-

щих N.2. Вычислить произведение натуральных четных чисел, не превы-

шающих N.3. Вычислить количество натуральных чисел, кратных трем и не

превышающих N.4. Задано число n. Определить значение выражения:

P= n!

∑i=1

n

i .

5. Вводится последовательность ненулевых чисел, 0 – конец по-следовательности. Определить сумму положительных элементов по-следовательности.

6. Вводится последовательность ненулевых чисел, 0 – конец по-следовательности. Определить, сколько раз последовательность поме-няет знак.

Page 67: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 162

7. Вычислить сумму отрицательных элементов последовательно-сти из N произвольных чисел.

8. В последовательности из N произвольных чисел подсчитать ко-личество нулей.

9. Вводится последовательность ненулевых чисел, 0 – конец по-следовательности. Определить наибольшее число в последовательно-сти.

10. Дано натуральное число P. Определить все простые числа, не превосходящие P.

11. Определить, является ли число L совершенным. Совершенное число L равно сумме всех своих делителей, не превосходящих L. Например, 6=1+2+3 или 28=1+2+4+7+14. В основе решения задачи лежит алгоритм из задачи 3.13.

12. Вводится последовательность ненулевых чисел, 0 – конец по-следовательности. Определить среднее значение элементов последо-вательности.

13. Вводится последовательность из N произвольных чисел, найти наименьшее положительное число.

14. Вводится последовательность из N произвольных чисел, найти среднее значение положительных элементов последовательно-сти.

15. Вводится последовательность ненулевых чисел, 0 – конец по-следовательности. Подсчитать процент положительных и отрицатель-ных чисел.

16. Вводится последовательность из N произвольных чисел. Определить процент положительных, отрицательных и нулевых эле-ментов.

17. Вводится последовательность положительных целых чисел, 0 – конец последовательности. Определить количество совершенных чисел (см. вариант 11).

18. Вводится последовательность из N произвольных чисел. Вы-числить разность между наименьшим и наибольшим значениями по-следовательности.

19. Дано натуральное число P. Определить все совершенные чис-ла (см. вариант 11), не превосходящие P.

20. Вводится последовательность из N положительных целых чи-сел. Найти наименьшее число среди четных элементов последова-тельности.

Page 68: 3 Операторы управления - uCoz · 3.2 Оператор присваивания Оператор присваивания в языке Free Pascal состоит

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus 163

21. Вводится последовательность положительных целых чисел, 0 – конец последовательности. Определить, является ли эта последова-тельность знакочередующейся.

22. Задано число P. Если это число простое вычислить P!.23. Вводится последовательность из N произвольных чисел.

Найти наибольшее число в последовательности. Если таких чисел несколько, определить, сколько их.

24. Задано число P. Определить количество его четных и нечет-ных делителей.

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