ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.04.2025
Просмотров: 1354
Скачиваний: 0
СОДЕРЖАНИЕ
Министерство образования и науки российской федерации
Начальный курс программирования на основе алгоритмического языка Паскаль
Часть. Основы программирования на Паскале
1.1. Структура простейшей Паскаль-программы
1.2. Данные и операции над ними
1.2.1. Свойства ячейки памяти. Переменные и константы
1.2.3. Правила записи констант
1.2.4. Описание переменных и именованных констант в Паскале
1.3. Операторы преобразования данных
1.4. Разработка простейших программ
1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
1.4.2. Алгоритм и способы его записи.
1.4.3. Изображение алгоритмов в виде блок-схем
1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале
1.4.5. Примеры разработки программ
1.5.1. Понятие массива. Основные правила работы с массивами в Паскале
1.5.2. Примеры программ с массивами
1.614. Структура паскаль-программы
2.1. Общие сведения о подпрограммах
2.4. Глобальные и локальные имена
2.5. Использование подпрограммы в качестве параметра другой подпрограммы
2.6.4. Модули как средство программирования
Часть. Обработка символьной информации и документов сложной структуры
3.1. Обработка символьной информации
3.1.3. Подпрограммы, работающие со строками
Часть IV. Работа с динамическими массивами
Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.
Режимы компиляции программы, использующей модули
Однако допустимо использование глобальных переменных для передачи данных между подпрограммами(если не требуется подстановка параметров). Так, если бы в примере п.2.2.2 требовалось обработать одну матрицу, то можно было бы использовать процедуры без параметров, как сделано в приведенной ниже программе.
program primer2_4;
{вычисление минимальных значений элементов строк матрицы a[3*5]}
Type matr=array[1..3,1..5] of real;
mas= array[1..3] of real;
Var a:matr; min:mas; {далее-раздел процедур и функций}
Procedure minstr;
Var i,j:integer;
Begin
for i:=1 to 3 do
begin
min[i]:=a[i,1];
for j:=1 to 5 do
if min[i]>a[i,j] then
min[i]:=a[i,j];
end
End{minstr};
Procedure matrin;
Var i,j:integer;
Begin
Writeln('Введите матрицу размером 3*5');
for i:=1 to 3 do
for j:=1 to 5 do
read(a[i,j]);
readln;
End{matrin};
Procedure masout;
Var i:integer;
Begin
Writeln('Минимальные значения строк матрицы ');
for i:=1 to 3 do
writeln(' ',min[i]);
End{masout};
{далее - раздел действий программы}
Begin
matrin;
minstr;
masout;
readln
End.
Основное назначение подпрограмм в такой программе – упростить программу и сделать ее более наглядной за счет укрупнения операторов. Заметим, однако, что использование глобальных переменных для передачи данных между процедурами имеет существенные недостатки, а именно:
делает процедуры менее универсальными и затрудняет их повторное применение, как в пределах одной программы, так и в других программах.
усложняет автономную отладку подпрограмм.
Процедуры, в разделе действий которой используются только ее формальные и локальные параметры, называются "чистыми". Именно "чистые" процедуры удобно использовать как библиотечные, так как они допускают подстановку вместо формальных параметров различных вариантов фактических.
2.5. Использование подпрограммы в качестве параметра другой подпрограммы
Использование параметра-подпрограммы необходимо, когда некоторый алгоритм, описанный как подпрограмма, применим к множеству алгоритмов, каждый из которых также задается подпрограммой.
Классические примеры таких ситуаций дают численные методы. В подпрограммах численных методов (вычисления определенного интеграла, нахождения экстремумов и нулей функций, вывода графиков, линий уровня, таблиц функций) обрабатываемые функции задаются как параметры. Средства для использования параметров-подпрограмм имеются во всех алгоритмических языках, предназначенных для решения вычислительных задач (СИ, Фортран, ПЛ/1).
В рассматриваемых версиях Паскаля процедура-формальный параметр должна быть описана с помощью ранее объявленного процедурного (функционального) типа. При объявлении этого типа описывается структура заголовка подпрограммы, т.е. дается заголовок без имени подпрограммы. Примеры процедурных типов:
TYPE PROC1=PROCEDURE(a,b,c:real; var d:integer);
FUNC1=FUNCTION : REAL;
G=FUNCTION (x,y,z:real);
Подпрограмма-фактический параметр должна соответствовать процедурному типу формального параметра, т.е. иметь такой же заголовок с точностью до обозначений.
Замечания
Имена стандартных подпрограмм нельзя использовать в качестве фактических параметров.
В языках BorlandPascalиTurboPascalподпрограммы, используемые как фактические параметры, должны компилироваться с использованием "дальней модели памяти" , поэтому в программу надо включить директивы компилятора {$F+} и {$F-} или поставить стандартную директиву far (для версий начиная сTurboPascal6.0) cразу за заголовком подпрограммы.
Пример 1.Решение двух уравнений на отрезке [0,3] c погрешностью 0.0001.
program primer2_5;
Type fn=function(x:real):real;{функциональный тип, задающий
вид уравнения}
Var r1,r2:real; {коpни уpавнений}
{$F+} {опция дальнего вызова, в ObjectPascalне надо}
function fx1(x:real):real; {fx1 задает первое уравнение}
begin
fx1:=1.0/(1.2*sin(x)/cos(x)+sqrt(x+1));
end;
function fx2(x:real):real; {fx2 задает второе уравнение}
begin
fx2:=(exp(-x)-sqrt(exp(x))+3.7)/3.0;
end;
{$F-} { В Object Pascal не надо }
{root– подпрограмма вычисления корня}
{уравнения fx(x)=0 на [a,b] c погрешн.е методом простых итераций}
function root(fx:fn; a,b,e:real):real;
{fx - функция – формальный параметр}
var x,x0:real;
begin
x0:=(a+b)/2; x:=fx(x0);
while abs(x-x0)>e do
begin
x0:=x; x:=fx(x0);
end;
root:=x;
end;
begin
r1:=root(fx1,0,3,1.0e-4);{fx1 - функция - факт. параметр}
r2:=root(fx2,0,3,1.0e-4);{fx2 - функция - факт. параметр}
writeln('Коpень пеpвого уpавнения r1=',r1:7:4);
writeln('Коpень втоpого уpавнения r2=',r2:7:4);
end.
Пример 2. Предположим, что функцияrootрешения уравнения из примера 1 является библиотечной подпрограммой и не подлежит изменению. Пусть надо решить уравнение, заданное с точностью до параметраp,например, p задается вводом:
x – p cosx=0.
В программе надо обратиться к root, подставив вместо формального параметраfxфактический
g(x,p)= x – p cosx.
Но g имеет два аргумента, аfx один. Выход из этой ситуации состоит в том, чтобы параметрр считать глобальным. Программа решения уравнения приведена ниже; предполагается, что типfn и функцияrootимеются в подключенной к программе библиотеке.
Varp{глобальная переменная для функцииg},
E{погрешность решения уравнения},A,B{границы отрезка}:real;
function g(x:real):real;
begin
g:=x-p*cos(x)
end;
begin
writeln(‘Введите p,A,B,E’);
readln (p,A,B,E );
writeln(‘ корень уравнения равен ‘,root(g,A,B,E));
readln
end.
2.6. Модули
2.6.1. Общие сведения
Единственно возможное положение подпрограмм в стандартном Паскале – это раздел процедур и функций программы. Отсюда следует один из основных недостатков стандартной версии - невозможность раздельной компиляции подпрограмм и программы. Этот недостаток делает невозможным создание библиотеки алгоритмов в кодах ЭВМ. Процедуры можно хранить только как тексты на алгоритмическом языке, включать их в текст программы-блока и компилировать блок как единое целое.
Для обеспечения возможности компиляции программы по частям в реализациях Паскаля, начиная с Турбо Паскаля, введено новое средство языка - модули (Units).
Модуль - это автономно компилируемая программная единица, включающая в себя различные разделы описаний (типов, констант, переменных, процедур и функций) и, возможно, некоторые исполняемые операторы (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов).
При рассмотрении модулей следует остановиться на двух вопросах: как создавать (программировать) модули и как использовать готовые модули. Этому посвящены следующие параграфы.
2.6.2. Структура модуля
Схематично структуру модуля можно изобразить следующим образом:
UNITимя_модуля;
INTERFACE
интерфейсная_часть
IMPLEMENTATION
исполняемая_часть
[BEGIN
инициирующая_часть]
END.
Модуль начинается ключевым словом UNIT, после которого пишется имя модуля, и заканчивается словомЕND, после которого ставится точка.
Модуль состоит из трех частей19. Первая часть содержит описания, доступные другим программам или модулям. Часто ее называютвидимой(ее как бы "видят" другие программы) илиинтерфейсной(она начинается с ключевого словаINTERFACE, что в переводе с английского означает "внешние связи"). От процедур и функций в первую часть включаются только заголовки.
Вторая часть содержит описания подпрограмм, заголовки которых находятся в интерфейсной части. Она называется исполняемой, так как содержит исполняемые операторы подпрограмм, и начинается с ключевого слова IMPLEMENTATION, которое переводится с английского как "исполнение". Содержание второй части доступно только данному модулю и не может использоваться другими программными единицами, поэтому ее также называют невидимой(для других программных единиц). В частиIMPLEMENTATIONв заголовках подпрограмм могут отсутствовать списки формальных параметров, так как они имеются в частиINTERFACE.
Третья часть называется инициирующей. Она содержит операторы, выполняемые до передачи управления основной программе. Они подготавливают работу модуля. Обычно это операторы инициализации переменных, открытия файлов (см. §3.3) и т. д. Инициирующая часть начинается с ключевого словаBEGIN. Она может отсутствовать (вместе с открывающим ее словомBEGIN).
Пример
Ниже приведен модуль VECTOR, позволяющий осуществлять некоторые операции над векторами. Число компонент вектора не превышает 10. Смысл процедур поясняется в комментариях.
Unit VECTOR; {операции над векторами}
INTERFACE
Type AR=Array[1..10] of real;
Function Scpr(Var a,b:Ar;N:Integer):Real;
{вычисление скалярного произведения двух векторов}
Function Lngth(Var a:Ar; N:Integer):Real;
{вычисление длины вектора}
Function UngleRad(Var a,b:Ar; N:Integer):Real;
{вычисление угла между двумя векторами в радианах}
Function UngleGr(Var a,b:Ar;N:Integer):Real;
{вычисление угла между двумя векторами в градусах}
Procedure Sum(Var a,b,c:Ar;N:Integer);
{вычисление суммы двух векторов}
Procedure Inp(Var a:Ar; N:Integer);
{ввод координат вектора}
IMPLEMENTATION
Function Scpr;
Var I:Integer; S:Real;
Begin
S:=0;
For i:=1 To N Do
S:=S+a[i]*b[i];
Scpr:=S;
End;
Function Lngth;
Begin
Lngth:=Sqrt(Scpr(a,a,N));
End;
Function UngleRad;
Var x:Real;
Begin
x:=Scpr(a,b,N)/Lngth(a,N)/Lngth(B,N);
If x=0 then UngleRad:=pi/2
Else
UngleRad:=ArcTan(Sqrt(1-x*x)/x);
End;
Function UngleGr;
Begin
UngleGr:=UngleRad(a,b,3)/pi*180;
End;
Procedure Sum;
Var i:Integer;
Begin
For i:=1 to N Do
c[i]:=a[i]+b[i]
End;
Procedure Inp;
Var I:Integer;
Begin
For i:=1 To N Do
Read(a[i]);
Readln
End;
End.
В Объектном Паскале допустима рассмотренная структура модуля. Но можно также отмечать начало инициализирующей части ключевым словом INITIALIZATION(вместоBEGIN). Модуль Объекьного Паскаля может иметь завершающую часть, которая содержит операторы, выполняемые при завершении программы, и начинается со словаFINALIZATION.
Имя файла, содержащего исходный текст модуля, должно совпадать с именем модуля и иметь расширение .PAS(для примера предыдущего раздела VECTOR.pas). Результатом компиляции будет файл с тем же именем. Расширение откомпилированного файла .TPU(например,VECTOR.tpu) для средTurboиBorlandPascalи.DCUдляDelphi.