67462

Параметры без типа

Лекция

Информатика, кибернетика и программирование

После объявления процедурного (или «функционального») типа можно объявлять переменные такого типа. Этим переменным можно будет присваивать «имена» уже описанных процедур или функций, а затем обращаться к ним по имени процедурной переменной.

Русский

2014-09-10

100 KB

0 чел.

Лекция 10

Параметры без типа

{$X+}

{$N+}   (* Только для TP7 *)

program Project2;

var

 i: integer;

 d: double;

 s: string[2];

procedure ShowInteger(var x);

begin

  writeln(Integer(x));

end;

procedure ShowDouble(var x);

begin

  writeln(Double(x));

end;

procedure ShowString(var x);

begin

  writeln(String(x));

end;


begin

  i := 1;

  ShowInteger(i);    // Будет выведено: 1

  ShowDouble(i);    // Будет выведена абракадабра

  ShowString(i);     // Возможны катастрофические последствия!!!

  readln;

end.


Процедурные типы

<Объявление типа «Процедура» > :: =

<Имя Типа> = procedure(<Список формальных параметров>) ;

<Объявление типа «Функция» > :: =

<Имя Типа> = function(<Список формальных параметров>): <Тип> ;


После объявления процедурного (или «функционального») типа можно объявлять переменные такого типа. Этим переменным можно будет присваивать «имена» уже описанных процедур или функций, а затем обращаться к ним по имени процедурной переменной.

На деле переменные процедурных типов являются указателями. До инициализации они имеют непредсказуемое значение. Не следует надеяться, что это именно Nil. Ответственность за вызов процедуры, на которую «указывает» неинициализированная процедурная переменная, несёт программист.


Пример

type

  MyFuncType = procedure(u: double; var v: double);

var

  z: double;

  p: MyFuncType;

procedure MySqrt(x: double; var y: double);

begin

  y := Sqrt(x);

  Writeln('x=', x:0:7, '  y=', y:0:7);

end;

procedure MySqr(x: double; var y: double);

begin

  y := Sqr(x);

  Writeln('x=', x:0:7, '  y=', y:0:7);

end;

begin

  p := Nil;  

// Переменная процедурного типа ни на что не указывает

  p := MySqrt;

// Переменная процедурного типа указывает на процедуру MySqrt

  p(2, z);

// Имя переменной процедурного типа использовано взамен MySqrt

  p := MySqr;

// Переменная процедурного типа указывает на процедуру MySqr

  p(2, z);

// Имя переменной процедурного типа использовано взамен MySqr

  ReadLN;

end.

Пример. Написать программу, которая будет находить корень уравнения  двумя способами: методом хорд и методом Ньютона (методом касательных).

Численному поиску корня функции f(x) (корня уравнения f(x)=0) должно предшествовать хотя бы грубое аналитическое исследование вопроса. Названные методы предназначены для случая, когда функция  f(x) непрерывна на промежутке [xL , xR], на котором корни разыскиваются.

Будем считать, что функция f(x) меняет на промежутке свой знак ровно один раз (корень единственен). Следовательно,  f(xL)  и  f(xR)  имеют противоположные знаки.

Для метода Ньютона, кроме того, потребуем, чтобы первая и вторая производные функции  f(x) были постоянны по знаку на [xL , xR].


Коротко о методе хорд.
В начале очередного, i-го шага (i = 1, 2, …) строится прямая, проходящая через точки (xL ,  f(xL)), (xR ,  f(xR)), и находится точка её пересечения с осью Ox – число xi  (i-е приближение). Эта точка делит промежуток на две части. Затем оценивается, на какой из этих частей расположен корень. От этого зависит, какая из переменных,  xL  или  xR ,  примет на себя новое, только что вычисленное значение  xi . Новый промежуток [xL , xR,] становится  более «узким» в сравнении со старым.  f(xL)  и  f(xR)  для новых xL , xR  должны иметь противоположные знаки.

Процесс останавливается, когда новое приближение отличается от предыдущего менее, чем на Eps.

На Рис.1 пояснено, как работает метод хорд.

Рис.1.


Коротко о методе касательных (методе Ньютона).
В начале каждого очередного, i-го шага (i = 1, 2, …) строится прямая, касательная к графику функции y=f(x) в точке (xi-1 ,  f(x i-1)), и находится точка её пересечения с осью Ox – число xi  (i-е приближение).

Возникает вопрос, какое число следует взять в качестве начального приближения x0. Для определённости потребуем, чтобы первая и вторая производные функции  f(x) были постоянны по знаку на [xL , xR,]. Тогда начальным приближением x0 должен стать тот из концов промежутка  [xL , xR,], на котором функция  f(x) и её вторая производная имеют один знак. Этим будет гарантировано, что ни одно из чисел  xi  (i = 1, 2, …) не «вылетит» за пределы промежутка [xL , xR,].

Процесс останавливается, когда новое приближение отличается от предыдущего менее, чем на Eps.

На Рис.2 пояснено, как работает метод касательных. Сходимость к искомому корню более быстрая, чем в методе хорд. Это видно и по рисунку, и по численным результатам.


Рис.2.


program
Project1;

{$APPTYPE CONSOLE}

uses

 SysUtils;

type

 MyFuncType = function(x: double): double;

const

 nMax = 100;     // Предел числа шагов

function f(x: double): double;  // Сама функция

begin

 f := x * Exp(-x) + 2;

end;

function dfdx(x: double): double;   // Первая производная функции

begin

 dfdx := Exp(-x) * (1 - x);

end;

function d2fdx2(x: double): double;   // Вторая производная функции

begin

 d2fdx2 := Exp(-x) * (x - 2);

end;

procedure ChordSearchRoot(xL, xR, Eps: double; f: MyFuncType);

var

 yL, yR, xOld, xNew, yNew:

   double;

 n:

   integer;


begin

 n := 0;  

 yL := f(xL);

 yR := f(xR);

 xNew := xL;

 while true do

 begin

   xOld := xNew;

   xNew := (xR * yL - xL * yR) / (yL - yR);

   yNew := f(xNew);

   if yNew * yR < 0 then

   begin

     xL := xNew; yL := yNew;

// Пододвинулась вправо левая граница промежутка

   end

   else

   begin

     xR := xNew; yR := yNew;

// Пододвинулась влево правая граница промежутка

   end;

   if Abs(xNew - xOld) < Eps then break;

   Inc(n);

   if n > nMax then

   begin

     Writeln(‘За ’, nMax, ‘ шагов требуемая точность не достигнута.’);

     break;

   end;

 end;

 xNew := (xR * yL - xL * yR) / (yL - yR);

 Writeln('Result: x=', xNew:0:12, ‘  n=’, n);

end;

procedure NewtonSearchRoot(xL, xR, Eps: double;

   f, df, d2f: MyFuncType);

var

 xOld, xNew:

   double;

 n:

   integer;

begin

 n := 0;  

 if f(xL) * d2f(xL) > 0 then xNew := xL else xNew := xR;

 while true do

 begin

   xOld := xNew;

   xNew := xOld - f(xOld) / df(xOld);

   if Abs(xNew - xOld) < Eps then break;

   Inc(n);

   if n > nMax then

   begin

     Writeln(‘За ’, nMax, ‘шагов требуемая точность не достигнута.’);

     break;

   end;

 end;

 Writeln('Result: x=', xNew:0:12, ‘  n=’, n);

end;

begin

 ChordSearchRoot(-2, 0, 0.000000000001, f);

 NewtonSearchRoot(-2, 0, 0.000000000001, f, dfdx, d2fdx2);

 Readln;

end.


Результат работы программы:

Result:   x = - 0.852605502013    n = 55

Result:   x = - 0.852605502014    n = 6


Оператор выбора

< Оператор выбора> ::=

case <Выражение-селектор> of

           <Список 1> : 

      <Оператор 1> ;

           <Список 2> : 

      <Оператор 2> ;

   . . .

           <Список N> : 

      <Оператор N> ;

  else

     <Операторы> ;

end


Пример.

type

 ColorType =

  (

     Red, Orange, Yellow, Green, Blue, DarkBlue, Purple, Black, White

           );

var

 MyColor:

    ColorType;

 X:

    integer;


begin

 MyColor := Green;

 сase  MyColor  of

   Red:

     X := 1;

   Orange:

     X := 2;

   Yellow:

     X := 3;

   Green:

     X := 4;

   Blue:

     X := 5;

   DarkBlue, Purple:

     X := 0;

   else

     X := -1;

 end;

 Write('Input Persons''Age:  ');

 readln(X);

 сase  X  of

   0 .. 1:

     writeln('Baby');

   2 .. 9:

     writeln('Child');

   10 .. 19:

     writeln('Teenager');

   20 .. 35:

     writeln('Young Person');

   36 .. 64:

     writeln('Mead Age Person');

   


   65 .. 90:

     writeln('Old Person');

   91 .. 120:

     writeln('Very Old Person');

   121 .. 180:

     writeln('Very Very Old Person');

   else

     writeln('Unimpossible Age');

 end;

 readln;

end.


Тип «Запись» (продолжение)

Упакованные записи

type

{$PACKRECORDS 1}

 MyRecordType1A = record

   A: byte;

   B: word;

 end;

{$PACKRECORDS 2}

 MyRecordType1B = packed record

   A: byte;

   B: word;

 end;

 MyRecordType1C = record

   A: byte;

   B: word;

 end;

{$ALIGNMENT ON}

{$ALIGN 8}

 MyRecordType1D = record

   A: byte;

   B: word;

 end;

begin

 writeln(SizeOf(MyRecordType1A));     // 3

 writeln(SizeOf(MyRecordType1B));     // 3

 writeln(SizeOf(MyRecordType1C));     // 4

 writeln(SizeOf(MyRecordType1D));     // 4

 readln;

end.


Записи с вариантной частью

type

 MyTagType0 = (Type00, Type01, Type02, Type03);

 MyTagType01 = (Type010, Type011, Type012, Type013);

 MyTagType02 = (Type020, Type021, Type022, Type023);


 MyRecordType1 =
record

   i: integer;   d: double;

 case Tag0: MyTagType0 of

   Type00:

   (

     s: string[7];

     mA: array[1..3] of single;

   );

   Type01:

   (

     R1, R2: MyRecordType2D;

   );

   Type02 .. Type03:

   (

     c1: char;

     T1: TDateTime;

   );

 end;

 MyRecordType2 = record

   r: single;

 case Tag0: MyTagType0 of

   Type00:

   (

     bWas: boolean;  mC: array[1..4] of char;

     case Tag01: MyTagType01 of

       Type010: (k: integer;);

       Type011 .. Type013: (b: byte;);

   );

   Type01:

   (

     R1, R2: MyRecordType2D;

     case Tag02: MyTagType02 of

       Type020: (c: char;);

       Type021 .. Type023: (s0: shortint;);

   );

 end;


 

А также другие работы, которые могут Вас заинтересовать

45316. Структура Администрации Президента РФ 21.06 KB
  Президент РФ в целях осуществления своих полномочий создает специальные органы занимающиеся исполнением распоряжений и указов Президента РФ и осуществляющие специальные полномочия. К ним в первую очередь относятся: 1 Администрация Президента РФ; 2 Совет Безопасности РФ. Порядок формирования и компетенция Администрации Президента РФ устанавливается Указом Президента РФ от 25 марта 2004 г. 400 Об Администрации Президента Российской Федерации.
