31
.pdf
Таблица 1.3. |
|
|
|
Таблица1.4. |
|
||||||
|
B |
B |
B |
C |
|
B |
B |
B |
N1 |
N2 |
N3 |
|
1 |
2 |
3 |
|
|
1 |
2 |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
N |
|
0 |
0 |
0 |
1 |
--- |
--- |
|
|
|
|
1 |
|
|
|
|
|
|
|
|
0 |
0 |
1 |
N |
|
0 |
0 |
1 |
--- |
1 |
--- |
|
|
|
|
2 |
|
|
|
|
|
|
|
|
0 |
1 |
0 |
N |
|
0 |
1 |
0 |
1 |
--- |
--- |
|
|
|
|
1 |
|
|
|
|
|
|
|
|
0 |
1 |
1 |
N |
|
0 |
1 |
1 |
--- |
--- |
1 |
|
|
|
|
3 |
|
|
|
|
|
|
|
|
1 |
0 |
0 |
N |
|
1 |
0 |
0 |
--- |
--- |
1 |
|
|
|
|
3 |
|
|
|
|
|
|
|
|
1 |
0 |
1 |
N |
|
1 |
0 |
1 |
--- |
--- |
1 |
|
|
|
|
3 |
|
|
|
|
|
|
|
|
1 |
1 |
0 |
N |
|
1 |
1 |
0 |
--- |
--- |
1 |
|
|
|
|
3 |
|
|
|
|
|
|
|
|
1 |
1 |
1 |
N |
|
1 |
1 |
1 |
--- |
--- |
1 |
|
|
|
|
3 |
|
|
|
|
|
|
|
На рис. 1.9а приведена начальная схема алгоритма выбора, а на рис. 1.9б показана СА выбора, полученная в результате минимизации; под каждым альтернативным выходом в скобках записаны соответствующие им значения двоичных наборов В1 В2 В3 (X- безразличное значение).
Отметим, что в данном примере упрощения фрагментов СА выбора могут быть получены чисто схемным путем. Действительно, участок a-b может быть заменен прямой (см. рис. 1.7), а участки c-d, c-e, c-в можно преобразовать с учетом законов дистрибутивности и коммутативности, как для переменных, так и для соответствующих им условных вершин. Для упомянутых участков имеем:
участок c-d - B2& B3VB2& B3 = B3(B2& B2) = B3 ;
участок c-e - B2& B3 = B2& B3; участок c-в - B2& B3 = B3& B2 .
Рис. 1.9. Пример выбора по сложному условию:
а– исходная СА выбора; б – минимизированная схема.
Взаключение запишем фрагмент программы, соответствующий минимизированной СА выбора. Переход от схемы выбора (рис. 1.9 б) к условному оператору case .. of несложен и осуществляется следующим образом:
N:= if (B1& B3) then 1 else
if (B1& B2& B3) then 2 else 3; case N of
1: оператор; (* оператор может быть составным *)
2:оператор;
3:оператор
end
Отметим, что к моменту вычисления N должны быть определены значения
B1, B2, B3.
Языки высокого уровня позволяют записать сколь угодно сложные условия, используя стандартные логические операции AND (конъюнкция), OR (дизъюнкция), и NOT (отрицание), совокупность которых является функционально полной логической системой. Другое дело, что для удобства
написания и |
отладки |
программы |
слож ое условие имеет смысл |
декомпозировать, введя |
вспомогательные логические переменные и вычисляя |
||
их значения в операторных вершинах до условной вершины if либо case. |
|||
На нижнем |
уровне |
описания ЭВМ |
(язык функционального описания |
аппаратуры -Ф-язык ) сложное условие выражается через простые условия типа if, и представляется в виде фрагмента схемы алгоритма с использованием простых условных вершин.
Связь нижнего и верхнего уровней описания |
сложного |
условия |
достаточно проста. Для случая двух альтернатив вход и выход F и T блока |
||
выбора (БВ) на нижнем уровне отображается на одну |
условную вершину if |
|
верхнего уровня с теми же входом и выходами. |
В случае |
множества |
альтернатив блок выбора отображается на вершину case так, что вход БВ идентичен входу вершины case, а их соответствующие выходы нумеруются одинаково.
Задания для самостоятельной работы.
1.Построить линейный алгоритм для заданной функции и представить его с помощью параллельной и последовательной форм реализации:
a)y=(cos x2-56x3)/(ctg4x+e-x);
b)y = sin(α)cos(β) + e-x cos(α)-5tg(x)/cos(3x);
c)y=(cos(2x)-sin(4x))/(ctg(x-20)+tg(x2));
d)y=(2cos(2x)-sin(4x))/(cos2x-5x);
e)y=ex(cos(ά)+sin2(β))/tg3(ά2+β3).
2.Построить дерево выбора альтернатив для функции и минимизировать его:
a)y=B1+B2+B3;
b)y=(B1+B2)*B3;
c)y=B1*(B2+B3);
d)y=B1*B2*B3;
e)y=B1+B2+B3+B4;
f)y=B1*(B2+B3+B4).
Практическая работа №2.
Тема: Циклические СА.
Цель: Изучить основные формы представления и организацию циклических алгоритмов.
Циклические СА.
Цикл – многократное повторение некоторого фрагмента алгоритма; соответственно циклическим называют алгоритм, включающий в себя один либо несколько циклов. Последовательность операторов, выполняемых внутри цикла, называют телом цикла.
Пример 2.1. Дано множество чисел А={а1, а2, … , аn}. Найти минимальный элемент этого множества.
Такого рода сложная операция может быть оформлена в виде процедуры. Она часто встречается как составная часть некоторого алгоритма(программы). Назовем ее MIN_A (минимальный элемент множества А). процедура MIN_A основана на попарном сравнении двух элементов кi и кj. Обозначим операцию сравнения пары элементов следующим образом: кi^кj. Тогда результатом операции кi^кj будет минимальный элемент пары с=min(кi,кj). Кi^к с. Сравнение можно осуществить с помощью вычитания b= кi-кj, в результате которого возможны 2 исхода:
(2.1)
Процедура MIN_A м.б. наглядно представлена как упорядочивание элементов по убыванию их тяжести с помощью рычажных весов (рис 2.1.а) методом сравнения тяжести минимального по весу предмета, полученного на предыдущем взвешивании, с очередным предметом (ki +1) в некотором ряду.
Рис.2.1. Особенности процедуры MIN_A: а - сравнение на к-том шаге; б - процесс сравнения; в - инверсия элементов.
Вычислительный процесс состоит в следующем: сравниваются попарно рядом стоящие элементы, просматривая множество слева направо, начиная с
1-го и 2-го элементов; каждый раз после сравнения на правую позицию ставится минимальный элемент пары; новая пара образуется из минимального и следующего за ним элемента ( рис. 2.1б); процесс продолжается до тех поp, пока минимальный элемент не окажется на последнем месте справа во множестве А.
Приведем словесное описание алгоритма, представленное по шагам вычислительного процесса.
Пpоцедуpа MIN_A
1.Начало.
2.Ввод множества А.
3.В качестве минимального эл-та принимаем первый элемент множества.
4.Образование новой пары: к минимальному элементу предыдущей пары приписываем следующий элемент множества.
5.Сравнение элементов.
6.Если левый элемент пары (lel) меньше правого (rel), то меняем их местами (инверсия элементов - invel), иначе оставляем их на месте.
7.В качестве минимального эл-та принимаем правый элемент пары.
8. Если не все элементы множества перебраны, то переходим на метку 1.
9.Последний элемент обработанного множества будет минимальным.
10.Конец.
Запишем для процедуры MIN_A программу на Pascal в упрощенном варианте(не объявлены типы данных; не расписан ввод.
Множества А). Процедура MIN_A.
1.Начало.
2.Ввод массива А;
3. |
i:=1; |
(* начальное значение параметра цикла *) |
|
4. |
c:=A[1]; |
|
|
5. |
М: lel:=с; rel:=A[i+1]; |
(* образование паpы *) |
|
6.if lel<rel then (t:=lel; lel:=rel; rel:=t); (*инверсия элементов – invel*)
7. |
c:=rel; |
(* выделение минимального элемента в пареminel*) |
|
Отметим два момента : |
|
|
- в программе |
используется более удобная проверка окончания работы |
алгоритма вместо 9. If I ≥ n then goto 10 else goto 4. |
||
8. |
i:=i+1; |
(* новое значение параметра цикла *) |
9.if i<n then goto M;(* пpодолжать работу ?*)
10.minel:=к; (* минимальный элемент множества А*)
11.Вывод minel;
12.Конец.
Рис.2.2. Процедура MIN_A: а- 1-й вариант СА;б- 2-й вариант СА;
в- проверка правильности организации цикла для 2-го варианта СА.
Пример 2.2. Даны две матрицы А и В размерностью d(A)=d(B)=m * n. Найти их сумму С=А+В.
По определению [3] при суммировании матриц элементы результирующей матрицы вычисляются по правилу: элемент матрицы С, имеющий пару индексов (кi, кj), равен сумме элементов матриц А и В, имеющих те же пары индексов, т. Е.
при этом результирующая матрица С имеет также размерность m x n: d©=d(A)=d(B).
c11 |
c12 |
... |
c1n |
|
a11 |
a12 |
... |
a1n |
|
b11 |
b12 |
... |
b1n |
|
c21 |
c22 |
... |
c2n |
= |
a21 |
a22 |
... |
a2n |
+ |
b21 |
b22 |
... |
b2n |
(2.2) |
: |
: |
cij |
: |
|
: |
: |
aij |
: |
|
: |
: |
bij |
: |
|
cm1 |
cm2 |
,,, |
cmn |
|
am1 |
am2 |
... |
amn |
|
bm1 |
bm2 |
... |
bmn |
|
суммирование можно организовать двумя способами: по строкам или столбцам. Рассмотрим первый вариант. Идея вычислительного процесса проста: выбираем некоторую строку матрицы (фиксируем ее номер i), и, перебирая все ее позиции с первой до последней включительно (изменяем номер j столбца с 1 до n), проводим суммирование элементов aij и bij . Затем
увеличиваем номер строки на 1 и повторяем процедуру суммирования элементов строки; действия повторяются до тех пор, пока не будут перебраны все m строк.
Таким образом, процесс суммирования матриц содержит 2 цикла: а) перебор строк (i = 1, m);
б) перебор элементов строки ( j = 1, n ).
Поскольку цикл (а) включает в себя цикл (б), то говорят, что цикл (б) вложен в цикл (а); или называют цикл (а) внешним, а цикл (б) – внутренним. Переменные i и j являются параметрами цикла (в данном случае i – параметр внешнего, а j – внутреннего цикла).
В соответствии со словесным описанием алгоритма суммирования двух матриц составим его схему (рис. 2.3а), на которой пунктиром выделен внутренний цикл, причём телом этого цикла является оператор j:=0 и внутренний цикл, который в данном представлении можно рассматривать как предопределённый процесс.
Стандартные способы организации циклов – использования конструкций for, while <условие> do <оператор> , repeat <оператор> until
<условие>. |
|
|
|
|
|
Оператор |
for |
имеет внутренний счетчик в обоих вариантах реализации( |
|||
Iнач Iкон , I – целые константы ): |
|
|
|||
for I:= Iнач |
step |
I to Iкон do <оператор> |
- счет в прямом направлении; |
||
for I:= Iкон step |
I downto Iнач do <оператор> - счет в обратном |
||||
направлении. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис.2.3. СА суммирования матриц: а - полный вариант; б - сокращенный вариант.
Применять этот оператор целесообразно при известном числе циклов. Обычно
I =1 ( по умолчанию ), и тогда оператор for записывается в более простой форме:
for I:= Iнач to Iкон do <оператор>,
for I:= Iкон downto Iнач do <оператор>.
На рис. 2.4, а и б приведены фрагменты СА для оператора for; ( здесь S1, S2 – тело цикла). Особенность этого оператора – возможность изменения значения счетчика только на 1.
Запишем фрагмент программы примера 2.1 (строчки 3-9) с использованием оператора for (здесь invel – процедура инверсии элементов, представленная условной записью):
с:=А[1];
for i:=1 to n-1 do
if lel<rel then invel(lel,rel); с:=rel;
Этот же фрагмент можно представить, не используя процедуру invel (на каждом шаге запоминается значение с=minel):
c:=A[1];
for i:=2 to n do
if c≥a[i] then c:=a[i];
Реализация операторов while…do , и repeat…until в виде СА приведена на рис. 2.4в и г. Смысл этих операторов заключается в следующем: для первого – пока выполняется условие W, делать S1, S2,…, а для второго – повторять S1, S2,…, пока не выполняется условие U.Различие этих условных операторов заключается в том , что при организации одного и того же вычислительного процесса (S1; S2 ;…Sn) условия U и W должны быть противоположны; кроме того, во втором случае последовательность операторов выполняется по меньшей мере один раз. Достоинством этих операторов является то, что можно строить циклические алгоритмы с заранее неизвестным числом циклов. Эти операторы можно использовать и при известном числе повторений; при этом в теле цикла должен быть предусмотрен счетчик, а условием выхода из цикла будет его конечное значение. Операторы while…do , и repeat…until, также как и оператор if,создают простое разветвление, но, в отличие от операторов if, они предназначены для многократного выполнения одного и того же вычислительного процесса (S1;S2;…Sn).
Отметим, что организация цикла на рис. 1.12 соответствует оператору while…do для второго варианта , и оператору repeat…until – для первого ( в обоих вариантах со встроенным счётчиком).
Рис. 2.4. Способы реализации операторов цикла: а,б - for;
в: while .. do ; г: repeat .. until.
Отметим, что если в теле цикла встречается оператор, который не зависит от параметра цикла, то его можно и нужно вынести за цикл, что сократит время выполнения алгоритма. Если переменная х[ I ], зависящая от параметра цикла I, встречается в теле цикла более одного раза, то имеет смысл пере обозначить её ( например y := x[ I ] ), с тем, чтобы не тратить время ( кроме первого раза ! ) на вычисление адреса этой переменной в оперативной памяти.
Задания для самостоятельной работы.
1.Построить циклический алгоритм для решения задачи. Представить его в виде словесного описания, схемы алгоритма и программы на языке программирования:
a)Дано множество чисел A={a1, a2, … , an}. Требуется найти максимальный элемент этого множества.
b)Дано множество чисел A={a1, a2, … , an}. Требуется составить из данного множества два новых множества, одно из которых содержало бы только положительные числа, а другое отрицательные.
c)Дано множество чисел A={a1, a2, … , an}. Требуется найти разность между максимальным и минимальным элементами множества.
d)Дано множество чисел A={a1, a2, … , an}. Требуется составить из данного множества новое множество, элементы которого представляли бы собой целые числа.
e)Дано множество чисел A={a1, a2, … , an}. Требуется составить из данного множества новое множество, элементы которого представляли бы собой четные числа.
