
- •Глава 3. Реализация алгоритмов ветвления
- •3.1. Условный оператор
- •Полная форма оператора
- •Краткая форма оператора.
- •3.2. Задачи к пройденной теме
- •3.3. Задачи для самостоятельного решения
- •Глава 4. Реализация циклических алгоритмов
- •4.1. Конструкция цикла со счетчиком
- •4.2. Базовые алгоритмы
- •4.3. Циклы с предварительной и последующей проверкой условия
- •Цикл с последующей проверкой условия.
- •4.4. Вложенные циклы
- •4.5 Решение задач
- •Задачи для самостоятельного решения
- •Глава 5. Пользовательские типы данных.
- •5.1. Общие понятия
- •5.2. Одномерные массивы
- •5.4. Задачи для самостоятельного решения.
- •Глава 6. Многомерные массивы
- •6.1. Двумерные массивы
- •1. Заполнение двумерного массива по строке.
- •2. Заполнение двумерного массива по столбцу.
- •3. Печать содержимого двумерного массива в виде таблицы.
- •4. Вычисление суммы элементов каждой строки (столбца).
- •6. Задача поиска максимального (минимального) элемента и его индексов (считая, что элемент единственный).
- •Алгоритм поиска минимального элемента и его индексов для всего массива.
- •6.2. Квадратные матрицы.
- •Введем некоторые понятия:
- •6.3. Задачи
- •Глава 7. Типы данных Char и String
- •7.1. Символьные данные
- •7.2. Кодирование
- •7.3. Операции над данными типа char.
- •7.4. Строки
4.4. Вложенные циклы
Рассмотрим
задачу: Вычислить:
Для решения этой задачи необходимо организовать два цикла. Первый цикл (он называется внешним) работает по переменной i. Телом этого цикла является в, свою очередь, опять оператор цикла, но по переменной j. Посмотрим, как изменяются значения переменных i и j.
i=1 i=2 i=3 … i=100
j=1 j=1 j=1 j=1 j=1
j=2 j=2 j=2 j=2 j=2
j=3 j=3 j=3 j=3 j=3
… … … … …
j=50 j=50 j=50 j=50 j=50
Общее количество повторений равно 100*50.
Фрагмент программы:
…
S := 0;
for i:= 1 to 100 do
for j:=1 to 50 do
S := S + 1/(i+j*j);
Задача.
Вычислить
, где n — натуральное число, а — действительное число.
Первое, что
необходимо увидеть – это базовые
алгоритмы, которые будут использоваться
при решении. В данной задаче их два —
вычисление суммы и вычисление
(или
).
Изобразим алгоритм решения графически:
Рис. 4.5. Схема алгоритма нахождения суммы ряда.
Теперь напишем текст программы, при этом необходимо помнить, что объявление типов данных должно быть корректным.
n — показатель степени натурального числа, переменную n можно объявить как byte.
i - количество повторений цикла, оно совпадает с n, следовательно, переменная i объявляется как byte.
a - действительное число, следовательно, тип real.
Текст программы:
PROGRAM P_N;
USES CRT;
VAR
n: byte; {показатель степени}
i,j: byte; {счетчии циклов}
a: real; {вводимое число}
W: real; {степень 1/an}
S: real; {сумма}
BEGIN
clrscr;
write('введите значение переменной a: ');
readln(a);
write('введите значение переменной n: ');
readln(n);
S:=0;
FOR i:=1 TO n DO
BEGIN
W := 1;
FOR j:=1 TO i DO
W := W * a;
S := S + 1/W;
END;
writeln('Cумма = ',S:5:3);
writeln('Нажмите любую клавишу для выхода...');
readln;
END.
Использование константы.
Значение n можно задать, используя служебное слово const в разделе описания типов переменных, но при этом необходимо помнить, что изменить n по ходу выполнения программы будет нельзя.
Вычислить:
, где n - натуральное число, x - действительное число. При решении используем три базовых алгоритма - an, и сумма n чисел.
Текст программы:
PROGRAM P_N_FACT;
USES CRT;
CONST
N=3;
VAR
i,j: byte; {счетчики цикла}
W: real; {xn}
F: longint; {n!}
x: real; {вводимое число}
S: real; {сумма}
BEGIN
clrscr;
write('задайте значение переменной x: ');
readln(x);
S:=0;
FOR i:=1 to n DO
BEGIN
W := 1;
FOR j:=1 TO i DO
W := W * x;
F := 1;
FOR j:=1 TO i DO
F := F * j;
S := S + W/F
END;
writeln('искомая сумма = ', S:5:3);
writeln('Нажмите любую клавишу для выхода...');
readln;
END.
4.5 Решение задач
Разберем несколько примеров для лучшего усвоения материала.
Пример 1. Вычисление суммы чисел удовлетворяющих условию
Задание: из 20 чисел заданных случайным образом, найти сумму чисел кратных 5. Для получения случайного числа в языке Турбо Паскаль существует оператор random(a), который возвращает число от 0 до a. (на самом деле, как и readln(a) это не оператор, а функция, но о функциях речь пойдёт позже)
Для решения поставленной задачи нам потребуется использовать базовый алгоритм накопления суммы чисел, но только тех, которые удовлетворяют условию. Организуем цикл, повторяющийся 20 раз (цикл FOR), в цикле будем получать случайное число, проверять кратно ли оно 5, и если условие истинно, накапливать сумму в переменной S.
Текст программы:
PROGRAM RANDOM20;
USES CRT;
VAR
a: shortint;
i, k: byte;
S: integer;
BEGIN
clrscr;
randomize; {функция позволяет в дальнейшем получать случайные числа}
S:=0;
k:=0;
FOR i:=1 TO 20 DO
BEGIN
a := random(15); { случайное целое положительное число меньше 15}
IF a mod 5 = 0 THEN
BEGIN
k:=k+1;
S:=S+a
END
END;
IF k = 0 THEN
writeln('чисел, удовлетворяющих условию нет.')
ELSE
writeln('сумма чисел, кратных 5 = ', S);
writeln('Нажмите любую клавишу для выхода...');
readln;
END.
Пример 2. Числа Фибоначчи
Дано действительное число d. Найти первое число Фибоначчи, превышающее заданное число d. Последовательность Фибоначчи образуется по следующему закону — первое число равно 0, второе 1, каждое следующее — это сумма двух предыдущих. Пусть a — первое число, b — второе число, с — очередное число.
На рис. 4.6. представлен алгоритм решения задачи.
Рис. 4.6. Схема алгоритма нахождения числа Фибоначчи превышающего заданное.
Рассмотрим работу алгоритма на конкретном примере, пусть d=7;
a=b=1
b=c=2
с=a+b=3
3<=7? да

