
- •Конспект лекций по информатике
- •Организация данных в эвм и основы программирования
- •1. Основные понятия языка программирования паскаль
- •1.1. Структурное программирование
- •1.2. Основные символы языка
- •1.3. Элементы языка
- •1.4. Интегрированная среда turbo pascal
- •1.5. Структура программы в turbo pascal
- •1.6. Определение типов
- •1.7. Операторы в программе
- •1.7.1. Операторные скобки
- •1.7.2. Операторы ввода
- •1.7.3. Оператор присваивания
- •1.7.4. Условный оператор
- •1.7.5. Пример простой программы
- •1.7.6. Оперетор безусловного перехода
- •1.8. Организация циклов
- •1.8.1. Использование операторов условного и безусловного перехода
- •1.8.2. Цикл с параметром
- •1.8.3. Цикл с предусловием - цикл while
- •1.8.4. Цикл с постусловием - цикл repeat
- •1.9. Оператор выбора варианта
- •1.10. Расположение операторов в программе
- •1.11. Концепция типов данных
- •2. Стандартные простые типы
- •2.1 Целый тип
- •2.1.1. Операции над данными целого типа:
- •2.2. Действительный тип
- •2.2.1. Операции над данными действительного типа:
- •2.3. Логический тип
- •Var p, q, r : Boolean;
- •2.3.1. Алгебра логики в Паскале
- •2.3.2. Законы алгебры логики в Паскале
- •2.4. Символьный тип
- •2.4.1. Символьные строковые константы
- •3. Нестандартные простые типы (определяемые пользователем)
- •3.1. Перечисляемый тип
- •3.2. Ограниченный тип (диапазон, интервал)
- •4. Процедуры и функции
- •4.1. Описание процедур
- •4.2. Стандартные процедуры
- •4.3. Описание функций
- •4.4. Стандартные функции
- •4.5. Итерация и рекурсия
- •4.6. Побочный эффект рекурсии
- •4.7. Предварительное описание (ссылки вперед)
- •5. Регулярные типы
- •5.1. Одномерный массив, или переменные с индексами
- •Алгоритмы сортировки массивов
- •1. Метод пузырька (метод обменной сортировки с выбором)
- •2. Сортировка выбором
- •3. Метод Шелла
- •4. Метод Хoopа
- •5.2. Многомерные массивы
- •5.3. Упакованные массивы
- •5.4. Строки
- •6. Множественные типы
- •6.1. Свойства множеств
- •6.2. Операции над множествами
- •7. Комбинированные типы
- •7.1. Описание записей и действия с ними
- •7.2. Оператор присоединения.
- •7.3. Записи с вариантами
- •8. Типизированная константа
- •8.1. Простая типизированная константа
- •8.2. Структурированная (сложная) типизированная константа
- •8.2.1. Типизированная константа массива
- •8.2.2. Типизированная константа записи
- •8.2.3. Типизированная константа множества.
- •9. Преобразование типов
- •9.1. Неявные преобразования типов
- •9.2. Использование стандартных функций для преобразования
- •9.3. Явные преобразования типов
- •9.5. Совместимость типов
- •10. Файловые типы
- •10.1. Определение файлового типа
- •10.2. Структура файла
- •10.3. Имя файла
- •10.4. Описание файлового типа
- •10.5. Файловая переменная
- •10.6. Операции над файлами
- •10.7. Типизированные файлы
- •10.8. Текстовые файлы
- •10.9. Нетипизированные файлы
- •10.10. Стандартные файлы inpuTиOutput
4. Процедуры и функции
Как записывается текст песни? Припев даётся один раз. Если нужно повторять его, то указывается одно слово – припев. Зачем же повторять несколько раз одно и тоже? Этот же принцип действует и в программировании. Если какая-нибудь часть программы многократно повторяется, то её оформляют отдельно от основной программы и называют подпрограммой. К ней обращаются при необходимости ее использования.
Более того, рекомендуется большую задачу разбивать на отдельные смысловые места, и программировать их отдельно, а затем объединять в единую программу.
Подпрограммы располагаются в разделе описания основной программы. Выполнение программы начинается с выполнения операторов основной программы. При необходимости выполнения программы, она вызывается по имени. Данные из основной программы передаются в подпрограмму (входные данные), которая начинает выполняться. Затем результаты подпрограммы (входные данные) передаются в основную программу в то место, откуда был сделан вызов подпрограммы, и продолжает выполняться основная программа.
Подпрограмма оформляется подобно основной программе, то есть состоит из заголовка, раздел описаний и раздел операторов. Все имена, представленные в разделе описаний основной программы, называются глобальными. Они действуют как в разделе операторов основной программы, так и в любой подпрограмме.
Имена, представленные в разделе описаний подпрограммы, называются локальными. Они действуют только в рамках подпрограммы и недоступны операторам основной программы.
В языке программирования Паскаль есть два вида подпрограмм:
Procedure– процедура и
Function- функция.
Процедуры и функции аналогичны программам в миниатюре и имеют общее название – подпрограммы. Применение подпрограмм дает возможность уменьшить число повторений одной и той же последовательности операторов, а также конструировать программу как набор отдельных подпрограмм (модулей), т.е. по принципу структурного программирования.
4.1. Описание процедур
Описание каждой процедуры начинается с заголовка, где задаются имя процедуры и список формальных параметров с указанием их типов. Оформление процедур в общем виде выглядит следующим образом:
Procedureимя (список формальных параметров);
Раздел описаний
Begin
Раздел операторов
End;
Раздел описаний процедуры подобен разделу описаний программы и состоит из разделов меток, констант, типов, переменных, процедур и функций. Он может отсутствовать вообще. Раздел операторов заключён в операторные скобки BeginEnd;
Процедура может быть и без параметров, тогда в заголовке указывается только её имя. С помощью параметров осуществляется передача исходные данных в процедуру, а также передача результатов работы в вызвавшую её программу. Список формальных параметров может включать в себя:
параметры – значений
параметры - переменных (перед ними должно стоять слово var),
параметры – процедуры (перед ними должно стоять служебное слово Procedure),
параметры – функции (перед ними должно стоять служебное слово Function)
Выполнение процедуры происходит при её вызове по имени:
Имя (фактические параметры).
Между формальными и фактическими параметрами должно быть полное соответствие:
- количество формальных и фактических параметров должно быть одинаково,
- порядок следования формалтных и фактических параметров должен быть один и тот же,
- тип каждого фактического параметра жлдэен совпадать с типом соответствующего ему формального параметра.
С помощью формальных и фактических параметров данные передаются из программы в процедуру и наоборот. В качестве формальных параметров могут использоваться только переменные с указанием их типа. В качестве фактических параметров могут использоваться константы, переменные, выраженные без указания их типа. При вызове процедуре сначала передаются параметры, при этом параметры-значения передаются по значению, а параметры-переменные – по ссылке. Основное отличие этих способов передачи заключается в том, что присвоение значений параметру переменной внутри процедуры одновременно выполняются и для соответствующего аргумента. То есть параметры, в которые записываются результаты работы процедуры, должны передаваться только по ссылке. Параметры, через которые в процедуру передаются исходные данные, передаются по значению.
Хотя параметры процедуры делятся на отдельные виды, но в простых программах чаще всего используются параметры-значения и параметры-переменные. Данные этих параметров передаются в обоих направлениях, из программы в процедуру и наоборот.
Параметры–значения (перед ними не стоит слово var) можно передавать только в одном направлении: из программы в процедуру. То есть, параметры-значения могут быть только входным для процедуры, а параметры-переменные как входными, так и выходными.
Процедура может содержать несколько операторов и несколько результатов выполнения. Каждый результат обозначается своим именем. В основной программе после вызова процедуры мы можем использовать эти результаты, сохраняя те же имена или давая другие.
Пример: Пусть в программе необходимо многократно вычислять площадь квадратаsк=а^2 и площадь прямоугольникаsp=a*bпри различных значениях сторон а иb.
Procedure Place (x, y: real);
Begin
Sk:=x*x
Sp:=x*y
End;
Вызвать эту процедуру можно, используя фактические переменные:
Place(A,B); где значения параметра А и В передаются в процедуру параметромX,Y.
Другой вариант:
Procedure Place (x, y: real; Var Sk, Sp: real);
Тогда обращение к ней: Place(A,B,S1,S2);
При вызове процедуры вместо переменных А, В можно указать конкретные значения: Place(2.5, 4,S1,S2).
Допускается одинаковое обозначение соответствующих формальных и фактических параметров.
Пример:В 1-ой вводимой с терминала строке подсчитать количество точек, а во 2-ой – количество букв ‘A’. Подсчёт символов реализовать в процедуреPodshet.
ProgramPod;
ConstTochka=’.’;
Var S:Integer;
Procedure Podchet (Sim: Char; Var Kol:Integer);
Var C:char;
Begin kol:=0;
Writeln (‘Введите строку’);
Repeat read (c);
If c=sim then kol:=kol+1;
Until EOLN
End;
Begin Readln;
Podchet (Tochka,S);
Writeln (‘Кол-во точек=’,S:3);
Podchet (Tochka’A’,S);
Writeln (‘Кол-во букв А’,S:3);
End.
Здесь процедура Podschetимеет два формальных пар-ра:
Sim- входной параметр (параметр значения), определяет символ, который подсчитывается в строке;
Kol- выходной параметр, через который передаётся количество подсчитанных символов.
Для того, чтобы результаты работы процедуры Podschetбыл доступен в программе, он передается по ссылке.
Фактический параметр, соответствующий формальному параметру sim, при первом вызове процедуры задается именем константы, определенной в основной программе, а при втором вызове – в явном виде. Обе формы задания правильны, так как в качестве фактического параметра, передаваемого по значению, м. использоваться произвольное выражение соответствующего типа.
Процедуры возвращают результат в основную программу не только при помощи параметров – переменных, но непосредственно изменяя глобальные переменные. Переменные, описанные в основной программе, являются глобальными по отношению к внутренним процедурам и функциям. Переменные, описанные внутри процедур и функций, являются локальными. Локальные переменные существуют только при выполнении процедуры и недоступны в основной программе. Переменная с символьного типа, описанная в процедуре Podschet, является локальной, а переменнаяsцелого типа, описанная в основной программе, является глобальной.
Изменим процедуру Podschet, чтобы она передавала результат своей работы через глобальную переменную.
Program Pod1;
Const Tochka=’.’;
Var s:integer;
Procedure Podshet (Sin:Char);
Var c:char;
Begin s:=0
Writeln (‘Введите строку’);
Repeat Read (c);
If c=sim then S:=s+1;
Until EOLN
End;
Begin Readln;
Podshet (tochka);
Writeln (‘Кол-во точек=’s:3);
Podshet (‘A’);
Writeln (‘Кол-во букв A=’,S:3);
End.
Программы PodиPod1 работают одинаково. Для конкретной задачи программист можно выбирать тот или иной способ передачи результатов работы процедуры и вызвавшую её программу.
Однако в сложных программных комплексах не рекомендуется использовать глобальные переменные, т.к. это ухудшает структурированность программы.
Пример:
Procedure Summa (A:integer;var B:Integer);
Begin A:=A+3;B:=B+3;
End;
В основной программе: A:=5;B:=5;
Summa (A,B);
Write (A,B);
Здесь значения A:=5;B:=5 передаются в процедуру, где вычисляются новые значенияA=5+3=8 иB=5+3=8. Новое значение В передается в программу, а значение А нет. Поэтому в основной программе будет А=5, В=8.
Если в процедуру нужно передать в качестве параметра не просто одно значение, а массив, то в этом случае фактически параметрами является имя массива. При этом формальный параметр указывается после слова var вместе с типом массива. Само же описание массива делается в разделеtypeосновной программы.
В языке программирования Паскаль допускается использование процедур без параметров. В этом случае отсутствует как формальные, так и фактические параметры.
Пример: Определить длину окружности С, площадь кругаS, (радиуса =R) удалениеLцентра окружности от начала координат.X,Y– координаты центра окружности.
1й вариант
y
R
y
L
x x
Program Ex;
Var R:Real;(*радиус*)
X,Y,:Real; (*центр*)
C:Real; (*длина окружности*)
S:Real; (*Sкруга *)
L:Real; (*Удаление центра*)
Procedure Round;
Begin
C:=2*Pi*R;
S:=Pi*SQR(R);
L:=SQRT (SQR(X)+SQR(Y));
End;
Begin
Writeln (‘Ввод);
Read (r,x,y);
Round; (*вызов процедуры*)
Writeln(‘Длина окр-ти=’,C:6:2);
Writeln (‘S круга=’,S:6:2);
Writeln(‘Удал-е центра=’,L:6:2);
End.
2й вариант
Program Ex;
Var R,X,Y,C,S,L:Real;
Procedure Round (R,X,Y:Real; Var C,S,L);
Begin
C:2*Pi*R;
S:=Pi*SQR (R);
L:=SQRT (SQR (X)+ SQR (Y));
End:
Begin
Writeln (‘Ввод’);
Read (R,X,Y);
Round (R,S,Y,S,L,C);
Writeln(‘Длина окружности=’,C:6:2);
Writeln (‘S круга=’,S:6:2);
Writeln(‘Удаление центра’,L:6:2);
End.