299.54K
Категория: ИнформатикаИнформатика

Основы алгоритмизации. Понятие и свойства алгоритма

1.

1
ОСНОВЫ АЛГОРИТМИЗАЦИИ
Понятие и свойства алгоритма
Слово «алгоритм» происходит от algorithm — латинского написания имени аль-Хорезми, под
которым в средневековой Европе знали величайшего математика из Хорезма (город в современном
Узбекистане) Мухаммеда бен Мусу, жившего в 783-850 гг., который сформулировал правила
выполнения 4 арифметических действий над многозначными числами.
Алгоритм — это конечная последовательность однозначных предписаний, позволяющая решить
задачу.
Свойства алгоритма:
1. Дискретность - алгоритм должен представлять процесс решения задачи как последовательность
простых шагов.
2. Определенность - каждая команда алгоритма должна быть четкой и однозначной.
3. Результативность - алгоритм должен приводить к решению за конечное число шагов.
4. Массовость - алгоритм позволяет решать целый класс однотипных задач, различающихся лишь
исходными данными.
Способы задания алгоритмов
1. Словесно-формульный
2. Графический
3. Табличный
4. Блок-схема
5. Описание на каком-либо языке программирование (программа).
Описание алгоритма с помощью блок-схемы.
Блок-схема - это графическое представление алгоритма, в котором операции изображены с помощью
различных геометрических фигур, причем каждому типу операций соответствует своя фигура.
Содержимое операции
записывается
внутри
фигуры,
а последовательность
их выполнения
изображается в виде линий, соединяющих соответствующие фигуры. Направления чтения блок-схемы сверху вниз и слева направо. Нетрадиционные направления принято обозначать стрелками.
Наименование символа
Обозначение символа
Функция символа
Пуск-останов
Начало, конец, прерывание процесса
обработки данных или выполнения
программы
Ввод-вывод
Преобразование данных в форму,
пригодную для обработки (ввод) или
отображения результатов обработки
(вывод)
Процесс
Выполнение операции или группы
операций, в результате которых изменяется
значение, форма представления или
расположения данных
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

2.

2
Выбор направления выполнения алгоритма
или программы в зависимости от
некоторых переменных условий
Решение
Предопределительный
процесс
Использование ранее cозданных или
отдельно описанных алгоритмов
и программ (подпрограммы)
Соединительный
Указание связи между прерванными
линиями потока, связывающими символы
Комментарий
Связь между элементами схемы и
пояснением
Пример 1 В переменную х вводится произвольное число. В зависимости от знака введенного числа,
переменной S присваиваются такие значения:
начало
− 1, x < 0
S = 0, x = 0
1, x > 0
Ввод
Х
нет
нет
S=0
X<0
X>0
да
да
S = -1
S=1
Вывод
S
конец
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

3.

3
Этапы решения задачи на ЭВМ.
1. Постановка задачи - четко сформулировать, что дано и что требуется найти.
2. Формализация задачи - задача переводится на язык математических формул, уравнений,
отношений.
3. Построение алгоритма - описания алгоритма с помощью блок-схемы.
4. Составление программы - перевод блок-схемы на язык программирования. Программа —
конечная последовательность предписаний с указанием порядка их выполнения.
5. Отладка и тестирование программы – выявление синтаксических и логических ошибок в
программе, проверка правильности работы программы с помощью калькулятора или уже имеющихся
данных.
6. Проведение расчетов и анализ полученных результатов - использование уже разработанной
программы в практических целях.
Часто эту последовательность называют технологической цепочкой решения задачи на ЭВМ.
Введение в Паскаль
Литература
1) Турбо Паскаль 7.0. Самоучитель Мартынюк Т.
Питер, 416 стр.
2) Турбо-Паскаль 7.0. Самоучитель для начинающих. 2-е издание Лукин С.Н.
Диалог-Мифи, 400 стр.
3) Turbo Pascal для студентов и школьников Рапаков Г., Ржеуцкая С.
BHV-Санкт-Петербург, 352 стр.
4) Pascal 7.0. Практическое программирование. Решение типовых задач.
Издание 3, дополненное Климова Л.М. КУДИЦ-ОБРАЗ, 528 стр.
5) Turbo Pascal 7.0. Практика программирования. Фаронов В.В. Нолидж,
Издание 7 стр. 416
Язык программирования Паскаль был разработан в конце 60 годов XX века швейцарским ученым
Н. Виртом. Он был назван в честь великого французского математика Блеза Паскаля
Паскаль имеет свой алфавит, который состоит из следующих символов:
- строчные и прописные символы латинского алфавита;
- строчные и прописные символы русского алфавита;
- арабские цифры;
- алгебраические знаки + ,- ,* , /
- знаки препинания . , ' ', ( ), [ ]
- знаки отношения <, >, =, > =, <=, <>
- специальные символы #, $
Типы данных.
Любой алгоритм работает с некоторыми данными или величинами. Данные могут быть как
константами, то есть постоянными величинами, так и переменными. Каждая величина имеет имя,
значение и адрес в памяти. Имя величины - это набор символов латинского алфавита и цифр. Имя не
должно начинаться с цифры, а также состоять из недопустимых символов.
Например, именем величены может быть B, A1, A1B18, ALFA. AB-18, 156BD, ФАB - неправильные.
Каждая величина может принимать то или иной значение из определенного множества. Для указания
этого множества используется тип данных - это множество, для которого оговорен некоторый набор
операций над его элементами. В языке Паскаль существует четыре основных типа данных:
Integer ( I )- целый тип, множество целых чисел от -32768 до 32768, операции сложения, вычитания,
умножения и целочисленного деления.
Real ( R )- вещественный тип, множество дробных чисел, операции сложения, вычитания, умножения
и деления. Вещественное число имеет две формы записи:
Числа с фиксированной запятой. Дробная часть отделяется точкой (.) Пример, 5.46, -9.37
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

4.

