Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 3 _Версия_полная_1_10_3.docx
Скачиваний:
1
Добавлен:
26.11.2019
Размер:
326.23 Кб
Скачать
  1. Если—то;

  2. Если—то—иначе;

  3. выбор — иначе.

Алгоритм на языке Турбо Паскаль

Блок-схема алгоритма

1. если—то

begin

IF <условие> THEN <оператор1> end

2. если—то—иначе

begin IF <условие>

THEN <оператор1> ELSE <оператор2> end

3. выбор—иначе

begin IF <условие1> THEN <оператор1>

ELSE(IF<условие2>THEN <оператор2>

...

ELSE(IF<условиеN>THEN <операторN>). ELSE <операторN+1>)...)

end

Рассмотрим примеры разветвляющихся алгоритмов.

Пример 3.5. Составить алгоритм определения наибольшего из двух числовых значений N1 и N2 и присвоить его переменной NB.

Блок-схема алгоритма

Алгоритм на языке Турбо Паскаль

Начало

Конец

Вывод 'NB= ',NB,

NB:=N2

2

T:=T+KT

IF N2>NB THEN

NB:=N1

Ввод данных

Begin

ReadLn(N1,N2);

NB:=N1;

If N2>NB Then NB:=N2;

WriteLn(' NB=',NB)

End.

Пример 3.6. Составить алгоритм определения наибольшего из трех числовых значений N1, N2 и N3 и присвоить его переменной NB.

Алгоритм выбора наибольшего, приведенный в примере 3.5, может дать ошибочный результат, т.к. при невыполнении условного оператора из-за синтаксической ошибки в записи оператора результат будет NB:=N1. Чтобы избежать этой ошибки на практике применяют алгоритм, в котором в качестве начального значения переменной NB принимают значение (-1019) заведомо меньшее проверяемых значений элементов списка. Алгоритм на языке Турбо Паскаль имеет вид.

begin

ReadLn(N1,N2,N3);

NB:= -1E+19;

IF N1>NB THEN NB:=N1;

IF N2>NB THEN NB:=N2;

IF N3>NB THEN NB:=N3;

WriteLn(' NB=',NB)

end.

Пример 3.7. Составить алгоритм вычисления значения функции y(x), заданной в виде

y=

Числовые значения x и a заданы.

Проверка на равенство действительных числовых значений производится проверкой выполнением условия где значение  зависит от точности вычислений (например, 10-5). Возведение в произвольную степень (кроме возведения в квадрат и возведения в степень числа e) в языке Турбо Паскаль отсутствует. Для возведения (x-a) в степень (1/3) можно воспользоваться очевидным равенством

Алгоритм на языке Турбо Паскаль имеет вид.

begin

ReadLn(x,a);

IF x>a THEN y:=x*EXP(1/3*LN(x-a)) ELSE

IF x<a THEN y:=EXP

y:=x*SIN(a*x);

WriteLn(' x=',x, ' a=',a' x=',x)

end.

Первый условный оператор проверяет условие x>a и в случае его выполнения (имеет значение TRUE) осуществляется переход к оператору, вычисляющему y:=x*EXP(1/3*LN(x-a)), иначе проверяется условие x<a. Если это условие выполняется, осуществляется переход к оператору, вычисляющему y:=EXP , иначе (при x=a) - .к оператору y:=x*SIN(a*x). После перехода по к вычислениям по любой из формул осуществляется переход в общую ветвь к оператору вывода результатов.

Циклические алгоритмы

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

Для организации цикла необходимо перед циклом задать начальное значение переменной цикла. Затем в теле цикла многократно повторить следующие действия:

  • изменять переменную цикла перед каждым новым повторением цикла;

  • проверять условие окончания или повторения цикла;

  • управлять циклом, т.е. переходить к началу тела цикла или выходить из цикла.

Базовая структура «цикл» существует в следующих основных вариантах:

