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;


 

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

45260. Попечительский совет как PR – ресурс фирмы: миссия, функции, этапы организации, приоритеты деятельности 30.5 KB
  Попечительский совет как PR ресурс фирмы: миссия функции этапы организации приоритеты деятельности. Но существуют некоторые общие функции которые присущи попечительскому совету любой организации: 1. создание положительного образа организации ПР; 3. лоббирование интересов организации на различных уровнях; 4 контроль за финансовой деятельностью организации; 5.
45261. Партнерские отношения как PR-ресурс организации: алгоритм работы со спонсором, содержание спонсорского пакета 29 KB
  Спонсорство обязано быть выгодным как самому спонсору так и инициатору проекта. описание проекта и его идеи с акцентом на деталях наиболее важных для спонсора дается оценка значения проекта для города региона и нужных спонсору социальных групп. программу с информацией о месте и времени события сценарий графики перечисление авторов и участников проекта. указание о поддержке проекта государственными структурами авторитетными учреждениями культуры известными и уважаемыми людьми копии официальных решений рекомендательных писем обращений...
45262. Имидж фирмы: структура, этапы формирования и реализации 27 KB
  Имидж фирмы: структура этапы формирования и реализации. Имидж фирмы целостное восприятие фирмы различными группами общественности формирующееся на основе известной им информации о различных сторонах деятельности фирмы. Структура: структуру имиджа фирмы составляют представления людей относительно фирмы которые условно можно разделить на группы: имидж товара или услуги представления людей относительно уникальных характеристик которыми он обладает его отличительных свойств. внутренний имидж фирмы представление сотрудников о фирме...
45263. Имидж ПР-специалиста: профессиональные составляющие и социально-личностные атрибуты 23.5 KB
  Блэку: наличие здравого смыла природное любопытство умение хорошо говорить и излагать вои мысли в письменной форме гибкость выносливость внимание к мелочам хорошее воспитание и образование целеустремленность умение знать и понимать людей чего они хотят. Профессиональная компетентность: психологическая компетентность умение разбираться в людях коммуникативная кть знание факторов эффективного делового общения видов коммуникации психологического воздействия аутопсихологическая кть самоконтроль самоээфективность...
45264. Самопрезентация специалиста как ПР-ресурс: специфика, формы, технологии 25.5 KB
  Самопрезентация специалиста как ПРресурс: специфика формы технологии. Самопрезентация является составной частью сложного процесса формирования профессионального имиджа специалиста. Самопрезентация может быть как начальным этапом какого-либо делового процесса так и отдельным самостоятельным элементом общения. В общем виде самопрезентация представляет собой управление производимым впечатлением умение представить себя и свое дело.
45265. GSM. Регистрация в сети 64 KB
  Регистрация в сети. При каждом включении телефона после выбора сети начинается процедура регистрации рис. Рассмотрим наиболее общий случай регистрацию не в домашней а в чужой так называемой гостевой сети будем предполагать что услуга роуминга абоненту разрешена. По номеру IMSI VLR гостевой сети определяет домашнюю сеть и запрашивает ее HLR.
45266. GSM. Обновление местоположения. Аутентификация и защита 91.5 KB
  Обновление местоположения. Один из вариантов определения местоположения периодически сообщать о расположении объектов в каждой соте. Другой крайний случай уведомлять систему при изменении местоположения мобильной станции широковещательным сообщением. Компромиссное решение используемое в GSM оповещение о местоположении при смене группы сот в зоне местоположения приводящей к ухудшению связи.
45267. GSM. Передача соединения (хэндовер). Роуминг 169 KB
  Переключение каналов между базовыми станциями контролируемыми разными BSC но одним MSC. Переключение каналов между базовыми станциями за которые отвечают не только разные BSC но и разные MSC. Варианты хэндовера В общем случае проведение хэндовера задача MSC. Но в двух первых случаях называемых внутренними хэндоверами чтобы снизить нагрузку на коммутатор и служебные линии связи процесс смены каналов управляется BSC а MSC лишь информируется о происшедшем.
45268. Протоколы сети GSM. Общая структура 37.5 KB
  Уровень 1 физический уровень который использует структуры канала рассмотренные выше по воздушному интерфейсу. Уровень 2 уровень звена передачи данных по Um интерфейс уровень звена передачи данных это модифицированная версия LPDпротокола используемого в ISDN; она называется LPDm. Уровень 3 сигнальный протокол из GSM использующий также модифицированную версию LPD; самостоятельно разделен на 3 подслоя.