Лекция 6. Управляющие конструкции. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лекция 6. Управляющие конструкции.



Управляющая конструкция if

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

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

Кто знаком с английским языком, уже ухватил суть этой конструкции. На русский язык это выражение можно перевести так:

если условие то оператор;

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

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

if условие then begin

Оператор 1;

Оператор 2;

...........

Оператор n;

end;

Операторы, заключенные в программные скобки begin.. end воспринимаются, как единый оператор. Иногда и этого бывает недостаточно. Что, если по логике программы требуется выполнить один оператор, если условие верно, и другой, если оно неверно? Тут приходит на помощь расширенная конструкция:

if условие then оператор 1

else оператор2;

Как видно из синтаксиса, если указанное условие истинно, то выполнится оператор 1. Иначе выполнится оператор 2. Еще одно правило, которое следует запомнить: перед словом else точка с запятой не ставится!

Конечно же, с помощью программных скобок можно расширить и эту конструкцию:

if условие then begin

Оператор 1;

.............

Оператор n;

End

Else begin

Оператор 1;

.............

Оператор n;

end;

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

if условие then

Begin

Оператор 1;

..............

Оператор n;

end;

То есть, слово begin пишется на отдельной строке. Другой стиль выглядит иначе:

if условие then begin

Оператор 1;

..............

Оператор n;

end;

Оба эти стиля являются классическими, какой из них применять – дело вкуса. На этой лекции будет использоваться второй стиль.

Однако и это еще не все. В предыдущем примере мы рассматривали только одно условие. Если оно верно, то выполнялся один оператор, а если нет – другой. А что, если по логике программы требуется проверить более, чем одно условие? И снова мы можем расширить эту конструкцию. Взгляните на синтаксис:

if условие 1 then оператор 1

else if условие 2 then оператор 2

else оператор 3;

Здесь, если условие 1 будет верно, конструкция выполняет оператор 1 и завершает работу. Если это условие неверно, проверяется условие 2. Если условие 2 верно, то выполняется оператор 2, и конструкция завершает работу. Если же оба условия неверны, выполняется оператор 3. Расширений else if в такую конструкцию можно вставлять сколько угодно.

Давайте теперь проанализируем часть кода из примера прошлой лекции.

If Perem2 = 0 then begin

Soobshenie;

Edit3.Text:= '0';

End

Else begin

Perem3:= Delenie(Perem1, Perem2);

Edit3.Text:= FloatToStr(Perem3);

end;

Вам уже должно быть понятно, что если Perem2 действительно равна 0, то выполнится первый блок кода. Иначе будет выполнен второй блок кода.

Пример 1.

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

Решение

Заштрихованная область представляет собой часть круга радиуса R, расположенного и первой четверти. Как известно, точки (х,у), лежащие внутри круга с центром и начале координат и радиусом R, удовлетворяют неравенству х2 + у2 <=R2. Кроме тогоч точки, лежащие в первой четверти координатной плоскости, должны удовлетворяй условиям: х>= 0 и у >= 0. Учитывая то, что точки, лежащие внутри заштрихованной области, должны одновременно удовлетворять всем трем условиям, соответствующее логическое выражение может быть записано следующим образом: (x*x+y*y<=R*R) and (х>=0) and (у>=0)

Программа

Program_1;

{$APPTYPE CONSOLE}

Uses

SynUtils;

Var

x,y,R:real;

Begin

writeln('Enter x,у,R');

readln(x,y,R);

if (x*x+y*y<=R*R) and (x>=0) and (y>=0)

then writeln(‘Yes’)

else writeln(‘No’);

Readln

End.

Результаты работы программы

Enter x,у,R

1 1 2

Yes

Самостоятельная работа.

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

Цикл for

Еще один мощный инструмент в Delphi – циклы. Эти циклы выполняют оператор или блок операторов заданное количество раз. Синтаксис цикла for следующий:

for счетчик:= нач_значение to кон_значение do оператор;

В расширенном варианте синтаксис такой:

for счетчик:= нач_значение to кон_значение do begin

оператор 1;

оператор 2;

..................

оператор n;

end;

Здесь:

счетчик – переменная любого целого типа;

нач_значение – начальное значение счетчика;

кон_значение – конечное значение счетчика.

В качестве счетчиков используют обычно целые переменные. Чтобы не тратить попусту оперативную память, счетчикам назначают тип Byte или Word, в зависимости от того, какое значение может оказаться у конечного значения.

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

Давайте изучим цикл for на примере. Пусть нам нужно перевести температуру от 0 до 100 градусов из шкалы Цельсия в шкалу Фаренгейта. Правила здесь просты: нужно взять температуру по 25 Цельсию, умножить ее на 9/5 и к результату прибавить 32. Сам результат нужно будет программно добавить в компонент Memo в виде строки:

«x градусов по Цельсию = y градусов по Фаренгейту»

Создайте новое приложение.

Сразу же свойству Name формы присвойте имя fName. В свойстве Caption напишите «Перевод температур из Цельсия в Фаренгейты». Сохраните проект в новую папку. В верхнюю часть окна поместите компонент Memo и в свойстве Lines удалите из него весь текст. Растяните Memo по форме, как на рисунке 4.1:

Рис. 4.1. Внешний вид приложения

Ниже Memo добавьте кнопку Button, в свойстве Caption которой укажите «Расчет температур». Теперь создадим обработчик нажатия на кнопку, дважды щелкнув по ней. Процедура выглядит так:

procedure TfMain.Button1Click(Sender: TObject);

Var

i: Byte; //счетчик

Begin

for i:= 0 to 100 do //делаем от 0 до 100

Memo1.Lines.Add(IntToStr(i) + ' градусов Цельсия = ' + FloatToStr(CelToFar(i)) + ' Фаренгейта');