1. Цикл «для» (тело цикла выполняется для значений параметра цикла заданное число раз, которое известно до начала выполнения цикла и реализуется с помощью счетчика, значение которого изменяются в заданном диапазоне с шагом 1.);

2. Цикл «с предусловием» ‑ тело цикла расположено после проверки условия; действия в теле цикла повторяются, пока условие выполняется (условие повторения цикла); цикл завершается, когда условие не выполняется;

3. Цикл «с постусловием» ‑ тело цикла расположено перед проверкой условия; действия в теле цикла следует повторять, до тех пока условие не выполняется (условие выхода из цикла); цикл завершается, когда условие выполняется;

Алгоритм на языке Турбо Паскаль

Блок-схема алгоритма

Цикл «для»

FOR <параметр цикла> = <начальное значение> TO <конечное значение> DO <тело цикла>, где параметр цикла может принимать только целочисленные значения; шаг изменения параметра цикла равен 1; начальное и конечное значения параметра цикла могут быть записаны константами или выражениями, которые принимают целые значения; тело цикла – произвольный оператор.

Цикл «с предусловием»

WHILE <условие продолжения цикла> DO <тело цикла>, где условие продолжения цикла представляет собой логическое выражение, которое принимает значения ИСТИННО или ЛОЖНО; значение переменных, входящих в условие, должны изменяться в теле цикла, иначе цикл не будет завершен; тело цикла – произвольный оператор.

Цикл «с постусловием»

REPEAT <тело цикла> UNTIL <условие выхода из цикла>, где условие выхода из цикла представляет собой логическое выражение, которое принимает значения ИСТИННО или ЛОЖНО; тело цикла выполняется хотя бы один раз; тело цикла – произвольный оператор.

Пример 3.8. Составить алгоритм вычисления ряда значений наиболее вероятной скорости молекул газа от температуры VB=f(T) при изменении температуры воздуха в интервале от TН до ТК с шагом hТ по формуле

.

Данные для вычислений: заданы в системе физических единиц Си.

Вариант 1. «Цикл с предусловием»

Блок-схема алгоритма

Алгоритм на языке Турбо Паскаль

Начало

Вывод 'NB= ' ,NB,

T:=TН

T

VB:=SQRT(2RT/M)

IF T<=TK+EPS

Начало

2

T:=T+HT

T

Конец

Ввод данных

Begin

ReadLn(M,TH,TK,HT,R,EPS);

T:=TH

While T<=TK+EPS DO

Begin

VB:=SQRT(2*R*T/M);

WriteLn (`T=`T,`VB=`VB);

T:=T+HT

End

End.

Параметром цикла является переменная Т, которая принимает значения от ТН до ТК с шагом HT. Условие повторения цикла имеет следующий вид:

T<=TK+EPS, где значение константы EPS ‑ зависит от точности вычислений (см. пример 3.7). Тело цикла представляет собой составной оператор, заключенный в операторные скобки Begin – End. Тело цикла включает в себя вычисление значения VB для текущего значения параметра цикла Т, вывод значений Т и VB на экран и вычисление следующего значения параметра цикла Т. Если значения ТН и ТК будут заданы ошибочно (например, ТН>ТК), то оператор цикла не выполнится ни разу.

Вариант 2. Цикл «с постусловием»

Алгоритм на языке Турбо Паскаль с оператором цикла REPEAT для фрагмента, аналогичного алгоритму с оператором WHILE (пример 3.8) имеет следующий вид.

Begin

ReadLn(M,TH,TK,HT,R,EPS);

T:=TН;

Repeat

Begin

VB:=SQRT(2*R*T/M);

WriteLn (`T=`T,`VB=`VB);

T:=T+HT

Until T>TK

End

End.

Тело цикла в операторах цикла REPEAT и WHILE совпадает. В отличие от оператора цикла WHILE в операторе цикла REPEAT проверка условия выхода из цикла выполняется в конце оператора, поэтому тело цикла будет выполнено хотя бы один раз, даже при ошибочном значении параметра цикла (см. вариант 1).

