Презентацию к данной работе Вы можете скачать здесь.
В
(рис 2.1) Базовые конструкции структурного программирования
Следование, ветвление и цикл называют базовыми конструкциями структурного программирования. Их особенностью является то, что любая из них имеет только один вход и один выход, поэтому они могут вкладываться друг в друга. Например, цикл может содержать следование из нескольких ветвлений, каждое из которых включает вложенные циклы.
Целью использования базовых конструкций является получение программы простой структуры. Такую программу легко читать, отлаживать и при необходимости модифицировать. Язык Паскаль способствует созданию хорошо
Операторы ветвления if и варианта case применяются для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case — на одну из произвольного числа ветвей.
Условный оператор if используется для разветвления процесса вычислений
на два направления. Структурная схема оператора приведена на рис 2.2. Формат оператора:
if выражение then оператор_1 [else оператор_2;]
Сначала вычисляется выражение, которое должно иметь логический тип. Если оно имеет
значение true, выполняется первый оператор, иначе — второй. После этого управление
передается на оператор, следующий за условным.
(рис 2.2) Структурная схема условного оператора
Oператоры, входящие в состав условного оператора, могут быть простыми или составными. Составной оператор ( блок ) обрамляется ключевыми словами begin и end. Блок применяют в том случае, когда по какой-либо ветви требуется выполнить несколько операторов: ведь иначе компилятор не сможет понять, где заканчивается ветвь и начинается следующая часть программы. Одна из ветвей может отсутствовать.
begin и end в ветви else компилятор как ошибку не распознает!Примеры условных операторов:
if a < 0 then b := 1; { 1 }
if (a < b) and ((a >d) or (a = 0)) then inc(b)
else begin
b := b * a; a := 0
end; { 2 }
if a < b then
if a < c then m := a else m := c
else
if b < c then m := b else m := c; { 3 }
В примере 1 отсутствует ветвь else. Такая конструкция называется 'пропуск оператора'.
Если требуется проверить несколько условий, их объединяют знаками логических операций.
Так, выражение в примере 2 будет истинно в том случае, если выполнится
одновременно условие a < b и хотя бы одно из условий a > d
и a = 0. Скобки, в которые заключены операции отношения, обязательны,
потому что приоритет у логических операций выше, чем у операций отношения.
Поскольку по ветви else требуется выполнить два оператора, они заключены в блок.
В примере 3 вычисляется наименьшее из значений трех переменных a, b и с.
0 < x < 1 нельзя
записать непосредственно. Правильный способ: if(0 < x) and (x < 1) then …,
поскольку фактически требуется задать проверку выполнения одновременно двух условий: x > 0 и x < 1.Пример. Программа, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика (рис 2.3).
(рис 2.3) Функция, заданная в виде графика
Составим описание алгоритма в неформальном словесном виде.
х.y по соответствующей формуле.х и y.Второй пункт алгоритма следует детализировать. Сначала запишем определение функции в виде формул.
$$\mathbf{Y} = \left( \begin{array}{ccccc} 0, ' x < -2 \\ -2-x, ' -2 <= x < -1 \\ x, ' -1 < x < 1 \\ -x+2, ' 1 <= x < 2 \\ 0, ' x => 2 \end{array} \right) $$Теперь в соответствии с формулами опишем словами последовательность действий второго пункта алгоритма:
x < –2, присвоить переменной y значение 0–2 <= x < –1, присвоить переменной y значение –x – 2.–1 <= x < 1, присвоить переменной y значение x.И так далее.
Теперь шаги алгоритма представлены максимально подробно, поэтому можно приступать к написанию программы ().
program calc_function_1;
var x, y : real;
begin
writeln(' Введите значение аргумента'); readln(x);
if x < –2 then y := 0;
if (x >= –2) and (x < –1) then y := –x – 2;
if (x >= –1) and (x < 1) then y := x;
if (x >= 1) and (x < 2) then y := –x + 2;
if x >= 2 then y := 0;
writeln('Для x = ', x:6:2, ' значение функции y = ', y:6:2);
end.
Тестовые примеры для этой программы должны включать по крайней мере по одному значению аргумента из каждого интервала, а для проверки граничных условий — еще и все точки перегиба (если это кажется вам излишним, попробуйте в предпоследнем условии 'забыть' знак =, а затем ввести значение х, равное 1.
Следует избегать проверки вещественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом. Это связано с погрешностью представления вещественных значений в памяти. Значение величины, с которой сравнивается модуль разности, следует выбирать в зависимости от решаемой задачи и точности переменных, участвующих в выражении. Пример:
const eps = 1e-6; { Требуемая точность вычислений }
var x, y : real;
...
if (x = y) then writeln('Величины x и y равны'); { Плохо! Ненадежно! }
if (abs(x - y) < eps) then writeln('Величины x и y равны'); { Рекомендуется }
Большого количества вложенных условных операторов также следует избегать, потому что они делают программу совершенно нечитабельной.
Оператор варианта (выбора) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведена на рис 2.4. Формат оператора:
case выражение of
константы_1 : оператор_1;
константы_2 : оператор_2;
константы_n : оператор_n;
[ else : оператор ]
end;
(рис 2.4) Структурная схема оператора выбора
Выполнение оператора выбора начинается с вычисления выражения. Затем управление передается на оператор, помеченный константами, значение одной из которых совпало с результатом вычисления выражения. После этого выполняется выход из оператора. Если совпадения не произошло, выполняются операторы, расположенные после слова else, а при его отсутствии управление передается оператору, следующему за case.
Выражение после ключевого слова case должно быть порядкового типа, константы — того же типа, что и выражение. Чаще всего после ключевого слова case используется имя переменной. Перед каждой ветвью оператора можно записать одну или несколько констант через запятую или операцию диапазона, обозначаемую двумя идущими подряд точками, например:
case a of
4 : writeln('4');
5, 6 : writeln('5 или 6');
7..12 : writeln('от 7 до 12');
end;
Если по какой-либо ветви требуется записать не один, а несколько операторов, они заключаются в блок с помощью ключевых слов begin и end.
else не обязательно, рекомендуется всегда описывать случай, когда значение выражения не совпадает ни с одной из констант. Это облегчает поиск ошибок при отладке программы.Операторы цикла используются для вычислений, повторяющихся многократно. В Паскале имеется три вида циклов: while, repeat и цикл с параметром for. Каждый из них состоит из определенной последовательности операторов.
Блок, ради выполнения которого и организуется цикл, называется ). Один проход цикла называется итерацией.
(рис 2.5) Структурные схемы операторов цикла
Начальные установки служат для того, чтобы до входа в цикл задать значения переменных, которые в нем используются.
, , б ). Разница между ними состоит в том, что тело
Параметром цикла называется переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла. Количество повторений такого цикла можно определить заранее. Параметр есть не у всякого цикла. В так называемом итеративном цикле условие продолжения содержит переменные, значения которых изменяются в цикле по
Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue и goto. Передавать управление извне внутрь цикла не рекомендуется, потому что при этом могут не выполниться начальные установки.
Формат оператора прост:
while выражение do оператор
Выражение должно быть логического типа. Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равен true, выполняется расположенный после служебного слова do простой или составной оператор (напомню, что составной оператор заключается между begin и end ). Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания
begin и end.Пример. Программа, печатающая таблицу значений функции
$$\mathbf{Y} = \left( \begin{array}{ccc} t, ' x < 0 \\ tx, ' 0 <= x < 10 \\ 2t, ' x => 10 \\ \end{array} \right) $$для аргумента, изменяющегося в заданных пределах с заданным шагом.
Опишем алгоритм в словесной форме.
Шаги 3–6 повторяются многократно, поэтому для их выполнения надо организовать цикл.
Назовем необходимые нам переменные так: начальное значение аргумента — Xn,
конечное значение аргумента — Xk, шаг изменения аргумента — dX,
параметр — t. Все величины вещественные. Программа выводит таблицу, состоящую
из двух столбцов — значений аргумента и соответствующих им значений функции ().
program tabl_fun;
var
Xn, Xk : real; { начальное и конечное значение аргумента }
dX : real; { шаг изменения аргумента }
x, y : real; { текущие значения аргумента и функции }
t : real; { параметр }
begin
writeln('Введите Xn, Xk, dX, t'); { приглашение ко вводу данных }
readln(Xn, Xk, dX, t); { ввод исходных данных – шаг 1 }
writeln(' --------------------------- '); { заголовок таблицы }
writeln('| X | Y |');
writeln(' --------------------------- ');
x := Xn; { первое значение аргумента = Xn – шаг 2 }
while x <= Xk do begin { заголовок цикла – шаг 7 }
if x < 0 then y := t; { вычисление значения функции - шаг 4 }
if (x >= 0) and (x < 10) then y := t * x; { шаг 4 }
if x >= 10 then y := 2 * t; { шаг 4 }
writeln('|', x:9:2,' |', y:9:2,' |');{ вывод строки табл. – шаг 5 }
x := x + dX; { переход к следующему значению аргумента - шаг 6 }
end;
writeln(' --------------------------- ');
end.
Параметром этого цикла, то есть переменной, управляющей его выполнением, является х. Для правильной работы цикла необходимо присвоить параметру начальное значение до входа в цикл (шаг 2). Блок модификации параметра цикла представлен оператором, выполняющимся на шаге 6. Для перехода к следующему значению аргумента текущее значение наращивается на величину шага и заносится в ту же переменную.
Тело repeat и until, поэтому заключать его в блок не требуется.
repeat
тело цикла
until выражение
В отличие от цикла while, этот цикл будет выполняться, пока логическое выражение после слова until ложно. Как только результат выражения станет истинным, произойдет выход из цикла. Вычисление выражения выполняется в конце каждой итерации цикла.
Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз: например, если в
Пример. Программа, вычисляющая квадратный корень вещественного аргумента X с заданной точностью eps по итерационной формуле:
где y ( n –1) — предыдущее приближение к корню (в начале вычислений выбирается произвольно), y ( n ) — последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее, чем на )..
program square_root;
var X, eps, { аргумент и точность }
Yp, Y : real; { предыдущее и последующее приближение }
begin
repeat
writeln('Введите аргумент и точность (больше нуля): ');
readln(X, eps);
until (X > 0) and (eps > 0);
Y := 1;
repeat
Yp := Y;
Y := (Yp + X / Yp) / 2;
until abs(Y - Yp) < eps;
writeln('Корень из ', X:6:3, ' с точноcтью ', eps:7:5,
'равен ', Y:9:5);
end.
Этот оператор применяется, если требуется выполнить тело цикла заранее заданное количество раз. Параметр
for параметр := выражение_1 to выражение_2 do оператор for параметр := выражение_2 downto выражение_1 do оператор
Выражения должны быть совместимы по присваиванию с переменной цикла (о правилах совместимости мы поговорим в конце третьей лекции), оператор — простым или составным. Циклы с параметром обычно применяются при работе с массивами.
Пример 1. Программа выводит на экран числа от 10 до 1 и подсчитывает их сумму:
var i, sum : integer;
begin
sum := 0;
for i := 10 downto 1 do begin
writeln(i); inc(sum, i)
end;
writeln('Сумма чисел: ', sum);
end.
В этом цикле переменная i автоматически уменьшается на 1.
Пример 2. Программа выводит на экран символы от :
var ch : char;
begin
for ch := 'a' to 'z' do write(ch:2)
end.
Здесь счетчик цикла ch символьного типа поочередно принимает значение каждого символа от 'a' до 'z'.
begin и end.Выражения, определяющие начальное и конечное значения счетчика, вычисляются один раз до входа в цикл. Цикл for реализован в Паскале как
После нормального завершения цикла значение счетчика не определено. Фактически оно равно первому значению, для которого выполняется условие выхода из цикла, но использовать это в программах не рекомендуется. Также не следует изменять значение счетчика внутри цикла вручную, например:
for i := 1 to 10 do begin inc(i,3); ... end; { плохо! }
Это может привести к зацикливанию программы.
Часто встречающимися ошибками при программировании циклов являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись while истинным должно являться условие повторения вычислений, а в операторе repeat — условие их окончания.
Чтобы избежать ошибок, рекомендуется:
while и for требуется выполнить более одного оператора, нужно заключать их в блок;В Паскале есть несколько стандартных процедур, изменяющих последовательность выполнения операторов:
break — завершает выполнение цикла, внутри которого записана;continue — выполняет переход к следующей итерации цикла;exit — выполняет выход из программы или подпрограммы, внутри которой записана;halt — немедленно завершает выполнение программы.Кроме того, для передачи управления используется оператор перехода goto.
Рассмотрим пример применения процедуры передачи управления.
Пример. Программа вычисления значения функции sin x (синус) с помощью бесконечного ряда Тейлора с точностью $$\varepsilon$$ по формуле:
y = x - x3/3! + x5/5! - x7/7! +…
Этот ряд сходится при любых значениях аргумента. Точность достигается при |Rn| < ε, где Rn —остаточный член ряда, который для данного ряда можно заменить величиной Cn очередного члена ряда, прибавляемого к сумме.
Общий алгоритм прост: задать начальное значение суммы ряда, а затем многократно вычислять очередной член ряда и добавлять его к ранее найденной сумме, пока абсолютная величина очередного члена ряда не станет меньше заданной точности.
До выполнения программы предсказать, сколько членов ряда потребуется просуммировать, невозможно. В цикле такого рода есть опасность, что он никогда не завершится. Поэтому для надежности программы необходимо предусмотреть аварийный выход из цикла с печатью предупреждающего сообщения по достижении некоторого максимально допустимого количества итераций.
Прямое вычисление члена ряда по приведенной выше общей формуле, когда х возводится в степень, вычисляется факториал, а затем числитель делится на знаменатель, имеет два недостатка, которые делают этот способ непригодным: большая погрешность вычислений и их низкая эффективность. При вычислении очередного члена ряда предыдущий уже известен, поэтому следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий Cn+1 = Cn *T, где T — некоторый множитель. Подставив в эту формулу Cn и Cn+1 , получим выражение для вычисления Т:
Текст программы с комментариями приведен в ().
program ch;
const MaxIter = 500; { максимальное количество итераций }
var x, eps : double; { аргумент и точность }
c, y : double; { член ряда и его сумма }
n : integer; { номер члена ряда }
done : boolean; { признак достижения точности }
begin
writeln('Введите аргумент и точность:');
readln(x, eps);
done := true;
c := x; y := c; { первый член ряда и нач. значение суммы }
n := 0;
while abs(c) > eps do begin
c :=- c * sqr(x) /(2 * n + 2)/(2 * n + 3); { очередной член ряда }
y := y + c; { добавление члена ряда к сумме }
inc(n);
if n > MaxIter then begin { аварийный выход из цикла }
writeln('Ряд расходится!');
done := false; break
end
end;
if done then
writeln('Для аргумента ', x, ' значение функции: ', y, #13#10,
'вычислено с точностью', eps, ' за ', n, ' итераций');
readln;
end.
Этот оператор имеет простой синтаксис: в точке программы, из которой требуется организовать переход, после слова goto через пробел записывается имя метки, например goto 1 или goto error. При программировании на Паскале необходимость в применении оператора перехода возникает, как правило, в двух случаях:
Во всех остальных случаях следует преобразовать алгоритм так, чтобы он мог быть записан с помощью базовых конструкций.
Презентацию к данной работе Вы можете скачать здесь.
В
(рис 2.1) Базовые конструкции структурного программирования
Следование, ветвление и цикл называют базовыми конструкциями структурного программирования. Их особенностью является то, что любая из них имеет только один вход и один выход, поэтому они могут вкладываться друг в друга. Например, цикл может содержать следование из нескольких ветвлений, каждое из которых включает вложенные циклы.
Целью использования базовых конструкций является получение программы простой структуры. Такую программу легко читать, отлаживать и при необходимости модифицировать. Язык Паскаль способствует созданию хорошо
Операторы ветвления if и варианта case применяются для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case — на одну из произвольного числа ветвей.
Условный оператор if используется для разветвления процесса вычислений
на два направления. Структурная схема оператора приведена на рис 2.2. Формат оператора:
if выражение then оператор_1 [else оператор_2;]
Сначала вычисляется выражение, которое должно иметь логический тип. Если оно имеет
значение true, выполняется первый оператор, иначе — второй. После этого управление
передается на оператор, следующий за условным.
(рис 2.2) Структурная схема условного оператора
Oператоры, входящие в состав условного оператора, могут быть простыми или составными. Составной оператор ( блок ) обрамляется ключевыми словами begin и end. Блок применяют в том случае, когда по какой-либо ветви требуется выполнить несколько операторов: ведь иначе компилятор не сможет понять, где заканчивается ветвь и начинается следующая часть программы. Одна из ветвей может отсутствовать.
begin и end в ветви else компилятор как ошибку не распознает!Примеры условных операторов:
if a < 0 then b := 1; { 1 }
if (a < b) and ((a >d) or (a = 0)) then inc(b)
else begin
b := b * a; a := 0
end; { 2 }
if a < b then
if a < c then m := a else m := c
else
if b < c then m := b else m := c; { 3 }
В примере 1 отсутствует ветвь else. Такая конструкция называется 'пропуск оператора'.
Если требуется проверить несколько условий, их объединяют знаками логических операций.
Так, выражение в примере 2 будет истинно в том случае, если выполнится
одновременно условие a < b и хотя бы одно из условий a > d
и a = 0. Скобки, в которые заключены операции отношения, обязательны,
потому что приоритет у логических операций выше, чем у операций отношения.
Поскольку по ветви else требуется выполнить два оператора, они заключены в блок.
В примере 3 вычисляется наименьшее из значений трех переменных a, b и с.
0 < x < 1 нельзя
записать непосредственно. Правильный способ: if(0 < x) and (x < 1) then …,
поскольку фактически требуется задать проверку выполнения одновременно двух условий: x > 0 и x < 1.Пример. Программа, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика (рис 2.3).
(рис 2.3) Функция, заданная в виде графика
Составим описание алгоритма в неформальном словесном виде.
х.y по соответствующей формуле.х и y.Второй пункт алгоритма следует детализировать. Сначала запишем определение функции в виде формул.
$$\mathbf{Y} = \left( \begin{array}{ccccc} 0, ' x < -2 \\ -2-x, ' -2 <= x < -1 \\ x, ' -1 < x < 1 \\ -x+2, ' 1 <= x < 2 \\ 0, ' x => 2 \end{array} \right) $$Теперь в соответствии с формулами опишем словами последовательность действий второго пункта алгоритма:
x < –2, присвоить переменной y значение 0–2 <= x < –1, присвоить переменной y значение –x – 2.–1 <= x < 1, присвоить переменной y значение x.И так далее.
Теперь шаги алгоритма представлены максимально подробно, поэтому можно приступать к написанию программы ().
program calc_function_1;
var x, y : real;
begin
writeln(' Введите значение аргумента'); readln(x);
if x < –2 then y := 0;
if (x >= –2) and (x < –1) then y := –x – 2;
if (x >= –1) and (x < 1) then y := x;
if (x >= 1) and (x < 2) then y := –x + 2;
if x >= 2 then y := 0;
writeln('Для x = ', x:6:2, ' значение функции y = ', y:6:2);
end.
Тестовые примеры для этой программы должны включать по крайней мере по одному значению аргумента из каждого интервала, а для проверки граничных условий — еще и все точки перегиба (если это кажется вам излишним, попробуйте в предпоследнем условии 'забыть' знак =, а затем ввести значение х, равное 1.
Следует избегать проверки вещественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом. Это связано с погрешностью представления вещественных значений в памяти. Значение величины, с которой сравнивается модуль разности, следует выбирать в зависимости от решаемой задачи и точности переменных, участвующих в выражении. Пример:
const eps = 1e-6; { Требуемая точность вычислений }
var x, y : real;
...
if (x = y) then writeln('Величины x и y равны'); { Плохо! Ненадежно! }
if (abs(x - y) < eps) then writeln('Величины x и y равны'); { Рекомендуется }
Большого количества вложенных условных операторов также следует избегать, потому что они делают программу совершенно нечитабельной.
Оператор варианта (выбора) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведена на рис 2.4. Формат оператора:
case выражение of
константы_1 : оператор_1;
константы_2 : оператор_2;
константы_n : оператор_n;
[ else : оператор ]
end;
(рис 2.4) Структурная схема оператора выбора
Выполнение оператора выбора начинается с вычисления выражения. Затем управление передается на оператор, помеченный константами, значение одной из которых совпало с результатом вычисления выражения. После этого выполняется выход из оператора. Если совпадения не произошло, выполняются операторы, расположенные после слова else, а при его отсутствии управление передается оператору, следующему за case.
Выражение после ключевого слова case должно быть порядкового типа, константы — того же типа, что и выражение. Чаще всего после ключевого слова case используется имя переменной. Перед каждой ветвью оператора можно записать одну или несколько констант через запятую или операцию диапазона, обозначаемую двумя идущими подряд точками, например:
case a of
4 : writeln('4');
5, 6 : writeln('5 или 6');
7..12 : writeln('от 7 до 12');
end;
Если по какой-либо ветви требуется записать не один, а несколько операторов, они заключаются в блок с помощью ключевых слов begin и end.
else не обязательно, рекомендуется всегда описывать случай, когда значение выражения не совпадает ни с одной из констант. Это облегчает поиск ошибок при отладке программы.Операторы цикла используются для вычислений, повторяющихся многократно. В Паскале имеется три вида циклов: while, repeat и цикл с параметром for. Каждый из них состоит из определенной последовательности операторов.
Блок, ради выполнения которого и организуется цикл, называется ). Один проход цикла называется итерацией.
(рис 2.5) Структурные схемы операторов цикла
Начальные установки служат для того, чтобы до входа в цикл задать значения переменных, которые в нем используются.
, , б ). Разница между ними состоит в том, что тело
Параметром цикла называется переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла. Количество повторений такого цикла можно определить заранее. Параметр есть не у всякого цикла. В так называемом итеративном цикле условие продолжения содержит переменные, значения которых изменяются в цикле по
Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue и goto. Передавать управление извне внутрь цикла не рекомендуется, потому что при этом могут не выполниться начальные установки.
Формат оператора прост:
while выражение do оператор
Выражение должно быть логического типа. Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равен true, выполняется расположенный после служебного слова do простой или составной оператор (напомню, что составной оператор заключается между begin и end ). Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания
begin и end.Пример. Программа, печатающая таблицу значений функции
$$\mathbf{Y} = \left( \begin{array}{ccc} t, ' x < 0 \\ tx, ' 0 <= x < 10 \\ 2t, ' x => 10 \\ \end{array} \right) $$для аргумента, изменяющегося в заданных пределах с заданным шагом.
Опишем алгоритм в словесной форме.
Шаги 3–6 повторяются многократно, поэтому для их выполнения надо организовать цикл.
Назовем необходимые нам переменные так: начальное значение аргумента — Xn,
конечное значение аргумента — Xk, шаг изменения аргумента — dX,
параметр — t. Все величины вещественные. Программа выводит таблицу, состоящую
из двух столбцов — значений аргумента и соответствующих им значений функции ().
program tabl_fun;
var
Xn, Xk : real; { начальное и конечное значение аргумента }
dX : real; { шаг изменения аргумента }
x, y : real; { текущие значения аргумента и функции }
t : real; { параметр }
begin
writeln('Введите Xn, Xk, dX, t'); { приглашение ко вводу данных }
readln(Xn, Xk, dX, t); { ввод исходных данных – шаг 1 }
writeln(' --------------------------- '); { заголовок таблицы }
writeln('| X | Y |');
writeln(' --------------------------- ');
x := Xn; { первое значение аргумента = Xn – шаг 2 }
while x <= Xk do begin { заголовок цикла – шаг 7 }
if x < 0 then y := t; { вычисление значения функции - шаг 4 }
if (x >= 0) and (x < 10) then y := t * x; { шаг 4 }
if x >= 10 then y := 2 * t; { шаг 4 }
writeln('|', x:9:2,' |', y:9:2,' |');{ вывод строки табл. – шаг 5 }
x := x + dX; { переход к следующему значению аргумента - шаг 6 }
end;
writeln(' --------------------------- ');
end.
Параметром этого цикла, то есть переменной, управляющей его выполнением, является х. Для правильной работы цикла необходимо присвоить параметру начальное значение до входа в цикл (шаг 2). Блок модификации параметра цикла представлен оператором, выполняющимся на шаге 6. Для перехода к следующему значению аргумента текущее значение наращивается на величину шага и заносится в ту же переменную.
Тело repeat и until, поэтому заключать его в блок не требуется.
repeat
тело цикла
until выражение
В отличие от цикла while, этот цикл будет выполняться, пока логическое выражение после слова until ложно. Как только результат выражения станет истинным, произойдет выход из цикла. Вычисление выражения выполняется в конце каждой итерации цикла.
Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз: например, если в
Пример. Программа, вычисляющая квадратный корень вещественного аргумента X с заданной точностью eps по итерационной формуле:
где y ( n –1) — предыдущее приближение к корню (в начале вычислений выбирается произвольно), y ( n ) — последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее, чем на )..
program square_root;
var X, eps, { аргумент и точность }
Yp, Y : real; { предыдущее и последующее приближение }
begin
repeat
writeln('Введите аргумент и точность (больше нуля): ');
readln(X, eps);
until (X > 0) and (eps > 0);
Y := 1;
repeat
Yp := Y;
Y := (Yp + X / Yp) / 2;
until abs(Y - Yp) < eps;
writeln('Корень из ', X:6:3, ' с точноcтью ', eps:7:5,
'равен ', Y:9:5);
end.
Этот оператор применяется, если требуется выполнить тело цикла заранее заданное количество раз. Параметр
for параметр := выражение_1 to выражение_2 do оператор for параметр := выражение_2 downto выражение_1 do оператор
Выражения должны быть совместимы по присваиванию с переменной цикла (о правилах совместимости мы поговорим в конце третьей лекции), оператор — простым или составным. Циклы с параметром обычно применяются при работе с массивами.
Пример 1. Программа выводит на экран числа от 10 до 1 и подсчитывает их сумму:
var i, sum : integer;
begin
sum := 0;
for i := 10 downto 1 do begin
writeln(i); inc(sum, i)
end;
writeln('Сумма чисел: ', sum);
end.
В этом цикле переменная i автоматически уменьшается на 1.
Пример 2. Программа выводит на экран символы от :
var ch : char;
begin
for ch := 'a' to 'z' do write(ch:2)
end.
Здесь счетчик цикла ch символьного типа поочередно принимает значение каждого символа от 'a' до 'z'.
begin и end.Выражения, определяющие начальное и конечное значения счетчика, вычисляются один раз до входа в цикл. Цикл for реализован в Паскале как
После нормального завершения цикла значение счетчика не определено. Фактически оно равно первому значению, для которого выполняется условие выхода из цикла, но использовать это в программах не рекомендуется. Также не следует изменять значение счетчика внутри цикла вручную, например:
for i := 1 to 10 do begin inc(i,3); ... end; { плохо! }
Это может привести к зацикливанию программы.
Часто встречающимися ошибками при программировании циклов являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись while истинным должно являться условие повторения вычислений, а в операторе repeat — условие их окончания.
Чтобы избежать ошибок, рекомендуется:
while и for требуется выполнить более одного оператора, нужно заключать их в блок;В Паскале есть несколько стандартных процедур, изменяющих последовательность выполнения операторов:
break — завершает выполнение цикла, внутри которого записана;continue — выполняет переход к следующей итерации цикла;exit — выполняет выход из программы или подпрограммы, внутри которой записана;halt — немедленно завершает выполнение программы.Кроме того, для передачи управления используется оператор перехода goto.
Рассмотрим пример применения процедуры передачи управления.
Пример. Программа вычисления значения функции sin x (синус) с помощью бесконечного ряда Тейлора с точностью $$\varepsilon$$ по формуле:
y = x - x3/3! + x5/5! - x7/7! +…
Этот ряд сходится при любых значениях аргумента. Точность достигается при |Rn| < ε, где Rn —остаточный член ряда, который для данного ряда можно заменить величиной Cn очередного члена ряда, прибавляемого к сумме.
Общий алгоритм прост: задать начальное значение суммы ряда, а затем многократно вычислять очередной член ряда и добавлять его к ранее найденной сумме, пока абсолютная величина очередного члена ряда не станет меньше заданной точности.
До выполнения программы предсказать, сколько членов ряда потребуется просуммировать, невозможно. В цикле такого рода есть опасность, что он никогда не завершится. Поэтому для надежности программы необходимо предусмотреть аварийный выход из цикла с печатью предупреждающего сообщения по достижении некоторого максимально допустимого количества итераций.
Прямое вычисление члена ряда по приведенной выше общей формуле, когда х возводится в степень, вычисляется факториал, а затем числитель делится на знаменатель, имеет два недостатка, которые делают этот способ непригодным: большая погрешность вычислений и их низкая эффективность. При вычислении очередного члена ряда предыдущий уже известен, поэтому следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий Cn+1 = Cn *T, где T — некоторый множитель. Подставив в эту формулу Cn и Cn+1 , получим выражение для вычисления Т:
Текст программы с комментариями приведен в ().
program ch;
const MaxIter = 500; { максимальное количество итераций }
var x, eps : double; { аргумент и точность }
c, y : double; { член ряда и его сумма }
n : integer; { номер члена ряда }
done : boolean; { признак достижения точности }
begin
writeln('Введите аргумент и точность:');
readln(x, eps);
done := true;
c := x; y := c; { первый член ряда и нач. значение суммы }
n := 0;
while abs(c) > eps do begin
c :=- c * sqr(x) /(2 * n + 2)/(2 * n + 3); { очередной член ряда }
y := y + c; { добавление члена ряда к сумме }
inc(n);
if n > MaxIter then begin { аварийный выход из цикла }
writeln('Ряд расходится!');
done := false; break
end
end;
if done then
writeln('Для аргумента ', x, ' значение функции: ', y, #13#10,
'вычислено с точностью', eps, ' за ', n, ' итераций');
readln;
end.
Этот оператор имеет простой синтаксис: в точке программы, из которой требуется организовать переход, после слова goto через пробел записывается имя метки, например goto 1 или goto error. При программировании на Паскале необходимость в применении оператора перехода возникает, как правило, в двух случаях:
Во всех остальных случаях следует преобразовать алгоритм так, чтобы он мог быть записан с помощью базовых конструкций.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.