4
Числа с плавающей запятой. Применяется для записи очень больших и очень маленьких числе.
Пример, 3.4Е5 = 3,4 . 105.
Char ( C )- символьный тип, это множество символов языка Паскаль (только 1 символ), операции
сравнения.
Boolean ( B )- множество состоящие из двух значений True и False, операции сравнения.
Арифметические операции, функции, выражения.
К арифметическим типам данных относятся группы вещественных и целых типов. К ним применимы
арифметические операции и операции отношений.
Операции над данными бывают унарными (применимые к одному операнду) и бинарными (применимые
к двум операндам). Унарная арифметическая операция одна. Это операция изменения знака. Ее формат:
— величина
Знак Выражение
Типы операндов
Тип результатов
Операция
+
А+В
-
А-В
*
R,R
1,1
I,R;R,I
R,R
1,1
I,R;R,I
R,R
I.I
I,R;R,I
R,R
1,1
I,R;R,I
I.I
I.I
А*В
/
А/В
div
mod
А div В
A mod В
R
I
R
R
I
Сложение
Вычитание
R
R
I
R
R
R
R
I
I
Умножение
Вещественное
деление
Целое деление
Остаток отцелого деления
Стандартные математические функции Турбо Паскаля.
Pi
Abs (x)
Arctan(x)
Chr(I)
Cos (x)
Exp(x)
Frac(x)
Int(x)
Ln(x)
Odd(I)
Random
Random(x)
Round(x)
Sin (x)
Sqr(x)
Sqrt(x)
Тип
аргумента

I,R
I,R
I
I,R
I,R
I,R
I,R
I,R
I
I
R
I,R
I,R
I,R
Тип
результата
R
I,R
R
С
R
R
R
R
R
B
R
I
I
R
I,R
R
Trunc(x)
R
I
Функция
Определяет
чиcлo π=3.1415926536E+00
модуль аргумента x
арктангенс x (радианы)
символ, порядковый номер которого равен I;
косинус x (x в радианах)
ex — основание натурального логарифма возводит в степень х
дробную часть аргумента x
целую часть аргумента х
натуральный логарифм х
четность числа: I – нечетный, то результат true, четный – false
псевдослучайное число в интервале [0, 1)
псевдослучайное число в интервале [0, х)
ближайшее целое (округляет число x)
синус х (х в радианах)
х2– х возводит в квадрат
x – квадратный корень из х
ближайшее целое, не превышающее х по модулю
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

5.

5
Математические функции, не представленные в языке Паскаль в явном виде
Функция
Математическое выражение
Определяет
log y x
Ln(x)/Ln(y)
логарифм x по основанию y
Lg(x)
xn
Ln(x)/Ln(10)
Exp(n*Ln(x))
Exp(Ln(x)/n)
десятичный логарифм x
значение возведение в степень
Извлечение корня степени n
n
x = x1/ n
Тригонометрические функции.
Sin(x)/Cos(x)
тангенс угла x
Cos(X)/Sin(x)
котангенс угла x
Arctan(X/Sqrt(l - x*x))
арксинус числа x
Pi/2 - Arctan(xSqrt(l - x*x))
арккосинус числа x
Pi/2 - Arctan(x)
арккотангенс числа x
tg x
ctg x
arcsin x
arccos x
arcctg x
Порядок убывания приоритета
1) вычисление функций 2) операция изменения знака
3) * , / , div , mod
4) + , Несколько записанных поряд операций одинакового приоритета выполняются последовательно слева
направо. Часть выражения, заключенная в скобки выполняется в первую очередь, например, сложение и
вычитание в скоках, а затем умножение (A+B)*(C-D).
(1 + y ) ⋅
2⋅x +
y − ( x + y)
1
y+ 2
x −4
Данное арифметическое выражение переведено на Паскаль.
Числами сверху указан порядок выполнения операций.
1
7
4
5
3
6
2
(1 + y) * (2 * x + Sqrt(y) - (x + y))
12
11
/ (y + 1
10
/
8
9
(sqr(x) - 4))
Структура программы на языке программирования Паскаль
На языке Паскаль программа - это последовательность операторов. Принято, что каждый оператор
программы должен записываться в отдельной строке.
Программа состоит из:
1 заголовка программы
Примеры
Program MyProg;
Uses CRT;
Label metka;
Сonst X=2; N=’Переменная’;
Type Day=(Sat, Sun, Mon);
Var S:Integer; X:Real;
Procedure Evklid;
Function Max(X,Y: Real): Real;
Program имя программы;
раздел описания модулей Uses
раздел описания меток Label
раздел описания констант Const
2 блока описаний
раздел описания типов Type
раздел описания переменных Var
раздел описания процедур и
функций Procedure и Function
заключается в операторные скобки
Begin – открывающая скобка
Begin
опертор 1;
A:=8;
опертор 2;
C:=(A+B)/D;
3 блока операторов
Write(A);
...
опертор n;
Write('Пример');
End – закрывающая скобка
End.
Любой раздел носит описательный характер и может отсутствовать.
В конце программы обязательно ставиться точка.
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

6.

6
Операторы языка программирования Паскаль
Оператор присваивания :=
имя := выражение;
где := - знак присваивания,
имя - имя величины,
выражение-набор величин или функций, включающий
Примеры:
A:=25;
A присвоить значение 25;
B:=B+C
B присвоить сумму B и С;
Назначение команды присваивания:
a. Засылка константы в память: A:=8;
b. Пересылка значения из одного места памяти в другое: B:=A;
c. Вычисление: C:=(A+B)/D;
знаки
операций
и
скобки.
Оператор ввода данных с клавиатуры Read
Read ( список переменных );
Readln (список переменных );
список переменных – одно или несколько имен переменных, разделенных запятой
Read [ri:d] – чтение
Read – считать данные с клавиатуры
ln сокращение от line [lain] – линия;
Readln – прочитать данные и перевести курсор на следующую линию (строку)
Пример Read (x) – набрать значение х и нажать клавишу ввода (Enter)
Read (x, y) – набрать значение х и нажать клавишу ввода (Enter)
– набрать значение y и нажать клавишу ввода (Enter)
или
− набрать значение х
− нажать клавишу пробел
− набрать значение y
− нажать клавишу ввода (Enter)
Оператор вывод данных на экран
Write ( список параметров);
Writeln (список параметров);
список параметров - константы, переменные, строка символов, заключенных в кавычки или
арифметическое выражение. Если параметров несколько, то они разделяются запятыми.
Write [rait] – написáть
Write - написáть на экране
ln сокращение от line [lain] – линия;
Writeln - написáть на экране и перевести курсор на следующую линию (строку)
Примеры:
Write(7);
{выводит на экран цыфру 7}
Write(A);
{выводит на экран значение переменной А}
Write('Пример');
{выводит на экран слово Пример}
Write(a+2);
{выводит на экран значение выражения a+2}
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

