- •§1. Начало программирования на языке Паскаль.
- •Краткое знакомство.
- •Функциональные клавиши Турбо Паскаль.
- •§2. Алфавит языка Паскаль. Переменные. Типы переменных Алфавит языка Паскаль.
- •Стандартные математические функции
- •Типы переменных
- •§3. Операторы присваивания.
- •Оператор ввода-вывода.
- •Арифметические операции.
- •Стандартные функции
- •Правила записи арифметических выражений.
- •Правила записи стандартных функций.
- •Оператор ввода .
- •Оператор вывода .
- •§4. Структура программы.
- •Первая программа.
- •Эксперименты с программой.
- •§5. Разветвляющие алгоритмы. Составной оператор
- •Оператор if или условный оператор
- •Блок-схема полного у словного оператора
- •Блок-схема неполного у да Условие словного оператора
- •§6. Оператор цикла с параметром Циклический алгоритм
- •Цикл с предусловием «Пока»
- •Цикл с постусловием «До»
- •Цикл с параметром «Для» Цикл с параметром «Для»
- •Блок-схема цикла «for»
- •§7. Базовые циклические алгоритмы
- •1. Алгоритм вычисления суммы чисел.
- •2. Подсчет количества чисел удовлетворяющих заданному условию.
- •3. Вычислить сумму чисел, кратных 3, из десяти чисел введенных с клавиатуры.
- •4. Алгоритм вычисления n!.
- •5. Алгоритм вычисления аn.
- •§8. Цикл с предусловием while
- •Блок-схема цикла «Пока»
- •§9. Оператор цикла с постусловием Repeat
- •Блок-схема цикла «До»
- •§10. Эксперимент с программой. Лабораторная работа
- •§11. Оператор варианта выбора
- •§12. Типы определенные пользователем Раздел описания типов
- •Перечислимый тип данных
- •§13. Вложенные циклы
- •§14. Одномерные массивы Работа с элементами
- •Способы задания значений элементов массива
- •Алгоритмы работы с массивами
- •Эксперименты с программой
- •§15. Обработка символьных массивов. Данные символьного типа.
- •Описание строковых переменных
- •Операции над строковыми переменными
- •§16. Двумерные массивы Работа с элементами
- •5.Вычисление суммы элементов всего двумерного массива.
- •6. Задача поиска максимального (минимального) элемента и его индексов.
- •7. Алгоритм поиска минимального элемента и его индексов для всего массива.
- •8. Квадратные матрицы.
- •Примеры решения задач
- •§17. Подпрограммы
- •Процедура в Паскале и ее формат.
- •Функции
- •§18. Примеры рекурсивного программирования
- •Задачи с рекурсивной формулировкой
- •Задачи, из постановки которых можно извлечь рекурсию
- •Задачи, которые можно решить как частный случай обобщенной
- •Задачи, в которых можно использовать характеристику или свойство функции
- •§19. Графика
- •Установка цвета и стиля заполнения
- •Процедуры создания графических примитивов
- •1. Текущий указатель.
- •2. Вывод точки
- •3. Вывод отрезка
- •4. Построение прямоугольника
- •5. Построение дуг, окружностей, эллипсов.
- •6. Построение закрашенного эллипса:
- •7. Заполнение внутренней или внешней области замкнутой фигуры.
- •Материалы для дополнительного чтения. §20. Файловый тип данных
- •Связь переменной файлового типа с файлом на диске.
- •Чтение из файла.
- •Закрытие файла
- •Признак конца файла
- •Запись в файл
- •Прямой доступ к элементам файла
- •§21. Текстовые файлы
- •§22. Множества
- •Операции над множествами
- •Операция определения принадлежности элемента множеству
- •Сравнение множеств
- •§23. Комбинированный тип данных (записи)
- •2. С использованием оператора присоединения.
- •§24. Приближенные вычисления.
- •§25. Основы структурного программирования
- •10. Комплексный пример
- •Содержание
§24. Приближенные вычисления.
Задача 1. Вычислить приближенное значение суммы
1 + x/1! + x2/2! + x3/3! + ...
Считаем, что нужное приближение получено, если вычислена сумма нескольких слагаемых, и очередное слагаемое оказалось по модулю меньше, чем данное малое положительное число .
Для решения задачи мы должны выполнить следующие действия:
1) получить очередное слагаемое (назовем его а);
2) сравнить абсолютную величину слагаемого а с и, в зависимости от результата сравнения, либо продолжить, либо прекратить вычисления.
Program p;
var a: real;
x : real;
: real;
i : integer;
S : integer;
begin
readln(x, );
i:=1;
a:=1;
S:=0;
WHILE a> DO
begin
S:=S+a; i:=i+1; a:=a*x/i;
end;
writeln(‘приближенное значение суммы=’,S:4:2)
end.
Задача 2. Рассмотрим часто встречающуюся задачу приближенного решения уравнения f(x)=0, где f(x) - заданная функция. Решить уравнение - значит найти такое значение х*, при котором f(x*)=0. Поиск решения осуществляется на интервале [a;b], причем f(a)<0, а f(b)>0. Используем метод деления пополам. Находим точку с=(а+b)/2 - середина отрезка. Если f(c)>0, то границу b изменяем на значение с, а если f(с)<0, то изменяем а. Процесс продолжаем, пока длина интервала не будет меньше заданной точности.
f(x)
0
a
c
b
X
Y
program popolam;
const eps=1.0E-3;
var a,b,c:real;
Function eg(x,y:real):boolean;
begin
Eg:=Abs(x-y)<eps
end;
Function F(x:real):real;
begin
F:=Sgr(x)-2
end;
BEGIN
Writeln(‘введите интервал’); readln(a,b);
if F(a)*F(b)>0 then writeln(‘на этом интервале мы не можем
найти решение уравнения’)
else begin
while Not Eg(a,b) do
begin c:=(a+b)/2;
if F(c)>0 then b:=c else a:=c
end;
writeln(‘Результат ’,a)
end;
readln
end.
Можно с помощью этой программы решить уравнения :
x2-6x+5=0 x-cosx=0 x-lnx-2=0 2x3-9x2-60x+1=0
0
a
x1
x2........
xn-2
xn
X
Y
На каждом из отрезков [xi,xi+1] как на основании, построим прямоугольник с высотой f(xi).
Площадь прямоугольников мы умеем находить. Сумма площадей всех прямоугольников даст приближенное значение площади фигуры:
Sприб=(b-a)/n*(f(x0)+....f(xn-1))
Естественно, что чем мельче будет разбиение, тем точнее мы подсчитаем площадь фигуры.
Для отладки программы возьмем функцию f(x2) на отрезке [1,2]. Площадь фигуры равна 2,333....
program trapez;
const eps=1.0E-3;
var a,b,s,dx :real;
i,n : integer;
Function eg(x,y:real):boolean;
begin
Eg:=Abs(x-y)<eps
end;
Function F(x:real):real;
begin
F:=Sgr(x)
end;
BEGIN
Writeln(‘введите интервал и число частей для разбивки’); readln(a,b,n);
x:=a; dx:=(b-a)/n; s:=0;
For i:=1 to n-1 do
begin
s:=s+F(x);
x:=x+dx;
end;
writeln(‘Результат = ’,(b-a)/n*s);
readln;
end.
Вычислить площадь криволинейных трапеций для следующих функций: f(x)=1/(1+x) [0,1] f(x)=1/x [1,3]
f(x)=sinx [0,/2]
Задача 4. Для вычисления элементарных функций в математике широко распространено представление этих функций в виде некоторых бесконечных сумм. Не вдаваясь в обоснование таких представлений, приведем некоторые их них :
ex=1 + x + x2/2! + x3/3! + ... + xn/n! + ...
sinx=x - x3/3! + x5/5! - x7/7! +...+ (-1)nx2n-1/(2n+1)! +....
cosx= 1 - x2/2! + x4/4! - x6/6! +...+ (-1)nx2n/(2n)! +....
ln(1+x)=x - x2/2 + x3/3 - x4/4 + ...+ (-1)n+1xn/n + ..... (-1<x<=1)
В каждом из разложений точность представления функции будет, вообще говоря, тем выше, чем больше взято слагаемых в сумме. Причем значения самих слагаемых с ростом n стремятся к нулю. Для вычисления значений функции с некоторой заданной точностью поступают следующим образом. Вычисляют и суммируют слагаемые до тех тор, пока очередное слагаемое не станет по абсолютной величине меньше или абсолютное значение разности между соседними слагаемыми не станет меньше . Полученную сумму и принимают за приближенное значение функции.
Вычисли функцию sinx.
Program rad;
const eps=1.0E-3;
var x,sn,ss : real;
p, n : integer;
{p - используется для чередования знака слагаемого}
Function Eg(x,y;real):boolean;
begin
Eg:=Abs(x-y)<eps
end;
Function F(n:integer;var x:real):real;
var i:integer;
s:longint;
begin
s:=1;
for i:=2 to n do s:=s*i;
x:=x*sqr(x); F:=x/s
end;
BEGIN
writeln(‘Введите значение х’);
readln(x);
ss:=0; sn:=x; n:=1; p:=1;
Repeat
ss:=sn; {предыдущее значение слагаемого}
{ новое значение слагаемого}
n:=n+2; p:=-1*p; sn:=ss+p*F(n,x)
Until Eq(ss,sn) or (n>=12);
Writeln(‘Результат=’,sn); readln
end.
Задача 5. Метод Монте-Карло для приближенного вычисления площади.
Пусть есть какая-нибудь фигура на плоскости, расположенная внутри стандартного квадрата со сторонами параллельными координатным осям.
Пусть про любую точку квадрата мы можем быстро узнать, попадает ли эта точка внутрь фигуры или нет.
Для выбора точек используют случайные числа Random(x)
Если вызвать функцию много раз подряд, то множество полученных чисел будет равномерно распределено по отрезку [0,a]
Program ss;
var n: integer; {количество точек}
a : integer; {длина стороны квадрата}
m, i : integer;
x,y : real;
begin
writeln(‘введите кол-во точек и сторону квадрата’);
readln(n,a);
m:=0;
for i:=1 to n do
begin
x:=Rondom(a); y:=Random(a);
if точка(x,y) внутри квадрата then m:=m+1
end;
S:=(m/n)*a*a
writeln(‘Результат ’,s);
end.
