Uploaded by nna1947

Примеры решения задач по программированию

advertisement
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
Национальный исследовательский ядерный университет "МИФИ"
НОВОУРАЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ
Кафедра информатики и программирования
ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ
ПО ПРОГРАММИРОВАНИЮ
Часть 1
Учебно-методическое пособие по курсам
«Информатика», «Программирование и основы алгоритмизации»,
«Программирование на языках высокого уровня»
для студентов всех специальностей
очной формы обучения
Новоуральск 2010
УДК 681.3.06
МиМ – 2.3. -
- 10
Автор
Рецензент
Орлова Ирина Викторовна
кандидат физико-математических наук,
доцент кафедры ВМ Фоминых Марина Анатольевна
Примеры решения задач по программированию. Часть 1. Учебнометодическое пособие по курсам «Информатика», «Программирование и
основы алгоритмизации», «Программирование на языках высокого уровня»
для студентов всех специальностей очной формы обучения
Новоуральск, НТИ НИЯУ МИФИ, 2010, 56 с.
Пособие представляет собой описание решения 21 задачи по программированию на языке Паскаль по основным девяти темам, изучаемым в курсах
«Информатика», «Программирование и основы алгоритмизация» и «Программирование на языках высокого уровня» в НТИ НИЯУ МИФИ.
Содержит 21 библиографических названия.
Пособие может использоваться при самостоятельном изучении программирования на языке Паскаль».
Методическое пособие рассмотрено на заседании кафедры
Протокол № 117 от 21 июня 2010 г.
Зав.кафедрой
Н.А.Николаев
СОГЛАСОВАНО:
Председатель методкомиссии НТИ НИЯУ МИФИ
д.т.н., профессор
2
А.Е.Беляев
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ.................................................................................................................4
1 ОПЕРАТОР ПРИСВАИВАНИЯ ........................................................................5
2 УСЛОВНЫЙ ОПЕРАТОР..................................................................................8
3 ПРОСТЕЙШИЕ ЦИКЛЫ.................................................................................13
4 ЧИСЛОВЫЕ РЯДЫ .........................................................................................19
5 ФУНКЦИОНАЛЬНЫЕ РЯДЫ .......................................................................25
6 ЗАДАЧИ С ИСПОЛЬЗОВАНИЕМ МАССИВОВ ......................................29
7 ВЛОЖЕННЫЕ
ЦИКЛЫ.................................................................................35
8 ПРОЦЕДУРЫ И ФУНКЦИИ ...........................................................................40
9 РАБОТА С МАТРИЦАМИ ...............................................................................47
СПИСОК ЛИТЕРАТУРЫ .....................................................................................54
3
ВВЕДЕНИЕ
Студенты НТИ НИЯУ МИФИ различных специальностей изучают программирование в курсах "Программирование на языке высокого уровня", "Программирование и основы алгоритмизации" и "Информатика" в разных объёмах, но в любом случае основой изучения данной темы является лабораторный практикум, который
структурно делится на две части: общий практикум, сопровождающий основной курс
по программированию, и практикум по численным методам, нацеленный на приобретение студентами опыта решения на ЭВМ определенных классов задач, а также на
практическое освоение студентами специализированных компонент математического
обеспечения.
Каждая задача практикума – это самостоятельная задача с краткой, но четкой
содержательной формулировкой, не содержащей описания алгоритма. В процессе
решения задачи от студента требуется:
- составить алгоритм решения задачи;
- записать алгоритм в виде программы на Паскале;
- произвести отладку программы;
- протестировать программу по заранее подготовленным данным;
Первый и второй этапы выполняются дома при подготовке к лабораторной работе, третий и четвертый - во время лабораторной работы.
Студентам, только начинающим изучать основы алгоритмизации и программирование, а также имеющим не достаточно глубокие знания элементарной математики,
математического анализа и линейной алгебры, бывает трудно представить ход решения предлагаемых задач и правильно оформить отчёт к лабораторной работе по программированию.
В данном пособии рассматриваются примеры решения задач по первой, общей
части практикума. Представленные в пособии задачи сгруппированы по девяти темам, которые соответствуют темам лабораторных работ, задания для которых содержатся в методическом пособии [3] и практически полностью охватывают материал,
изучаемый студентами всех специальностей в первом семестре изучения соответствующего курса.
На каждую тему в данном пособии приводится по 2–3 примера, которые подобраны так, чтобы рассмотреть наиболее часто используемые приёмы при решении задач указанной темы. Для каждой из рассматриваемых задач, помимо условия, приводится математическая модель или описание рассуждений, используемых при решении
задачи, затем приводится блок-схема алгоритма, текст программы на языке Паскаль и
данные для тестирования, с помощью которых можно проверить правильность работы представленной программы.
Настоящее пособие может быть использовано студентами при подготовке к лабораторным и контрольным работам или изучающими самостоятельно тему «Основы
алгоритмизации и программирования на языке Паскаль», преподавателями при подготовке и проведении лекций по этой теме в курсах «Информатика», «Программирование и основы алгоритмизации» и «Программирование на языках высокого уровня»,
а также сотрудниками, которые в своей работе встречаются с необходимостью составления алгоритмов и написания программ на языке Паскаль.
4
1 ОПЕРАТОР ПРИСВАИВАНИЯ
В этом разделе рассматриваются примеры решения простейших задач, алгоритм которых имеет линейную структуру. По каждой задаче составлена программа,
содержащая операторы ввода исходных данных, присваивания и вывода результатов.
В программах предусмотрен вывод подсказки для ввода и пояснения результата при
выводе.
Пример 1.1. Дано натуральное трехзначное число. Вычислить сумму его цифр.
Математическая модель задачи
Введём переменные:
z – введённое трёхзначное число.
Единицы: e = z mod 10;
Десятки:
d = (z div 10) mod 10;
Сотни:
s = z div 100;
Сумма цифр числа z: Sum = e + d + s.
Блок-схема алгоритма
Начало
Ввод z
e = z mod 10
d = (z div 100) mod 10
s = z div 100
Sum = e + d + s
Вывод Sum
конец
5
Текст программы на языке Паскаль
Program Example_1;
Var z, e, d, s, Sum : word;
Begin
write(‘Введите трехзначное число z=‘);
read(z);
e := z mod 10;
d := (z div 100) mod 10;
s := z div 100;
Sum := e + d + s;
writeln(‘Сумма цифр числа ‘, z , ’ = ‘, Sum);
readln
end.
Данные для тестирования
1) Для числа z=128 – сумма цифр = 1 + 2 + 8 = 11
2) Для числа z=756 – сумма цифр = 7 + 5 + 6 = 18
Пример 1.2. Даны два круга с общим центром и радиусами R1 и R2 (R1 > R2 ).
Найти площадь S кольца, внешний радиус которого равен R1 , а внутренний радиус
R2. В качестве значения π использовать 3.14.
Математическая модель задачи
Площадь S кольца будет равна разности площади круга с радиусом R1 и площади круга с радиусом R2:
S = 3.14*R12 – 3.14*R22.
Блок-схема алгоритма
начало
Ввод R1, R2
S:=3.14*R1*R1-3.14*R2*R2
Ввод S
конец
6
Текст программы на языке Паскаль
Program Example_2;
Var R1, R2, S : real;
Begin
write(‘Введите радиус большего круга R1=‘);
read(R1);
write(‘Введите радиус меньшего круга R2=‘);
read(R2);
S := 3.14*R1*R1 - 3.14*R2*R2;
writeln(‘Площадь кольца S = ‘, S:5:2);
readln
end.
Данные для тестирования
1) Для R1=5, R2=3 – Площадь кольца S = 3.14*52 – 3.14*32 = 50.24
2) Для R1=7, R2=5 – Площадь кольца S = 3.14*72 – 3.14*52 = 75.36
7
2 УСЛОВНЫЙ ОПЕРАТОР
В этом разделе рассматривается решение задач с использованием условного
оператора. В некоторых задачах решение будет более компактным и простым если
при проверке условия составить сложное логическое выражение, а в других задачах
необходимо использовать вложенный оператор if.
Пример 2.1. Даны действительные числа x, y. Меньшее из этих двух чисел заменить
их удвоенной суммой, а большее – половиной их произведения. Если числа равны,
то оставить их без изменения.
Математическая модель задачи
Введём переменные:
min = 2*(x + y);
max = x * y / 2.
Блок-схема алгоритма
начало
Ввод x, y
min := 2*(x + y)
max := x * y / 2
да
нет
x<y
нет
x := min
x>y
y := max
да
y := min
x := max
Вывод x, y
конец
8
Текст программы на языке Паскаль
Program Example_3;
Var x, y, min, max : real;
Begin
write(‘Введите x = ‘);
read(x);
write(‘Введите y = ‘);
read(y);
min := 2*(x + y);
max := x * y / 2;
if x<y then begin x:=min; y:=max end
else if x>y then begin y:=min; x:=max end;
writeln(‘Результат:
x = ‘, x:4:2, ‘
y = ‘, y:4:2);
readln
end.
Данные для тестирования
1) Для x = 5, y = 3  min = 2*(5+3) = 16; max = 5 * 3 / 2 = 7.5;
Результат: x = 7.5 y = 16
2) Для x = 3, y = 5  min = 2*(3+5) = 16; max = 3 * 5 / 2 = 7.5;
Результат: x = 16 y = 7.5
3) Для x = 3, y = 3  Результат: x = 3 y = 3
Пример 2.2. Даны два действительных числа x, y. Определить, принадлежит ли
точка с координатами x, y заштрихованной области.
y
0
-1
1
x
-1
Математическая модель задачи
Из рисунка можно определить, что заштрихованная область ограничена тремя
прямыми: y = 0, y = -x – 1, y = x – 1. Границы также принадлежат этой области.
9
Тогда, чтобы точка с координатами (х, у) принадлежала заштрихованной области, необходимо, чтобы одновременно выполнялись три условия:
У≤0
y ≥ x -1 ;
y ≥ -x - 1.
Блок-схема алгоритма
начало
Ввод х, у
Да
(у <= 0)
и (у >= х - 1)
и (у >= -х -1)
Точка принадлежит
заданной области
Нет
Точка не принадлежит
заданной области
Конец
Текст программы на языке Паскаль
Program Example_4;
Var x, y : real;
Begin
writeln;
write(‘Введите x = ‘);
read(x);
write(‘Введите y = ‘);
read(y);
if (y <= 0) and (y >= x – 1) and (y >= -x – 1)
then writeln(‘Точка принадлежит заштрихованной области’)
else writeln(‘Точка не принадлежит заштрихованной области’);
readln
end.
10
Данные для тестирования
1) Для x = -0.3, y = -0.6  Точка принадлежит заштрихованной области;
2) Для x = -0.3, y = -1  Точка не принадлежит заштрихованной области;
3) Для x = 0.6, y = -0.3  Точка принадлежит заштрихованной области;
4) Для x = 0.3, y = 1  Точка не принадлежит заштрихованной области;
Пример 2.3. Дано действительное число a. Для функции f(x), график которой представлен на рисунке, вычислить значение f(a).
у
f(х)
1
-2
-1
х
1
-1
Математическая модель задачи
Опишем на математическом языке представленную на графике функцию:
1 при x < -2
f(x) =
-х-1
х-1
при -2 <= x < 0
в остальных случаях
Блок-схема алгоритма
начало
Ввод a
да
f := 1
нет
a < -2
да
f := - a - 1
a<0
нет
f := a - 1
Вывод f
конец
11
Текст программы на языке Паскаль
Program Example_5;
Var a, f : real;
Begin
writeln;
write(‘Введите a = ‘);
read(a);
if a < -2 then f := 1
else if a < 0 then f := -x -1
else f := x – 1;
writeln(‘Результат:
f(‘, a:3:2, ‘) = ‘, f:4:2);
readln
end.
Данные для тестирования
1) Для a = -4
2) Для a = -1.3
3) Для a = 2.7
12



Результат:
f(-4.00) = 1.00
Результат: f(-1.30) = 0.30
Результат:
f(2.70) = 1.70
3 ПРОСТЕЙШИЕ ЦИКЛЫ
При решении задач этой темы используются алгоритмы, имеющие циклическую структуру. В зависимости от последовательности рассмотрения материала (операторов цикла), предполагается, что для реализации решения на языке Паскаль могут
использоваться оператор цикла с предусловием while или оператор цикла с постусловием repeat.
Пример 3.1. Даны натуральные числа А, В. Найти наименьшее общее кратное этих
двух чисел.
Математическая модель задачи
Наименьшим общим кратным двух чисел является наименьшее число, которое
делится нацело, т.е. без остатка, на оба этих числа. Таким числом может оказаться
одно из заданных чисел – то, которое больше.
Введём переменную R – наименьшее общее кратное.
Для сокращения числа проверок, вначале можно найти большее из двух заданных чисел и в качестве начального значения переменной R принять это число. Затем в
цикле добавлять к R по единице, пока R не будет делиться нацело на оба заданных
числа. В этом примере удобнее использовать оператор цикла с постусловием repeat.
Блок-схема алгоритма
начало
Ввод А, В
да
нет
А<В
R := B - 1
R := A - 1
R := R + 1
нет
R mod A = 0
и R mod B = 0
да
Вывод x, y
конец
13
Текст программы на языке Паскаль
Program Example_6;
Var A, B, R : word;
Begin
writeln;
write(‘Введите натуральное число A = ‘);
read(A);
write(‘Введите натуральное число B = ‘);
read(B);
if A < B then R := B – 1
else R := A – 1;
repeat
R := R + 1
until (R mod A = 0) and (R mod B = 0);
writeln(R, ‘ - наименьшее общее кратное чисел ‘, A, ‘ и ’, В);
readln
end.
Данные для тестирования
1) Для А = 5, В = 3
 15 - наименьшее общее кратное чисел 5 и 3
2) Для А = 5, В = 30
 30 - наименьшее общее кратное чисел 5 и 30
3) Для А = 10, В = 25
 50 - наименьшее общее кратное чисел 10 и 25
Пример 3.2. Найти наибольшее и наименьшее значение функции y = 3x2 + x – 4, если
на заданном отрезке [А, В] значения х изменяются с шагом 0,1.
Математическая модель задачи
Введём переменные: min – наименьшее значение функции;
max – наибольшее значение функции;
х – значение узла сетки, изменяющееся от А до В с шагом 0,1;
у – значение заданной функции в узле сетки х.
В качестве начального значения для переменных max и min примем значение
функции в точке А.
Далее с помощью цикла while и условного оператора организуем сравнение
переменных max и min со значением функции в очередном узле сетке и, при необходимости, переприсваивание новых значений функции.
14
Блок-схема алгоритма
начало
Ввод А, В
min := 3*A*A + A – 4
max := min
x := A
x <= B
нет
да
x := x + 0.1
y := 3*x*x + x – 4
y < min
нет
да
min := y
y > max
нет
да
max := y
Вывод max, min
конец
Текст программы на языке Паскаль
Program Example_7;
Var A, B, x, y, max, min : real;
15
Begin
writeln;
write(‘Введите начало отрезка A = ‘);
read(A);
write(‘Введите конец отрезка B = ‘);
read(B);
min := 3*A*A + A – 4;
max := min;
x := A;
while x <= B do begin
x := x + 0.1;
y := 3*x*x + x – 4;
if y < min then min := y;
if y > max then max := y
end;
writeln(min, ‘ - наименьшее значение функции на отрезке [A, В]’);
writeln(max, ‘ - наибольшее значение функции на отрезке [A, В]’);
readln
end.
Данные для тестирования
x
-1
-0,9
-0,8
-0,7
-0,6
-0,5
-0,4
-0,3
-0,2
-0,1
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1
16
y
-2
-2,47
-2,88
-3,23
-3,52
-3,75
-3,92
-4,03
-4,08
-4,07
-4
-3,87
-3,68
-3,43
-3,12
-2,75
-2,32
-1,83
-1,28
-0,67
0
А = -1
В=1
- наименьшее значение функции
- наибольшее значение функции
Пример 3.3. Дано натуральное n. Вычислить сумму
n
1
 2k  12