a=b=2
b=c=3
с=a+b=5
5<=7? да
a=b=3
b=c=5
с=a+b=8
8<=7? нет
Выход из цикла.
Печать результата.
Текст программы:
PROGRAM FIBO;
USES CRT;
CONST
D = 7;
VAR
c, a, b : integer;
BEGIN
clrscr;
a:=0;
b:=1;
c:=1;
WHILE c <= D DO
BEGIN
a:=b;
b:=c;
c:=a+b
END;
writeln('первое число Фибоначчи, превышающее ', D, ' = ', c);
writeln('Нажмите любую клавишу...');
readln;
END.
Пример 3. Вычисление алгебраического произведения
Вычислить:
Примечание:
заглавная буква
означает, что необходимо вычислить
произведение элементов последовательности,
общий член которой задается формулой.
Посмотрите, как выглядят элементы при
k=1, k=2 и k=3.
k=1
k=2
k=3
Для
решения данной задачи организуем внешний
цикл, повторяющийся 5 раз, в котором
будет накапливаться произведение.
Внутри внешнего цикла нам необходимо
вычислить первое слагаемое
,
для которого понадобится организовать
цикл вычисления факториала, второе
слагаемое
,
для которого понадобится организовать
цикл вычисления степени.
Текст программы:
PROGRAM PROIZV_RYADA;
USES CRT;
CONST
N = 5;
VAR
P : double; {накопление произведения}
a1 : double; {первое}
fact : word; {факториал}
cos_n : double; {косинус в степени n - второе слагаемое}
abs_xk : double; {аргумент косинуса}
k , i : byte; {счетчики циклов}
x : double; {переменная}
BEGIN
clrscr;
write('Введите x : ');
readln(x);
P := 1;
FOR k := 1 TO N DO
BEGIN
{вчислим факториал k}
fact:=1;
FOR i:=1 TO k DO
fact := fact * i;
{вычислим первое слагаемое}
a1 := x / ( fact + 1);
{вычислим косинус в нужной степени}
cos_n := 1;
abs_xk := abs(x+k);
FOR i:= 1 TO k DO
cos_n := cos_n * cos(abs_xk);
{теперь вычтем из первого слагаемов второе и умножим на P}
P := P * (a1 - cos_n);
END;
writeln('P = ', P:1:5);
writeln('Нажмите любую клавишу...');
readln;
END.
Небольшие пояснения: функции abs и cos – стандартные математические функции, которые были рассмотрены в главе 2. Для корректного отображения на экране вещественного числа используется шаблон вывода P:1:5 означающий, что число P необходимо вывести в десятичном виде с одной цифрой в целой части и 5 знаками после запятой, т.е. число займет на экране 6 позиций под цифры и одну позицию под разделительную точку.