Задача табулирования функции предполагает получение таблицы значений функции при изменении аргумента с фиксированным шагом. В качестве исходной информации должны быть заданы: Х0, Хn – начало и конец промежутка табулирования, при этом (Х0< Хn); n – число шагов разбиения промежутка [Х0, Xn]; F(X) – описание табулируемой функции.
При составлении алгоритма предполагается, что X – текущее значение аргумента; h – шаг изменения аргумента (иногда его называют шагом табуляции функции); i – текущий номер точки, в которой вычисляются функция (i = 0 .. n).
Количество интервалов n, шаг табуляции h и величины Х0, Хn связаны между собой фор-мулой:
Интерпретация переменных (т. е. их обозначение в математической постановке задачи, смысл и тип, обозначения в блок-схеме и программе) приведена в таблице имен.
Пример 17. Табулировать функцию F(X) в N равноотстоящих точках, заданную на промежутке [Х0, Xn], где
PROGRAM PR17;
VAR
I, N: INTEGER;
X, Y: REAL;
H, X0, XN: REAL;
BEGIN
WRITELN(‘ВВЕДИТЕ X0, XN, N’);
READLN(X0, XN, N);
H := (XN — X0)/N;
FOR I:=0 TO N
DO BEGIN
Y:= SIN(X+1)*EXP(2-X*X);
X := X0 + I * H;
WRITELN (X:4:1,»,Y:9:6)
END
END.
Теперь запишем решение этой же задачи, но с использованием цикла While…DO.
PROGRAM PR17_while;
VAR
N: INTEGER;
X, Y: REAL;
H, X0, XN: REAL;
BEGIN
WRITELN(‘ВВЕДИТЕ X0, XN, N’);
READLN(X0, XN, N);
H := (XN — X0)/N;
X:=X0;
WHILE X<=XN
DO BEGIN
Y:= SIN(X+1)*EXP(2-X*X);
X := X + H;
WRITELN (X:4:1,»,Y:9:6)
END
END.
Предыдущая статья: Примеры использования различных операторов цикла.
Оглавление: Лекции по Pascal.
Следующая статья: Арифметический цикл с рекуррентной зависимостью.
На занятии изучается работа в Паскаль с циклом for — цикл с параметром или счетчиком. Рассматриваются примеры работы операторов Continue и Break в Паскале
Содержание:
- Цикл со счетчиком в Паскаль (цикл for)
- Pascal: выход из цикла
- Break и Continue
- Произвольный шаг в цикле for
- Табулирование функции на отрезке с заданным шагом
- Exit и Halt
Цикл со счетчиком или, как он еще называется — цикл с параметром в Паскале служит для организации повторений (итераций) с заранее известным их количеством, т.е. когда точно известно, сколько раз должны выполниться операторы тела цикла.
Блок-схема, соответствующая циклу For:
Ну или если на простом примере:
Пример: вывести пять раз слово «Привет!»
Паскаль цикл For: синтаксис:
Прямое направление цикла (от меньшего значения к большему):
{при движении от меньшего значения к большему, например, от 1 до 10} for счетчик:=значение to конечное_значение do тело_цикла;Обратное направление (от большего к меньшему):
{при движении от большего значения к меньшему, например, от 10 до 1} for счетчик:=значение downto конечное_значение do тело_цикла;
Решение на Паскале:
Оператор в теле конструкции может быть одиночным или составным оператором.
Счетчик цикла или параметр цикла — это обычная переменная, которая может быть только порядкового (целочисленного, символьного, логического) или перечислимого типа.
При прямом направлении цикла счетчик в каждой итерации увеличивается на единицу, при обратном направлении — уменьшается на единицу.
Важно знать: счетчик (параметр цикла) нельзя изменять внутри тела цикла! Кроме того, нельзя менять его начальное и конечное значения.
PascalABC.NET
:
for [var] i: integer := 1 to 5 do <оператор>
for var i := 1 to 5 do <оператор>
Значение переменной цикла после завершения цикла будет не определено (локальная).
Рассмотрим на решенном примере, как используется в Паскаль цикл for:
Пример: Печатать «ноль» указанное количество раз
Pascal | PascalABC.NET | ||||
|
|
Более детально цикл со счетчиком в Паскале рассмотрен в видеоуроке:
Пример: Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b). Реализовать двумя способами: 1. переменная цикла должна увеличиваться и 2. переменная цикла должна уменьшаться.
Решение в виде блок-схемы:
Решение на Паскале:
Задача 8. Найти среднее арифметическое чисел в Паскале, числа вводятся с клавиатуры, их количество произвольно. Использовать цикл for
[Название файла: L3task8.pas
]
Задача 9. Составить блок-схему по программе нахождения среднего арифметического в pascal.
[Название файла: L3task9.pas
]
Пример: Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.
Решение:
Pascal: выход из цикла
Break и Continue
Для выхода из цикла предусмотрена процедура break
в Паскале. Break
досрочно прекращает выполнение циклов while
, repeat
и for
.
Процедура Continue
досрочно выходит из текущей итерации цикла, но, не завершая его, а переходя к следующей итерации.
Рассмотрим использование процедур выхода из цикла Continue и Break в Паскале (будем использовать цикл while
):
Пример: Программа вывода на экран степеней двойки с использованием процедур break
и continue
1 2 3 4 5 6 7 8 9 10 11 |
var a:integer; begin a:=1; while a<1000 do begin a:=a*2; if a=64 then continue; if a=256 then break; write(a:4); {4 позиции на вывод каждого числа} end; end. |
В результате программы на экране будут напечатаны: 2 4 8 16 32 128.
Число 64 пропущено, так как при условии a=64
происходит выход из текущей итерации (continue
) и число не выводится на экран, а при a=256
выполнение цикла прерывается окончательно (break
), так и не распечатав число 256.
Задача 10. Решить рассмотренную задачу с процедурами break
и continue
для циклов repeat
и for
[Название файла: L3task10.pas
]
Произвольный шаг в цикле for
Пример:
Выполнить: Выведите все двухзначные нечетные числа от 11 до 21.
Примерный результат:
11 13 15 17 19 21
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
loop
Задание 1 (step):
Выполнить: Выведите последовательность 3 5 7 9 … 21 (от 3 до 21 с шагом = 2). Выполнить дважды: с циклом loop
и циклом for
.
Фрагмент программы:
begin println('результат с циклом loop'); var ...; loop ...; ... println('результат с циклом FOR'); for var ... ... end.
[Файл: task-01step.pas
]
Задание 2 (step):
Выполнить: Вывести последовательность: 20 18 16 … 2 (от 20 до 2 с шагом = 2). Выполнить дважды: с циклом loop
и циклом for
.
[Файл: task-02step.pas
]
Пример 3:
Выполнить: Вывести последовательность: 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0.
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
Задание 3 (step):
Выполнить: Вывести последовательность 0.1 0.3 0.5 0.7 0.9 1.1. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
0.1 0.3 0.5 0.7 0.9 1.1
[Файл: task-03step.pas
]
Табулирование функции на отрезке с заданным шагом
* Следует учесть, что эта тема не обязательна для школьного курса информатики, в основном предполагается ознакомление студентами.
Табулирование функции одной переменной
Пример: На отрезке [a,b] с шагом h протабулировать функцию f(x)=x2+Ln|x|
и вывести на печать значения этой функции.
Алгоритм:
Для решения задачи в области определения функции вводится сетка – совокупность точек:
{x0, x1, x2, …, xi}, где x0 = а, x1= x0+h, …, xi = xi-1+h, xn = b.
Тогда задача сводится к вычислению функции f в точках xi, то есть нужно вычислить:
f(x0), f(x1), …, f(xi), f(xn)
✍ Решение:
Pascal | PascalABC.NET | ||||
|
|
Пример: Вычислить 7 значений функций
0.15x + a y= ----------- a2 + x2
где начальное значение а=0.14х, шаг Δа=0.22
Результаты для x = 2:
a =0.28 y = 0.142212632404865 a =0.5 y = 0.188235294117647 a =0.72 y = 0.225743626062323 a =0.94 y = 0.253911049225981 a =1.16 y = 0.273121819814427 a =1.38 y = 0.284533568186437 a =1.6 y = 0.289634146341463
✍ Решение:
var x, a, y, h: real; i:integer; begin writeln('ведите x'); readln(x); h:=0.22; a := 0.14*x; for i:=1 to 7 do begin y := (0.15*x + a)/(sqr(a)+sqr(x)); writeln('a =', a, ' y = ', y); a := a + h; end end.
Табулирование функции двух переменных
Пример: На интервале xn≤x≤xk с шагом Δх, для каждого у из интервала уn≤y≤yk с шагом Δу вычислить значение функции f=x2+ln|y|
.
Например:
если xn = 2; xk = 3 уn = -1; yk = 1 шаг Δх = 1, шаг Δy = 0.5 то f1 = 22+ln|-1| = 4 f2 = 22+ln|-0.5|= 3.30685281944005 ...
Результат:
x= 2 y= -1 f= 4 x= 2 y= -0.5 f= 3.30685281944005 x= 2 y= 0 f= -∞ x= 2 y= 0.5 f= 3.30685281944005 x= 2 y= 1 f= 4 x= 3 y= -1 f= 9 x= 3 y= -0.5 f= 8.30685281944005 x= 3 y= 0 f= -∞ x= 3 y= 0.5 f= 8.30685281944005 x= 3 y= 1 f= 9
✍ Решение:
var xn, xk, yn, yk, f, hx, hy,x,y: real; begin writeln('отрезок для x от ... и до ...'); readln(xn, xk); writeln('отрезок для y от ... и до ...'); readln(yn, yk); writeln('шаг для x'); readln(hx); writeln('шаг для y'); readln(hy); x := xn; y := yn; while x <= xk do begin while y <= yk do begin f := sqr(x) + ln(abs(y)); writeln('x= ', x, ' y= ', y, ' f= ', f); y := y + hy; end; x := x + hx; y:=yn; end end.
Задача 11:
Вычислить значение функции:
z(x, у) = sin x + cos y
при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
Результат:
x=-1.00 y=0.00 z=0.16 x=-1.00 y=0.10 z=0.15 x=-1.00 y=0.20 z=0.14 x=-1.00 y=0.30 z=0.11 x=-1.00 y=0.40 z=0.08 x=-1.00 y=0.50 z=0.04 x=-1.00 y=0.60 z=-0.02 x=-1.00 y=0.70 z=-0.08 x=-1.00 y=0.80 z=-0.14 x=-1.00 y=0.90 z=-0.22 x=-1.00 y=1.00 z=-0.30 x=-0.80 y=0.00 z=0.28 ...
Дополните код в местах, где стоят троеточия:
var x, y, z: real; // описание переменных begin writeln('x y z(x,y)'); x := -1.0; y := ...; // начальное значение while (x <= 1) do begin while (...) do //запуск внутреннего цикла begin z := sin(x) + cos(y); write(' x=', x:3:2, ' y=', y:3:2, ' z=', z:3:2 ); y := y + ...; writeln(); end; writeln(); x := ...; // изменение параметра х на шаг y:= 0; end end.
[Название файла: L3task11.pas
]
Exit и Halt
Процедура Pascal Exit
служит для завершения работы того программного блока, в котором она используется (условный оператор, цикл, процедура…). Если Exit
вызывается внутри процедуры или функции, то завершается работа данной процедуры/функции. Если процедура Exit
находится в основном блоке программы, то это приводит к ее завершению.
Процедура halt
в pascal завершает работу программы.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
Составить программу табулирования функции y=x*sin(x) на отрезке [a, b] с шагом h=(b-a)/m, где m – заданное число. Где a = 0, b = 3*PI, m = 10;
Рассмотрим решение задачи с помощью различных видов циклов.
Решение с помощью цикла Пока
Блок-схема:
Исходный код:
program lr4_1a; var a, m, i: integer; var b, h, x, y: real; begin a := 0; b := 3 * Pi; m := 10; h := (b - a) / m; x := 0; i := 0; while x < b do begin x := (h * i); y := x * Sin(x); writeln(x / Pi, 'Pi - значение ' + Round(y, 2)); i := i + 1; end; end.
Протокол работы:
Решение с помощью цикла До
Исходный код:
program lr4_1b; var a, m, i: integer; var b, h, x, y: real; begin a := 0; b := 3 * Pi; m := 10; h := (b - a) / m; x := 0; i := 0; repeat begin x := (h * i); y := x * Sin(x); writeln(x / Pi, 'Pi - значение ' + Round(y, 2)); i := i + 1; end until x >= b; end.
Резльтаты работы программы эквивалентны приведенымм выше.
Итак, основное
назначение циклов — обработка большого
объема данных. Математически эта
обработка зачастую сводится к поиску,
выбору и статистической обработке
нужных величин. Практически в любой
реальной задаче мы ищем максимальные
и минимальные значения в наборе данных,
суммируем или перемножаем требуемые
данные, определяем арифметическое
среднее или количество элементов,
отвечающих условию. Для решения всех
этих распространенных задач существуют
типовые
алгоритмы,
задающие правила выполнения соответствующих
расчетов. Изучением этих алгоритмов мы
займемся в гл. 11 и 12.
Разумеется,
настоящие задачи, встающие перед
программистами, значительно сложнее,
чем приведенные далее примеры, но из
типовых алгоритмов, как из кирпичиков,
строится здание любой сложной программы.
11.1. Алгоритм табулирования
Применяется для
составления всевозможных таблиц,
которыми могут быть как абстрактная
таблица значений математической функции,
так и конкретная таблица стоимости
товара или платежей, совершенных
абонентом сотового оператора.
В общем виде
алгоритм можно описать так:
1.
до цикла
задается начальное значение управляющей
переменной, условием выхода из цикла
служит достижение управляющей переменной
конечного значения;
2.
в теле цикла
на каждом шаге вычисляется очередное
значение функции, зависящее от управляющей
переменной, затем формируется строка
таблицы;
3.
в конце шага
цикла значение управляющей переменной
(обозначим ее x)
изменяется оператором вида x:=x+d;,
где d
— заданный шаг по управляющей переменной.
В качестве примера
составим таблицу синусов в пределах от
0
до π с шагом по аргументу 0.25.
Обозначим аргумент как x,
значение синуса от x
обозначим как y.
В простейшем случае программа табулирования
может выглядеть так:
var
x,y:real;
begin
writeln(‘x’:10,’sin(x)’:10);
{печать
заголовка таблицы до цикла}
x:=0;
{начальное значение аргумента}
while
x<=pi+1e-6
do begin
y:=sin(x);
{вычисление функции}
writeln
(x:10:2, y:10:2);
{печать
строки таблицы}
x:=x+0.25;
{шаг по x}
end;
end.
«Расширим»
задачу за счет использования произвольных
границ изменения аргумента и произвольного
шага, а также выполнения всех необходимых
проверок корректности. Пусть, например,
требуется составить таблицу значений
следующей функции:
,
значения
a,
b
вводятся пользователем.
Напишем текст
программы, сопроводив его соответствующими
комментариями.
var
x,f,a,b,dx:real;
n:integer;
{счетчик выведенных строк}
begin
repeat
{Цикл ввода с контролем
правильности
значений: a,dx,b должны быть
числами,
dx>0, a+dx должно быть меньше b}
writeln
(‘Введите
a,dx,b:’);
{$I-}read
(a,dx,b);{$I+}
if
IoResult <> 0 then begin
writeln
(‘Вы
не
ввели
3 числовых
‘,
‘значения,
попробуем еще раз’);
continue;
end;
if
(dx<=0) or (a+dx>=b) then begin
writeln
(‘Вы не ввели допустимые ‘,
‘данные,
попробуем еще раз’);
continue;
end
else
break;
until
false;
{Печать
заголовка
таблицы}
writeln;
writeln
(‘x’:10,’f(x)’:10);
x:=a;
n:=2;
{2 строки уже использованы}
while
x<=b+1e-6 do begin
{в
условии цикла учитываем возможную
погрешность
работы с real!}
if
x<=0 then f:=sqr(x)*x
else
f:=exp(1/3*ln(abs(x)));
{корень
3 степени взяли через exp и ln}
writeln
(x:10:2,f:10:2);
n:=n+1;
if
n=24 then begin
{На
экране консоли по умолчанию 25
строк}
write
(‘Нажмите
Enter…’);
reset
(input); readln;
n:=1;
end;
x:=x+dx;
end;
writeln
(‘Таблица
выведена’);
reset
(input); readln;
end.
Как видно из
примера, основной порядок действий —
такой же, как в предыдущей задаче. Так
как экран консоли по умолчанию содержит
всего 25 строк, с помощью переменной n
мы дополнительно контролируем число
уже выведенных строк и делаем по
заполнении экрана паузу до нажатия
пользователем клавиши Enter.
Разумеется, другие
изученные нами виды циклов также могут
применяться при табулировании. Рассмотрим
в качестве примера следующую задачу.
Известна стоимость
единицы товара. Составить таблицу
стоимости 1, 2, …, K
единиц товара, значение K
вводится.
Так как число
единиц товара — заведомо целое, при
программировании задачи будет удобен
цикл for:
var
t:real;
i,k:integer;
begin
writeln;
writeln
(‘Стоимость единицы товара:’);
read
(t);
writeln
(‘Количество единиц товара:’);
read
(k);
writeln
(‘Единиц’:10,’Стоимость’:10);
for
i:=1 to k do
writeln
(i:10,(i*t):10:2);
end.
Здесь для простоты
мы исключили сделанные в предыдущем
примере проверки. Стоимость единицы
товара обозначена t,
переменная i
необходима для перебора возможных
значений единиц товара в цикле for.
Поскольку счетчик цикла for
автоматически меняется с шагом 1, а
оператором writeln
можно выводить не только значения
переменных, но и выражения, основной
цикл программы состоит из одного
оператора и не нуждается в операторных
скобках.
Соседние файлы в папке учебники по паскалю
- #
- #
- #
- #
- #
10 / 10 / 4 Регистрация: 21.11.2009 Сообщений: 187 |
|
1 |
|
Табулирование функции05.01.2010, 22:38. Показов 8585. Ответов 12
1. Паскаль — программа определения попадания точки в заданный интервал.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
05.01.2010, 22:38 |
Ответы с готовыми решениями: Табулирование функции
12 |
4341 / 1473 / 680 Регистрация: 12.03.2009 Сообщений: 5,310 |
|
05.01.2010, 22:43 |
2 |
CFYZ, а подробней условия нельзя?
0 |
10 / 10 / 4 Регистрация: 21.11.2009 Сообщений: 187 |
|
05.01.2010, 22:45 [ТС] |
3 |
Это и есть все условия, такие вопросы будут на экзамене.
0 |
WolfCF 3310 / 1372 / 110 Регистрация: 28.04.2009 Сообщений: 4,822 |
||||
06.01.2010, 08:05 |
4 |
|||
4. Паскаль-программа табулирования функции. функция y(x)=(x-2)^2-18 на интервале [-3;6]
Добавлено через 1 минуту
9. Паскаль-программа вычисления произведения матриц. https://www.cyberforum.ru/pasc… 42353.html
1 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
06.01.2010, 08:58 |
5 |
Программа подсчета среднего числа букв в книге. Это круто! Я пока такой программы не видел.
0 |
CFYZ 10 / 10 / 4 Регистрация: 21.11.2009 Сообщений: 187 |
||||
06.01.2010, 15:37 [ТС] |
6 |
|||
up Добавлено через 2 часа 26 минут
1. Паскаль — программа определения попадания точки в заданный интервал. Может кому-то, кроме меня, понадобится еще
0 |
10 / 10 / 4 Регистрация: 21.11.2009 Сообщений: 187 |
|
09.01.2010, 13:24 [ТС] |
7 |
Подскажите как решить задачу 6. Паскаль-программа вычисления значений полинома по схеме Горнера.
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
09.01.2010, 13:53 |
8 |
CFYZ, Понимаю что тебя в Гугле забанили, поэтому спешу помочь. Вот здесь изложен метод и есть код на Паскале с примерами.
0 |
10 / 10 / 4 Регистрация: 21.11.2009 Сообщений: 187 |
|
12.01.2010, 18:33 [ТС] |
9 |
А вот эти, кто может сделать?
0 |
3310 / 1372 / 110 Регистрация: 28.04.2009 Сообщений: 4,822 |
|
12.01.2010, 18:35 |
10 |
7. Текстовые файлы. Программа подсчета среднего числа букв в книге. 5 пост читали?
0 |
ЧакЭ одобряЭ 285 / 284 / 86 Регистрация: 27.12.2009 Сообщений: 1,767 |
|
12.01.2010, 18:42 |
11 |
может быть в файле книга.
0 |
10 / 10 / 4 Регистрация: 21.11.2009 Сообщений: 187 |
|
12.01.2010, 22:36 [ТС] |
12 |
Скорей всего так и есть, может имеется ввиду программа которая будет подсчитывать количество символов в любом текстовом файле.
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
15.01.2010, 22:34 |
13 |
CFYZ, А чего ты апаешь, карточку еще хочешь? Ты сам прочитай на свои идиотские вопросы, как по ним писать программы, если там практически нет никаких данных для этого. А чисто теоретически, лазь по форуму, ищи похожие и изучай.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
15.01.2010, 22:34 |
13 |