k 1
Решение задачи
Введём переменные: S – сумма;
k – номер очередного слагаемого;
n– количество слагаемых в сумме.
Данная сумма может быть представлена в виде S=u1+u2+u3+… .
Начальное значение суммы равно 0.
При вычислении суммы к начальному ее значению прибавляется значение первого члена последовательности, затем к полученному значению прибавляется значение второго члена последовательности и так далее. То есть при вычислении суммы
циклически проводится операция сложения.
Вычисление суммы организуем с помощью цикла while. Если до начала цикла
k присвоить 1, то в качестве условия выполнения цикла можно записать k <= n.
Блок-схема алгоритма
начало
Ввод n
S := 0
k := 1
k <= n
нет
да
S := S + 1/(2*k+1)2
k := k + 1
Вывод S
конец
17
Текст программы на языке Паскаль
Program Example_8;
Var k, n : integer; S : real;
Begin
writeln;
write(‘Введите количество слагаемых суммы N = ‘);
read(n);
while k <= n do begin
S := S + 1/sqr(2*k + 1);
k := k + 1;
end;
writeln(‘S = ’, S:6:4);
readln
end.
Данные для тестирования
S
1) Для n = 2
1
2  1  1
2

1
2  2  1
2

1 1

 0.1111  0.04  0.1511
9 25
2) Для n = 3
S
18
1
2  1  1
2

1
2  2  1
2

1
2  3  1
2

1 1
1


 0.1111  0.04  0.0204  0.1715
9 25 49
4 ЧИСЛОВЫЕ РЯДЫ
В задачах этой темы необходимо вычислить заданные суммы S.
Каждая задача должна решаться в двух вариантах:
а) задано число членов суммы N;
б) вычисление производить до тех пор, пока очередной член вычисляемой суммы не станет по модулю меньше заданного значения . Все последующие слагаемые
в S входить не должны.
При решении задач данной темы для реализации варианта а) должен использоваться оператор цикла с параметром (for), а для реализации варианта б) – оператор
цикла с постусловием (repeat) или оператор цикла с предусловием (while) – это определяет конкретный преподаватель.
Пример 4.1. Вычислить сумму ряда:
S  1
2
32

3
42
    1k 1 
k
k  12

Решение задачи
Выберем схему решения поставленной задачи.
Данная сумма может быть представлена в виде S=u1-u2+u3-u4+….
Начальное значение суммы – это первое слагаемое u1=1.
При вычислении суммы из начального ее значения вычитается значение второго члена последовательности, затем прибавляется значение третьего члена, затем вычитается значение четвертого члена суммы и так далее. То есть при вычислении суммы необходимо учитывать чередование знака слагаемых.
Для учета такого чередования надо ввести дополнительную переменную Znak,
которая будет принимать значения либо 1, либо –1. Начальное значение знака
Znak=-1. Чередование значений переменной можно получить циклическим умножением переменной на –1, то есть проводить вычисления по формуле Znak : Znak * (1) .
При вычислении значения суммы надо к предыдущему значению суммы прибавить значение модуля очередного слагаемого, умноженного на знак.
При расчете абсолютного значения дроби надо отметить закономерность. Числитель очередного слагаемого равен порядковому номеру члена суммы (обозначим
его переменной k). Тогда знаменатель дроби можно рассчитать по формуле (k + 1)2.
В варианте а) число членов суммы заранее известно (равно N), и для решения
задачи удобно использовать цикл с параметром.
В варианте б) значение очередного слагаемого следует запомнить в некоторой
переменной (sl), чтобы использовать его при проверке условия прекращения вычислений – модуль последнего слагаемого должен быть меньше заданной величины .
Вычисление суммы в варианте б) организуем с помощью цикла while: пока
очередное слагаемое по модулю будет больше  (в алгоритме обозначим её Е), будем
выполнять действия в цикле. Чтобы не «потерять» последнее слагаемое, прибавим его
к сумме после завершения цикла
19
Блок-схема алгоритма
начало
Ввод n, Е
S := 1
znak := -1
k := 2 .. n
S := S + znak*k / (k+1)2
znak := - znak
Вывод S
S := 0
znak := 1
k := 1
sl := 1
|sl| >= E
да
S := S + znak*sl
k := k + 1
znak := - znak
sl := k / (k + 1)2
S := S + znak*sl
Вывод S
конец
20
нет
Текст программы на языке Паскаль
Program Example_9;
Var k, n, znak : integer; S, sl, E : real;
Begin
writeln;
write(‘Введите количество слагаемых суммы N = ‘);
read(n);
write(‘Введите точность вычисления суммы Е = ‘);
read(Е);
S := 1;
znak :=-1;
For k := 2 to n do begin
S := S + znak*k / sqr(k + 14);
znak := - znak
end;
writeln(‘Вариант а) S = ’, S:6:4);
S := 0;
znak := 1;
k := 1;
sl :=1
while abs(sl) >= E do begin
S := S + znak * sl;
k := k + 1;
znak := - znak;
sl := k / sqr(k + 1)
end;
S := S + znak * sl;
writeln(‘Вариант б) S = ’, S:6:4);
readln
end.
Данные для тестирования
1) Для n = 3, Е = 0,2
2) Для n = 4, Е = 0,17
S  1
S  1
2
3
 2  1  0.2222  0.1875  0.9653
2
3
4
2
3
4
 2  2  1  0.2222  0.1875  0.16  0.8053
2
3
4
5
21
Пример 4.1. Вычислить сумму ряда:
S
1 2
k
 

2  k  1!
3! 5!
Решение задачи
Выберем схему решения поставленной задачи.
Данная сумма может быть представлена в виде S=u1+u2+u3+u4+….
Начальное значение суммы S=1.
При вычислении суммы к начальному ее значению прибавляется значение первого члена последовательности, затем к полученному значению прибавляется значение второго члена последовательности и так далее. То есть при вычислении суммы
циклически проводится операция сложения.
При расчете абсолютного значения дроби надо отметить закономерность:
 Числитель очередного слагаемого равен порядковому номеру члена суммы
(обозначим его переменной k).
 Знаменатель очередной дроби (обозначим его zn) можно получить путём
умножения знаменателя предыдущей дроби на выражение 2*k*(2*k+1). При
этом необходимо задать начальное значение zn = 1.
В варианте а) число членов суммы заранее известно (равно N), и для решения
задачи удобно использовать цикл с параметром.
В варианте б) значение очередного слагаемого следует запомнить в некоторой
переменной (sl), чтобы использовать его при проверке условия прекращения вычислений – модуль последнего слагаемого должен быть меньше заданной величины .
Вычисление суммы в варианте б) организуем с помощью цикла repeat: до тех
пор пока очередное слагаемое по модулю не станет меньше  (в алгоритме обозначим
её Е), будем выполнять действия в цикле. После завершения цикла искомая сумма
будет вычислена.
Блок-схема алгоритма
начало
Ввод n, Е
S := 0
zn := 1
k := 1 .. n
zn := zn*2*k*(2*k+1)
S := S + k / zn
22
Вывод S
S := 0
zn := 1
k := 1
zn := zn*2*k*(2*k+1)
sl := k / zn
S := S + sl
k := k + 1
нет
|sl| < E
да
Вывод S
конец
Текст программы на языке Паскаль
Program Example_10;
Var k, n, zn : word; S, sl, E : real;
Begin
writeln;
write(‘Введите количество слагаемых суммы N = ‘);
read(n);
write(‘Введите точность вычисления суммы Е = ‘);
read(Е);
S := 0;
zn := 1;
For k := 1 to n do begin
zn := zn*2*k*(2*k+1);
S := S + k / zn
23
end;
writeln(‘Вариант а) S = ’, S:6:4);
S := 0;
zn := 1;
k := 1;
repeat
zn := zn*2*k*(2*k+1);
sl := k / zn
S := S + sl;
k := k + 1;
until abs(sl) < E;
writeln(‘Вариант б) S = ’, S:6:4);
readln
end.
Данные для тестирования
1) Для n = 3, Е = 0,0002
S
1 2 3 1
1
1
   

 0.166667  0.008333  0.000198  0.175198
3! 5! 7! 6 120 5040
2) Для n = 2, Е = 0,01
24
S
1 2 1
1
  
 0.166667  0.008333  0.1750
