ПРОГРАММИРОВАНИЕ ПРОЦЕССОВ с разветвляющейся структурой
Цель работы: овладение практическими навыками разработки алгоритмов и программ с разветвляющейся структурой на языках Turbo Pascal и С.
Теоретический материал
На практике редко удается представить схему алгоритма решения задачи в виде линейной структуры. Часто в зависимости от каких-либо значений промежуточных результатов необходимо организовать вычисления по одним или другим формулам. В зависимости от выполнения некоторого логического условия вычислительный процесс осуществляется по одной или другой ветви.
Алгоритм такого вычислительного процесса называется алгоритмом разветвляющейся структуры.
В качестве условия в разветвляющемся алгоритме может быть использовано любое понятное исполнителю утверждение, которое может соблюдаться (быть истинно) или не соблюдаться (быть ложно). Такое утверждение может быть выражено как словами, так и формулой. Таким образом, алгоритм ветвления состоит из условия и двух последовательностей команд.
В зависимости от того, в обеих ветвях решения задачи находится последовательность команд или только в одной, разветвляющиеся алгоритмы делятся на полные и не полные (сокращенные).
Стандартные блок-схемы разветвляющегося алгоритма приведены ниже:
Условные конструкции в ТР.
Разветвления в программах используют операторы перехода, условный и выбора варианта.
1) Оператор безусловного перехода GOTO позволяет изменять последовательность выполнения операторов в программе.
Формат записи оператора:
GOTO <метка>; где
<метка> - имя метки, отличающей ту строку, на которую требуется выполнить переход.
Имя метки должно быть предварительно описано в разделе описания меток Label.
Неправильное использование в программе оператора GOTO усложняет читаемость программы.
Например:
Label 1,3,8,10;
. . . . .
Goto 8
. . . . .
8: x : = A+ B
2) Составной оператор ( begin … end ) представляет собой совокупность последовательно выполняемых операторов, заключенных в операторные скобки begin … end.
Этот оператор записывается следующим образом:
begin
<оператор 1>;
<оператор 2>;
. . . . . . . . . . . . . . . . . .
<оператор N>
end;
Составной оператор используется в тех случаях, когда в соответствии с правилами записи языка TURBO PASCAL можно записать только один оператор, в то время как требуется выполнить несколько операторов.
Отдельные операторы внутри составного оператора отделяются друг от друга точкой с запятой.Перед символом end точку с запятой можно не ставить, т. к. это слово не является отдельным оператором. Если же « ; » будут поставлены, то они будут рассматриваться как пустой оператор, т. е. оператор не выполняющий никакого действия.Сам блок операторов программы является ( можно считать ) составным оператором, т. к. он тоже заключен в операторные скобки BEGIN . . . END, внутри которых располагается последовательность операторов, разделенных « ; ».
Например:
Begin
A:=2;
B:=x+y;
End;
3) Условный оператор IF обеспечивает в зависимости от условия выбор одного из возможных действий.
Существует два варианта записи оператора:
a) Полный вариант:
If S then A else B ;
b) Укороченный вариант:
If S then A ;
где: S – условие (логическое выражение), которое проверяется на истинность.
A – оператор (только один!), выполняющейся, если выражение S – истинно.
B – оператор (только один!), выполняющейся, если выражение S – ложно.
Если вместо A или B требуется использовать несколько операторов, то применяется составной оператор (BEGIN . . . END).
Примеры использования оператора IF приведены в Приложении 1.
4) Оператор выбора варианта Case … of … end.
Используется для обработки ситуаций с несколькими вариантами решения (путем выбора одного из нескольких операторов), выбираемых в зависимости от некоторого выражения, называемого селектором.
Существует две формы записи этого оператора:
1) Case S of c1: <оператор 1>; c2: < оператор 2>; …………………. cN: < оператор N> else < оператор> end; | 2) Case S of c1: <оператор 1>; c2: < оператор 2>; …………………. cN: < оператор N> end; |
где S – выражение порядкового типа, значение которого вычисляется;
сl,c2,...,сN—это константы или метки, с которыми сравниваются значения выражения селектора (S). Они должны быть одного гита с селектором.
Выбор оператора определяется совпадением значения селектора S и константы (метки сl,c2,...,cN), стоящей перед оператором.
< оператор 1 >, < оператор 2 >, < оператор N > — один оператор, либо составной оператор (begin... end),
< оператор > — оператор, который выполнится, если значение выражения S не совпадет ни с одной из меток (констант) сl,c2,...,cN.
Примеры использования оператора IF.
a) IF p>0.5 THEM GOTO 15;
b) IF (x>0) AND (x<=10) THEN T:=x*3 ELSE T:=SQRT(y);
Вложенные IF:
IF X<=A THEN Z:=sin(x) ELSE IF x>0 THEN Z:=sin(x)/cos(x) ELSE Z:=cos(x);
Ключевое слово ELSE всегда относится к ближайшему ему IF.
Пример 1. Вычислить и вывести на экран значение заданной функции
где t=2.2.
Текст программы:
Program Lab21;
Const
t=2.2;
Var
x,z:real;
Begin
Writeln('Введите x');
Read(x);
If x<0.5 then z:=(ln(exp(3*ln(x)))+sqr(x))/sqrt(x+t)
else if x=0.5 then z:=sqrt(x+t)+1/x
else z:=cos(x)+t*(sqr(sin(x)));
Writeln ('z=',z:8:3);
End.
Результат выполнения программы:
z(0.1)=-4.548
z(0.5)=3.643
z(1)=2.098
Пример 2. Ввести число от 0 до 5. Вывести его название на английском языке.
Текст программы:
Program lab22;
Var
i:0..5;
Begin
Writeln('Введите целое число от 0 до 5');
Read(i);
Case i of
0:writeln('zero');
1:writeln('one');
2:writeln('two');
3:writeln('three');
4:writeln('four');
5:writeln('five');
end;
End.
Пример 3. Определение частного от деления целых чисел
{Вариант № 1 (с применением оператора GOTO)}
Program DELZEL_1(input,output);
Label metka1;
Var x, y, Res : integer ;
BEGIN
Write ( ‘ Введите делимое: ’);
Readln (x);
Write ( ‘ Введите делитель: ’);
Readln (y);
If y = 0 then
begin
Writeln ( ‘ Деление на ноль! ’);
GOTO metka1;
end;
Res : = x div y;
Writeln ( ‘ Частное равно : ‘, Res : 10 : 3 );
metka1; {метка пустого оператора}
END.
{Вариант № 2 (без оператора GOTO)}
Program DELZEL_1(input,output);
Var x, y, Res : integer ;
BEGIN
Write ( ‘ Введите делимое: ’);
Readln (x);
Write ( ‘ Введите делитель: ’);
Readln (y);
If y < > 0 then
begin
Res : = x div y;
Writeln ( ‘ Частное равно : ‘, Res : 10 : 3 );
end
Else Write ( ‘ Деление на ноль! ’);
END.
Условные конструкции в Си/С++.
1. Операторы if
Эти операторы иначе называются условными операторами и позволяют реализовывать разветвления в программах.
Пример 4. Программа осуществляет преобразование дюймов в сантиметры и сантиметров в дюймы; предполагается, что Вы укажете единицы измерения вводимых данных, добавляя i для дюймов и c для сантиметров:
#include <iostream.h>
void main()
{
const float fac = 2.54;
float x, in, cm;
char ch = 0;
cout << "введите длину: ";
cin >> x >> ch;
if (ch == 'i') { // inch - дюймы
in = x;
cm = x*fac;
}
else if (ch == 'c') // cm - сантиметры
{ in = x/fac;
cm = x;
}
cout << in << " in = " << cm << " cm\n";
}
Условие в операторе if должно быть заключено в круглые скобки.
2. Операторы switch
Оператор switch производит сопоставление значения с множеством констант.
Проверки в предыдущем примере можно записать так:
switch (ch) {
case 'i':
in = x;
cm = x*fac;
break;
case 'c':
in = x/fac;
break;
default:
in = cm = 0;
break;
}
Операторы break применяются для выхода из оператора switch. Константы в вариантах case должны быть различными, и если проверяемое значение не совпадает ни с одной из констант, выбирается вариант default. Программисту не обязательно предусматривать default.
3. Проверки
Проверка значения может осуществляться или оператором if, или оператором switch:
If ( выражение ) оператор