
- •Учебно-методическое пособие по изучению теоретического материала и самостоятельному выполнению лабораторных заданий
- •1. Введение
- •2. Общие методические рекомендации по изучению курса
- •3. Методические рекомендации по изучению теоретического материала курса
- •3.1 Содержание разделов дисциплины
- •Тема 1. «Структура программы на языке «Паскаль». Основные типы данных. Правила записи имён в языке Паскаль. Линейные вычислительные процессы.»
- •Тема 2. «Базовые конструкции языка «Паскаль». Ветвящиеся вычислительные процессы.»
- •Тема 3. «Одномерные и многомерные массивы. Циклические вычислительные процессы.»
- •Тема 4. «Обработка символьной информации»
- •Тема 5. «Процедуры в языке Паскаль»
- •Тема 6. «Функции в языке Паскаль»
- •Тема 7. Рекурсивные функции. Явная и неявная рекурсия.
- •Тема 8. Многомодульные приложения (дополнительная тема).
- •4. Методические рекомендации по выполнению лабораторных работ
- •4.1 Лабораторная работа №1 «Структура программ на языке Паскаль, основные типы данных, основные операции, линейные вычислительные процессы»
- •Варианты заданий на лабораторную работу № 1.
- •Var a,b,c,r : real;
- •Var a,b,c,r : real;
- •Var a,b,c,r : real;
- •4.2 Лабораторная работа №2 «Условные операторы. Правила записи условий простые и сложные условия, ветвящиеся вычислительные процессы»
- •Варианты заданий на лабораторную работу № 2.
- •Var a,b,X : real;
- •Var a,b,X : real;
- •Var a,b,X : real;
- •Var a,b,X : real;
- •Var a,b,X : real;
- •4.3 Лабораторная работа №3 «Массивы и циклы в языке Паскаль»
- •Варианты заданий на лабораторную работу № 3.
- •4.4 Лабораторная работа №4 «Обработка символьной и строковой информации в языке Паскаль»
- •Варианты заданий на лабораторную работу № 4.
- •4.5 Лабораторная работа №5 «Процедуры в языке Паскаль»
- •Варианты заданий на лабораторную работу № 5.
- •Var a,b : integer; // Числа, вводимые пользователем
- •I : integer; // Счётчик цикла
- •Var a,b : integer; // Числа, вводимые пользователем
- •I : integer; // Счётчик цикла
- •Var a,b : integer; // Числа, вводимые пользователем
- •I : integer; // Счётчик цикла
- •Var X : integer;
- •Var I : integer; // Счётчик цикла
- •4.6 Лабораторная работа №6 «Функции в языке Паскаль»
- •Варианты заданий на лабораторную работу № 6.
- •Пример решения типовой задачи лабораторной работы № 6.
- •Var I : integer; // Счётчик цикла
- •Var X : integer;
- •Var X : integer;
- •В результате внесённых изменений наша программа примет следующий вид:
- •Var X : integer;
- •Результат работы этой программы представлен на следующем рисунке:
- •Var X : integer;
- •4.7 Лабораторная работа №7 «Рекурсия и рекурсивные функции в языке Паскаль»
- •Варианты заданий на лабораторную работу № 7.
- •Var x1, x2, Xn : real; // Вычисляемые числа
- •Var x1, x2, Xn : real; // Вычисляемые числа
- •Var x1, x2, Xn : real; // Вычисляемые числа
- •Var r : real ; // Граница вычислений, вводимая пользователем
- •Var x1, x2, Xn : real ; // Вычисляемые числа
- •I : integer; // Число итераций цикла
- •Var r : real ; // Граница вычислений, вводимая пользователем
- •Var Xn : real; // Вычисляемые числа
- •Var Xn : real; // Вычисляемые числа
- •5. Вопросы для подготовки к зачёту
- •6. Список рекомендуемой литературы
- •7. Программное обеспечение и Интернет-ресурсы
Var x1, x2, Xn : real; // Вычисляемые числа
S : real; // Вычисляемая сумма чисел
R : real; // Граница вычислений, вводимая пользователем
Этап второй. Разработка программы, реализующей вычисления при помощи простой не рекурсивной функции.
Для решения любой задачи можно разработать множество различных алгоритмов. Одни из них будут быстрыми, эффективными и универсальными, другие медленными. Но в любом случае, авсе алгоритмы будут отражать суть поставленной задачи.
Посмотрим ещё раз на нашу задачу.
Нам требуется непрерывное вычисление последовательных значений переменной «Xn», следовательно, в программе должен быть реализован циклический вычислительный процесс.
Однако, число повторений (итераций) цикла нам неизвестно. Оно определяется проверкой условия, что вычисленная сумма не должна превосходить заданное пользователем число. Значит для решения задачи нам потребуется цикл либо с пред, либо с пост условием.
Начальные значения переменных «X1», «X2» и переменной содержащей начальную сумму, должны быть заданы до начала цикла. А в процессе выполнения цикла – значения данных переменных должны будут изменяться в соответствии с формулой, заданной в условии задачи.
Итак, базовый код, реализующий заданные вычисления, но пока не содержащий функций, будет выглядеть примерно так:
Var x1, x2, Xn : real; // Вычисляемые числа
S : real; // Вычисляемая сумма чисел
R : real; // Граница вычислений, вводимая пользователем
Begin
// Ввод границы вычислений и установка начальных значений
Write(‘введите границу вычислений. R=’);
Readln(R);
X1:=0;
X2:=1;
S :=1;
Writeln(X1);
Writeln('X = ', X2, ' Сумма = ', S);
// Основной цикл
While (S<=R) do
begin Xn:=(X1+X2)/2;
S:=S+Xn;
Writeln('X = ', X2, ' Сумма = ', S);
X1:=X2;
X2:=Xn;
End;
End.
Казалось бы, базовый алгоритм готов.
Однако, посмотрим на результаты работы данной программы:
Вычисления на каждом шаге алгоритма производятся верно. Но алгоритм в целом, выполняет на один шаг вычислений больше.
Действительно, для введённой границы R=3, вычисления должны были закончится на шаге: X = 0.625 Сумма = 2.875
Наша же программа выполнила ещё один шаг и выдала:
X = 0.6875 Сумма = 3.5625
Вопрос.
Каким образом следует изменить разработанный нами базовый алгоритм, чтоб он не выполнял лишнего действия?
Самый простой способ – это заменить цикл с предусловием на цикл с постусловием. Переместив в него вычисление и печать первой суммы и изменив условие прекращения работы цикла.
Var x1, x2, Xn : real; // Вычисляемые числа
S : real; // Вычисляемая сумма чисел
R : real; // Граница вычислений, вводимая пользователем
Begin
// Ввод границы вычислений и установка начальных значений
Write('Введите границу вычислений. R=');
Readln(R);
X1:=0;
X2:=1;
Writeln('X = ', X1);
S :=X1;
Xn:=X2;
// Основной цикл
repeat
S:=S+Xn;
Writeln('X = ', Xn, ' Сумма = ', S);
Xn:=(X1+X2)/2;
X1:=X2;
X2:=Xn;
until ((S+Xn) > R);
End.
Теперь алгоритм будет работать верно:
Однако, по условию задачи нам требуется осуществить вычисления сначала при помощи простой функции, а затем рекурсивной функции.
Для начала осуществим преобразование алгоритма к варианту использования простой функции.
Пусть наша функция осуществляет вычисление и печать нового текущего значения «Xn» и полученной суммы «S».
Результатом работы функции будет число итоговая вычисленная сумма.
Подсчёт числа итераций цикла будет осуществляться по локальной переменной и возвращаться в главную часть программы при помощи параметра-переменной.
Таким образом, функция будет иметь 4 параметра: начальные значения «X1» и «X2», граница вычислений «R», и параметр N – число итераций цикла.
В конце программы выведем ещё раз значение найденной суммы, число слагаемых и число итераций цикла.
Для повышения качества выводимых данных – немного изменим оператор вывода в цикле.
В результате программа примет такой вид: