Файл: 1. Лекции Паскаль (Часть 1).doc

Добавлен: 19.10.2018

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

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

1.Стандартные типы данных

1.1.Структура программы

1.2.Описание стандартных типов данных

Целый тип

Вещественный тип

Символьный тип

Булевский тип

Перечисляемый тип

1.3.Выражения

Лабораторная работа №1

Вычисление выражений с использованием стандартных функций

Лабораторная работа № 1.

Вычисление выражений с использованием стандартных функций.

Постановка задачи

Описание используемых стандартных функций.

Программы № 15.а

Программы № 15.б

Варианты заданий

2. Операторы языка.

2.1. Составной и пустой операторы.

2.2.Условный оператор.

2.3.Операторы повторений.

2.4.Оператор выбора

2.5.Практические задания.

Лабораторная работа № 2

Решение уравнений и неравенств с использованием условного оператора.

Лабораторная работа № 2, вариант № 8.

Решение уравнений и неравенств с использованием условного оператора.

Варианты заданий

Лабораторная работа № 3.

Построение таблиц функций.

Лабораторная работа № 3, вариант № 8.

Построение таблиц функций.

Варианты заданий

Лабораторная работа № 4.

Организация циклов в программе.

Лабораторная работа № 4, вариант № 8.

Организация циклов в программе.

Варианты заданий

3.Численные методы.

3.1.Метод итераций

3.2.Метод Ньютона

3.3. Метод половинного деления.

Лабораторная работа № 5

Решение нелинейных уравнений.

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом итераций.

Описание метода итераций:

Текст программы.

Распечатка результатов работы программы в следующем виде:

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом Ньютона.

Описание метода Ньютона:

Блок-схема метода Ньютона:

Текст программы.

Распечатка результатов работы программы в следующем виде:

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом половинного деления.

Описание метода половинного деления:

Блок-схема метода половинного деления:

Текст программы.

Распечатка результатов работы программы в следующем виде:

Метод Монте-Карло (метод статистических испытаний)

5. Массивы.

5.1. Процедуры и функции.

5.2. Одномерные массивы.

5.2.1. Описание массивов.

5.2.2. Классы задач по обработке массивов.

5.2.2.1. Однотипная обработка всех или указанных элементов массивов.

5.2.2.2. Задачи, в результате решения которых изменяется структура массива.

5.2.2.3. Обработка нескольких массивов одновременно.

5.2.2.4. Поисковые задачи для массивов.

5.2.2.5. Сортировка массивов.

5.2.2.5.1. Сортировка вставкой

5.2.2.5.2. Сортировка выбором

5.2.2.5.3. Сортировка обменом («пузырьковая сортировка»)

5.2.2.5.4. Сортировка фон Неймана (слиянием)

5.2.2.5.5. Шейкер-сортировка

5.3. Двумерные массивы.

5.3.1. Описание двумерных массивов.

5.3.2. Сортировка двумерных массивов

Лабораторная работа № 4.

Работа с массивами чисел.

Образец выполнения задания.

Лабораторная работа № 4.

Работа с массивами чисел.

Варианты заданий.

6. Обработка строк.

6.1. Функции обработки строк.

6.2. Процедуры обработки строк.

Лабораторная работа № 7.

Обработка строк.

Лабораторная работа № 7, вариант № 8.

Обработка строк.

7. Комбинированные типы. Оператор присоединения

7.1. Записи

7.2. Оператор присоединения

Лабораторная работа № 8.

Работа с комбинированными типами данных.

Лабораторная работа № 8, вариант № 8.

Работа с комбинированными типами данных.

8. Множественные типы данных.

8.1. Множества.

Лабораторная работа № 9.

Работа с множественными типами данных.

Лабораторная работа № 9, вариант № 3.

Работа с множественными типами данных.

Варианты заданий.

Лабораторная работа № 10.

Операции над множествами.

Лабораторная работа № 10.