3! 5! 6 120
5 ФУНКЦИОНАЛЬНЫЕ РЯДЫ
В задачах этой темы для заданного действительного x необходимо вычислить
значение суммы S(x).
Каждая задача должна решаться в двух вариантах:
а) задано число членов суммы N;
б) вычисление производить до тех пор, пока очередной член вычисляемой суммы не станет по модулю меньше заданного значения . Все последующие слагаемые
в S входить не должны.
При решении задач данной темы для реализации варианта а) должен использоваться оператор цикла с параметром (for), а для реализации варианта б) – оператор
цикла с постусловием (repeat) или оператор цикла с предусловием (while) – это (как и
для задач предыдущей темы) определяет конкретный преподаватель.
Принципы решения задач из этой темы такие же, как и для вычисления числовых рядов. Отличие их состоит лишь в том, что в качестве исходных данных появляется ещё действительная переменная х, значение которой следует подбирать таким,
чтобы при проверке расчеты оказались не слишком сложными, и каждое следующее
слагаемое ряда было по модулю меньше предыдущего.
Пример 5.1. Вычислить сумму ряда:
S ( x) 
cos x cos 2  x cos 3  x cos 4  x

 2 3  2 4 
12  x 32  x 2
5 x
7 x
Решение задачи
Выберем схему решения поставленной задачи.
Данная сумма может быть представлена в виде S=u1-u2+u3-u4+….
Начальное значение суммы равно 0.
При вычислении суммы к начальному ее значению прибавляется значение первого члена последовательности, затем из полученного значения вычитается значение
второго члена последовательности, затем прибавляется значение третьего члена, затем вычитается значение четвертого члена суммы и так далее. То есть при вычислении суммы необходимо учитывать чередование знака слагаемых.
Для учета такого чередования введём дополнительную переменную Znak, которая будет принимать значения либо 1, либо –1. Начальное значение знака
Znak=1. Чередование значений переменной будем получать циклическим умножением переменной на –1, то есть проводить вычисления по формуле Znak : Znak * (1) .
При вычислении значения суммы надо к предыдущему значению суммы прибавить значение модуля очередного слагаемого, умноженного на знак.
При расчете абсолютного значения дроби надо отметить закономерность:
 Числитель очередного слагаемого представляет собой стандартную функцию
cos, аргументом которой является произведение порядкового номера члена
суммы (обозначим его переменной k) на переменную х, то есть cos(k*x).
 Знаменатель очередной дроби можно представить в виде произведения двух
сомножителей: квадрата выражения (2*k-1) и очередной степени переменной х
25
(обозначим эту часть переменной st), которую можно получить путём умножения значения st предыдущей дроби на x. Зададим начальное значение st = 1.
В варианте а) число членов суммы заранее известно (равно N), и для решения
задачи удобно использовать цикл с параметром.
В варианте б) значение очередного слагаемого следует запомнить в некоторой
переменной (sl), чтобы использовать его при проверке условия прекращения вычислений – модуль последнего слагаемого должен быть меньше заданной величины .
Вычисление суммы в варианте б) организуем с помощью цикла repeat: до тех
пор пока очередное слагаемое по модулю не станет меньше  (в алгоритме обозначим
её Е), будем выполнять действия в цикле. После завершения цикла искомая сумма
будет вычислена.
Блок-схема алгоритма
начало
Ввод х, n, Е
S := 0
znak := 1
st := 1
k := 1 .. n
st := st*x
S:=S+znak*cos(k*x)/(2*k-1)2/st
znak := - znak
Вывод S
S := 0
znak := 1
st := 1
k := 1
26
st := st * x
sl := cos(k*x)/(2*k-1)2/st
S := S + znak * sl
k := k + 1
znak := - znak
нет
|sl| < E
да
Вывод S
конец
Текст программы на языке Паскаль
Program Example_11;
Var k, n, znak : integer; x, S, sl, st, E : real;
Begin
writeln;
write(‘Введите значение х = ‘);
read(х);
write(‘Введите количество слагаемых суммы N = ‘);
read(n);
write(‘Введите точность вычисления суммы Е = ‘);
read(Е);
S := 0;
znak := 1;
st := 1;
For k := 1 to n do begin
st := st*x;
S := S + znak*cos(k*x) / sqr(2*k-1) / st;
znak := - znak
end;
27
writeln(‘Вариант а) S = ’, S:6:5);
S := 0;
znak := 1;
st := 1;
k := 1;
repeat
st := st*x;
sl := cos(k*x) / sqr(2*k-1) / st;
S := S + znak * sl;
k := k + 1;
znak := - znak
until abs(sl) < E;
writeln(‘Вариант б) S = ’, S:6:5);
readln
end.
Данные для тестирования
1) Для x = 1, n = 3, Е = 0,04
S ( x) 
cos 2 cos 2  2 cos 3  2

 2 3  0.5403  0.04624  0.0396  0.54694
12 1 32 12
5 1
2) Для x = 2, n = 4, Е = 0,0005
cos 2 cos 2  2 cos 3  2 cos 4  2

 2 3  2 4 
12  2 32  2 2
5 2
7 2
 0.20807  0.01816  0.00480  0.00019  0.18493
S ( x) 
Для вычисления значений подобных выражений и подбора подходящих значений переменной х очень удобно пользоваться электронными таблицами Excel (рисунок 5.1).
Рисунок 5.1 – Вычисление отдельных слагаемых и суммы в Microsoft Excel
28
6 ЗАДАЧИ С ИСПОЛЬЗОВАНИЕМ МАССИВОВ
Массивом называется тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип. Каждый элемент массива имеет свой номер (индекс) для одномерных массивов и совокупность номеров для многомерных. Индексы
представляют собой выражения, чаще всего целого типа.
Все задачи этой темы делятся на два подраздела: лёгкие задачи и задачи средней сложности. Поскольку, при работе с массивом количество элементов в нём известно по условию задачи, то для обработки массивов наиболее часто используется
оператор цикла с параметром (for).
Приведём примеры решения задач с использованием массивов.
Пример 6.1. Дан целочисленный массив А размера N. Вывести все содержащиеся в
данном массиве четные числа, расположенные на нечетных местах в порядке возрастания их индексов, а также их количество K.
Решение задачи
Выберем схему решения поставленной задачи.
После того как будут введены элементы массива, с помощью оператора цикла с
параметром (for) и условного оператора организуем проверку номера элемента на нечетность и значения элемента на четность. Для этого можно воспользоваться стандартной функцией языка Паскаль odd(x), которая возвращает истину, если х – нечетно, и ложь, если х – четное.
Если обозначить i – номер очередного элемента массива, тогда заданное в задаче условие можно записать с помощью логического выражения:
odd(i) and (not odd(abs(A[i])))
Если результатом этого выражения будет истина, то к переменной K прибавляем 1 и такой элемент массива выводим на экран. По окончании цикла на экран выводим получившееся К.
Блок-схема алгоритма – представлена на рисунке 6.1.
Текст программы на языке Паскаль
Program Example_12;
Var K, n, i : integer; A : array [1..30] of integer;
Begin
writeln;
write(‘Введите количество элементов массива N = ‘);
read(n);
write(‘Введите ‘, n, ‘целых чисел - элементов массива А:‘);
For i := 1 to n do
read(A[i]);
K := 0;
29
For i := 1 to n do
If odd(i) and (not odd(abs(A[i]))) then begin
K := K + 1;
writeln(‘A[‘, i, ’]= ‘, A[i])
end;
writeln(‘K = ’, K);
readln
end.
начало
Ввод n, {A}
K := 0
i := 1 .. n
Odd(i) and
(not odd(A[i]))
нет
да
K := K + 1
Вывод A[i]
Вывод K
конец
Рисунок 6.1 – Блок-схема алгоритма для примера 6.1
Данные для тестирования
1) Для n = 10, A = {5, 7, 8, 10, -12, 3, 1, 4, 6, 2}