7.

7
Формат вывода вещественных чисел
имя пременной: общее поле выводимой части: дробная часть (точность)
Пример:
Write(y:6:2); {вывод на экран Y с точностью до 2ух знаков}
A:=5.53637; Write(a:6:3); {выводит 5.536 с точностью до 3 знаков}
Формат целых чисел
имя пременной: общее поле выводимой части
Пример: Write(7:5);
{выведет 7, а перед ним 4 пробела}
Write(7,14);
{ выведет 714}
Write(7:5,14:5); { выведет _ _ _ _ 7 _ _ _ 1 4}
Перед вводом любых данных рекомендуется выводить поясняющий текст с помощью Write.
Пример 2 Выбрать алгоритм и составить его
блок-схему, а также программу для вычисления
значения функции
ln( x − 2,28) ⋅ x − 4
.
y=
x 2 − 24
начало
program pr1;
var
x,y:real;
Ввод Х
begin
{Блок ввода данных}
write ('Введите значение x ');
readln (x);
{Блок обработки данных}
y=
ln( x − 2,28) ⋅ x − 4
x 2 − 24
y:=ln(x-2.28)*sqrt(x-4)/(sqr(x)-24);
Вывод У
конец
writeln ('x= ',x:4:2,' y= ',y:4:2;)
end.
Тестирование программы
Введите значение x 5
x= 5.00 y= 1.00
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

8.

8
Условный оператор или оператор условия
нет
Логическое
выражение
If логическое выражение
Then оператор1
Else оператор2 ;
да
логическое выражение
принимает значение:
оператор1
оператор2
True (истина)
выполняется оператор1
(простой или составной)
следующему за ключевым
словом Then
нет
Логическое
выражение
False (ложь)
выполняется оператор2
(простой или составной)
следующему за ключевым
словом Else
If логическое выражение
Then оператор1;
да
логическое выражение
принимает значение:
оператор1
True (истина)
выполняется оператор1
(простой или составной)
следующий за ключевым
словом Then
False (ложь)
выполняется оператор,
следующий за оператором
оператор1
If [if] – если, если бы
Then [ðen] – тогда
Else [els] – иначе
Пример If A>3
Then Write (‘А больше трех’)
Else Write (‘А меньше трех’) ;
Если А больше трех
Тогда написать на экране «А больше трех»
Иначе написать на экране «А меньше трех»
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

9.

9
Пример 3 Выбрать алгоритм и составить его
блок-схему для вычисления значения функции
ln( x − 2,28) ⋅ x − 4
.
y=
x 2 − 24
program pr3;
var x,y:real;
начало
begin
{Блок ввода данных}
write ('Введите значение x ');
readln (x);
Ввод Х
{Блок обработки данных}
нет
y=
x-2,28≤0
or x-4<0
or x2-24=0
if (x-2,28<=0) or (x-4<0) or (sqr(x)-24=0)
then writeln (' При x= ',x:4:2,' решений нет.')
else begin
да
ln( x − 2,28) ⋅ x − 4
x 2 − 24
y:=ln(x-2.28)*sqrt(x-4)/(sqr(x)-24);
Вывод
Решений нет
Вывод У
writeln ('x= ',x:4:2,' y= ',y:4:3);
end;
конец
end.
Тестирование программы
Введите значение x 5
x= 5.00 y= 1.00
Введите значение x 2
При x= 2.00 решений нет
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

10.

10
Пример 4 В переменную х вводится произвольное число. В зависимости
начало
от
знака
введенного
числа,
переменной
присваиваются такие значения:
Ввод
Х
нет
нет
S=0
X<0
X>0
− 1, x < 0
S = 0, x = 0
1, x > 0
да
да
S = -1
S=1
Вывод
S
конец
PDF created with FinePrint pdfFactory trial version www.pdffactory.com
program znak;
var
S:integer;
x:real;
begin
write ('Введите число x ');
readln (x);
if x>0 then
S:=1
else
if x<0 then
S:= -1
else
S:=0;
writeln ('Переменная S равна ',S:2);
end.
S

11.

11
Циклы
Цикл Пока
или
цикл с предусловием
while логическое выражение do
оператор1;
оператор2;
начальные
присвоения
Логическое
выражение
логическое выражение
принимает значение:
нет
да
True (истина)
выполняется оператор1 –
простой или составной
оператор - тело цикла
тело
цикла
False (ложь)
выполнение цикла прекращается
и управление передается
опретатору оператор2,
следующему за телом цикла
while [wail] - пока
do [ du:] - выполнять, делать
Пример 5 Пусть требуется определить произведение двух произвольных натуральных
чисел x и y. Пусть исполнитель, определяющий заданное произведение имеет такую
систему предписаний, в которой нет действия умножения, а есть только действие сложения.
z=1
x +42
x + ...
+x
4
43
4
Y
раз
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

12.