Операции над множествами.

Варианты заданий.


Постановка задачи:
  1. Для конкретного варианта найти корень уравнения F(x) = 0 с точностью =10-4, используя один из численных методов. На печать вывести вычисленное значение корня и для сравнения точное значение корня.

  2. Значения a, b, x0, вводятся с клавиатуры. Должен быть предусмотрен контроль вводимых значений.

  3. В программе необходимо предусмотреть подсчет и вывод на печать числа итераций, за которое удается найти значение корня с заданной точностью.


Содержание отчета :
  1. Постановка задачи для конкретного варианта и исходные данные.

  2. Описание и блок-схема метода решения.

  3. Текст программы.

Распечатка результатов работы программы в следующем виде:


РЕШЕНИЕ УРАВНЕНИЯ

ТОЧНОЕ ЗНАЧЕНИЕ КОРНЯ .............................

ВЫЧИСЛЕННОЕ ЗНАЧЕНИЕ КОРНЯ .............….

ЧИСЛО ИТЕРАЦИЙ ...........................................

Образец выполнения задания.

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом итераций.

Постановка задачи для конкретного варианта и исходные данные:


1. Найти корень уравнения : с точностью =10-4, корень уравнения находится на отрезке (0.4, 1), используя метод итераций. На печать вывести вычисленное значение корня и для сравнения точное значение корня, точное значение корня x=0.7376.


Значения :

Xо – примерное значение корня,

- точность нахождения корня, вводятся с клавиатуры.

Должен быть предусмотрен контроль вводимых значений.


2. В программе необходимо предусмотреть подсчет и вывод на печать числа итераций, за которое удается найти значение корня с заданной точностью.

Описание и блок-схема метода решения:

Описание метода итераций:

Пусть уравнение имеет один корень на отрезке [a;b]. Функция F(x) непрерывна на отрезке [a; b].

Этот метод заключается в замене уравнения эквивалентным ему уравнением вида

После этого строится итерационный процесс:

На заданном отрезке [a; b] выберем точку х0 – нулевое приближение – и найдем:

х1 = f(x0),

потом найдем:

х2 = f(x1),

и т.д.

Таким образом, процесс нахождения корня уравнения сводится к последовательному вычислению чисел:

хn = f(xn-1) n = 1,2,3..... .


Процесс итераций продолжается до тех пор, пока


где – заданная абсолютная погрешность корня х.


Блок-схема метода итераций:











true false










Текст программы.

program lab5{ вариант № 3};

uses crt;

var x0,x1,a,b,e:real;

iteraz:integer;

function fun(x:real):real;

begin

fun:=2.5-sqrt(x)-exp((1/3)*(ln(x)));

end;

begin

clrscr;

write('Введите приближённое значение X=');

readln(x1);

write('Введите точность e=');

readln(e);

iteraz:=0;

repeat

iteraz:=iteraz+1;

x0:=x1;

x1:=fun(x0);

until (abs(x1-x0)<=e);

writeln('Решение уравнения:');

writeln('Точное значение корня...... ……0.7376');

writeln('Вычисленное значение корня…',x1:6:5);

writeln('Число итераций..…………......... ',iteraz);

writeln('Программа закончена, нажмите Enter.');

readln;

end.

Распечатка результатов работы программы в следующем виде:




Решение уравнения:

Точное значение корня...... ……...0.7376

Вычисленное значение корня.. …0.73767

Число итераций...........………….. ..989


Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом Ньютона.


Постановка задачи для конкретного варианта и исходные данные:


1. Найти корень уравнения : с точностью =10-4, корень уравнения находится на отрезке (0.4, 1), используя метод Ньютона. На печать вывести вычисленное значение корня и для сравнения точное значение корня, точное значение корня x=0.7376.


Значения :

Xо – примерное значение корня,

- точность нахождения корня, вводятся с клавиатуры.

Должен быть предусмотрен контроль вводимых значений.