A[3] = 8
A[5] = -12
A[9] = 6
30
Пример 6.2. Дан целочисленный массив {x} размера N и целое число a. Если в массиве {x} есть хотя бы один элемент, равный a, то получить сумму всех
элементов, следующих за первым таким элементом. В противном
случае вывести сообщение об отсутствии такого элемента.
Решение задачи
Выберем схему решения поставленной задачи. В этой задаче требуется:
1) определить имеется ли вообще в заданном массиве элемент, равный числу а;
2) если, такой элемент имеется, то запомнить его номер;
3) вычислить сумму элементов массива, предшествующих найденному элементу или вывести сообщение об отсутствии такового.
Чтобы запомнить номер искомого элемента, введём переменную K. Первоначально зададим K = 0.
После того как будут введены все элементы массива {x} и число а, с помощью
оператора цикла с параметром (for) и условного оператора организуем поиск элемента, равного а. Как только будет найден первый такой элемент, присвоим его номер
переменной K и, с помощью процедуры break, прервём дальнейшее выполнение цикла for, т.е. просмотр оставшейся части массива. Если мы проверим весь массив и элемента равного а не обнаружится, то значение переменной K останется равным нулю.
После завершения просмотра массива с помощью условного оператора проверим значение переменной K – если оно осталось равным нулю, то выведем сообщение
об отсутствии элемента равного а, в противном случае с помощью оператора цикла
for вычислим искомую сумму и выведем её значение.
Блок-схема алгоритма – представлена на рисунке 6.2.
Текст программы на языке Паскаль
Program Example_13;
Var K, n, i, S, a : integer; x : array [1..30] of integer;
Begin
writeln;
write(‘Введите количество элементов массива N = ‘);
read(n);
write(‘Введите ‘, n, ‘целых чисел - элементов массива X:‘);
For i := 1 to n do
read(x[i]);
K := 0;
For i := 1 to n do
If x[i] = a then begin K := i; break end;
If K = 0 then writeln(‘В данном массиве нет элементов равных ’, а)
else begin S := 0;
for i := 1 to K-1 do S := S + x[i];
writeln(‘S = ’, S) end;
end.
31
начало
Ввод n, {A}
K := 0
i := 1 .. n
x[i] = a
нет
да
K := i
break
да
K=0
S := 0
‘В массиве нет
элементов равных
а’
i := 1 .. n
S := S + x[i]
Вывод S
конец
Рисунок 6.2 – Блок-схема алгоритма для примера 6.2
Данные для тестирования
1) Для n = 10, x = {5, 7, 8, 10, -12, 3, 8, 1, 8, 2},

S = 10-12+3+8+1+8+2 = 24
2) Для n = 10, x = {5, 7, 8, 10, -12, 3, 8, 1, 8, 2},

32
a=8
В данном массиве нет элементов равных 4
a=4
Пример 6.3. Дан целочисленный массив {ai} , i= 1,2, ..., n. Получить новый массив
{bi}, выбросив из исходного массива все элементы со значением
max({аi}). Определить число элементов нового массива.
Решение задачи
Выберем схему решения поставленной задачи.
После того как будут введены все элементы массива {a}, с помощью оператора
цикла с параметром (for) и условного оператора организуем поиск максимального
элемента. В методическом пособии [1] приведено решение задачи на нахождение минимального элемента массива. Поиск максимального элемента выполняется аналогично.
Введём переменную j – номер очередного элемента в новом массиве. Начальное значение j = 0. С помощью цикла с параметром и условного оператора «перепишем» в массив {bi} все элементы из массива {ai}, не равные максимальному.
Номер последнего элемента в массиве {bi} будет равен количеству элементов в
новом массиве.
Блок-схема алгоритма – представлена на рисунке 6.3.
Текст программы на языке Паскаль
Program Example_14;
Var n, i, j, Max : integer; A, B : array [1..30] of integer;
Begin
writeln;
write(‘Введите количество элементов массива N = ‘);
read(n);
write(‘Введите ‘, n, ‘целых чисел - элементов массива A:‘);
For i := 1 to n do
read(A[i]);
j := 0;
Max := A[1];
For i := 2 to n do
If A[i] > Max then Max := A[i];
writeln(‘Новый массив В:’);
For i := 1 to n do
If A[i] <> Max then begin j := j + 1;
B[j] := A[i]
writeln(B[j], ‘ ‘) end;
writeln(‘В новом массиве ‘, j, ‘ элементов’);
readln
end.
33
начало
Ввод n, {A}
j := 0
Max := A[1]
i := 2 .. n
A[i] > Max
нет
да
Max := A[i]
i := 1 .. n
A[i] <> Max
нет
да
j := j + 1
B[j] := A[i]
Вывод B[j]
Вывод j
конец
Рисунок 6.3 – Блок-схема алгоритма для примера 6.3
Данные для тестирования
1) Для n = 10, A = {10, 7, 8, 10, -1, 3, 8, 10, 8, 2}

Новый массив В: 7, 8, -1, 3, 8, 8, 2
В новом массиве 7 элементов
34
7
ВЛОЖЕННЫЕ
ЦИКЛЫ
Если телом цикла является циклическая структура, то такие циклы называются
вложенными. Возможно любое сочетание операторов цикла при организации вложенных циклов.
Приведём примеры решения задач с использованием вложенных циклов.
Пример 7.1. Дано n натуральных чисел a1, a2, ... , an . Найти наибольший общий делитель.
Решение задачи
Выберем схему решения поставленной задачи.
Наибольшим общим делителем называется наибольшее число, на которое делятся все заданные числа, - в данном случае, таким числом может оказаться
наименьший элемент данного массива {a}.
После того как будут введены все элементы массива {a}, с помощью оператора
цикла с параметром (for) и условного оператора организуем поиск минимального
элемента. Решение задачи на нахождение минимального элемента массива приведено
в методическом пособии [1].
Затем, с помощью оператора цикла с параметром (for) будем перебирать в порядке убывания значения от min({a}) до 1. Во вложенном цикле на каждом шаге для
всех элементов массива будем проверять кратность элемента очередному числу. Для
осуществления такой проверки воспользуемся операцией mod (остаток от деления), а
в качестве индикатора успешного результата введём логическую переменную t, первоначально на каждом шаге присваивая ей значение True (истина).
Если все элементы массива окажутся кратны очередному значению параметра
внешнего цикла (значение переменной t останется True), то с помощью процедуры
break выходим из цикла и выводим результат – значение параметра внешнего цикла
на том шаге, на котором он был прерван.
Блок-схема алгоритма
начало
Ввод n, {A}
Min := A[1]
i := 2 .. n
A[i] < Min
нет
да
Min := A[i]
35
k := Min .. 1
t := true
i := 1 .. n
нет
A[i] mod k <> 0
да
t := false
t = true
нет
да
Break
Вывод k
конец
Текст программы на языке Паскаль
Program Example_15;
Var n, i, k, Min : integer;
t : boolean;
A : array [1..30] of integer;
Begin
writeln;
write(‘Введите количество элементов массива N = ‘);
read(n);
write(‘Введите ‘, n, ‘натуральных чисел - элементов массива A:‘);
For i := 1 to n do
read(A[i]);
Min := A[1];
For i := 2 to n do
If A[i] < Min then Min := A[i];
36
For k := Min downto 1 do begin
t := true;
For i := 1 to n do
If A[i] mod Max <> 0 then t := false;
If t = true then break;
end;
writeln(‘Наибольший общий делитель равен ‘, k );
readln
end.
Данные для тестирования
1) Для n = 8, A = {15, 27, 18, 21, 12, 6, 51, 48}

Наибольший общий делитель равен 3
2) Для n = 5, A = {15, 75, 30, 45, 90}