12
program pr5;
var i,z,x,y:integer;
begin
write ('Введите значение переменных х и y');
readln (x, y);
начало
Ввод
Х,Y
z:=0;
i:=1;
z=0
i=1
нет
while i<=y do
да
begin
Z=Z+X
z:=z+x;
i=i+1
i:=i+1;
end;
Вывод
Z
writeln('Произведение чисел равно ,z:2);
readln;
конец
end.
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

13.

13
Цикл До
или
цикл с постусловием
repeat
оператор1;
until логическое выражение;
оператор2;
начальные
присвоения
тело
цикла
Логическое
выражение
логическое выражение
принимает значение:
да
False (ложь)
выполняется оператор1 –
простой или составной
оператор - тело цикла
нет
Repeat [ri’pi:t] - повторять
until [ən’til] – только когда/если
PDF created with FinePrint pdfFactory trial version www.pdffactory.com
True (истина)
выполнение цикла прекращается
и управление передается
оператору оператор2,
следующему за телом цикла

14.

program pr5а;
var i,z,x,y:integer;
begin
начало
Ввод
Х,Y
write ('Введите значение переменных х и y');
readln (x, y);
Z=0
i=1
z:=0;
i:=1;
repeat
Z=Z+X
z:=z+x;
i=i+1
i:=i+1;
i>Y
да
until i > y;
нет
Вывод
Z
writeln('Произведение чисел равно ‘ , z:2);
readln;
конец
end.
PDF created with FinePrint pdfFactory trial version www.pdffactory.com
14

15.

15
Цикл Для или Цикл по параметру
Заголовок цикла:
заголовок цикла
Переменная цикла = начальное значение .. конечное значение
Пример заголовка цикла:
тело
цикла
i = 1,10
for переменная цикла := начальное значение to конечное значение do
оператор1;
оператор2;
Если значеие переменной цикла меньше конечного значения цикла или равно
конечному значению выполняеся оператор1
(простой или составной оператор - тело цикла)
Если значеие переменной цикла больше конечного значения, то выполнение
цикла прекращается и управление передается опретатору оператор2,
следующему за телом цикла
For
- для
to [tu:] – до
do [ du:] - выполнять, делать
При выполнении цикла значение переменной цикла изменяется с шагом 1. Если необходимо
изменять значение переменной цикла с шагом -1, нужно перед to добавить down
- вниз
for переменная цикла := начальное значение downto конечное значение do
В этом случае начальное значение больше конечного значения переменной цикла. Выполнение цикла
прекращается, если значение переменной цикла станет меньше конечного значения.
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

16.

16
начало
Ввод
Х,Y
program pr5b;
var i,z,x,y:integer;
begin
write ('Введите значение переменных х и y');
readln (x, y);
Z=0
z:=0;
i = 1,y
for i:=1 to y do
Z = Z+X
z:=z+x;
Вывод
Z
writeln('Произведение чисел равно ,z:2);
readln;
конец
end.
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

17.

17
Пример 6 Пусть вводится последовательность из п чисел. Требуется найти
среднее значение этих чисел.
program srednee;
var i, n :integer;
Sum, x: real;
begin
writeln ('Введите количество чисел’);
read (n);
for i:=1 to n do
begin
writeln ('Введите значение x ');
read (x);
if i = 0
then MAX:=x
else if X>MAX
then MAX:=x;
end;
writeln ('Максимум равен ', MAX:4);
end.
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

18.

Пример 7 Пусть вводится последовательность из п целых чисел. Требуется
найти среди этих чисел максимальное.
начало
Ввод
n
i = 1, n
Ввод
X
нет
нет
X > MAX
i=1
да
program maximum;
var
i, MAX, x, n :integer;
begin
writeln ('Введите количество чисел’);
read (n);
for i:=1 to n do
begin
writeln ('Введите значение x ');
read (x);
if i = 0
да
then MAX:=x
MAX = X
else if X>MAX
MAX = X
then MAX:=x;
end;
writeln ('Максимум равен ', MAX:4);
Вывод
MAX
end.
конец
PDF created with FinePrint pdfFactory trial version www.pdffactory.com
18

19.

Выбрать алгоритм, составить блок-схему и
программу для вычисления в точках xi=a+i⋅h,
i=0,1,2…,n-1, h=(b-a)/(n-1) промежутка [a,b]
наибольшего и среднего значений
ln( x + 5) ⋅ x − 4
функции y =
.
x 2 − 16
начало
19
Ввод
a, b, n
h=(b-a)/(n-1)
j=0
sum=0
i = 0 .. n-1
x=a+i.h
нет
y=
x2-16=0
or x +5 < = 0
or x-4<0
ln(x + 5) ⋅ x − 4
x2 −16
да
Вывод
Ф. не
опр.
Вывод
x, y
sum=sum+y
j=j+1
нет
нет
да
j=1
да
y > max
max = y
max = y
нет
j=0
Вывод
Sum/j,m
ax
да
Вывод
Реш. нет
конец
PDF created with FinePrint pdfFactory trial version www.pdffactory.com
19

20.

20
program pr10;
var
h,x,y,max,sym:real;
v,a,b,n,i,j:integer;
begin
{Блок ввода данных}
writeln ('Введите значение параметров a,b,n ');
readln (a,b,n);
h:=(b-a)/n;
j:=0;
sym:=0;
{Блок обработки данных}
for i:=0 to n-1 do
begin
x:=a+i*h;
if (x*x-16=0) or (x+5<=0) or (x-4<0)
then writeln (‘При х=’, x:4:2,’ функция не определена.’)
else begin
y:=ln(x+5)*sqrt(x+4)/(x*x-16);
writeln ('x= ',x:4:2,' y= ',y:4:2);
sym:=sym+y;
j:=j+1;
if j=1
then max:=y
else if y>max
then max:=y;
end;
end;
{Вывод результатов}
if j=0
then writeln (‘Решений нет’)
else begin
writeln ('Среднее значение функции ',sym/j:4:2);
writeln ('Максимальное значение функции ',max:4:2);
end;
end.
Протокол работы программы
Введите значение параметров a,b,n
356
При х=3.00 функция не определена.
При х=3.40 функция не определена.
При х=3.80 функция не определена.
При х=4.20 y= 3.87
При х=4.60 y= 1.29
При х=5.00 y= 0.77
Среднее значение функции 1.98
Максимальное значение функции 3.87
20
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

21.

21
Типы данных.
Простые
Порядковые
Целые
Вещественные
Структурированные
Логические
Массивы
Символьные
Строки
Типы
Указатели
Множества
Перечисляемые
Записи
Интервальные
Файлы
Перечисляемый тип данных
Перечисляемый тип – это определенный программистом тип, составленый из множества
упорядоченных элементов. Упорядоченность элементов определяется порядком их следования.
Введение этого типа предоставляет возможность создавать пользователю необходимые ему
в каждой конкретной программе дополнительные типы данных.
Type имя типа = (идентификатор 1, идентификатор 2, .. идентификатор n);
Var список переменных : имя типа ;
Type [t a I p] - тип
Пример.
Type Day=(Sat, Sun, Mon, Tue);
Var Pd, Od, Gh: Day;
Другой вариант описания
Var список переменных: (идентификатор 1, идентификатор 2, .. идентификатор n);
Пример.
Var Pd, Od, Gh:(Sat, Sun, Mon, Tue);
Можно использовать на данном типе функции Ord, Pred, Succ, Dec, Ins.
Первый по списку – порядковый номер 0, второй – 1… Поэтому Sat < Sun < Mon < Tue.
Тип данных – интервальные
Определяются
Type имя типа = минимальное значение..максимальное значение;
Var список переменных: имя типа;
Пример.
Type Max = - 40..40; {диапазон значений от –40 до 40}
Var Tp, Tem, MTp:Max;
Другой вариант описания
Var список переменных: минимальное значение..максимальное значение;
Пример.
Var Tp: - 40..40;
Используются порядковые типы.
21
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

22.

22
Массив
Регулярный тип, или массив, есть упорядоченный набор данных одинакового типа.
Type имя типа = Array[типы индексов] Of тип элемента;
Var имя массива : имя типа;
Type [t a I p] - тип
Array [ə‘r e I] – множество, массив
Of [ (ə) v] – принадлежащий типу
Пример.
Type Mas = Array[1..5] Of Real;
Var x,y:Mas;
Другой вариант описания
Var имя массива:Array [типы индексов] Of тип элемента;
Пример.
Var x,y: Array [1..5] Of Real;
Ввод/вывод элементов массива
Вводить массивы можно только поэлементно. Рассмотрим программу, поясняющую ввод/вывод
регулярных типов:
Начало
Ввод n
i:=1 до n
Ввод X[i]
Program MaS;
Var x: Array [1..20] Of Real;
i,n:Integer;
Begin Writeln (’Задайте количество элементов массива’);
Readln (n);
For i:=1 To n Do
Begin
Write ('Введите ',I:2, ' элемент массива ');
Readln (x[i])
End;
{вывод элементов}
For i:=1 To n Do
i:=1 до n
If i mod 5 = 0
Then Writeln (x[i]:7:2)
Else Write (x[i]:7:2);
Вывод
End.
Конец
22
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

23.

23
Соглашения о вводе и выводе заключаются в соответствии с тем режимом, в котором будет
работать программа,- пакетным или интерактивным (диалоговым). Приведенная выше программа
рассчитана на интерактивный режим, поэтому на экране работа программы отразится следующим
образом:
Задайте количество элементов массива 6
Введите 1 элемент массива 1
Введите 2 элемент массива 2
Введите 3 элемент массива 3
Введите 4 элемент массива 4
Введите 5 элемент массива 2
Введите 6 элемент массива 1
1.00 2.00 3.00 4.00 2.00
1.00
Для инициализации массива можно применять типизированные константы
Type имя типа = Array[типы индексов] Of тип элемента;
Const имя массива : имя типа = (список констант);
пример
Type Mas=Array[1..10] Of Real;
Const x: Mas = (1,2,3,4,5,6,7,8,9,10);
Изменим вышеприведенную программу для работы с типизированными константами.
Program MaS;
Type Mas=Array[1..10] Of Real;
Const x: Mas = (1,2,3,4,5,6,7,8,9,10);
i,n:Integer;
Begin Writeln (’Задайте количество элементов массива’);
Readln (n);
и т.д.
Получим следующий протокол ее работы
Задайте количество элементов массива 10
1.00
6.00
2.00 3.00
7.00 8.00
4.00 5.00
9.00 10.00
23
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

24.

24
Пример 8
Отсортировать массив 3, 1, 2, 6, 4, 5, 9, 8, 7 по возрастанию.
Начало
n=9; m[i]=(3,1,2,6,
4,5,9,8,7)
i от 1 до n-1
j от i+1 до n
нет
да
mj<mi
Temp:=mj
mj=mi
mi:=Temp
i:=1 до n
Вывод m[i]
Конец
24
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

25.

PROGRAM Sort;
Type MMM=Array[1..9] Of Integer;
Const n=9;
m:MMM=(3,1,2,6,4,5,9,8,7);
Var i,j,k,temp:Integer;
Begin Writeln;
Writeln ('Массив до сортировки');
For i:=1 To n Do
Write (m[i]:3);
Writeln;
For i:=1 To n-1 Do
Begin
For j:=i+1 To n Do
If m[j]<m[i] Then
Begin temp:=m[j];
m[j]:=m[i];
m[i]:= temp;
End;
End;
Writeln ('Массив после сортировки');
For j:=1 To n Do
Write (m[j]:3);
End.
25
Протокол работы программы
Массив до сортировки
3 1 2 6 4 5 9 8 7
Массив после сортировки
1 2 3 4 5 6 7 8 9
25
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

26.

начало
Пример 9
Выбрать алгоритм, составить его
блок-схему и
программу,
в
которой:
1) вычислить в точках xi = a + (i -1) h,
где i = 1,2,…n+1,
h=(b-a)/(n+1)
промежутка
[a;b]
значения
элементов массива yi=f(xi)
ln( x i + 5) ⋅ x i − 4
f ( xi ) =
xi2 − 16
2) среди элементов массива yi
найти первые два min1, min2
наименьших (min1<min2) и первые
два max1, max2 наибольших
элемента в массиве (max2<max1);
3) вычислить величину Ysr –
среднее
значение
элементов
массива yi;
4) вычислить величины:
M = ∑ (y i − y cpi )
n +1
i =1
2
Ввод
a, b
h=(b-a)/(n-1)
sum=0 n=10
Вывод
fx, a, b, n
для i от 1 до n
xi = a+(i-1)h
(n + 1)
D= M
5) предусмотреть ввод исходных
данных a, b, n с клавиатуры; если в
промежутке [a;b] хотя бы в одном
случае функция не определена –
повторить ввод данных a, b, n,
задав им другие значения;
6) вывести вычисленные величины
на экран в следующем виде:
Исходные данные:
f(x)= …; a= ; b= ; n=10.
Массив X:
x1 x2 x3 x4 x5
x6 x7 x8 x9 x10
Массив Y:
y1 y2 y3 y4 y5
y6 y7 y8 y9 y10
min1= ; min2 = ; max2 = ; max1= ;
Ysr = ; M = ; D = .
26
нет
yi =
xi2-16=0
or xi +5 < = 0
or xi -4<0
ln(xi +5) ⋅ xi − 4
да
Вывод
x −16
Ф. не опр.
2
i
Вывод
xi
sum=sum+yi
Ysr=sum/n
нет
y1>y2
да
max1=y2
max2=y1
max1=y1
max2=y2
min1=y1
min2=y2
min1=y2
min2=y1
b−a
1
26
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

