Операторы передачиуправления принудительно изменяют порядок выполнения команд.
Оператор
goto метка
где метка – идентификатор, применяют для безусловного перехода, он передает управление оператору с меткой:
метка: оператор;
Операторы break и continue используют только внутри циклов. Так оператор break осуществляет немедленный выход из циклов repeat, while, for и управление передается оператору, находящемуся непосредственно за циклом. Оператор continue начинает новую итерацию цикла, даже если предыдущая не была завершена.
Оператор exit осуществляет выход из подпрограммы.
Оператор halt прекращает выполнение программы.
Задача. Составить таблицу значений функции y=3cos(x2) на отрезке [xn;xk] с шагом dx. Вывести на печать каждую вторую пару значений x и y. Найти среднее арифметическое ненулевых значений y.
Входные данные:
начальн. значение аргумента – xn,
конечн. значение аргумента – xk,
шаг изменения аргумента – dx.
Выходные данные:
множество значений X и Y;
S – среднее значение Y;
Вспомагательные переменные:
K – количество значений Y;
i – номер выводимых значений.
При сложении нескольких чисел необходимо накапливать результат в определенном участке памяти, каждый раз считывая из этого участка предыдущее значение суммы и прибавляя к нему следующее слагаемое.
S:=S+Y
Для выполнения первого оператора накапливания суммы из участка памяти необходимо взять такое число, которое не влияло бы на результат сложения. Т.е. перед началом цикла переменной, предназначенной для накапливания сумы, необходимо присвоить значение нуль: S:=0.
При вычислении количества значений практически происходит суммирование единиц. Поэтому, для выполнения первого оператора накапливания ячейка обнуляется, K=0. Далее, K = K + 1.
procedure TForm1.btn3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
mmo1.Lines.Clear;
edt1.Text:='';
edt2.Text:='';
edt3.Text:='';
end;
procedure TForm1.btn1Click(Sender: TObject);
var
xn,xk,dx:Real;
x,y:Real;
S:Real;
k,i:Integer;
kod1, kod2, kod3:integer;
begin
val(edt1.Text,xn,kod1);
val(edt2.Text,xk,kod2);
val(edt3.Text,dx,kod3);
if (kod1=0) and (kod2=0) and (kod3=0) then
begin
S:=0; k:=0; i:=0;
x:=xn;
mmo1.Lines.Add('Значения функции в заданных точках' );
while x<=xk do
begin
y:= 3*cos(Sqr(x));
i:=i+1;
if i mod 2=0 then
mmo1.Lines.Add('x='+
FloatToStrF(x,ffFixed,5,2)+
' y='+
FloatToStrF(y,ffFixed,7,2));
if y<>0 then
begin
S:=S+y;
k:=k+1;
end;
x:=x+dx;
end;
if k=0 then
MessageDlg('Ошибка!',
mtError,[mbOk],0)
else
MessageDlg('Среднее
значение функции'+chr(13)
FloatToStrF(S,ffFixed,5,2),
mtInformation,[mbOk],0)
end
else
begin
MessageDlg('Введите число!',mtWarning,[mbOk],0);
edt1.Text:='0.0';
edt2.Text:='0.0';
edt3.Text:='0.0';
end;
end;
Задача. Составить таблицу значений функции на отрезке [xn;xk] с шагом dx. Вывести на печать значения x и y. Найти произведение положительных значений y, сумму отрицательных значений y и количество всех значений y.
Входные данные:
начальн. значение аргумента – xn,
конечн. значение аргумента – xk,
шаг изменения аргумента – dx.
Выходные данные:
множество значений X и Y;
S, P, K ;
При умножении нескольких чисел произведение накапливается в определенном участке памяти, например P.
Для выполнения первого оператора из участка памяти необходимо взять такое число, которое не влияло бы на результат умножения, т.е. единицу
P = 1.
Далее, из переменной P считывается предыдущее значение и умножается наследующее
P = P * i.
procedure TForm1.btn3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
mmo1.Lines.Clear;
edt1.Text:='';
edt2.Text:='';
edt3.Text:='';
lbl4.Visible:=False;
lbl5.Visible:=False;
lbl6.Visible:=False;
edt4.Visible:=False;
edt5.Visible:=False;
edt6.Visible:=False;
mmo1.Visible:=False;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
xn,xk,dx:Real;
x,y:Real;
S,P:Real;
k:Integer;
kod1, kod2, kod3:integer;
begin
lbl4.Visible:=true;
lbl5.Visible:=true;
lbl6.Visible:=true;
edt4.Visible:=true;
edt5.Visible:=true;
edt6.Visible:=true;
mmo1.Visible:=true;
val(edt1.Text,xn,kod1);
val(edt2.Text,xk,kod2);
val(edt3.Text,dx,kod3);
if (kod1=0) and (kod2=0) and (kod3=0) then
begin
S:=0; k:=0; P:=1;
x:=xn;
mmo1.Lines.Add('Значения функции' );
while x<=xk do
begin
y:= Power(Sqr(Sin(x)),1/3);
mmo1.Lines.Add('x='+
FloatToStrF(x,ffFixed,5,2)+
' y='+
FloatToStrF(y,ffFixed,7,2));
if y>0 then
P:=P*y
else S:=S+y;
k:=k+1;
x:=x+dx;
end;
edt4.Text:=FloatToStrF(S,
ffFixed,7,2);
edt5.Text:=FloatToStrF(P,
ffFixed,7,2);
edt6.Text:=IntToStr(K);
end
else
begin
MessageDlg('Введите число!',mtWarning,[mbOk],0);
edt1.Text:='0.0';
edt2.Text:='0.0';
edt3.Text:='0.0';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
lbl4.Visible:=False;
lbl5.Visible:=False;
lbl6.Visible:=False;
edt4.Visible:=False;
edt5.Visible:=False;
edt6.Visible:=False;
mmo1.Visible:=False;
end;
ЗАДАЧА. Вычислить факториал числа N (N!=1×2×3 …×N).
Входные данные:N–целое число.
Выходные данные: factorial – значение факториала числа N, произведение чисел от 1 до N, целое число.
Промежуточные переменные:
i– параметр цикла, целочисленная переменная, последовательно принимающая значения 2, 3, 4 и так далее до N.
procedure TForm1.Button1Click(Sender: TObject);
var i,N,factorial:integer;
begin
N:=StrToInt(Edit1.Text);
factorial:=1;
for i:=2 to N do
factorial:=factorial*i;
Label2.Caption:=
'N!='+IntToStr(factorial);
end;
ЗАДАЧА. Вычислить an , где n – целое положительное число.
Входные данные:
a – вещественное число
Выходные данные:
p (вещественное число) – результат возведения вещественного числа a в целую положительную степень n.
Промежуточные данные:i – целочисленная переменная, принимающая значения от 1 до nс шагом 1, параметр цикла.
procedure TForm1.Button1Click(Sender: TObject);
var i,n:byte;a,p:real;
begin
a:=StrToFloat(Edit1.Text);
n:=StrToInt(Edit2.Text);
p:=1;
for i:=1 to n do
p:=p*a;
Label3.Caption:='a в степени n равно '+FloatToStr(p);
end;
ЗАДАЧА. Вычислить сумму натуральных четных чисел, не превышающих N.
Входные данные:N –целое число.
Выходные данные: S– сумма четных чисел.
Промежуточные переменные:i – параметр цикла, принимает значения 2, 4, 6, 8 и так далее.
//Решение задачи с
//помощью цикла while:
procedure TForm1.Button1Click(Sender: TObject);
var i,N,S:byte;
begin
N:=StrToInt(Edit1.Text);
S:=0;
i:=2;
while i<=N do
begin
S:=S+i;
i:=i+2;
end;
Label2.Caption:='S= '+IntToStr(S);
end;
//Решение задачи
//с помощью цикла for:
procedure TForm1.Button1Click(Sender: TObject);
var i,N,S:byte;
begin
N:=StrToInt(Edit1.Text);
S:=0;
for i:=2 to N do
if i mod 2 = 0 then
S:=S+i;
Label2.Caption:='S= '+IntToStr(S);
end;
ЗАДАЧА. Дано натуральное число N. Определить К – количество делителей этого числа, не превышающих его (Например, для N=12 делители 1, 2, 3, 4, 6. Количество K=5).
Входные данные:N –целое число.
Выходные данные:целое число K– количество делителей N.
Промежуточные переменные:i – параметр цикла, возможные делители числа N.
procedure TForm1.Button1Click(Sender: TObject);
var N,i,K:word;
begin
N:=StrToInt(Edit1.Text);
K:=0;
for i:=1 to N div 2 do
if N mod i= 0 then
K:=K+1;
Label2.Caption:='K= '+IntToStr(k);
end;
ЗАДАЧА. Дано натуральное число N. Определить, является ли оно простым. Натуральное число N называется простым, если оно делится нацело без остатка только на единицу и N. Число 13 – простое, так как делится только на 1 и 13, N=12 не является простым, так как делится на 1, 2, 3, 4, 6 и 12.
Входные данные:N –целое число.
Выходные данные: сообщение.
Промежуточные данные: i – параметр цикла, возможные делители числа N.