Наибольший общий делитель равен 15
Пример 7.2. Дан массив целых чисел {ai}, i = 1, 2, ... , n. Вывести те из них, которые встречаются в массиве по одному разу.
Решение задачи
Выберем схему решения поставленной задачи.
Ввод элементов массива {a} выполним обычным образом - с помощью оператора цикла с параметром (for).
Затем, с помощью оператора цикла с параметром (for) будем перебирать все
элементы данного массива. Для каждого элемента введём переменную k с начальным
значением k=0. Во вложенном цикле (также с помощью оператора цикла for) каждый
элемент массива будем сравнивать со всеми элементами этого массива и, как только
будет найден равный ему элемент, к переменной k будем прибавлять 1.
Если, после сравнения очередного элемента с элементами всего массива, значение переменной k будет равно 1, следовательно, он оказался равен только самому
себе. Выводим этот элемент на экран.
Блок-схема алгоритма – приведена на рисунке 7.1.
Текст программы на языке Паскаль
Program Example_16;
Var n, i, j, k : integer;
A : array [1..30] of integer;
Begin
writeln;
write(‘Введите количество элементов массива N = ‘);
read(n);
37
write(‘Введите ‘, n, ‘целых чисел - элементов массива A:‘);
For i := 1 to n do
read(A[i]);
writeln(‘В данном массиве по одному разу встречаются:‘);
For i := 1 to n do begin
k := 0;
For j := 1 to n do
If A[i] = A[j] then k := k + 1;
If k = 1 then writeln(‘ ‘, A[i] );
end;
readln
end.
начало
Ввод n, {A}
i := 1 .. n
k := 0
j := 1 .. n
нет
A[i] = A[j]
да
k := k + 1
k=1
нет
да
Вывод A[i]
конец
Рисунок 7.1 – Блок-схема алгоритма для примера 7.2
38
Данные для тестирования
1) Для n = 10, A = {1, 2, 3, 4, 1, 3, 5, 4, 7, 3}

В данном массиве по одному разу встречаются
2 5 7
2) Для n = 10, A = {1, 5, 7, 5, 3, -1, 4, 5, 7, -3}

В данном массиве по одному разу встречаются
1 3 -1 4 -3
39
8 ПРОЦЕДУРЫ И ФУНКЦИИ
Подпрограммой называют обособленную, оформленную в виде отдельной синтаксической конструкции и снабжённую именем часть программы. Использование
подпрограмм позволяет, сосредоточив в них подробное описание некоторых операций, в основной программе только указывать имена подпрограмм, чтобы выполнить
эти операции. Такие вызовы подпрограммы возможны неоднократно из разных
участков программы, причём при вызове подпрограмме можно передать некоторую
информацию (различную в разных вызовах), чтобы одна и та же подпрограмма выполняла решение подзадачи для разных случаев.
Подпрограммы в Турбо Паскале реализованы посредством процедур и функций. Имея один и тот же смысл и аналогичную структуру, процедуры и функции различаются назначением и способом их использования.
Приведём примеры решения задач с использованием процедур и функций.
Пример 8.1. Описать функцию SumDigit(K), находящую сумму цифр целого положительного числа K. Используя эту функцию, найти количество цифр для каждого
из заданных целых положительных чисел {Аi} i = 1, 2, ... , n.
Решение задачи
Выберем схему решения поставленной задачи.
В функции SumDigit(K) введём переменную S для накопления суммы цифр
(начальное значение S=0). С помощью циклической структуры while и операций div и
mod организуем выделение очередной цифры. Самую правую цифру числа можно
получить, разделив нацело заданное число K на 10 и взяв остаток от деления. Результат целочисленного деления будем сохранять в этой же переменной K. Цикл будем
выполнять пока переменная K будет больше нуля. Последним выполнимым оператором функции будет присвоение значения полученной суммы S имени функции.
В основной программе после того как будут введены все элементы массива
{А}, с помощью оператора цикла с параметром (for) для каждого элемента массива
организуем обращение к функции SumDigit, передавая в качестве параметра очередной элемент, и вывод результата.
Блок-схемы алгоритмов основной программы и функции SumDigit(K) –
представлены на рисунке 8.1
Текст программы на языке Паскаль
Program Example_17;
Var n, i, Sg : integer;
A : array [1..30] of word;
Function SumDigit(K: word): integer;
Var D, S : integer;
Begin
S := 0;
While K > 0 do begin
40
D := K mod 10;
S := S + D;
K := K div 10 end;
SumDigit := S
End;
Begin
writeln;
write(‘Введите количество элементов массива N = ‘);
read(n);
write(‘Введите ‘, n, ‘целых положительных чисел : ‘);
For i := 1 to n do
read(A[i]);
writeln(‘Результат:‘);
For i := 1 to n do begin
Sg := SumDigit(A[i]);
writeln(‘Сумма цифр числа ‘, A[i], ‘ равна ’, Sg ) end;
readln
end.
начало
SumDigit(K)
Ввод n, {A}
S := 0
i := 1 .. n
K>0
нет
да
Sg := SumDigit(A[i])
Вывод A[i], Sg
конец
D := K mod 10
S := S + D
K := K div 10
SumDigit := S
конец
Рисунок 8.1 – Блок-схемы алгоритма основной программы и функции для примера 8.1
41
Данные для тестирования
1) Для n = 3, A = {123, 4135, 47356}

Результат:
Сумма цифр числа 123 равна 1+2+3= 6
Сумма цифр числа 4135 равна 4+1+3+5= 13
Сумма цифр числа 47356 равна 4+7+3+5+6= 25
2) Для n = 4, A = {5753, 14, 5, 73}

Результат:
Сумма цифр числа 5753 равна 5+7+5+3= 20
Сумма цифр числа 14 равна 1+4= 5
Сумма цифр числа 5 равна 5
Сумма цифр числа 73 равна 7+3= 10
Пример 8.2. Описать процедуру Massiv(Х, K, X_cр, Т), находящую среднее арифметическое элементов массива {Х}, состоящего из K целых чисел, и возвращающую
Т=True, если элементы массива упорядочены по неубыванию, и T=False в противном случае. Используя эту процедуру, вычислить среднее арифметическое и
проверить упорядоченность элементов по неубыванию для двух целочисленных
массивов {A} размером N и {B} размером М.
Решение задачи
Выберем схему решения поставленной задачи.
В процедуре Massiv(Х, K, X_cр, Т) введём переменную S для накопления суммы
элементов массива (начальное значение S=0). Вычисление суммы осуществляется с
помощью оператора цикла с параметром (for) – на каждом шаге к переменной S добавляется очередной элемент массива. Среднее арифметическое элементов массива
будет вычисляться: S / K.
Для определения упорядоченности элементов массива по неубыванию в процедуре введём переменную Т с начальным значением Т=True (предположим, массив
упорядочен по неубыванию, т.е. x1≤x2≤x3≤ .. ≤xk). С помощью оператора цикла с параметром (for) для каждой пары элементов будем проверять нарушение условия упорядоченности, т.е. xi > xi+1. При выполнении такого условия переменной Т присваивается значение False.
В основной программе после того как будут введены все элементы массивов
{А} и {В}, с помощью обращения к процедуре Massiv, вначале для массива {А}, а затем для массива {В} вычисляем нужные значения.
Поскольку массивы будут передаваться в процедуру в качестве параметров, то
необходимо при описании массивов использовать описанный тип пользователя.
Блок-схемы алгоритмов основной программы и процедуры
Massiv(Х,K,X_cр,Т) – представлены на рисунке 8.2
42
начало
Massiv(X, K, X_cp, T)
Ввод n, {A}
S := 0
Ввод m, {B}
j := 1 .. K
Massiv(A, N, A_cp, T_a)
Вывод A_cp, T_a
Massiv(B, M, B_cp, T_b)
Вывод B_cp, T_b
S := S + X[j]
X_cp := S / K
T := True
j := 1 .. K-1
конец
X[j] > X[j+1]
нет
да
T := False
конец
Рисунок 8.2 – Блок-схемы алгоритма основной программы и функции для примера 8.2
Текст программы на языке Паскаль
Program Example_18;
type mas = array [1..30] of integer
Var n, m, i : integer; A_cp, B_cp : real; T_a, T_b : boolean;
A, B : mas;
procedure Massiv(X: mas; K: integer; var X_cp: real; var T: boolean);
Var j, S : integer;
Begin
S := 0;
For j := 1 to K do
S := S + D;
X_cp := S / K;
T := True;
43
For j := 1 to K-1 do
If X[j] > X[j+1] then T := False;
End;
Begin
writeln;
write(‘Введите количество элементов массива A N = ‘);
read(n);
write(‘Введите ‘, n, ‘целых чисел – элементы массива А : ‘);
For i := 1 to n do
read(A[i]);
write(‘Введите количество элементов массива В M = ‘);
read(m);
write(‘Введите ‘, m, ‘целых чисел – элементы массива B : ‘);
For i := 1 to n do
read(B[i]);
writeln(‘Результат:‘);
Massiv(A, N, A_cp, T_a);
writeln(‘Среднее арифметическое элементов массива A равно ’, А_ср:5:2);
if T_a then writeln(‘Массив A упорядочен по неубыванию’)
else writeln(‘Массив A не упорядочен по неубыванию’);
Massiv(B, M, B_cp, T_b);
writeln(‘Среднее арифметическое элементов массива В равно ’, В_ср:5:2);
if T_b then writeln(‘Массив B упорядочен по неубыванию’)
else writeln(‘Массив B не упорядочен по неубыванию’);
readln
end.
Данные для тестирования
1) Для n = 8, A = {1, 2, 3, 4, 5, 6, 7, 8}
Для m = 5, B = {7, 2, 1, 4, 5}