27.

27
1
для i от 1 до n
нет
нет
yi <min1
нет
yi < min2
yi >max2
да
yi >max1
да
да
max2= max1
max1= yi
max2= yi
да
min2= yi
min2=min1
min1=yi
M=M+(yi -Ysr)2
Вывод
yi
D
M
n + 1
=
Вывод min1,
min2 max2,
max1
Вывод
Ysr, M, D
конец
27
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

28.

28
program lab_6_a;
uses crt;
label metka;
const n=10;
type mx=array [1..n] of real;
var
x,y:mx;
h, max1, max2, min1, min2, sym, Ysr, M, D:real;
a,b,i:integer;
begin
{Блок ввода данных}
clrscr;
write ('Введите значение параметров a,b ');
metka:;
readln (a,b);
h:=(b-a)/(n-1);
sym:=0;
writeln ('y=ln(x+5)*sqrt(x-4)/(x*x-16)',' a= ',a,' b= ',b,' n= ',n);
{Блок обработки данных}
writeln ('Массив X');
for i:=1 to n do
begin
x[i]:=a+(i-1)*h;
if (x[i]*x[i]-16=0) or (x[i]+5<=0) or (x[i]-4<0)
then begin
clrscr;
writeln ('При x=',x[i]:5:2,' функция не определена');
writeln ('Измените значение а и b.');
write ('Введите новые значения параметров a и b ');
goto metka;
end
else begin
y[i]:=ln(x[i]+5)*sqrt(x[i]-4)/(x[i]*x[i]-16);
if i mod 5=0
then writeln (' X[',i:2,']=',x[i]:5:2)
else write (' X[',i:2,']=',x[i]:5:2);
sym:=sym+y[i];
end;
Ysr:=sym/n;
if y[1]>y[2]
then begin
max1:=y[1];
max2:=y[2];
min1:=y[2];
min2:=y[1];
end
else begin
max1:=y[2];
max2:=y[1];
min1:=y[1];
min2:=y[2];
28
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