end;

Здесь следует обратить внимание на последний оператор. Оператор

Memo1.Lines.Add('Строка');

добавляет строку ‘Строка’ в компонент Memo. При этом, в качестве строки, мы использовали сложное выражение, формирующее строку из разных частей. Разберем каждую часть подробно. IntToStr(i)

в качестве результата вернет значение i (счетчика) в виде строки. Как уже говорилось, это значение за каждый проход цикла будет увеличиваться на единицу. То есть, в первом проходе i будет равна 0, во втором 1, и так далее, пока не станет равна 100. Выполнив оператор в последний раз, цикл прекратит свою работу. А мы каждый раз будем получать это число в виде строки.

Далее у нас идет строка

' градусов Цельсия = '

С помощью знака «+» (знак конкатенации) мы добавляем одну строку к другой. В результате, при первом проходе мы получим строку

'0 градусов Цельсия = '

Обратите внимание, что во второй строке в начале и в конце есть пробелы. Без пробела строки сольются: «0градусов Цельсия =», а это некрасиво.

Далее мы имеем строку

FloatToStr(CelToFar(i))

Функция FloatToStr() возвращает вещественное число в виде строки. В качестве вещественного числа мы использовали вызов функции CelToFar(i), передав ей в качестве параметра целое число – текущее значение счетчика. Функция использует это число, как градус Цельсия, преобразует его в Фаренгейт и вернет значение в виде вещественного числа. Этой функции пока еще не существует, мы напишем ее позже. В результате мы получим строку «0 градусов Цельсия = 32». Далее мы добавляем еще строку

' Фаренгейта'

в результате чего получаем готовую строку «0 градусов Цельсия = 32 Фаренгейта». И уже готовую строку с помощью метода Add() мы добавляем в компонент Memo. Еще одно правило, которое можно увидеть из этого примера – если оператор получается длинным, его можно перенести на следующую строку после арифметического знака или запятой.

Функцию CelToFar() нужно будет создать выше нашей процедуры:

function CelToFar(a: Byte): Real;

Begin

Result:= a * 9/5 + 32;

end;

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

Пример 2

Вычислить

Решение

Для вычисления суммы будем использовать так называемый алгоритм накопления который заключается в том, что для вычисления суммы n слагаемых необходимо n раз выполнить оператор: S:=S+ioe слагаемое; где i =1, 2, 3,..., n; i-oe слагаемое равно 1/i2. Если указанный оператор выполняется первый раз, т.е. i = 1, то S должна содержать 0.

Программа

Program 2;

{$APPTYPE CONSOLE}

Uses

SynUtils;

Var

i,n: integer;

s,ai:real;

Begin

write('Enter n=');

readln(n);

s:=0;

For i:=1 to n do

Begin

ai:= 1/sqr(i);

s:=s+i;

end;

Writeln(‘s=’,s:7:3);

Readln;

End.

Результаты работы программы

Enter n=6

s = 1.491

Самостоятельная работа.

Вычислить

Инструкция (цикл) WHILE

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

Синтаксис инструкции такой:

while условие do инструкция;

или расширенный вариант:

while условие do begin

инструкция 1;

инструкция 2;

...................

инструкция n;

end;

Здесь условие – переменная или выражение логического типа. Сначала вычисляется условие. Если условие ложно (False), то цикл не выполняется и сразу заканчивает работу. Если же условие истинно (True), то цикл выполняет инструкции, затем вновь возвращается к условию. Если условие опять возвращает True, цикл выполняется еще раз, и так до тех пор, пока условие не вернет False. Будьте осторожны с этим циклом! Не включайте туда условие, которое никогда не станет False. Компьютер в таком случае «зациклится», то есть зависнет. Обычно для этого внутрь цикла помещают счетчик – переменную целого типа. Только в отличие от цикла for, здесь переменная не увеличивает свое значение автоматически, за этим должен следить сам программист. Пример применения инструкции:

i:= 1;

while i < 10 do begin

ShowMessage('Число равно ' + IntToStr(i));

i:= i + 1;

end;

В этом простом примере мы целой переменной i присваиваем значение 1. Затем выполняем цикл while до тех пор, пока i не станет больше или равно 10. Если бы мы внутри цикла не указали «i:= i + 1;», то этого никогда бы не произошло, и мы зациклили бы программу.

Пример 3

Вычислить с погрешностью e=10-4 значение функции y=cos(x),используя разложение в ряды:

Решение

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

Запишем выражение для общего члена ряда:

Подставим в эту формулу вместо n величину n-1:

Найдем отношение:

Откуда получаем искомую рекуррентную формулу:

Для проверки корректности работы алгоритма и программы наряду со значением cуммы ряда, содержащейся в переменной s, будем выводить на экран дисплея также точнее значение cos(x), находящееся в переменной у.

Программа

program 3;

{$APPTYPE CONSOLE}

Uses

SysUtils;

Var

eps,s,t,f,x,y:real;

n:integer;

Begin

writeln('Enter x,eps');

readln(x,eps);

s:= 0;

t:= 1;

n:= 0;

while abs(t)>eps do

Begin

s:= s+t;

n:= n+1;

f:= -sqr(x)/(2*n*(2*n-l));

t:= t*f;

end;

у:= cos(x);

writeln('row amount s=',s:8:5);

writeln('proper value y=’,y:8:5);

readln

End.

Результаты работы программы

Enter x,eps

4.25 0.000001

row amount s=-0.44609

proper value у=- 0,44609

Самостоятельная работа.

Определить число членов бесконечного ряда

и найти его сумму с погрешностью e=10^-5



Поделиться:


Последнее изменение этой страницы: 2017-01-20; просмотров: 142; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.63.236 (0.07 с.)