Результат:
Среднее арифметическое элементов массива A равно 4.50
Массив A упорядочен по неубыванию
Среднее арифметическое элементов массива B равно 3.80
Массив B не упорядочен по неубыванию
44
Пример 8.3. Для заданных действительного А и целого М вычислить значение выражения
Z
A5  A 3
3  AM
Возведение некоторого числа X в степень N организовать с помощью функции
Stepen(Х, N).
Решение задачи
Выберем схему решения поставленной задачи.
X 
X  ...
X .
Чтобы получить XN, нужно вычислить произведение 

N
В функции Stepen(Х, N) введём переменную P для накопления произведения N
сомножителей (начальное значение Р=1). Вычисление произведения осуществляется с
помощью оператора цикла с параметром (for) – на каждом шаге переменная Р домножается на Х. Если N – отрицательное, то зададим Х = 1 / Х.
Последний выполнимый оператор в функции Stepen – присвоение результата
имени функции, т.е. Stepen := Р.
В основной программе после того как будут введены значения А и M, с помощью обращения к функции Stepen с соответствующими аргументами, вычисляем значение выражения для Z.
Блок-схемы алгоритмов основной программы и функции Stepen(Х, N)
начало
Stepen(X, N)
Ввод
Ввод n,A,{A}
M
P := 1
Z := (Stepen(A, 5) - Stepen(A, -3))
/ 3 / Stepen(A, M)
N<0
нет
да
Вывод Z
X := 1 / X
конец
i := 1 .. |N|
P := P * X
Stepen := P
конец
45
Текст программы на языке Паскаль
Program Example_19;
Var m : integer; A, Z : real;
function Stepen(X: real; N: integer): real;
Var i : integer; P : real
Begin
P := 1;
If N < 0 then X := 1 / X;
For i := 1 to abs(N) do
P := P * X;
Stepen := P
End;
Begin
writeln;
write(‘Введите действительное число А = ‘);
read(А);
write(‘Введите показатель степени – целое число М = ‘);
read(m);
Z := (Stepen(A, 5) - Stepen(A, -3)) / 3 / Stepen(A, M);
writeln(‘Результат: Z = ‘, Z:8:4);
readln
end.
Данные для тестирования
1) Для A = 2, М = 3

Результат: Z = (25 – 2-3) / 3 / 23 = (32 – 0.125) / 24 = 1.328125
2) Для A = -2, М = -3

46
Результат: Z = ((-2)5 – (-2)-3) / 3 / (-2)-3 = (-32 + 0.125)*(-8) / 3 = 85
9 РАБОТА С МАТРИЦАМИ
В задачах этой темы исходная матрица (матрицы) должны считываться из заранее подготовленного текстового файла, в котором записана квадратная матрица
размером не менее 6 строк и 6 столбцов. Числа, определяющие размер исходной матрицы (n или n, m) и другие скалярные исходные данные должны вводиться с клавиатуры.
После завершения работы программы исходная матрица и результаты работы
программы должны быть выведены на экран и в текстовый файл.
Пример 9.1. Дана матрица действительных чисел n  m, все элементы которой
различны. Найти сумму элементов строки, в которой находится наименьший
элемент матрицы и столбца, в котором находится наибольший элемент.
Решение задачи
Выберем схему решения поставленной задачи.
Прежде всего, на устройстве Е: создадим текстовый файл (назовём его
data.txt), в котором разместим исходный массив размером не менее 6 строк и 6
столбцов. Это можно сделать с помощью приложения Блокнот или через редактор
текста среды Turbo Pascal.
С помощью ввода с клавиатуры зададим размеры n и m исходной матрицы.
Считывание элементов матрицы {А} из файла и вывод их на экран организуем с помощью вложенных операторов цикла с параметром (for).
Затем переходим к поиску наименьшего и наибольшего элементов массива.
При отыскании наибольшего элемента будем запоминать номер столбца, в котором
он находится, а при поиске наименьшего – номер его строки. Введём переменные:
min – значение наименьшего элемента массива;
max – значение наибольшего элемента массива;
k – номер столбца, в котором находится наибольший элемент массива;
r – номер строки, в котором находится наименьший элемент массива;
S – искомая сумма.
Вычисление искомой суммы элементов организуем также с использованием
операторов цикла с параметром (for).
Блок-схема алгоритма
начало
Ввод
Ввод n,N,{A}
M
Ввод {Aij} из файла,
Вывод {Aij} на экран
47
min := A[1,1]
max := A[1,1]
k := 1
r := 1
i := 1 .. N
j := 1 .. M
A[i,j] < min
нет
да
min := A[i, j]
r := i
A[i,j] >max
да
max := A[i, j]
k := j
S := 0
i := 1 .. N
S := S + A[i, k]
j := 1 .. M
S := S + A[r, j]
48
нет
Вывод S в файл,
Вывод S на экран
конец
Текст программы на языке Паскаль
Program Example_20;
Var i, j, n, m, k, r : integer;
min, max, S : real;
A : array [1..10,1..10] of real;
F : text;
Begin
writeln;
write(‘Задайте число строк матрицы N = ‘);
read(n);
write(‘Задайте число столбцов матрицы М = ‘);
read(m);
writeln(‘Исходная матрица:’);
Assign(F, ‘E:\data.txt’);
Reset(F);
For i:=1 to n do begin
For j:=1 to m do begin
read(F, A[i, j]); write(A[I, j]:7:2) end;
readln(F); writeln end;
close(F);
min := A[1, 1];
max := A[1, 1];
k := 1;
r := 1;
For i:=1 to n do
For j:=1 to m do begin
if A[i, j] < min then begin min := A[i, j]; r := i end;
if A[i, j] > max then begin max := A[i, j]; k := j end
end;
S := 0;
49
For i:=1 to n do
S := S + A[i, k];
For j:=1 to m do
S := S + A[r, j];
writeln(‘Искомая сумма S = ‘, S:5:2);
Assign(F, ‘E:\result.txt’);
Rewrite(F);
writeln(F, ‘Искомая сумма S = ‘, S:5:2);
close(F);
readln
end.
Данные для тестирования
Пусть в файле E:\data.txt хранятся следующие данные:
-11 2 13 4 15 6
7 -30 8 -1 9 12
11 -3 0 -2 50 -5
-9 16 20 5 -7 -20
17 -4 21 -6 22 -8
-7 18 -2 -15 1 -9
1) Для N = 4, M = 6

Исходная матрица:
-11.00 2.00 13.00 4.00 15.00 6.00
7.00 -30.00 8.00 -1.00 9.00 12.00
11.00 -3.00 0.00 -2.00 50.00 -5.00
-9.00 16.00 20.00 5.00 -7.00 -20.00
Искомая сумма S = 7 – 30 + 8 – 1 + 9 + 12 + 15 + 9 + 50 – 7 = 72
2) Для N = 5, M = 4