29.

29
end;
end;
writeln;
writeln ('Массив y');
for i:=1 to n do
begin
if y[i]>max1
then begin
max2:=max1;
max1:=y[i]
end
else
if y[i]>max2
then max2:=y[i]
else if y[i]<min1
then begin
min2:=min1;
min1:=y[i]
end
else
if y[i]<min2
then max2:=y[i];
M:=M+sqr(y[i]-Ysr);
if i mod 5 = 0
then writeln (' Y[',i:2,']=',y[i]:5:2)
else write (' Y[',i:2,']=',y[i]:5:2);
end;
D:=sqrt(M/(n+1));
writeln;
writeln (' min1=',min1:4:2,' min2=',min2:4:2,' max2=',max2:4:2,' max1=',max1:4:2);
writeln (' Ysr=',Ysr:4:3, ' M=',M:4:2,' D=',D:4:2);
readln;
end.
Тестирование программы
Введите значение параметров a, b
6 20
y=ln(x+5)*sqrt(x-4)/(x*x-16) a= 6 b= 20 n= 10
Массив X
X[ 1]= 6.00 X[ 2]= 7.56 X[ 3]= 9.11 X[ 4]=10.67
X[ 6]=13.78 X[ 7]=15.33 X[ 8]=16.89 X[ 9]=18.44
X[ 5]=12.22
X[10]=20.00
Массив y
Y[ 1]= 0.17 Y[ 2]= 0.12 Y[ 3]= 0.09 Y[ 4]= 0.07 Y[ 5]= 0.06
Y[ 6]= 0.05 Y[ 7]= 0.05 Y[ 8]= 0.04 Y[ 9]= 0.04 Y[10]= 0.03
min1=0.03 min2=0.04 max2=0.12
Ysr=0.072 M=0.02
D=0.04
max1=0.17
29
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

30.

