Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Тема - программирование циклических вычислительных процессов с использованием операторов, реализующих базовые структуры цикла.
Цель работы - освоить на практике программирование простейших циклических процессов, используя для этого операторы цикла, научиться отладке программ и подготовке тестов для этой отладки.
Общие сведения
Циклическая структура процесса вычислений предполагает, что для получения результата некоторые действия необходимо выполнить несколько раз. Например, чтобы получить таблицу значений функции на заданном интервале изменения аргумента с заданным шагом, необходимо соответствующее количество раз определить следующее значение аргумента и вычислить для него значение функции. Другой пример. Чтобы найти фамилию человека в списке, надо проверить первую фамилию списка, затем вторую, третью и т. д. до тех пор, пока не будет найдена нужная или не будет достигнут конец списка. Такие повторяющиеся действия называются циклами.
Процессы вычислений циклической структуры можно разделить на три группы:
- циклические процессы, для которых количество повторений известно счетные циклы или циклы с заданным числом повторений;
- циклические процессы, завершающиеся по достижении или нарушении некоторых условий итерационные циклы;
- циклические процессы, для которых возможны два варианта выхода из цикла: выход по завершении циклического процесса и досрочный выход по какому-либо дополнительному условию поисковые циклы.
Графические элементы структуры цикла:
1. Цикл с заранее известным числом повторений (рис.1)
Рис.1
2. Цикл с постусловием (рис.2)
Рис.2
3. Цикл с предусловием (рис.3)
Рис.3
Для реализации циклических процессов используют операторы циклов.
1. Цикл с заранее известным числом повторений реализуется с помощью оператора цикла for. Оператор цикла for организует выполнение одного оператора заранее известное число раз.
Существует два варианта этого оператора:
а) for i := i1 to i2 do A ;
б) for i := i1 downto i2 do A .
В этих операторах:
i - параметр цикла, являющийся переменной порядкового типа (чаще всего integer; вещественный тип не допускается);
i1 - выражение, определяющее начальное значение параметра цикла;
i2 - выражение, определяющее конечное значение параметра цикла;
A - простой или составной выполняемый оператор (тело цикла).
i1 и i2 должны быть совместимы для присваивания с параметром цикла.
Цикл действует таким образом. Сначала вычисляются и запоминаются начальное i1 и конечное i2 значения параметра цикла. Далее параметру цикла i присваивается начальное значение i1. Затем значение параметра цикла i сравнивается со значением i2. Далее, пока параметр цикла меньше или равен конечному значению (в первом варианте оператора), или больше или равен конечному значению (во втором варианте), выполняется очередная итерация цикла; в противном случае происходит выход из цикла. Выполнение очередной итерации включает в себя сначала выполнение оператора A (тела цикла), а затем присваивание параметру цикла следующего, бóльшего, значения (в первом варианте оператора) или следующего, меньшего, значения (во втором варианте). Естественно, если в первом варианте значение i1 больше i2 или во втором варианте значение i1 меньше i2, оператор A (тело цикла) не выполняется ни разу.
После выхода из цикла параметр цикла становится неопределенным, за исключением случая, когда выход из цикла был осуществлен с помощью оператора GOTO или стандартной процедурой Break.
2. Цикл с постусловием реализуется с помощью оператора цикла repeat. Оператор цикла repeat организует выполнение цикла, состоящего из любого числа операторов, с неизвестным заранее числом повторений. Тело цикла выполняется хотя бы один раз. Выход из цикла осуществляется при истинности некоторого логического выражения.
Структура этого оператора:
repeat
until B;
В этой структуре:
p1, p2, ... , pk выполняемые операторы, составляющие тело цикла.
B - логическое выражение, истинность которого проверяется в конце каждой итерации.
Тело цикла выполняется, пока логическое выражение имеет значение False, а если результат равен True, происходит выход из цикла.
3. Цикл с предусловием реализуется с помощью оператора цикла while. Оператор цикла while организует выполнение одного оператора неизвестное заранее число раз. Выход из цикла осуществляется, если некоторое логическое выражение окажется ложным. Так как истинность логического выражения проверяется в начале каждой итерации, тело цикла может не выполняться ни разу.
Структура этого оператора: while B do A ;
где B - логическое выражение, истинность которого проверяется в начале каждой итерации;
A - простой или составной выполняемый оператор (тело цикла).
Перед каждым выполнением цикла вычисляется значение B. Если результат равен True, тело цикла выполняется и снова вычисляется значение логического выражения B. Если результат равен False, происходит выход из цикла и переход к следующему оператору программы.
Пример выполнения работы.
Задача 4.1. Составить программу для табулирования функции
при x = 0,9; 1,0; 1,1; 1,2.
Решение.
Обозначим: a - начальное значение x; b - конечное значение x; h - шаг изменения x; - граничное значение x.
Тогда:
a = 0,9; b = 1,2; h = 0,1.
2. Тест для отладки программы.
a = 0,9 ;
b = 0,9 ;
y = 0,92 e-0,9-sin(0,9) = 0,25797.
3. Блок - схема:
4. Программа:
Program Fun1 ; { Пример шаговой таблицы функции}
Var
x , y , a , b ,h, xgr : real ; { Описание переменных }
Begin
WriteLn ;
WriteLn(' Введите a,b,h');
ReadLn(a,b,h) ; { Ввод исходных данных}
WriteLn ;
WriteLn(' a=',a:6:2,' b=',b:6:2,' h=',h:7:3); {Вывод
исходных данных}
WriteLn ;
{ Вывод заголовка таблицы }
WriteLn('____________________') ;
WriteLn(' x y ') ;
WriteLn('____________________') ;
xgr := b + 0.5 * h ; { Вычисление граничного значения x }
x := a ; { Занесение начального значения x }
repeat
y := x*x * exp(-x) * sin(x) ; { Вычисление y }
WriteLn(x:7:1,y:10:5) ; { Вывод значений x, y }
x := x + h ; { Подготовка переменной x к новому циклу }
until x > xgr { Проверка на окончание цикла }
End. { Конец программы}
5. Вид печати:
a= 0.90 b= 1.20 h= 0.100
____________________
x y
____________________
0.9 0.25797
1.0 0.30956
1.1 0.35896
1.2 0.40424
Задача 4.2. Элементы последовательности вычисляются рекуррентно по формуле . Составить программу для вычисления и печати числа элементов последовательности, удовлетворяющих неравенству ai>0,7 , если ao = 27, a значения i изменяются от 1 до 10.
Решение.
Пусть n - число вычисляемых элементов последовательности,
k - число элементов, удовлетворяющих условию ai > 0,7.
Тогда
ko =0 - начальное значение k.
Исходные данные: ao = 27, n = 10.
n = 2,
ao = 27,
a1 = 9,
a2 = 3,
k = 2.
4. Программа:
Program Pose1 ; { Вычисление элементов последовательности
и их числа, удовлетворяющих условию }
Var
a0, a : real ; { Описание переменных }
i, n, k : integer ;
Begin
WriteLn ;
WriteLn(' Введите n,a0');
ReadLn(n,a0) ; { Ввод n, a0 }
WriteLn ;
WriteLn(' Введено число вычисляемых элементов последовательности :' ,n:4); { Вывод n }
WriteLn(' Начальное значение :',a0:6:1) ; { Вывод a0}
k :=0 ; { Занесение начального значения k }
i :=1 ; { Занесение начального значения i }
a :=a0 ; { Занесение начального значения a }
while i <= n do
begin
a := a / 3.0 ; { Вычисление текущего
элемента последовательности}
if a > 0.7 then k := k + 1 ; {Проверка
условия a > 0.7}
i := i + 1 { Увеличение номера элемента
последовательности }
end ;
WriteLn ;
WriteLn(' k=',k:4) ; {Вывод числа элементов,
удовлетворяющих условию }
End. { Конец программы}
5. Вид печати:
Введено число вычисляемых элементов последовательности : 10
Начальное значение : 27.0
k= 3
Задача 4.3. Используя формулу для элементов последовательности ai, составить программу для вычисления суммы n элементов этой последовательности.
Дано:
Решение.
В этой задаче элементы последовательности вычисляются рекуррентно, поэтому соотношение:
Пусть Si - сумма i первых элементов последовательности.
Тогда
Начальные значения:
Основные формулы:
Исходные данные:
n=3 (тест),
n=7 (рабочий вариант).
2. Тест для отладки программы:
3. Блок - схема:
4. Программа:
Program Sum ; { Вычисление суммы заданного числа элементов
последовательности }
Var S, a : real ; { Описание переменных }
i, n : integer ;
Begin
WriteLn(' Введите n');
ReadLn(n) ; { Ввод числа элементов последовательности}
WriteLn(' Введено n=',n:4); { Вывод n }
S := 0.0 ;
a := -1.0 ;
for i := 1 to n do begin
a := -a / i ; { Вычисление текущего элемента последовательности}
S := S +a ; { и суммы }
end ;
WriteLn ;
WriteLn(' сумма S=',S:10:4) ; { Вывод суммы }
End. { Конец программы}
5. Вид печати:
Введено n= 3
сумма S=0.6667
Задача 4.4. Разработать программу, которая определяет первый отрицательный элемент последовательности значений функции при изменении в интервале с шагом .
Дано:
Решение.
Для вычисления требуемого результата необходимо последовательно вычислять значение функции и анализировать его знак. Для конкретных вариантов исходных данных может оказаться, что такого элемента в заданной последовательности нет. Следовательно, после завершения цикла необходимо вывести соответствующее сообщение.
Обозначим: a - начальное значение x; b - конечное значение x; h- шаг изменения x; .
Тогда: a = 2; b = 5; h = 0,5.
.
.
.
- первый отрицательный элемент последовательности.
3. Блок - схема
Program Otr ; { Вычисление 1-го отрицательного э-та пос-ности}
Var x , y , a, b, h : real ; { Описание переменных }
Begin { Начало основного блока }
Write('Введите a,b.h') ;
ReadLn(a,b,h) ; { Ввод исходных данных }
x:=a-h ;
repeat x := x +h ;
y := sin(x); { Вычисление y }
until (x+h>b) or (y<0); {комбинированное условие выхода из цикла}
if y<0 then WriteLn('y=',y:9:6,' при x=',x:3:1)
else WriteLn('Элемент не найден') ;
End. { Конец программы}
y=-0.350783 при x=3.5
Задача 4.5. Разработать программу, определяющую сумму ряда для значения с точностью
Решение.
Из соответствующих разделов математики известно, что суммой ряда называется предел, к которому стремится последовательность частичных сумм данного ряда, если он существует. Если такой предел существует, то ряд называется сходящимся, в противном случае - расходящимся. Также известно, что знакопеременный ряд сходится, если , где и - соответственно n-й и n+1-й члены ряда.
Кроме того, доказано, что , где - сумма ряда, а - сумма n членов ряда.
Следовательно, для получения требуемого результата будем накапливать частичную сумму элементов ряда, пока очередной член ряда не станет меньше заданной погрешности: .
Имеем .
Тогда . Отсюда следует, что
3. Блок - схема
4. Программа.
Program Sum_R;
Var
S,r,x,eps:real; { Описание переменных }
Begin
WriteLn(' Введите x и eps');
Readln(x,eps); { Ввод исходных данных }
If abs(x) > 1 Then {если x>1, то ищем сумму ряда}
begin
S:=1;
r:=1;
While abs(r) > eps do
begin
r:=-r/x;
S:=S+r;
end;
WriteLn(' При x=',x:3:1,' S=',S:7:5)
end
else Write('Ряд расходится ');
END. { Конец программы}
При x=6.3 S=0.86302
Варианты задания
Задача 4.1. Составить программу для табулирования функций и при изменении от до с шагом . В первой колонке печатать , во второй - , в третьей - . Исходные данные приведены в табл. 4.1.
Таблица 4.1
Вариант |
|||||
1. |
0,3 |
0,36 |
0,01 |
||
2. |
0,12 |
0,22 |
0,02 |
||
Продолжение таблицы 4.1 |
|||||
Вариант |
|||||
3. |
0,1 |
3,6 |
0,5 |
||
4. |
1,2 |
2,2 |
0,2 |
||
5. |
0,3 |
1,1 |
0,1 |
||
6. |
0,5 |
1,5 |
0,2 |
||
7. |
0,1 |
0,15 |
0,01 |
||
8. |
0,5 |
0,7 |
0,02 |
||
9. |
1,5 |
1,6 |
0,01 |
||
10. |
2,0 |
2,7 |
0,1 |
||
11. |
-1,5 |
1,0 |
0,5 |
||
12. |
-1,2 |
0,4 |
0,2 |
||
13. |
0,2 |
0,7 |
0,1 |
||
14. |
0,1 |
0,8 |
0,1 |
||
15. |
0,3 |
1,2 |
0,1 |
||
Продолжение таблицы 4.1 |
|||||
Вариант |
|||||
16. |
1,5 |
2,5 |
0,1 |
||
17. |
3,0 |
3,9 |
0,1 |
||
18. |
0,2 |
0,28 |
0,01 |
Задача 4.2. Элементы последовательности заданы рекуррентно (табл. 4.2). Составить программу вычисления и печати числа элементов последовательности, удовлетворяющих указанному неравенству.
Таблица 4.2
Вариант |
Формула |
Изменение i |
Начальное |
Неравенство |
|
от |
до |
значение |
|||
1. |
1 |
20 |
ao = 6 |
ai > 1 |
|
2. |
1 |
10 |
ao = 1 |
ai < 5 |
|
3. |
1 |
12 |
ao = 2 |
ai > 100 |
|
4. |
1 |
20 |
ao = 1 |
ai < 40 |
|
5. |
1 |
10 |
ao = 2 |
ai > 15 |
|
6. |
1 |
20 |
ao = 1 |
ai <14 |
|
7. |
1 |
6 |
ao = -1 |
ai > 500 |
|
8. |
1 |
15 |
ao = 100 |
ai < 10 |
|
9. |
1 |
10 |
ao = 1,2 |
ai > 5 |
|
10. |
1 |
10 |
ao = 2 |
ai < 3 |
|
11. |
1 |
12 |
ao = 1 |
ai > 10 |
|
Продолжение таблицы 4.2 |
|||||
Вариант |
Формула |
Изменение i |
Начальное |
Неравенство |
|
от |
до |
значение |
|||
12. |
1 |
12 |
ao = 2 |
ai < 150 |
|
13. |
1 |
15 |
ao = 36 |
ai > 0,1 |
|
14. |
1 |
11 |
ao = 64 |
ai > 10 |
|
15. |
1 |
14 |
ao = 3 |
ai > 4 |
|
16. |
1 |
18 |
ao = 1 |
ai >-20 |
|
17. |
1 |
15 |
ao = 1 |
ai <5 |
|
18. |
1 |
12 |
ao = 1,5 |
ai > 3 |
Задача 4.3. Используя формулу для элементов последовательности ai, составить программу для вычисления суммы n элементов этой последовательности (табл.4.3). Составить рекуррентные соотношения там, где это необходимо.
Таблица 4.3
Вариант |
ai |
Начальное значение i |
n |
1. |
0 |
8 |
|
2. |
1 |
7 |
|
3. |
1 |
9 |
|
4. |
1 |
10 |
|
Продолжение таблицы 4.3 |
|||
Вариант |
ai |
Начальное значение i |
n |
5. |
1 |
7 |
|
6. |
1 |
6 |
|
7. |
1 |
6 |
|
8. |
2 |
6 |
|
9. |
1 |
8 |
|
10. |
1 |
6 |
|
11. |
1 |
8 |
|
12. |
1 |
10 |
|
13. |
1 |
6 |
|
14. |
1 |
5 |
|
15. |
1 |
10 |
|
16. |
2 |
7 |
|
17. |
1 |
8 |
|
18. |
1 |
6 |
Задача 4.4. Разработать программу, которая определяет первый отрицательный (положительный) элемент последовательности значений функции при изменении в интервале с шагом . Исходные данные приведены в табл. 4.4.
Таблица 4.4
Вариант |
Первый элемент |
||||
1. |
1 |
3 |
0,25 |
отрицательный |
|
2. |
-1 |
2 |
0,5 |
положительный |
|
3. |
-1 |
-0,5 |
0,1 |
отрицательный |
|
4. |
-1,3 |
0,1 |
0,2 |
положительный |
|
5. |
1 |
1,5 |
0,1 |
отрицательный |
|
6. |
-5 |
0 |
1 |
положительный |
|
7. |
0 |
6 |
1 |
отрицательный |
|
8. |
0,7 |
1 |
0,05 |
положительный |
|
9. |
0,25 |
1,25 |
0,25 |
отрицательный |
|
10. |
-0,5 |
0,7 |
0,3 |
положительный |
|
11. |
-0,8 |
-0,2 |
0,1 |
отрицательный |
|
12. |
0,9 |
1,2 |
0,05 |
положительный |
|
13. |
0,6 |
1 |
0,1 |
отрицательный |
|
Продолжение таблицы 4.4 |
|||||
Вариант |
Первый элемент |
||||
14. |
0,9 |
1,2 |
0,05 |
положительный |
|
15. |
0,4 |
0,7 |
0,05 |
отрицательный |
|
16. |
0,2 |
0,8 |
0,1 |
положительный |
|
17. |
-3 |
2 |
1 |
отрицательный |
|
18. |
1 |
7 |
1 |
положительный |
Задача 4.5. Разработать программу, определяющую сумму ряда для заданного значения с точностью Исходные данные приведены в табл. 4.5.
Таблица 4.5
Вариант |
|||
1. |
0,45 |
0,01 |
|
2. |
0,76 |
0,0001 |
|
3. |
0,84 |
0,001 |
|
4. |
0,29 |
0,00001 |
|
5. |
0,44 |
0,001 |
|
6. |
0,19 |
0,00001 |
|
Продолжение таблицы 4.5 |
|||
Вариант |
|||
7. |
0,21 |
0,01 |
|
8. |
0,91 |
0,001 |
|
9. |
0,37 |
0,0001 |
|
10. |
0,05 |
0,00001 |
|
11. |
0,13 |
0,01 |
|
12. |
0,82 |
0,001 |
|
13. |
|
0,66 |
0.0001 |
14. |
0,44 |
0,00001 |
|
15. |
0,25 |
0,01 |
|
16. |
0,21 |
0,001 |
|
17. |
0,78 |
0,0001 |
|
18. |
0,32 |
0.00001 |
PAGE 23
Начало
x=a-h
x=x+h
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
Конец
Да
Да
Нет
ет
Тело цикла
i := n1, n2, h
Тело цикла
Условие
Да
Нет
Тело цикла
Условие
Нет
Да
Начало
Ввод a, b, h
Вывод a, b, h, заголовка таблицы
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
Вывод x, y
Конец
Да
Нет
Начало
Начало
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
Вывод k
Ввод - вывод EMBED Equation.3
Да
Да
Нет
Нет
Начало
Ввод вывод n
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
Вывод s
Конец
EMBED PBrush
EMBED PBrush
EMBED PBrush
EMBED Equation.3
EMBED Equation.3
EMBED Equation.3
“Ряд
расходится”
EMBED Equation.3
Начало
Да
Нет
Нет
EMBED Equation.3
EMBED Equation.3
Да
EMBED Equation.3
EMBED Equation.3