2. В программе необходимо предусмотреть подсчет и вывод на печать числа итераций, за которое удается найти значение корня с заданной точностью.

Описание и блок-схема метода решения:

Описание метода Ньютона:


Пусть уравнение имеет один корень на отрезке [a;b]. Функция F(x) непрерывна на отрезке [a; b].

Приводящее к итерационному процессу следующего вида:

Выберем на отрезке[a; b] произвольную точку х0 – нулевое приближение. Затем найдем:

x1 = x0 - ,

потом x2 = x1 - .

Таким образом, процесс нахождения корня уравнения сводится к вычислению чисел xn по формуле:

xn = xn-1 - n = 1,2,3...... .


Процесс вычисления продолжается до тех пор, пока не будет выполнено условие:

Блок-схема метода Ньютона:









true false










Текст программы.

program lab5{ вариант № 3};

uses crt;

var x0,x1,a,b,e:real;

iteraz:integer;

function fun(x:real):real;

begin

fun:=(x+sqrt(x)+exp((1/3)*(ln(x)))-2.5)/(1+1/(2*sqrt(x))+1/(3*exp((1/3)*(ln(x)))));

end;

begin

clrscr;

write('Введите приближённое значение корня X=');

readln(x1);

write('Введите точность e=');

readln(e);

iteraz:=0;

repeat

iteraz:=iteraz+1;

x0:=x1;

x1:=x0-fun(x0);

until (abs(x1-x0)<=e);

writeln('Решение уравнения:');

writeln('Точное значение корня...... ……0.7376');

writeln('Вычисленное значение корня…',x1:6:5);

writeln('Число итераций..…………......... ',iteraz);

writeln('Программа закончена, нажмите Enter.');

readln;

end.


Распечатка результатов работы программы в следующем виде:



Решение уравнения:

Точное значение корня...... ……...0.7376

Вычисленное значение корня.. …0.73762

Число итераций...........………… ..3


Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом половинного деления.


Постановка задачи для конкретного варианта и исходные данные:


1. Найти корень уравнения : с точностью =10-4, корень уравнения находится на отрезке (0.4, 1), используя методов половинного деления. На печать вывести вычисленное значение корня и для сравнения точное значение корня, точное значение корня x=0.7376.


Значения :

(a, b) – отрезок на котором находится корень уравнения,

Xо – примерное значение корня,

- точность нахождения корня,

вводятся с клавиатуры.

Должен быть предусмотрен контроль вводимых значений.


2. В программе необходимо предусмотреть подсчет и вывод на печать числа итераций, за которое удается найти значение корня с заданной точностью.


Описание и блок-схема метода решения:

Описание метода половинного деления:


Пусть уравнение имеет один корень на отрезке [a;b]. Функция F(x) непрерывна на отрезке [a; b].

Метод половинного деления заключается в следующем:

Сначала выбираем начальное приближение, деля отрезок пополам, т.е. х0 = (a+b)/2. Если F(x)=0, то x0 является корнем уравнения. Если F(x) 0, то выбираем тот из отрезков, на концах которого функция имеет противоположные знаки. Полученный отрезок снова делим пополам и выполняем действия сначала и т.д.

Процесс деления отрезка продолжаем до тех пор, пока длина отрезка, на концах которого функция имеет противоположные знаки, не будет меньше заданного числа .



Блок-схема метода половинного деления:







true false




false true









Текст программы.

program lab5{ вариант № 3};

uses crt;

var x,a,b,e:real;

iteraz:integer;

function fun(x:real):real;

begin

fun:=x+sqrt(x)+exp((1/3)*(ln(x)))-2.5;

end;

begin

repeat

clrscr;

writeln('Корень уравнения находиться на интервале [a,b]');

write('Введите [a=');

readln(a);

write('Введите [b=');

readln(b);

write('Введите приближённое значение корня X=');

readln(x);

write('Введите точность e=');

readln(e);