30
Рассмотрим программу, поясняющую описание и ввод/вывод
двумерных массивов (матриц) с использованием вложенных циклов:
Начало
n=2
m=3
Program MAS;
Const n=2; m=3;
Type MATRIX=Array [1..n,1..m] Of Integer;
Var MM:MATRIX; I ,J : Integer;
i=1,n,1
j=1,m,1
Ввод X[i,j]
i=1,n,1
j=1,m,1
Вывод X[i,j]
Begin Writeln;
{ВВОД ЭЛЕМЕНТОВ МАССИВА}
For I:=1 To n Do
For J:=1 To m Do
Begin
Writeln ('ВВЕДИТЕ ЭЛЕМЕНТ ММ[',I,',',J,']');
Read (MM[I,J]);
End;
{ВЫВОД ЭЛЕМЕНТОВ МАССИВА}
For I:=1 To n Do
Begin Writeln;
For J:=1 To m Do
Write (' ММ[',I,',',J,']= ',MM[I,J]:2);
End;
End.
Протокол работы программы:
Конец
ВВЕДИТЕ ЭЛЕМЕНТ ММ[1,1]
2
ВВЕДИТЕ ЭЛЕМЕНТ ММ[1,2]
3
ВВЕДИТЕ ЭЛЕМЕНТ ММ[1,3]
5
ВВЕДИТЕ ЭЛЕМЕНТ ММ[2,1]
6
ВВЕДИТЕ ЭЛЕМЕНТ ММ[2,2]
8
ВВЕДИТЕ ЭЛЕМЕНТ ММ[2,3]
7
ММ[1,1]= 2 ММ[1,2]= 3 ММ[1,3]= 5
ММ[2,1]= 6 ММ[2,2]= 8 ММ[2,3]= 7
30
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

31.

31
ПРОЦЕДУРЫ И ФУНКЦИИ
В языках программирования вспомогательные алгоритмы называются подпрограммами. В Паскале
различаются две разновидности подпрограмм: процедуры и функции. Процедуры и функции
аналогичны программам в миниатюре. Каждая процедура или функция определяется только один раз,
но может использоваться многократно.
Структура процедур и функций аналогична структуре полной программы на языке ПАСКАЛЬ. В
процедурах и функциях могут быть описаны собственные метки, константы, типы, собственные
переменные и даже собственные процедуры и функции. Внутренние описания должны следовать в том
же порядке, что и разделы основной программы.
ОПИСАНИЕ ПРОЦЕДУРЫ. ОПЕРАТОР ПРОЦЕДУРЫ
Описание каждой процедуры начинается с заголовка, в котором задаются имя процедуры и список
формальных параметров с указанием их типов. Процедура может быть и без параметров, тогда в
заголовке указывается только ее имя. С помощью параметров осуществляется передача исходных
данных в процедуру, а также передача результатов работы обратно в вызвавшую ее программу.
Общая форма записи заголовка процедуры:
PROCEDURE имя ( список формальных параметров );
Список формальных параметров может включать в себя параметры-значения, параметрыпеременныс (перед ними должно стоять служебное слово VAR), параметры-процедуры (перед ними
должно стоять служебное слово PROCEDURE) и параметры-функции (перед ними должно стоять
служебное слово FUNCTION), После заголовка процедуры следуют разделы в том же порядке, что и в
программе.
Вызов и выполнение процедуры осуществляются при помощи оператора процедуры:
имя процедуры (список фактических пapаметров );
Между формальными и фактическими параметрами должно быть полное соответствие, т. е.
формальных и фактических параметров должно быть одинаковое количество; порядок следования
фактических и формальных параметров должен быть один и тот же; тип каждого фактического
параметра должен совпадать с типом соответствующего ему формального параметра.
При вызове процедуры сначала передаются параметры, при этом параметры-значения передаются
по значению, а параметры-переменные - по ссылке. Основное отличие этих способов передачи
параметров заключается в том, что присваивания значений параметру-переменной внутри процедуры
одновременно выполняются и для соответствующего аргумента (фактического параметра). Таким
образом, параметры, в которые записываются результаты работы процедуры, должны передаваться
только по ссылке. Параметры, через которые в процедуру передаются исходные данные, передаются по
значению.
Областью действия описания любого программного объекта (переменной, типа, константы и т.д.)
является тот блок, в котором расположено это описание. Если данный блок вложен в другой
(подпрограмма), то присутствующие в нем описания являются локальными. Они действуют только в
пределах внутреннего блока. Описания же, стоящие во внешнем блоке, называются глобальными по
отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем
блоке, то на него распространяется внешнее (глобальное) описание.
Рассмотрим примеры
31
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

32.

32
Program Examplel;
Var X: Integer;
Program Example2;
Var X: Integer;
{процедура}
Procedure P;
Begin
{процедура}
Procedure P ;
Var X: Integer;
Begin
Writeln('x=',X:2)
Writeln('x=',X:2)
End;
{операторный блок
программы}
Begin
X:=l;
P
End;
{операторный блок
программы}
Begin
X:=l;
P
End.
End.
В первом случае переменная с именем х описана как глобально, так и локально. Но процедура
выводит значение локальной переменной, которой ничего не присвоено. В этом примере идентификатором х обозначены две совершенно разные величины, им соответствуют две разные ячейки
памяти.
Во втором примере переменная х одна на всю программу. Она описана глобально. Поэтому
значение 1, присвоенное ей в основной программе, передается и в подпрограмму.
ОПИСАНИЕ ФУНКЦИИ. УКАЗАТЕЛЬ ФУНКЦИИ
Описание функции в основном аналогично описанию процедуры. Однако имеются некоторые
отличия. Результатом работы функции является одно скалярное чичение или одно значение
ссылочного типа. Тип результата задается в заголовке функции, общий вид которого
FUNCTION имя функции ( список формальных параметров) : тип результата;
Вызов и выполнение функции производятся при вычислении значения указателя функции,
который входит в некоторое выражение. После выполнения функции выработанный ею результат
используется и в качестве значения указателя функции в том выражении, в которое входит этот
указатель. При вызове функции передача фактических параметров производится так же,- как и при
вызове процедуры.
Рассмотрим этот вопрос на примере следующей задачи: даны два натуральных числа а и b.
Требуется определить наибольший общий делитель трех величин: а + b, |а – b|, а*b. Запишем это так:
НОД(a + b,|а – b|, a • b). Идея решения состоит в следующем математическом факте: если х, у, z — три
натуральных числа, то НОД(х, у, z) = НОД(НОД(х, у), z). Иначе говоря, нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа.Очевидно, что вспомогательным алгоритмом
для решения поставленной задачи является алгоритм получения наибольшего общего делителя двух
чисел. Эта задача решается с помощью известного алгоритма Евклида.
32
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

