Если—то;
Если—то—иначе;
выбор — иначе.
Алгоритм на языке Турбо Паскаль |
Блок-схема алгоритма |
|
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. |