Вариант 3. Цикл «для» (со счетчиком цикла)

Операторы цикла REPEAT и WHILE применяют для организации цикла с неизвестным числом повторений. Если в алгоритме заранее определить число повторений цикла, то можно использовать оператор цикла «для».

Алгоритм на языке Турбо Паскаль с оператором цикла FOR для фрагмента, аналогичного алгоритму с оператором WHILE (пример 3.8) имеет следующий вид.

Блок-схема алгоритма

Алгоритм на языке Турбо Паскаль

Начало

Конец

Начало

T:=T+HT

T

Вывод ('T= ',T, 'VB=',VB) )))',VB),NB,

VB:=SQRT(2RT/M)

2

2

:=

2

Ввод данных

begin

ReadLn(M,TH,TK,HT,R,EPS);

N:=TRUNC((TK-TH)/HT)+1;

T:=TH;

For I:=1 TO N Do

Begin

VB:=SQRT(2*R*T/M);

WriteLn (`T=`T,`VB=`VB);

T:=T+HT

End

End.

Параметром цикла является целая переменная I, которая принимает значения от 1 до N с шагом 1. Количество повторений цикла N вычислено до начала цикла с использованием функции выделения целой части числа TRUNC. Переменная T изменяет свое значение в теле цикла. До начала цикла переменной T присваивается начальное значение с помощью оператора присваивания T:=TN. Тело цикла в операторах цикла REPEAT, WHILE и FOR совпадает. В каждом цикле проверяется условие продолжения цикла I<=N.

Массивы

В рассмотренных в примере 3.8 вариантах циклических алгоритмов параметры цикла и результаты вычислений рассматриваются как простые переменные, которые позволяют использовать в алгоритме одиночные объекты (простая переменная может принимать одно числовое значение). В алгоритмах с применением массива могут использоваться также объекты, содержащие множество однотипных элементов. Массивы – это формальное объединение нескольких однотипных объектов (элементов массива), рассматриваемое как единое целое (имеющих общее имя). К необходимости применения массивов мы приходим всякий раз, когда требуется связать и использовать целый ряд родственных величин. Например, результаты многократных замеров (дискретно) параметров исследуемого объекта за определенный временной интервал удобно рассматривать как совокупность вещественных чисел, объединенных в один сложный объект ‑ массив измерений.

Доступ к каждому элементу массива в алгоритме осуществляется с помощью индекса ‑ целого числа (точнее, выражения целого типа), который служащего адресом элемента в массиве (если левая граница типа-диапазона равна 1, индекс элемента совпадает с его порядковым номером). Массивы могут быть одномерными (адрес каждого элемента определяется значением одного индекса) и многомерными (несколько индексов). Аналогом одномерного массива в математике является вектор Х(Х1, Х2,…,ХN). Аналогом двумерного массива в математике является матрица размерностью MxN (M строк и N столбцов)

A=

При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс (индексы) элемента в квадратных скобках, например: X[1], A[2,1].

Пример 3.9. Составить алгоритм для вычисления и запоминания в массиве таблицы значений наиболее вероятной скорости молекул газа от температуры VB=f(T) для заданного ряда значений температуры воздуха Т=(T1, T1,…,ТN) с по формуле

.

Исходные данные R, M, T заданы в системе физических единиц Си.

Алгоритм на языке Турбо Паскаль имеет вид.

begin

ReadLn(T,N);

For I:=1 TO N Do

VB[I]:=SQRT(2*R*T[I]/M);

WriteLn(VB)

End.