until (b-a>e) or (x>a) or (x<b) or (a<>0);

iteraz:=0;

while (fun(x)<>0) and (abs(a-b)>e) do

begin

iteraz:=iteraz+1;

if (fun(a)*fun(x))<0

then b:=x

else a:=x;

x:=((a+b)/2);

end;

writeln('Решение уравнения:');

writeln('Точное значение корня....……..0.7376’);

writeln('Вычисленное значение корня.. ',x:6:5);

writeln('Число итераций..........…………. ',iteraz);

writeln('Программа закончена, нажмите Enter.');

readln;

end.

Распечатка результатов работы программы в следующем виде:



Решение уравнения:

Точное значение корня...... ……..0.73760

Вычисленное значение корня.. …0.73764

Число итераций...........………… ..14


Варианты заданий.



N0 вар.

Уравнение

Отрезок, содержащий корень

Метод

Точное значение корня

1

[2;3]

Итераций

2,2985

2

[0;2]

Ньютона

1,0001

3

[0;0,85]

Итераций

0,2624

4

[1;2]

Ньютона

1,1183

5

[0;8]

Половинного деления

0,3333

6

[0;1]

Итераций

0,5629

7

[2;4]

Ньютона

3,2300

8

[1;2]

Половинного деления

1,8756

9

[0;1]

Итераций

0,7672

10

ex - e-x -2 = 0

[0;1]

Ньютона

0,8814

11

[1;3]

Половинного деления

1,3749

12

[1,2;2]

Итераций

1,3077

13

[3;4]

Ньютона

3,5265

14

[1;2]

Половинного деления

1,0804

15

[0;1,5]

Итераций

1,1474

16

[1;3]

Ньютона

2,0692

17

[0;1]

Половинного деления

0,5768

18

[0,5;1]

Итераций

0,9892

19

[1;3]

Ньютона

1,8832

20

[0;1]

Половинного деления

0,1010

21

[2;3]

Итераций

2,0267

22

[0,4;1]

Ньютона

0,6533

23

[-1;0]

Половинного деления

-0,2877

24

ln x -x + 1,8 = 0

[2;3]

Итераций

2,8459



  1. Случайные числа.

Мы не можем заранее сказать, какая сторона монеты или игрального кубика окажется сверху, какую карту мы вытащим из колоды. Говорят, что результат такого эксперимента является случайным числом. Повторяя эксперимент много раз, можно получить последовательность случайных чисел. Интересно, что невозможно предвидеть значение нового члена ряда – он не зависит от предыдущих членов.

Случайные числа широко используются в задачах, моделирующих жизненные ситуации (игры, эпидемии заболеваний и др.). В Паскале реализован датчик или генератор псевдослучайных чисел. Числа, вырабатываемые при помощи приведенных ниже функций, называют псевдослучайными («похожими» на случайные), поскольку это модель случайных чисел, иногда весьма приближенная.

Randomize – инициирует датчик.

Random – генерирует случайные действительные числа из диапазона [0;1]

Random (x) – генерирует любые случайные целые числа из диапазона [0;x].

Random (x) + random – генерирует случайное действительное число из диапазона [0;x];

Random (x) + random + y – генерирует случайное действительное число из диапазона [y; x + y];

Random (x) + random – y – генерирует случайное действительное число из диапазона [-y; x – y];

2* x* Random – x – генерирует случайное действительное число из диапазона [-x; x].

Метод Монте-Карло (метод статистических испытаний)


Случайные числа широко используются для приближенного вычисления площади с помощью метода Монте-Карло. Суть метода очень проста. Пусть есть некоторая фигура, площадь которой необходимо вычислить. Размещаем эту фигуру внутри стандартного квадрата со сторонами, параллельными осям. Пусть про любую точку квадрата можно узнать попадает ли эта точка внутрь фигуры или нет. Тогда площадь может быть вычислена следующим образом: поделив количество точек, попавших внутрь фигуры, на количество всех точек, попавших в квадрат, можно узнать, какую часть площади квадрата занимает фигура, домножив это отношение на площадь квадрата, получим площадь фигуры. Ясно, что число точек, попавших внутрь фигуры тем больше, чем больше фигура, а точность решения будет пропорциональна количеству точек в квадрате. Пара случайных чисел в этом методе может быть рассмотрена как координаты точки на плоскости.

Пример: Определить площадь круга с радиусом R=1.

Решение:

program task;

var i,n, m: integer; {n- общее кол-во точек, m- кол-во точек внутри круга}

x, y: real; {координаты точки}

begin

wriiteln (‘задайте количество точек’);

readin (n);

Randomize;

m: = 0;

for i: = 1 to n do

begin

x: = 2* random – 1; y: = 2* random – 1;

if sqr (x) + sqr (y) < = 1 then m: - m + 1;

end;

writeln ('площадь круга равна ‘, 4* m/n);

readln;

End.

Результаты выполнения программы:

Задайте количество точек: 8


Площадь круга равна : 2.5000000000E+00


5. Массивы.

5.1. Процедуры и функции.


Процедуры и функции представляют собой важный инструмент ТР, позволяющий писать хорошо структурированные программы.


Процедура представляет собой отдельную часть программы, которая имеет своё имя.

Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные определенным образом и снабженные именем.

Описать программу - это значит указать ее заголовок и тело. В заголовке объявляют имя подпрограммы и формальные параметры. Для функции еще указывается тип возвращаемого ею результата. За заголовком следует тело подпрограммы, которое состоит из раздела описаний и раздела исполняемых операторов.

Заголовок процедуры имеет вид:

PROCEDURE <имя>[(< сп. ф. п. >)];

Заголовок функции:

FUNCTION<имя> [(< сп. ф. п.>)]: <тип>,

где <имя> - имя подпрограммы;

<сп. ф. п.> - список формальных параметров;

<тип> - тип возвращаемого функцией результата;

Список формальных параметров необязателен и может отсутствовать. Если же он есть, то в нем должны быть перечислены их имена и тип:

PROCEDURE SB (a : real; b : integer; c : char );

Операторы тела подпрограммы рассматривают список формальных параметров как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы.

Вызов и выполнение осуществляется при помощи оператора процедуры:

<имя процедуры>(<список фактических параметров>);

Между формальными и фактическими параметрами должно быть полное соответствие, т.е. должно быть одинаковое количество, порядок их следования должен быть один и тот же, тип каждого фактического параметра должен совпадать с типом соответствующего ему формального параметра. Определение формального параметра тем или иным способом существенно только для вызывающей программы: если формальный параметр объявлен как параметр-переменная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр-значение, то при вызове ему может соответствовать произвольное выражение. Контроль над неукоснительным соблюдением этого правила осуществляется компилятором языка Turbo Pascal.


Расмотрим взаимодействие основной программы с процедурами и функциями.

Program

Const

MWSt = 14.0;

Var

Value, cost:real;

Procedure Input­_number (var Input_value:real);

{данная процедура решает задачу ввода стоимости товара после предварительного запроса }

Begin

Write(‘Ведите, велечину стоимости товара: ’)

Readln (Input_value);

End;

Prodcedure Calulation_cost (Cost,Value:real);

{данная процедура позволяет вычислить велечину цены ,учитывая при этом велечину налога}

Begin

Cost:=(1.0+MWSt/100.0)*Value;

End;

Procedure Output_result (Input_value:real);

{данная процедура позволяет вывести на экран результаты расчетов}

Begin

Writeln;{Оператор Writeln заданный без параметров,}

Writeln;{Переводит курсор на начало следующей строки}

Writeln(‘Расчетная цена с учетом’,MWSt:5:2,’% налога’,’составляет: ’,Cost:7:2,’ $.’);

End;

Begin {Основной блок программы}