45317. Понятие конституции 24.6 KB
  Правовой статус главы местной администрации. Главой местной администрации может быть не только избираемый населением глава муниципального образования но и так называемый наемный менеджер – муниципальный служащий принимаемый на работу по контракту. 37 Закона главой местной администрации может быть лицо назначаемое на должность главы местной администрации по контракту заключаемому по результатам конкурса на замещение указанной должности на срок полномочий определяемый уставом муниципального образования. В этом случае главой муниципального...
45318. Конституция - акт учредительной (верховной) власти 23.87 KB
  Иностранные граждане постоянно или преимущественно проживающие на территории муниципального образования обладают при осуществлении местного самоуправления правами в соответствии с международными договорами Российской Федерации и федеральными законами. на всей территории муниципального образования или на части его территории для выявления мнения населения и его учета при принятии решений органами местного самоуправления и должностными лицами местного самоуправления а также органами государственной власти. В опросе граждан имеют право...
45319. Содержание, форма и основные свойства конституции 25.12 KB
  Правовой статус главы муниципального образования. Закона об общих принципах организации местного самоуправления уставом муниципального образования может быть предусмотрена должность главы муниципального образования – выборного должностного лица возглавляющего деятельность по осуществлению местного самоуправления на территории муниципального образования. Глава муниципального образования соединяет в своем правовом и фактическом статусе черты префекта департамента Франции и председателя исполкома местного Совета. Термин глава муниципального...
45320. Механизм защиты Конституции РФ 22.96 KB
  В конституционной практике Российской Федерации давно сложился ряд правовых форм способов защиты Конституции:1 процесс охраны Конституции Президентом Российской Федерации. Во-первых в качестве гаранта федеральной Конституции Президент Российской Федерации который наделяется прерогативами по защите конституционного строя прав и свобод человека и гражданина осуществлению мер по охране суверенитета РФ ее независимости и государственной целостности обеспечению согласованного функционирования органов государственной власти. Суд наделен...
45321. Конституционный строй 19.94 KB
  Одним из ключевых институтов гражданской службы определенных Федеральным законом О государственной гражданской службе Российской Федерации является институт должности гражданской службы. Прохождение гражданской службы возможно только на должности государственной службы. При освобождении от должности и не будучи назначенным на другую должность лицо увольняется с гражданской службы. Должности федеральной государственной гражданской службы учреждаются федеральным законом или указом Президента Российской Федерации должности...
45322. ИНСТИТУТ ОСНОВНЫХ ПРАВ И СВОБОД ЧЕЛОВЕКА И ГРАЖДАНИНА 27.9 KB
  Правовой статус депутата представительного органа мсу Закон об общих принципах организации местного самоуправления развивая нормы Конституции РФ весьма удачно решил проблему политикоправового статуса депутата других членов выборных органов. Представительный орган местного самоуправления состоит из депутатов избираемых на основе всеобщего равного и прямого избирательного права при тайном голосовании п. Известно что в мировой истории становления демократических начал императивный мандат сыграл решающую роль при формировании парламентского...
45323. Конституционно-правовой механизм обеспечения прав и свобод человека и гражданина 19.09 KB
  Основные принципы государственной службы в Российской Федерации. Вопрос о принципах государственной службы является важнейшим в структуре института государственной службы правовой системы не только Российской Федерации но и других стран мира. Термин принципы государственной службы указывает на основополагающие черты сущностные характеристики важнейшее содержание и значение самой государственной службы а также на главнейшие юридические положения в структуре одноименного правового института. Анализируя принципы государственной службы...
45324. Принципы российского федерализма 27.75 KB
  Российская Федерация состоит из республик краев областей городов федерального значения автономной области автономных округов равноправных субъектов Российской Федерации. В составе Российской Федерации в соответствии со ст. Государственная целостность Российской Федерации. Государственная целостность федеративного государства гарантируется тем что государственный суверенитет как верховенство и независимость государственной власти на всей своей территории и в международных отношениях принадлежит только Федерации но...