Метод последовательной детализации 


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



ЗНАЕТЕ ЛИ ВЫ?

Метод последовательной детализации



x:=101;
while x<999 do
begin
Если x-простое, то
вывести x
x:=x+2
end.

Следующим шагом детализируем действие "x-простое".

Переборные задачи

Задача. Вывести все тройки целых положительных a, b, c <100: a2+b2=c2
Решение 1. (В лоб)

for a:=1 to 99 do
for b:=1 to 99 do
for c:=1 to 99 do
if a*a+b*b=c*c then
writeln(a:3;b:3;c:3)

Решение 1а.

for a:=1 to 99 do
for b:=a+1 to 99 do
for c:=b+1 to 99 do
if a*a+b*b=c*c tnen
writeln(a:3;b:3;c:3)

Решение 1б.

for a:=1 to 99 do
for b:=a+1 to 99 do
c:=round(sqrt(a*a+b*b));
if a*a+b*b=c*c tnen
writeln(a:3;b:3;c:3)

Но! Нельзя заниматься преждевременной оптимизацией!

Оператор безусловного перехода goto

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

метка: оператор

Метка представляет собой идентификатор и должна быть описана в разделе описания меток в виде:

label имя [, имя ]

Сам оператор goto имеет следующий синтаксис:

goto метка

Переход внутрь другого оператора запрещен:

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

Пример 1.

Цикл...
begin
...
break
end;

эквивалентно

Цикл...
begin
...
goto lbl;
...
end;
lbl:

Пример 2.

Цикл...
begin
...
continue
...
end;

эквивалентно

Цикл...
begin
...
goto lbl;
...
lbl:
end;

Пример 3.

repeat
операторы
until B;

эквивалентно

lbl:
операторы
if not B then goto lbl;

Пример 4.

while B do
begin

операторы
end;

эквивалентно

lbl1:
if not B then goto lbl2;
операторы
goto lbl1;
lbl2:

Пример 5.

if A then
begin
операторы1
end
else
begin
операторы2
end;

эквивалентно

if not A then goto lbl1;
операторы1
goto lbl2;
lbl1:
операторы2
lbl2:

Пример 6.

case i of
1: begin
операторы1
end;
2: begin
операторы2
end;
3: begin
операторы3
end;
else
операторы4
end;

эквивалентно

if i=1 then goto lbl1;
if i=2 then goto lbl2;
if i=3 then goto lbl3;
goto lbl4;
lbl1:
операторы1
goto lblend;
lbl2:
операторы2
goto lblend;
lbl3:
операторы3
goto lblend;
lbl4:
операторы4
lblend:

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

Следует отметить, что команда безусловного перехода (JMP) обязательно присутствует в языке ассемблера и интенсивно используется. По существу, приведенные выше примеры показывают, как на языке ассемблера моделируются те или иные управляющие конструкции языка программирования высокого уровня.

Подпрограммы. Процедуры и функции

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

Цели введения подпрограмм:

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

Процедуры

Пример. Составить процедуру вычисления среднего арифметического и среднего геометрического А и В. С ее помощью найти среднее арифметическое и среднее геометрическое пар A,B; A,C; B,C.

procedure Mean(A,B: real; var MA,MG: real);
// A,B-входные параметры
// MA,MG-выходные параметры
begin
assert(A>0); // предусловия процедуры
assert(B>0);
MA:=(A+B)/2;
MG:=sqrt(A*B);
end;

var A,B,C: real;
MA1,MA2,MA3,MG1,MG2,MG3: real;

begin
readln(A,B,C);
Mean(A,B,MA1,MG1);
Mean(A,C,MA2,MG2);
Mean(B,C,MA3,MG3);
writeln(MA1,MG1);
writeln(MA2,MG2);
writeln(MA3,MG3);
end.

Синтаксис описания процедуры

procedure имя [(список формальных параметров)]
раздел локальных описаний
begin
операторы
end;

Оператор вызова процедуры

имя [(список фактических параметров)]

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

Функции

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

Пример. Функция

function sign(x: real): integer;
begin
if x<0 then
sign:=-1
else if x>0 then
sign:=1
else sign:=0
end;

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

var s,a: real;
begin
s:=sign(-3);
writeln(s);
read(a);
writeln(sign(a)+sign(1));
end.

Для сравнения реализуем вычисление sign в виде процедуры.

procedure CalcSign(x: real; var sign: integer);
begin
if x<0 then
sign:=-1
else if x>0 then
sign:=1
else sign:=0
end;

var a: real;
s,s1,s2: integer;

begin
Calcsign(-3,s);
writeln(3);
read(a);
Calcsign(a,s1);
Calcsign(1,s2);
writeln(s1+s2);
end.

Переменная Result

В Delphi и FreePascal неявно определена переменная Result, присваивание которой равносильно и хранит результат функции.

function Sum(n: integer): integer;
var i: integer;
begin
Result:=0;
for i:=1 to n do
Result:=Result+i // Inc(Result,i)
end;

Локальные переменные подпрограмм не инициализируются (место на программном стеке под них отводится при выделении памяти под запись активации), поэтому их явная инициализация обязательна.

Способы передачи параметров



Поделиться:


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

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