Исходная матрица:
-11.00 2.00 13.00 4.00
7.00 -30.00 8.00 -1.00
11.00 -3.00 0.00 -2.00
-9.00 16.00 20.00 5.00
17.00 -4.00 21.00 -6.00
Искомая сумма S = 7 – 30 + 8 – 1 + 13 + 8 + 0 + 20 + 21 = 46
50
Пример 9.2. Дана матрица действительных чисел n  m. Определить количество таких элементов матрицы, сумма индексов которых нечетна, и которые
меньше суммы остальных элементов своего столбца.
Решение задачи
Выберем схему решения поставленной задачи.
Прежде всего, как и в предыдущей задаче, на устройстве Е: создадим текстовый файл (назовём его data.txt), в котором разместим исходный массив размером не
менее 6 строк и 6 столбцов.
С помощью ввода с клавиатуры зададим размеры n и m исходной матрицы.
Считывание элементов матрицы {А} из файла и вывод их на экран организуем с помощью вложенных операторов цикла с параметром (for).
Введём переменную k – количество элементов, удовлетворяющих заданному
условию. Первоначально k = 0.
Для поиска указанных элементов и сравнения их с суммой остальных элементов соответствующего столбца будем использовать вложенные циклы с параметром.
В качестве параметра во внешнем цикле введём переменную j, отвечающую за изменение номера столбца. В первом внутреннем цикле с параметром i (переменная i отвечает за изменение номера строки) для каждого столбца вычислим сумму всех его
элементов. Для этого введём переменную S и для каждого столбца первоначально будем задавать S = 0.
Затем, во втором внутреннем цикле с параметром i с помощью условного оператора организуем проверку выполнения одновременно двух условий: 1) сумма индексов элемента Ai,j – нечётна (для этого можно воспользоваться, например, стандартной функцией odd(x)) и 2) элемент Ai,j меньше суммы остальных элементов своего столбца, т.е. меньше чем S - Ai,j. Если оба эти условия выполняются, то значение
переменной k увеличиваем на 1.
Результатом решения задачи будет значение переменной k. Его необходимо
вывести на экран и в текстовый файл (предположим, Е:\result.txt).
Блок-схема алгоритма
начало
Ввод
Ввод n,N,{A}
M
Ввод {Aij} из файла,
Вывод {Aij} на экран
k := 0
51
j := 1 .. M
S := 0
i := 1 .. N
S := S + A[i, j]
i := 1 .. N
Odd(i+j) и
A[i,j] < S- A[i,j]
да
k := k + 1
Вывод k в файл,
Вывод k на экран
конец
Текст программы на языке Паскаль
Program Example_21;
Var i, j, n, m, k : integer; S : real;
A : array [1..10,1..10] of real;
F : text;
Begin
write(‘Задайте число строк матрицы N = ‘);
read(n);
write(‘Задайте число столбцов матрицы М = ‘);
read(m);
writeln(‘Исходная матрица:’);
Assign(F, ‘E:\data.txt’);
52
нет
Reset(F);
For i:=1 to n do begin
For j:=1 to m do begin
read(F, A[i, j]); write(A[i, j]:7:2) end;
readln(F); writeln end;
close(F);
k := 0;
For j:=1 to m do begin
S := 0;
For i:=1 to n do
S := S + A[i, j];
For i:=1 to n do
if odd(i+j) and (A[i, j] < S - A[i, j]) then k := k + 1
end;
Assign(F, ‘E:\result.txt’);
Rewrite(F);
writeln(F, ‘В заданной матрице искомых элементов k = ‘, k);
close(F);
writeln(‘В заданной матрице искомых элементов k = ‘, k);
readln
end.
Данные для тестирования
Пусть в файле E:\data.txt хранятся следующие данные:
-11 2
7 -30
11 -3
-9 16
17 -4
-7 18
13 4 15 6
8 -1 9 12
0 -2 50 -5
20 5 -7 -20
21 -6 22 -8
-2 -15 1 -9
1) Для N = 4, M = 6

Исходная матрица:
-11.00 2.00 13.00 4.00 15.00 6.00
7.00 -30.00 8.00 -1.00 9.00 12.00
11.00 -3.00 0.00 -2.00 50.00 -5.00
-9.00 16.00 20.00 5.00 -7.00 -20.00
В заданной матрице искомых элементов k = 8
53
СПИСОК ЛИТЕРАТУРЫ
Основная литература
1
2
3
4
5
Епанишников А., Епанишников В. Программирование в среде Turbo Pascal 7.0. М.: “ДИАЛОГ-МИФИ”, 1993.-288с.
Культин Н.Б. Программирование в Turbo Pascal 7.0 и Delphi –СПб: БХВПетербург, 2000.-416 с.: ил
Культин Н.Б. Turbo Pascal в задачах и примерах –СПб: БХВ-Петербург, 2000.-256
с.: ил.
Турбо Паскаль 7.0 - К.: Торгово-издательское бюро BHV, 1996.-480 с.: ил.
Фаронов В.В. Турбо Паскаль. В 3 кн. Кн.1. - М.: Учебно-инженерный центр
"МВТУ-ФЕСТО ДИДАКТИК",1992.-304 с.: ил.
Дополнительная литература
Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И.. Задачи по программированию - М.: Наука, 1988. - 224 с.
2 Вьюкова Н.И., Галатенко В.А., Ходулев А.Б. Систематический подход к программированию/ под ред. Ю.М. Баяковского.-М.: Наука, 1993.-208с.
3 Гловацкая А.П. Методы и алгоритмы вычислительной математики. Учеб. пособие. –М.: Радио и связь, 1999.- 408 с.
4 Докукина Т.К. Программирование и алгоритмические языки. - М.: Машиностроение, 1993. - 496 с.:ил
5 Зуев Е.А. Язык программирования Turbo Pascal 6.0, 7.0/ - М.: Веста, Радио и связь,
1993. -384с.:ил.
6 Пильщиков В.Н. Сборник упражнений по языку Паскаль: Учеб. пособие для вузов. - Наука. 1989. - 160 с.
7 Прайс Д. Программирование на языке Паскаль. Пер. с англ. - М.: Мир, 1987. - 232
с.
8 Программное обеспечение микроЭВМ. В 11 кн. Кн. 7. Программирование на языке Паскаль. /Шаньгин В.Ф., Поддубная Л.М., Голубев-Новожилов Ю.С.; Под ред.
В.Ф. Шаньгина.- М.: Высшая школа, 1988. - 125 с.
9 Фаронов В.В. Турбо Паскаль. В 3 кн. Кн.3. Практика программирования. Часть
1. - М.: Учебно-инженерный центр "МВТУ-ФЕСТО ДИДАКТИК",1993.-256 с.: ил.
10 Фаронов В.В. Турбо Паскаль. В 3 кн. Кн.3. Практика прграммирования . Часть
2. - М.: Учебно-инженерный центр "МВТУ-ФЕСТО ДИДАКТИК",1993.-304 с.: ил.
11 Форсайт Р. Паскаль для всех. Пер. с англ. - М.: Машиностроение,1986. - 288 с.:
ил.
12 Электронные вычислительные машины: в 8-ми кн.: Учебное пособие для вузов.
Кн.5. Алексеев В.Е., Ваулин Л.С. Языки программирования. - М. Высшая школа,
1987. - 143 с.: ил.
1
54
Методические пособия
1
2
3
4
Николаев Н. А. Основы программирования в системе Turbo Pascal 7.0. Учебнометодическое пособие по курсам:«Информатика», «Программирование и алгоритмизация».- Новоуральск, НПИ, 2000, -69 с..
Николаев Н. А. Работа с графикой в системе Turbo Pascal. Методическое пособие
по курсу «Программирование на языках высокого уровня» для студентов специальности 230102 дневной формы обучения. Новоуральск, НГТИ, 2006, -48 с
Николаев Н.А. Сборник заданий по программированию. Часть 1. - Методическое
пособие по курсам: "Программирование на языке высокого уровня", "Программирование и основы алгоритмизация", "Информатика" для студентов всех специальностей очной и очно-заочной форм обучения., Новоуральск, НГТИ, 2007, 52 с.
Орлова И. В. Основы работы в интегрированной среде Турбо Паскаль 7.0. Учебно-методическое пособие по курсу «Информатика» для всех специальностей. Новоуральск, НПИ, 2001, -43 с.
55
УДК 681.3.06
Автор:
Орлова Ирина Викторовна
ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ ПО ПРОГРАММИРОВАНИЮ.
Часть 1.
Учебно-методическое пособие по курсам «Информатика»,
«Программирование и основы алгоритмизации»,
«Программирование на языках высокого уровня»
для студентов всех специальностей очной формы обучения
Новоуральск, НТИ НИЯУ МИФИ, 2010, 56 с.
Сдано в печать
Печать плоская
Заказ
Издательство НТИ
56
Формат А5
Уч.-изд.л. 1
Лицензия ИД № 00751.
Бумага писчая
Тираж 10 экз.
г.Новоуральск, Ленина, 85.
Download