Файл: Методичка к лабораторным и практическим.doc

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Программирование

Добавлен: 15.11.2018

Просмотров: 5246

Скачиваний: 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Н - целое частное.

Перевод десятичного числа в двоичную систему счисления можно опи­сать следующей последовательностью шагов:

  1. Последовательно делим данное число и получаемые целые частные

на 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.


Контрольные вопросы


  1. Что такое цикл?

  2. Какие действия необходимо выполнить для организации цикла?

  3. Что такое итерационный циклический процесс?

  4. Какие операторы цикла имеются в Турбо Паскале?

  5. Какие средства языка целесообразно использовать для организации циклов с заданным числом повторений?

  6. Как работает оператор цикла While?

  7. В чем заключается различие между операторами Repeat и While?

  8. Каково может быть условие выхода из цикла при вычислении значения суммы бесконечного ряда?

  9. Зачем используются рекуррентные соотношения для вычисления значений члена ряда?


Задачи 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. Массивы



Задачи, решаемые на ЭВМ, являются математическими моделями процессов или явлений реальной жизни. В математической модели находят отражение наиболее существенные связи между реальными объектами. Модели реальных объектов вместе с присущими им связями образуют структуры данных, процесс обработки которых и описывается с помощью алгоритмов.

Разные классы решаемых на ЭВМ задач характеризуются и разными структурами данных, что находит отражение и в соответствующих языках программирования.

Рассмотрим наиболее часто используемые структуры данных языка Турбо Паскаль.

Необходимость в массивах возникает всякий раз, когда при решении задачи приходится иметь дело с большим, но конечным количеством однотипных упорядоченных данных. Допустим, что требуется вычислить значение многочлена Р (объект задачи):