- •Основы алгоритмизации и программирования
- •Введение
- •1.1. Структура программы
- •1.2. Типы данных
- •1.2.1. Целый тип данных
- •1.2.2. Логические типы данных – Boolean
- •1.2.3. Данные символьного типа
- •1.3. Операторы языка программирования Турбо Паскаль
- •1.3.1. Операции в Турбо Паскаль
- •1.3.2. Правила вычисления выражений
- •1.3.3. Встроенные функции в Турбо Паскаль
- •1.3.4. Описание констант и переменных
- •1.3.5. Операторы в Турбо Паскаль
- •Вопросы для самопроверки
- •Лабораторная работа №1 Организация программ линейных структур
- •Варианты заданий
- •2. Организация форматного вывода данных на языке Паскаль
- •Вопросы для самопроверки
- •Лабораторная работа №2 Организация ввода-вывода данных на языке Паскаль
- •Методические указания
- •Варианты задания
- •3. Организация программ разветвляющихся структур
- •3.1. Полная форма условного оператора
- •3.2. Краткая форма условного оператора
- •Вопросы для самопроверки
- •Лабораторная работа №3 Организация программ разветвляющихся структур
- •Варианты заданий
- •4. Организация циклических процессов
- •Лабораторная работа №4 Составление циклических программ
- •Варианты заданий
- •Методические указания
- •Варианты заданий
- •5. Программирование структур с вложенными циклами
- •Вопросы для самопроверки
- •Лабораторная работа №5 программирование структур с вложенными циклами. Вычисление суммы ряда
- •Методические указания
- •Варианты заданий
- •6. Перечислимые и ограниченные типы данных
- •6.1 Перечислимый тип данных
- •6.2. Ограниченный тип данных
- •6.3. Оператор выбора (варианта)
- •Вопросы для самопроверки
- •Лабораторная работа №6 Перечислимые и ограниченные типы данных
- •Варианты заданий.
- •7. Регулярные типы данных
- •7.1. Одномерные массивы
- •7.1.1. Краткая форма объявления одномерного массива
- •7.1.2. Полная форма объявления одномерного массива
- •7.1.3. Доступ к элементам массива
- •Вопросы для самопроверки
- •Лабораторная работа №7_1 регулярные типы данных. Массивы
- •Варианты заданий
- •7.2. Двумерные массивы
- •Полная форма описания матрицы:
- •Формирование элементов случайным образом:
- •Формирование элементов матрицы при вводе с клавиатуры:
- •Фрагменты программ по обработке 2-х мерных массивов
- •Вопросы для самопроверки
- •Лабораторная работа №7_2 регулярные типы данных. МАтрицы
- •Варианты заданий
- •7.3. Сортировка элементов массива
- •7.3.1. Сортировка методом «пузырька»
- •7.3.2. Сортировка вставками
- •7.3.3. Сортировка посредством выбора
- •7.3.4. Быстрая сортировка
- •8. Составление программ с использованием подпрограмм
- •8.1. Область видимости идентификатора переменной
- •8.2. Подпрограммы - процедуры (procedure)
- •8.2.1. Формальные и фактические параметры
- •Вопросы для самопроверки
- •Лабораторная работа №8_1 составление программ с использованием подпрограмм - процедур
- •Методические указания
- •Варианты заданий
- •8.3. Подпрограммы-функции (function)
- •Вопросы для самопроверки
- •Лабораторная работа №8_2 составление программ с использованием подпрограмм - функций
- •Варианты заданий
- •8.4. Рекурсия
- •8.4.1. Вычисление факториала
- •8.4.2. Формы рекурсивных процедур
- •8.4.3. Числа Фибоначчи
- •Вопросы для самопроверки
- •9. Модули
- •Структура модуля
- •Interface
- •Implementation
- •Вопросы для самопроверки
- •10.2. Стандартные процедуры и функции для строк
- •10.3. Хранение строк
- •Вопросы для самопроверки
- •Лабораторная работа №10 обработка символьной информации
- •Варианты заданий
- •11. Комбинированные типы. Записи (Record)
- •11.1 Записи с фиксированными частями
- •11.2. Оператор with…do
- •11.3. Вариантные записи
- •Вопросы для самопроверки
- •Лабораторная работа №11 Комбинированные типы. Записи
- •Варианты заданий
- •12. Файлы
- •12.1. Классификация файлов
- •12.1.1. Чтение файла
- •12.1.2. Запись файла
- •Вопросы для самопроверки
- •13.1. Объявление множества
- •13.2. Операции над множествами
- •13.3. Сравнение множеств
- •Include (s, I);
- •13.4. Старшинство множественных операций
- •Вопросы для самопроверки
- •Лабораторная работа №13 множества
- •Варианты заданий
- •Горячие клавиши
- •Библиографический список
- •Оглавление Введение 3
- •1. Программирование на языке Паскаль 5
- •1.1. Структура программы 5
- •2. Организация форматного вывода данных на языке Паскаль 17
- •Лабораторная работа №7_1.
- •Лабораторная работа №7_2.
- •Лабораторная работа №8_2.
8.1. Область видимости идентификатора переменной
Область действия описания конкретного идентификатора и называется областью видимости.
Все переменные и другие объекты, описанные в подпрограмме, являются локальными и действуют только внутри этой программы. Никакой связи между ними и объектами вызывающей программы, имеющими такие же имена, нет.2
В подпрограммах в свою очередь можно использовать идентификаторы, описанные только в вызывающей программной единице. Смысл и значение этих идентификаторов одинаков и в вызывающей и в вызываемой программной единице. Такие идентификаторы называются глобальными. Другими словами, глобальными называются переменные, описанные в основной, то есть главной, программе.
Примечание. Использование глобальных переменных в подпрограммах следует избегать. Во-первых, потому что подпрограмма становится менее универсальной, и могут возникнуть трудности при переносе её в другую программу, где необходимо тщательно проследить за обменом данными между программными единицами с помощью глобальных переменных. И, во-вторых, возрастает риск ошибок, вызванных, например, неучтённым изменением значения глобальной переменной в теле подпрограммы.
Например,
Program primer1;
Var
i:integer; {объявление глобальной переменной}
{объявление процедуры}
ProcedureP; {заголовок процедуры}
Var
i:integer; {объявление локальной переменной}
Begin{начало тела процедуры}
Writeln(“Значением переменнойiявляется цифра - ”,i);
End; {конец тела процедуры}
Begin{начало тела основной программы}
I := 1;
P; {вызов процедуры}
End. {конец тела процедуры}
В результате запуска программы Primer1 на экран монитора будет выведена строка:
Значением переменной iявляется цифра – 1
8.2. Подпрограммы - процедуры (procedure)
Процедура – это подпрограмма, которая решает некоторую частную задачу. Результатом работы процедуры является либо одно или более значений, либо ни одного. Например, процедура CLRSCR; ни чего не возвращает программе, которая её вызывает. А процедура READLN(a) возвращает основной программе значение переменной A, введённое пользователем с клавиатуры.
Процедура оформляется аналогично программе, то есть содержит заголовок, раздел описаний и операторов:
{заголовок процедуры}
PROCEDURE<имя_процедуры> (<список_формальных_параметров>);
{раздел описаний}
BEGIN
{раздел операторов}
END;
Здесь, <имя_процедуры> - имя процедуры удовлетворяет всем правилам идентификатора; формальные («ненастоящие») параметры – список переменных с указанием их типа.
Например (см. Задача 1).
…
Procedure Dlina (x1, x2, y1, y2 : real; var l : real);
…
Вызов процедуры:
<имя_процедуры> (<список_фактических_параметров>);
Здесь, фактические («настоящие») параметры – параметры вызывающей программы.
Например (см. Задача 1).
…
Dlina (q1, q2, k1, k2, d);
…
8.2.1. Формальные и фактические параметры
В заголовке процедуры или функции может содержаться список параметров, которые представляют собой идентификаторы переменных и служат для обмена значениями между подпрограммой и вызывающей её программной единицей. При этом в описании подпрограммы, поскольку оно включается в тексте программы один раз, имена параметров выбираются определённым образом и безотносительно к именам переменных, используемых в других частях программы. Такие параметры, имена которых указаны в заголовке подпрограммы, называются формальными.
С другой стороны, при каждом новом обращении к подпрограмме в неё могут передаваться значения разных переменных. Такие переменные, имена которых подставляются в операторы вызова подпрограммы при фактическом обращении к ней, называются фактическими параметрами.
Список формальных параметров может отсутствовать. В том случае, если он есть, то в нём должны быть перечислены имена формальных параметров и их типы.
Формальные параметры могут включать в себя:
Параметры-значения;
Параметры-переменные;
Параметры-константы;
Параметры-массивы и параметры-строки;
Нетипизированные параметры-переменные;
Процедурные типы:
Параметры-функции;
Параметры-процедуры.
В свою очередь, формальные параметры делятся на входные и выходные параметры. К выходным параметрам относятся параметры-переменные, а остальные параметры следует отнести к входным параметрам подпрограмм.
Рассмотрим несколько формальных параметров.
Параметры-значения
Формат:
(q1, q2, .., qn: <тип>); или
(q1: <тип>; q2: <тип>; .. qn: <тип>);
где q1, q2, .., qn – имена параметров.
Например, (q1, q2 : real); (q1: integer; q2: real);
Параметры-переменные определяют выходные данные процедуры (результаты обработки данных), которые передаются в основную программу.
Для выделения выходных переменных перед ними ставится слово Var.
Формат:
(var t1, t2, .., tn: <тип>); или
(var t1: <тип>; var t2: <тип>; .. var tn: <тип>);
где t1, t2, tn – параметры-переменные.
Например, (var t1: real; var t2, t3: integer);
Параметры-константы
Формат:
(const t1, t2, .., tn: <тип>); или
(const t1: <тип>; const t2: <тип>; .. const tn: <тип>);
где t1, t2, tn – параметры-константы.
Например, (const t1: real; const t2, t3: integer);
Пример 8.1. Procedure MyProc(var a : Real; b : integer; const c: char);
Здесь, a – параметр-переменная, b – параметр-значение, c – параметр-константа.
Параметры-процедуры и параметры-функции. Это параметры, которые сами являются процедурами или функциями.
Между формальными и фактическими параметрами должны быть следующие соответствия:
количество параметров;
порядок следования входных и выходных параметров;
тип данных.
Для того чтобы понять, в каких случаях использовать тот или иной тип параметров, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.
Если параметр определён как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передаётся подпрограмме. Даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, всё равно подпрограмме будет передана лишь копия переменной (константы). Любые возможности изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра.
Если параметр определён как параметр-переменная, то при вызове подпрограммы передаётся сама переменная, а не её копия (фактически в этом случае подпрограмме передаётся адрес переменной). Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе.
В случае параметра-константы в подпрограмму также передаётся адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
Пример 8.2.
…
const
a: integer = 5;
b: integer = 7;
{объявление процедуры}
procedure Inc2 (var c: integer; b: integer); {заголовок процедуры}
begin{начало тела подпрограммы}
c := c+c;
b := b+b;
writeln(‘удвоенные :’,c:5,b:5);
end; {конец тела подпрограммы}
begin{начало тела основной программы}
writeln (‘исходные :’, a:5, b:5);
inc2(a,b); {вызов тела подпрограммы}
writeln (‘результат :’, a:5, b:5);
end. {конец тела подпрограммы}
В результате прогона программы, на экран будет выведено:
Исходные : 5 7
Удвоенные : 10 14
Результат : 10 7
Задача 8.1. Определить расстояние между двумя точками.
Блок-схема алгоритма
Листинг процедуры DLINA
PROCEDURE DLINA (X1, X2, Y1, Y2 : REAL; VAR L : REAL);
BEGIN
L:= SQRT(SQR(X2-X1)+SQR(Y2-Y1));
END;
Блок-схема алгоритма основной программы
Листинг основной программы
PROGRAMTASK;
VAR Q1, Q2, K1, K2, D : REAL;
PROCEDURE DLINA(X1,X2,Y1,Y2 :REAL; VAR L : REAL);
BEGIN
L:= SQRT(SQR(X2-X1)+SQR(Y2-Y1));
END;
BEGIN
READLN (Q1, Q2, K1, K2);
DLINA (Q1, Q2, K1, K2, D);
WRITELN(D);
END.
Здесь,
Q1,Q2,K1,K2,D – глобальные переменные,
X1, X2, Y1, Y2, L – формальные параметры, где
X1, X2, Y1, Y2 – входные параметры-значения и
L – выходной параметр-переменная.
Задача 8.2. Определить в одномерном массиве минимальный элемент и его номер.
Примечание. Если в качестве параметров используются массивы, их необходимо объявлять в разделе типов.
Блок-схема алгоритма подпрограммы-процедуры MINVECTOR
Листинг подпрограммы-процедуры MINVECTOR
PROCEDURE MINVECTOR (D : VECTOR; L : INTEGER; MIN : INTEGER);
VAR
I: INTEGER;
BEGIN
MIN:= 1;
FOR I:=2 TO L DO
IF D[MIN] > D[I] THEN MIN:= I;
END;
Блок-схема алгоритма основной программы
Листинг основной программы
PROGRAMTASK;
CONST N = 25;
TYPE VECTOR = ARRAY[1..N] OF REAL;
VAR I, M : INTEGER; A: VECTOR;
PROCEDURE MINVECTOR (D : VECTOR; L : INTEGER; MIN : INTEGER);
VAR I: INTEGER;
BEGIN
MIN:= 1;
FOR I:=2 TO L DO
IF D[MIN] > D[I] THEN MIN:= I;
END;
BEGIN
FOR I := 1 TO N DO READLM (A[I]);
MINVECTOR (A, N, M);
WRITELN (‘Минимальный элемент массива равен - ’, A[M]:3);
END.
Задача 8.3. Даны три массива А (20), В (30), С (25). Расположить элементы по возрастанию. Использовать процедуры для формирования массива, вывода первоначальных значений на экран и вывода упорядоченных элементов массива.
Блок-схема алгоритма подпрограммы InputVector
Листинг подпрограммы InputVector
PROCEDURE INPUTVECTOR (L: INTEGER; VAR D: VECTOR);
VAR I : INTEGER;
BEGIN
RANDOMIZE;
FOR I:=1 TO L DO D[I]:=RANDOM (101) - 50;
END;
Блок-схема алгоритма подпрограммы OutputVector
Листинг подпрограммы OutputVector
PROCEDURE OUTPUTVECTOR (L: INTEGER; D: VECTOR);
VAR I : INTEGER;
BEGIN
FOR I:=1 TO L DO WRITELN (D[I]);
END;
Блок-схема алгоритма подпрограммыSortVector (сортировка посредством выбора)
Листинг подпрограммы SortVector
PROCEDURE SORTVECTOR (L: INTEGER; VAR D: VECTOR);
VAR
I, J, T : INTEGER;
BEGIN
FOR I:=1 TO L-1 DO
FOR J:=I+1 TO L DO
IF D[J]>D[I] THEN
BEGIN
T:= D[I];
D[I]:= D[J];
D[J]:= T;
END;
END;
Блок-схема алгоритма основной программы
Листинг основной программы
PROGRAMTASK;
USES CRT;
CONST N = 30;
TYPE
VECTOR = ARRAY[1..N] OF INTEGER;
VAR
A, B, C : VECTOR;
PROCEDURE SORTVECTOR
(L: INTEGER; VAR D: VECTOR);
VAR
I, J, T : INTEGER;
BEGIN
FOR I:=1 TO L-1 DO
FOR J:=I+1 TO L DO
IF D[J]>D[I] THEN
BEGIN
T:= D[I];
D[I]:= D[J];
D[J]:= T;
END;
END;
BEGIN
CLRSCR;
INPUTVECTOR(20, A);
INPUTVECTOR(30, B);
INPUTVECTOR(25,C);
WRITELN(‘Сформированный массив А: ’);
OUTPUTVECTOR(20,A);
WRITELN(‘Сформированный массив В: ’);
OUTPUTVECTOR(30,B);
WRITELN(‘Сформированный массив С: ’);
OUTPUTVECTOR(25,C);
WRITELN(‘Отсортированный массив А: ’);
SORTVECTOR(20,A);
WRITELN(‘Отсортированный массив В: ’);
SORTVECTOR(30,B);
WRITELN(‘Отсортированный массив С: ’);
SORTVECTOR(25, C);
READLN;
END.