Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

31

.pdf
Скачиваний:
7
Добавлен:
10.02.2016
Размер:
668.73 Кб
Скачать

Таблица 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(β))/tg323).

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. Обозначим операцию сравнения пары элементов следующим образом: кij. Тогда результатом операции кij будет минимальный элемент пары с=min(кij). Кiс. Сравнение можно осуществить с помощью вычитания b= кij, в результате которого возможны 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 ca[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}. Требуется составить из данного множества новое множество, элементы которого представляли бы собой четные числа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]