Вопрос №5.Подпрограммы.Подпрограмма – поименованная логически законченная группа операторов языка, которую можно вызвать для выполнения по имени любое количество раз из различных мест проги. Блок может содержать в себе другие блоки. Блок, который не входит в другой блок, называется глобальным. Блок, входящий в состав другого блока – локальный. Объявление называется докальным для подпроги, если оно создается данной подпроге. Глобальное объявление – оно создается в объемлющей проге или в глобальном блоке. С каждым объявлением имени связана область его действия и вне своей области действия имя не существует. Областью действия имени явяляется часть блока от точки объявления до конца текущего уровня вложенности, включая вложенные подпроги, за исключнием тех вложенных подпрог, в которых имеются другие объявления того же имени. Не допускаются повторные объявления имени на одном уровне вложенности. Сущ 2 вида подпрог: процедуры и функции. Подразделяются: встроенные и определенные пользователем. Встроенные процедуры и функции являются частью языка и используются без их предварительного описания в проге. Процедуры и функции пользователя организуются програмером и являются локальными блоками. Их предварительное описание обязательно. Принцип локализации.С целью организации коллективной работы паскаль разрешает в любой подпроге или модуле вводить для внутренних потребностей любые типы значений и программные элементы. Принцип локализации заключается в том, что имена, вводимые в употребеление в подпроге имеют силу только только в данной подпроге. Если такое имя описано вне тела модуля, то область действия данного описания на подпрогу не распространяется.Program q; var y:real; x:chat; const c=10; procedure al(x,z:real); var c:real;Begin c:=x+z; x:=2*x; y:=1; writeln (c,x,y); end; begin x:=’a’; y:=0.5; al(y,0.1);writeln (c,x,y); end. | Вопрос №6.Процедуры.<описание_процедуры>::= <заголовок_проц>→;→<тело_проц><заголовок>::=→procedure→<ид.> →<сисок_формальных_пар-в>→ −−−−−−−−−−→−−−−−−−−−−−<сисок_формальных_пар-в>::=→(→<форм_пар>→)→ −−←−−;←−−−Формальные параметры определяют тип данных, передаваемых процедуре при ее вызове и способ передачи данных. Тело процедуры состоит из объявлений локальных идентификаторов и сотавного оператора, описывающего действия данной процедуры.<вызов_процедуры>::=→<ид_процедуры>→(→<аргумент>→)→ −−←−−,←−−−Осуществляется с помощью оператора вызова процедуры. Оператор вызова вызывает процедуру с указанным именем и передает ей фактические параметры, если они заданы. Выполнение процедуры прекращается при достижении конца составного оператора тела программы. Для прекращения выполнения процедуры до достижения конца ее тела используется оператор EXIT. Такое выполнение процедуры называется синхронным.Процедуры без параметров.Если нет параметров, то связь по данным между вызывающими и вызываемыми блоками возожна только через одноименные переменные, область действия которых охватывает оба блока. Пример: program R; var x1,x2,y1,y2,d:real; i:integer; const N=10;procedure rast1; begin d:=sqrt(sqr(x1-x2)+sqr(y1-y2)); end;begin for i:=1 to N do begin readln (x1,x2,y1,y2); rast1; writeln (d); end; end.Begin for I:=1 to N do begin readln(X1,Y1,X2,Y2); Rast1; writeln(D); end; end.Недостаток: жесткая фиксация исходных данных.Если процедуру без параметров приходится использовать в различных частях программы, для различных имен переменных, то перед вызовом процедуры необходимо произвести переприсваивание имен. | Вопрос №7.Процедуры с параметрами.Формальные параметры – это идентификаторы переменных или имена подпрограмм, используемых в операторах внутри подпрог, заменяемые аргументами при вызове подпроги.<форм_пар>::=−−−−−−−−−−−−−→<ид.>−−−−−−−−−−−−−−−−−−−−→ →VAR→ →,→ →: →<тип_пар>→ →CONST→5 типов ф. параметров: п.значения, п-переменные, п-константы, п без типа, п процедурного типа.Параметры-значения – группа параметров, перед которыми не используются зарезервированные слова var или const и за которыми следует тип. Запрещается использовать параметры значения файловых типов. Для каждого параметра-значения создается локальная переменная. Они существуют только во время выполнения подпроги. При входе в подпрогу этим переменным присваивается значение соответствующих фактических параметров оператора вызова процедуры. В качестве фактического параметра может использоваться любое выражение, тип которого совместим по присваиванию с типом параметра значения.Процедура не может изменять значение переменной, являющейся фактическим параметром. С помощью параметров-значений Нельзя представить результаты выполнения процедуры, которые используются вне ее тела.Var x1,x2,y1,y2,D: real; i: integer; const n=10;Procedure Rast2(XX1,XX2,YY1,YY2);Begin D:=sqrt(sqr(xx1-xx2)+sqr(yy1-yy2) end;Begin for i:=1 to n doBegin readln(x1,x2,y1,y2); rast2(x1,x2,y1,y2) ; writeln(D) ; end ;End. |
Вопрос №8.Параметры – переменные это группа параметров, перед которой стоит слово VAR и за которой следует тип. Фактическим параметром может быть только переменная того же типа, что и тип формального параметра.−−−−−−−−−−−−−→<ид.>−−−−−−−−−−−−−−−→ →VAR→ →,→ →:→<тип>→ →CONST→В подпрогу передается адрес этой переменной, поэтому процедура может непосредственно использовать и изменять значение этой переменно, т.е. передавать в основную прогу вычисленные результаты. Изменения формального параметра переменной приводит к изменению соответствующей переменной.Параметры-константы – описываются с помощью CONST. В подпрогу передается адрес фактического параметра. Фактическим параметром может быть константа или переменная. При входе в процедуру локальные переменные не создаются. Процедура выполняется гораздо быстрее. | Вопрос №9.Параметры-переменные без типа – группа параметров, перед которыми стоит VAR, но после которой не следует тип параметра. Фактическими параметрами м.б. переменные любого типа.Поскольку у нетипизированных параметров переменных тип отсутствует, то изначально они не совместимы с переменными всех типов. Обеспечение совместимости с фактическими параметрами достигается двумя способами: 1) внутри подпроги объявляется локальная переменная нужного типа, наложенная на переданный фактический параметр. Для описания налагаемой переменной используется ABSOLUTE.→<имя_пер>→:→<тип_перем>→ABSOLUT→<имя_параметра_без_типа>→Пример (сравнение значений элементов массивов):...type vector=array[1..6] of integer; point=record x,y:integer end;var vec1,vec2:vector; N,i:integer; p:point; rez:boolean;procedure equale1 (var so,de;size:word;var rez:boolean);{сравниваются любые 2 переменные SO и DE любого типа и любого размера SIZE}var N:integer; s:array [0..maxint] of byte absolute so; d:array [0..maxint] of byte absolute de;begin N:=0; while (N<size) and (s[N]=d[N]) do inc (N);rez:=N=size; end;begin...readln (N);equale1 (vec1,vec2,sizeof(integer)*N,rez);--------------------------------equale1 (vec1,vec2[3], sizeof(integer)*2,rez);--------------------------------equale1 (vec1[5],p,4,rez);2) способ: внутри процедуры вводится нужный тип. Данный тип ставится в соответствие параметру переменной без типа с помощью присваивания типа переменной.Procedure equale (...);Type bytes=array[0..maxint] of byte;var N:integer; begin N:=0;while (N<size) and (bytes(de)[N]=bytes(so)[N]) do inc (N); Rez:=N=size; End; | Вопрос №10.Параметры процедурного типа. Это группа параметров, перед которыми не используется слова Varили Const. Позволяют организовать процедуры, использующие в качестве параметра другие процедуры или функции. С этой целью применяются процедурные типы. Описание процедурного типа вводится в разделе TYPE.Type pr=procedure (x:integer,var y:real); Pr1=procedure (a,b:string,p:pr);Допускается использовать в любом контексте. Varp:pr; P1:pr1;Параметры процедуры м.б. присвоено значение другой процедурной переменной, имя процедуры или функции. Для обеспечения такой совместимости, процедура, если ее нужно присвоить процедурной переменной, должна удовлетворять следующим требованиям: она должна компилироваться в состоянии far {$f+}; не д.б. стандартной процедурой или функцией; не д.б. вложенной; не д.б. процедурой типа Inline; не д.б. процедурой прерывания Interrupt.На физическом уровне при присваивании процедурной переменной значения процедуры в данную переменную заносится адрес процедуры, поэтому процедурная переменная аналогично указателям. Занимает 4 байта. Если процедура д. передаваться в качестве фактического параметра, она должна удовлетворятьтем же правилам совместимости типа, что и при присваивании. Const r=4; type mas=array[1..r] of real;Proc=procedure (x:mas;var x1:mas);Var vec1:mas; i:integer;------------------{$f+}procedure loc(y:mas;var y1:mas);begin for i:=1 to r do y1[i]:=ln(y[i]);end;procedure step (y:mas;var y1:mas);begin for i:=1 to r do y1[i]:=exp(y[i]);end; {$f-}procedure vizov (g:mas;poced:proc);var n:1..r; rez:mas;begin proced (g,rez);for n:=1 to r do write (rez[n]);end; begin vizov (vec1,log); vizov (vec1,step); end. |
Вопрос №11.Использование производных типов в качестве параметров процедур.Могут использоваться как параметры-переменные, п-значения или п-константы. Во всех случаях фактическими параметрами м.б. только переменные соответствующего типа, но не выражения и не константы (за исключением строковых констант). При использовании массива в качестве параметра-значения при входе в процедуру образуется локальная переменная массив, куда заносится значение фактического параметра массива, т.е. осуществляется копирование массива. | Вопрос №12.Функции.→FUNCTION→<ид>→<список_форм_пар>→:→<ид_типа>→ -----------------------Функция может изменять значения глобальных переменных и параметров-переменных. Каждая функция вычисляет значение, называемое возвращаемым значением функции. Чтобы установить это значение необходимо присвоить это значение идентификатору функции. В теле ф-ции должен присутствовать оператор присваивания, в левой части которого записано имя описываемой функции (без параметров). Типы возвращаемых значений: скалярные, string,тип-указатель. Вызов ф-ции представляет собой возвращаемое значение. Оно используется в качестве операндов. М.б. использован везде, где по синтаксису допускается использование выражений. | Вопрос №13.Рекурсивные функции.Особенность: в их теле содержится обращение к этой же подпроге. 2 вида: явная – обращение к подпроге содержится в теле самой подпроги; неявная – обращение содержится в теле другой подпроги, к которой производится обращение изданной подпроги. Возможность рекурсивного обращения обеспечивается специальными средствами, которые при каждом повторном вызове подпроги создают новый экземпляр ее памяти и делают временно недоступным прежний экземпляр памяти. Экземпляр памяти – значения локальных переменных и фактических параметров, существующих на момент рекурсивного вызова подпроги. Все экземпляры памяти помещаются в стэк. В стэке всегда доступен только текущий экземпляр памяти, содержащийся последним. При каждом возврате из рекурсивной подпроги, текущий экземпляр памяти удаляется из стека и делается доступным предыдущий экземпляр. Рекурсивность – свойство описания подпроги. Недостаток – дополнительная память, существенно замедляется работа проги.Директивы.Тело подпроги может содержать директивы.<тело_подпроги>::=−−−−−−−−−−−−−−−−−−−−−→<блок>−−−−−→ →INTERRUPT→;→ →FORWARD→ →EXTERNAL→ →INLINE→---------------------------------- INTERRUPT – прерываниеEXTERNAL – подключать в качестве тела подпроги фрагменты AssemblerINLINE – подключать в качестве разделов операторов инструкции в машинных кодахFORWARD – опережающее описание. После этого прога д.б. описана с помощью определяющего описания – описание, содержащее заголовок подпроги, тело подпроги.Между опережающим и определяющим описагиями м.б. описаны другие подпроги, которые могут обращаться к подпрогам с опережающим описанием → взаимная рекурсияXi=0,5(X(i-1)+P(i-1)); Xo=1; Pi=X(i-1)-P(i-1); Po=2;Program rec; var n:integer; xi,pi:real;procedure form_xi (i:integer;var xi:real);forward; procedure form_pi (i:integer;var pi:real);var xi:real; begin if i=0 then pi:=2 else beginform_xi(i-1,xi); form_pi(i-1,pi); pi:=xi-pi; end end;procedure form_xi; var pi:real; begin if i=0 then xi:=1 else form_xi(i-1,xi);form_pi (i-1,pi); xi:=0.5*(xi+pi) end end;begin read (n); form_xi(n,xi); form_pi(n,pi); writeln (‘x’,n,’=’,xi); writeln (‘p’,n,’=’,pi);end. |
Вопрос №17.Процедуры ввода из стандартного текстового файла Input. Допустимые типы вводимых переменных. Особенности ввода. Пример.По умолчанию устройство ввода связано со стандартным входным файлом Input. Устройство вывода связано со стандартным выходным файлом Оutput.Устр-во ввода: клавиатура; вывода: экран.1. Read(x1,x2,..,xn);список ввода2. ReadLn(x1,x2,..,xn);Пр-ры читают символьные данные из файла Input и присваивают их переменным хi, при этом символьн. данные пробразуются к типу переменной xi. Допустимы следующие типы хi:1. целочисленны и их диапазоны;2. веществен.;3. сhar и его диапазон;4. string;5. array of char;Пр-ра ReadLn после чтения эл-тов списка ввода осущ. переход к следующей строке файла Input.Var a,b,c:integer; |
Пр-ра Read после чтения эл-тов списка ввода осущ. переход на число символов данной строки.