Добавлен: 15.11.2018
Просмотров: 5609
Скачиваний: 36
a n = сn (2n - 1).
Сомножитель cn = (-1)n - 1 будем вычислять по рекуррентной формуле, выражая последующий член через предыдущий:
cn = - cn -1.
Число значений х на отрезке от 0.2 до 1 с шагом 0.2 равно 5. В программе для контроля при каждом значении x вычисляется также функция соs x + x sin x, которая приближенно может быть представлена в виде указанной суммы.
PROGRAM Prim118;
VAR
X, S, EPS,C,A : REAL;
I, N : INTEGER;
BEGIN
X:=0.2; Eps:=0.0001;
For I:=1 To 5 DO
BEGIN
S:=1;
C:=-1;
N:=1;
REPEAT
C:=-c*x*x/((2*n-1)*2*n);
A:=c*(2*n-1);
S:=s+a;
N:=N+1
UNTIL Abs(a)<Eps;
WRITELN( ‘x=’,x, ‘ s=’,s, ‘ f(x)=’, cos(x) + x*sin(x));
X:=X+0.2
END
End.
Пример 1.19. Вычислить сумму ряда . Суммирование осуществлять, пока разность между предыдущим и текущим членами остается больше 0,04. Кроме суммы вывести на экран значение последнего слагаемого и его номер.
Решение.
Обозначим объекты программы:
S- сумма;
N - количество членов ряда;
ТЕК - текущий член ряда;
PR - предыдущий член ряда.
Вычисление данной суммы будем осуществлять в цикле WHILE до тех пор, пока разность по модулю между текущим и предыдущим значениями членов ряда будет больше заданной величины, т.е.
WHILE ABS(TEK-PR)>0.04 DO
Так как выход из цикла осуществляется при нарушении данного условия, то для вывода правильного значения суммы, в которой разность по модулю между текущим и предыдущим слагаемыми еще остается больше 0,04, следует определить значение суммы, а также значение и номер слагаемого, предшествующего сумме ряда при выходе из цикла.
Приведем вариант программы
PROGRAM Prim119;
VAR S, TEK, PR : REAL;
N : INTEGER;
BEGIN
S:=0.5;
ТЕК:=0.5;
PR:=0;
N:=1;
WHILE ABS(TEK-PR)>0.04 DO
BEGIN
N:=N+1;
PR:=TEK;
TEK:=1/(2*N);
S:=S+TEK;
END;
WRITELN(‘Сумма= ‘, S-TEK);
WRITELN(‘Последнее слагаемое ‘,PR,’ и его номер ’,N-1);
END.
Пример 1.20. Найти максимальное количество слагаемых в сумме членов ряда , при котором эта сумма остается меньше 12. Кроме этого вывести на экран значение последнего слагаемого и его номер.
Решение.
Введем обозначения объектов:
S – сумма;
N - количество слагаемых в сумме;
А - очередное (текущее слагаемое).
Формула общего члена данного ряда имеет вид:
,
где n - порядковый номер слагаемого.
Суммирование осуществляется в цикле WHILE до тех пор, пока сумма остается меньше 12, т.е.
WHILE S<12
При выводе результатов следует учесть, что после выхода из цикла значение суммы будет больше или равно 12. Поэтому следует «откатиться» к предыдущему значению суммы, т.е. максимальному значению суммы, еще остающейся меньше 12.
Предлагаем следующий вариант.
PROGRAM Prim120;
VAR A, S : REAL;
N : INTEGER;
BEGIN
S:=0;
N:=0;
А:=7;
WHILE S<12 DO
BEGIN
N:=N+1;
A:=A/N;
S:=S+A;
END;
WRITELN(‘Максимальная сумма <12= ‘, S-A);
WRITELN(‘Последнее слагаемое ‘,A*N,’ и его номер ’, N-1);
END.
Пример 1.21. В числовую переменную последовательно вводятся отличные от нуля целые числа. Количество чисел заранее неизвестно. Определить и вывести на экран, какие (четные или нечетные) числа были введены последними и какова их сумма.
Решение.
В данном условии задачи обратите внимание на фразу «количество чисел заранее неизвестно». Это означает, что количество вводимых чисел может быть определено (подсчитано) только при завершении их ввода, а до начала ввода данных сведения об их количестве просто отсутствуют.
Кроме того, при составлении данной программы должны быть задействованы два счетчика сумм подряд идущих четных и нечетных чисел, которые при отсутствии подсчитываемых значений должны обнуляться.
Возможный вариант программы.
PROGRAM Prim121;
VAR
S1, S2, X : INTEGER;
{S1 - сумма подряд идущих нечетных чисел,
S2 - сумма подряд идущих четных чисел,
Х - переменная, содержащая введенное число}
BEGIN
S1:=0;
S2:=0;
WRITE(‘Введите число ‘);
READLN(Х);
WHILE X<>0 DO
BEGIN
IF X MOD 2<>0
THEN
BEGIN
S1:=S1+X;
S2:=0
END
ELSE
BEGIN
S2:=S2+X;
S1:=0
END;
WRITE(‘Введите число’);
READLN(X);
END;
IF S1<>0 THEN
WRITELN('Последними были введены нечетные числа. Их сумма = ‘, S1);
IF S2<>0 THEN
WRITELN(‘Последними были введены четные числа. Их сумма =’, S2);
END.
Пример 1.22. Найти сумму и количество цифр натурального числа N.
Решение.
Обозначим:
S - сумма цифр числа;
К - количество цифр числа;
Z - выделенная цифра числа;
СН - целое частное от деления.
Предложенный алгоритм базируется на выделении всех цифр числа, начиная с младшего разряда, методом последовательного деления и получения целых частных на основании данной системы счисления до тех пор, пока целое частное от деления не станет равным нулю.
Текст программы
PROGRAM Prim122;
VAR
S, K, Z, CH : INTEGER;
N : 1.. MAXINT;
BEGIN
WRITE(‘Введите натуральное число ‘);
READLN(N);
S:=0;
K:=0;
CH:=N;
WHILE CH<>0 DO
BEGIN
K:=K+1 ;
Z:=CH MOD 10;
S:=S+Z; CH:=CH DIV 10;
END;
WRITELN(‘Количество ‘,K,’ и сумма цифр ‘, S)
END.
Пример 1.23. В числовую переменную вводится число в десятичной системе счисления, не превышающее по модулю 10000. Необходимо вывести на экран представление этого числа в двоичной системе счисления.
Решение.
Обозначим объекты программы:
N - целое число;
К - количество цифр двоичного числа;
Z(14) - массив с цифрами двоичного числа;
CН - целое частное.
Перевод десятичного числа в двоичную систему счисления можно описать следующей последовательностью шагов:
-
Последовательно делим данное число и получаемые целые частные
на 2 до тех пор, пока последнее частное не станет равным нулю.
2. Запоминаем все остатки от деления данного числа и целых частных на 2.
3. Составляем число в двоичной системе счисления, начиная с последнего остатка и кончая первым.
Для запоминания остатков от деления надо организовать в памяти одномерный массив. Но какой размерности?
По условию, целое десятичное число не должно превышать 10000, т.е. 1000010 =271016 =10 0111 0001 00002.
Отсюда видно, что максимальное количество значащих разрядов двоичного числа не может превышать 14. Эта величина и будет определять размерность одномерного массива.
При выводе изображения двоичного числа анализируется его знак, т.к. в условии задачи ничего не сказано о том, какие числа переводятся - положительные или отрицательные.
Вариант программы
Program Prim123;
Var
Z : Array[1..14] of Integer;
N, I, K, CH : Integer; S,q: Real;
Begin
Write(‘Введите целое число ‘);
Readln(N);
K:=0;
CH:=ABS(N);
WHILE CH<>0 Do
Begin
K:=K+1;
Z[K]:=CH MOD 2;
CH:=CH DIV 2;
End;
Writeln(‘Число ’,N,’ в двоичной системе счисления’);
If N<0 THEN Write(‘-‘);
q:=1; S:=0;
For I:=1 TO K DO
Begin
S:=S+Z [I]*q;
q:=q*10;
End;
Writeln(S:14:0);
End.
Контрольные вопросы
-
Что такое цикл?
-
Какие действия необходимо выполнить для организации цикла?
-
Что такое итерационный циклический процесс?
-
Какие операторы цикла имеются в Турбо Паскале?
-
Какие средства языка целесообразно использовать для организации циклов с заданным числом повторений?
-
Как работает оператор цикла While?
-
В чем заключается различие между операторами Repeat и While?
-
Каково может быть условие выхода из цикла при вычислении значения суммы бесконечного ряда?
-
Зачем используются рекуррентные соотношения для вычисления значений члена ряда?
Задачи I уровня
Определить, какой цикл (по счетчику или по условию) требуется в задаче. Для цикла по условию определить, где должна производиться проверка условия выхода из цикла (в начале или в конце тела цикла) и, исходя из этого, использовать соответствующие операторы цикла.
1. Вычислить 1 + 1/2 + 1/3 + ... + 1/10.
2. Вычислить 5 + 8 + 11 + ... + 35.
3. Вычислить 1 + 3 + З2 + ... + 37.
4. Вычислить 1/2 + 1/22 + ... + 1/210.
5. Вычислить 2/3 + 3/4 +... + 10/11.
6. Вычислить 2 + 23 + ... + 210.
7. Вычислить у = 1/2 + 2х3 при х = -5, -4.5, - 4,... , 3.
8. Составить таблицу стоимости порций сыра весом 50, 100,... , 1000 г (цена 1 кг сыра 80 руб.).
В задачах № 9-15 вычислить сумму заданного числа членов знакопеременного ряда.
9. S =
10. S =
11. S = 0.3
12. S = 2 +
13. S = 1 +
14. S =
15. S = 0.4
Задачи II уровня
1. Имеется последовательность ненулевых целых чисел, за которой следует 0. Определять, сколько раз в последовательности меняется знак чисел.
2. Составить программу для вычисления значения:
у=х + х3/3! + х5/5! + х7/7! +...,учитывая, что < 1.
Расчет продолжать до тех пор, пока модуль разности между очередным и предыдущим значениями у будет больше заданной величины (точности вычислений).
3. Имеется последовательность положительных и отрицательных чисел. Определить, является ли последовательность чисел, находящихся до первого отрицательного числа, возрастающей.
4. Имеется шестизначный номер лотерейного билета. Определить является ли номер «счастливым», т.е. равны ли суммы первых и последних трех цифр.
5. Имеется последовательность вещественных чисел, содержащая нулевые значения. Определить, сколько чисел, расположенных до первого нулевого значения, больше своих «соседей».
6. Перед паромной переправой остановились легковые и грузовые автомобили. Определить, сколько легковых автомобилей находится в начале очереди.
7. На шоссе образовалась «пробка» из легковых и грузовых автомобилей. Определить, сколько грузовых автомобилей находится между легковыми.
8. Вычислить сумму ряда . Суммирование осуществлять, пока разность между предыдущим и текущим членами остается больше 0.04. Кроме суммы вывести на экран значение последнего слагаемого и его номер.
9. Вывести на экран N чисел Фибоначчи (N задается из диапазона от 2 до 21), значения частных от деления каждого из этих чисел на предыдущее число и сумму этих частных.
Числа Фибоначчи - это такая последовательность целых чисел, в которой два первых числа равны 1, а каждое следующее число равно сумме двух предыдущих. (Числа Фибоначчи: 1, 1, 2, 3, 5, 8,...).
10. В числовые переменные вводятся два натуральных числа Х и N. Необходимо найти ближайшее к Х и превосходящее его натуральное число, кратное N, а также сумму его цифр. Выдать на экран соответствующие сообщения.
11. Найти минимальное количество слагаемых в сумме членов ряда 1·1 + 1·2·2 + 1·2·3·3 + 1·2·3·4·4 + ···, при котором эта сумма станет больше 120. Кроме этого вывести на экран значение последнего слагаемого и его номер.
12. Не используя массивы, ввести экзаменационные оценки N учеников по К предметам (N и К задаются). Определить и вывести на экран количество учеников, не получивших:
а) ни одной "пятерки";
б) ни одной оценки выше "тройки".
13. В числовую переменную последовательно вводятся отличные от нуля целые числа. Количество чисел заранее неизвестно. Определить и вывести на экран, какие (четные или нечетные) числа были введены последними и какова их сумма.
14. Ввести с клавиатуры границы диапазона трехзначных натуральных чисел, из которых необходимо напечатать только простые. Определить количество таких чисел и их сумму.
15. Найти максимальное количество слагаемых в сумме членов ряда , при котором эта сумма остается меньше 12. Вывести на экран значение последнего слагаемого и его номер.
16. Вычислить последнюю сумму членов ряда , при которой разность между предыдущим и текущим членами ряда остается больше 0.007. Кроме суммы вывести на экран значение последнего слагаемого и его номер.
17. В числовую переменную последовательно вводятся отличные от нуля целые числа. Количество чисел заранее неизвестно. Определить и вывести на экран, какие (положительные или отрицательные) числа были введены последними и какова их сумма.
18. Вычислить сумму ряда 2 + 4 + 8 + 16 + 32 + ···. Суммирование осуществлять, пока разность между текущим и предыдущим членами остается меньше 200. Кроме суммы вывести на экран значение последнего слагаемого и его номер.
19. В числовую переменную последовательно вводятся произвольные числа, не равные нулю. Количество вводимых чисел заранее неизвестно. Определить порядковые номера и значения первого из максимальных и
последнего из минимальных чисел этой последовательности, а также произведение двух этих чисел.
20. Вычислить сумму членов ряда . Суммирование осуществлять, пока разность между текущим и предыдущим зна-
чениями суммы остается больше 0,001. Кроме этого найти значение последнего слагаемого и его номер.
21. В числовую переменную последовательно вводятся ненулевые целые числа. Количество вводимых чисел заранее неизвестно. Необходимо определить максимальную длину цепочки из подряд идущих положительных чисел и максимальную длину цепочки из подряд идущих отрицательных чисел.
22. В числовую переменную в произвольном порядке последовательно вводятся нулевые и положительные числа. Количество вводимых чисел заранее неизвестно. Определить сумму и количество введенных положительных чисел, а также максимальное количество подряд введенных нулевых чисел.
23. В числовую переменную последовательно вводятся произвольные числа, не равные нулю. Количество вводимых чисел заранее неизвестно. Требуется вычислить и напечатать сумму тех из них, порядковые номера которых являются простыми числами.
24. В числовую переменную последовательно вводятся целые числа, не равные нулю. Количество вводимых чисел заранее неизвестно. Требуется найти сумму тех введенных чисел, в которых встречаются две цифры 5.
25. В числовую переменную последовательно вводятся ежедневные замеры дневных температур осенних и зимних дней. Количество вводимых замеров заранее неизвестно. Определить количество дней с температурой ниже чем минус 5 градусов, а также максимальное количество подряд идущих дней с нулевой температурой.
26. В одну и ту же переменную х вводятся вещественные числа по модулю больше 1 и меньше 2. Количество вводимых чисел заранее неизвестно. Для каждого значения х вывести на экран сумму ряда 1 + х + х/2 + х/3 + + х/5 + х/8 + х/13 + х/21 +......, значение последнего слагаемого и его порядковый номер. Суммирование выполнять до тех пор, пока модуль разности между текущим и предыдущим членами остается больше 0.0001.
Глава 2. СТРУКТУРИЗАЦИЯ ПРОГРАММНЫХ ДАННЫХ
2.1. Массивы
Задачи, решаемые на ЭВМ, являются математическими моделями процессов или явлений реальной жизни. В математической модели находят отражение наиболее существенные связи между реальными объектами. Модели реальных объектов вместе с присущими им связями образуют структуры данных, процесс обработки которых и описывается с помощью алгоритмов.
Разные классы решаемых на ЭВМ задач характеризуются и разными структурами данных, что находит отражение и в соответствующих языках программирования.
Рассмотрим наиболее часто используемые структуры данных языка Турбо Паскаль.
Необходимость в массивах возникает всякий раз, когда при решении задачи приходится иметь дело с большим, но конечным количеством однотипных упорядоченных данных. Допустим, что требуется вычислить значение многочлена Р (объект задачи):