33.

33
Program NOD1;
Var А,В,С: Integer;
Procedure Evklid(M,N: Integer; Var К:Integer) ;
Begin
While M<>N Do
If M>N
Then M:=M-N
Else N:=N-M;
K:=M
End;
Begin
Write('a=') ;
ReadLn(A) ;
Write('b=');
ReadLn (B);
Evklid(A+B,Abs(A-B),C);
Evklid(C,A*B,C);
WriteLn('HOД=',C)
End.
Borland Pascal Version 7.0 Copyright (c) 1983,92 Borland International
a=7
b=3
HOД=1
a=4
b=6
HOД=2
В данном примере обмен аргументами и результатами между основной программой и процедурой
производится через параметры (формальные и фактические). Существует и другой механизм обмена
— через глобальные переменные. Процедура в качестве результата может передавать в вызывающую
программу множество значений (в частном случае — одно), а может и ни одного. Если описана
процедура с формальными параметрами, то и обращение к ней производится оператором процедуры с
фактическими параметрами. Правила соответствия между формальными и фактическими параметрами:
соответствие по количеству, соответствие по последовательности и соответствие по типам.
Первый вариант взаимодействия формальных и фактических параметров называется передачей по
значению: вычисляется значение фактического параметра (выражения) и это значение присваивается
соответствующему формальному параметру. Второй вариант взаимодействия называется передачей по
имени: при выполнении процедуры имя формальной переменной заменяется на имя соответствующей
фактической переменной (в откомпилированной программе имени переменной соответствует адрес
ячейки памяти).
В рассмотренном нами примере формальные параметры M и N являются параметрами-значениями.
Это аргументы процедуры. При обращении к ней первый раз им соответствуют значения выражений а
+ b и abs (а - Ь); второй раз — с и а • Ь. Параметр K является параметром-переменной. В ней
получается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная с. Через эту переменную основная программа получает
результат.
33
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

34.

34
Теперь
рассмотрим
без параметров.
другой
вариант
программы,
решающей
ту
же
задачу
Program NOD2;
Var A,B,K,M,N: Integer-Procedure Evklid;
Begin
While MON Do
If M>N
Then M:=M-N
Else N:=N-M;
K:=M
End;
Begin
Write(' a=');
ReadLn(A) ;
Write('b=') ;
ReadLn (B) ;
M:=A+B;
N:=Abs(A-B) ;
Evklid;
M:=K;
N:=A*B;
Evklid;
WriteLn('HOД равен',K) End.
В программе NOD1 переменные М, N, К — локальные внутри процедуры; переменные а, b, с—
глобальные. Однако внутри процедуры переменные а, b, с не используются. Связь между внешним
блоком и процедурой осуществляется через параметры.
В программе NOD2 все переменные являются глобальными. В процедуре Evklid нет ни одной
локальной переменной (нет и параметров). Поэтому переменные Ми N, используемые в процедуре,
получают свои значения через оператор присваивания в основном блоке программы. Результат
получается в глобальной переменной К, значение которой выводится на экран.
Использование механизма передачи через параметры делает процедуру более универсальной,
независимой от основной программы. Однако в некоторых случаях оказывается удобнее использовать
передачу через глобальные переменные. Чаще такое бывает с процедурами, работающими с большими
объемами информации. В этой ситуации глобальное взаимодействие экономит память ЭВМ.
Функции. Теперь выясним, что такое подпрограмма-функция. Обычно функция используется в
том случае, если результатом подпрограммы должна быть скалярная (простая) величина. Тип
результата называется типом функции. В Турбо Паскале допускаются функции строкового типа. СКак
и у процедуры, у функции в списке формальных параметров могут присутствовать параметрыпеременные и параметры-значения. Все это аргументы функции. Параметры вообще могут
отсутствовать (если аргументы передаются глобально).
Программа решения рассмотренной выше задачи с использованием функции будет выглядеть
следующим образом:
Program NOD3;
Var A,B,Rez:Integer;
Function Evklid(M,N:Integer):Integer;
Begin
While M<>N Do
If M>N
34
PDF created with FinePrint pdfFactory trial version www.pdffactory.com

35.

35
Then M:=M-N
Else N:=N-M;
Evklid:=M
End;
Begin Write('a=');
ReadLn(A) ;
Write('b=');
ReadLn(B) ;
Rez:=Evklid(Evklid(A+B, Abs(A-B)),A*B);
WriteLn('NOD равен',Rez)
End.
Из примера видно, что тело функции отличается от тела процедуры только тем, что в функции
результат присваивается переменной с тем же именем, что и функция.Обращение к функции
является операндом в выражении. Сравнивая приведенные выше программы, можно сделать вывод,
что программа NOD3 имеет определенные преимущества перед другими. Функция позволяет получить
результат путем выполнения одного оператора присваивания. Здесь иллюстрируется возможность
того, что фактическим аргументом при обращении к функции может быть эта же функция.
Строковый тип данных
Теперь мы познакомимся с типом данных, который относится к числу структурированных. Это
строковый тип данных (строка). Следует заметить, что строковый тип данных есть в Турбо Паскале и
отсутствует в стандартном Паскале.
Строка —это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII).
Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0
до 255. Строковые величины могут быть константами и
переменными.
Строковая константа есть последовательность символов, заключенная в апострофы. Например:
'Язык программирования ПАСКАЛЬ', 'IBM PC — computer', '33-45-12'.
Строковая переменная описывается в разделе описания переменных следующим образом:
Var <идентификатор>: String[<максимальная длина строки>] Например:
Var Name: String[20]
Параметр длины может и не указываться в описании. В таком случае подразумевается, что он
равен максимальной величине 255. Например:
Var slovo: String
Строковая переменная занимает в памяти на 1 байт больше, чем указанная в описании длина. Дело
в том, что один (нулевой) байт содержит значение текущей длины строки. Если строковой переменной
не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки
символами ее текущая длина возрастает, но она не должна превышать максимальной по описан
English     Русский Правила