Оператор ReadLn(T,N) осуществляет ввод всего массива значений температуры Т. В цикле вычисляется результат как переменная с индексом VB[I]– элемент массива. Переменная T[I] также является элементом массива (T1, T1,…,ТN). После выполнения оператора присваивания в теле цикла осуществляется переход к следующему циклу – значение переменной цикла I увеличивается на 1 и проверяется условие продолжения цикла I<=N. При невыполнении условия осуществляется выход из цикла и вывод на экран значений элементов массива VB оператором WriteLn. Оператор WriteLn(VB)стоит за циклом, так как на экран выводится весь массив VB.

Пример 3.10. Составить алгоритм вычисления суммы S значений элементов массива F=(F1, F2,…,FN).

Алгоритм на языке Турбо Паскаль имеет вид.

Begin

ReadLn(F,N);

S:=0;

For I:=1 TO N Do

S:=S+F[I];

WriteLn(S)

End.

Перед оператором цикла задается начальное значение суммы S равное нулю. В цикле осуществляется «накопление суммы» ‑ к предыдущему значению накопленной суммы прибавляется текущее значение элемента массива S:=S+F[I]. При первом выполнении цикла вычисляется значение S:=S+F[1], которое должно быть равно F[1].

Пример 3.11. Составить алгоритм определения наименьшего элемента XM массива X(x1, x2,…xN,) и его порядкового номера NM.

begin

ReadLn(X,N);

XM:=X[1];

NM:=1;

For I:=2 To N Do

If X[I]<XM Then

Begin

XM:=X[I];

NM:=I

End;

WriteLn('XM=',XM,'NM=',NM)

End.

В качестве начального значения XM принимается первый элемент массива X[1] (адрес NM=1). Сравнение текущего элемента массива X[I] c NM выполняется в цикле, начиная со второго элемента массива X (For I:=2 TO N Do <Оператор>). Проверка условия X[I]<XM выполняется в условном операторе If X[I]<XM Then <составной оператор>. Если условие выполняется, то определяются новые значения XN и NM (XM:=X[I]; NM:=I). При невыполнении условия X[I]<XM никаких действий не производится и осуществляется переход к следующему циклу – переменная цикла I изменяет значение на 1 и проверяется условие продолжения цикла I<=N. При невыполнении условия осуществляется выход из цикла и вывод на экран значений XN и NM с их названиями оператором WriteLn.

Пример 3.12. Составить алгоритм умножения прямоугольной матрицы A на вектор-столбец B.

Произведением АВ матрицы A на вектор-столбец B называется матрица С. Элементы матрицы С вычисляют по следующему правилу: элемент равен сумме произведений элементов (i-й строки, j-го столбца) матрицы А на соответствующие элементы Произведение АВ существует, если число столбцов N матрицы A=( (i=1,2,…,M; j=1,2,…,N) равно числу элементов вектора-столбца B (j=1,2,…,N)

, где + + + .

Алгоритм решения задачи представляет собой структуру вложенных циклов – внешнего и внутреннего. Внешний цикл определяет изменение индекса строки i, а внутренний – индекса столбца j. Так как значения числа строк М и столбцов N в алгоритме определены (оператор ReadLn(N,M,A,B), то для организации внешнего цикла воспользуемся оператором цикла For J:=1 TO M <составной оператор>, а для внутреннего цикла – оператором цикла For J:=1 TO N <Оператор>. Перед внутренним циклом необходимо задать начальное значение суммы C[I]:=0. Для каждого значения параметра внутреннего цикла I параметр внутреннего цикла J пробегает все свои значения. После завершения внутреннего цикла управление передается во внешний цикл. После завершения внешнего цикла управление передается оператору вывода WriteLn (C) для вывода на экран значений элементов массива С=(сi).

Блок-схема алгоритма

Алгоритм на языке Турбо Паскаль

Начало

Конец

Начало

Вывод C

2

Ввод данных

begin

ReadLn(N,M,A,B)

For I:=1 TO M Do

Begin

C[I]:=0;

For J:=1 TO N Do

C[I]:= C[I]+A[I,J]*B[J]

End;

WriteLn (C);

End.

6