Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Условная компиляция





 

{$ define <Имя режима>}

Включает режим компиляции с именем <Имя режима>.

 

{$ ifdef <Имя режима>}

< Операторы, которые «видны» компилятору только в режиме “<Имя режима>”>

{$ else}

< Операторы, которые «видны» компилятору только в противоположном режиме >

{$ endif }

Классическая развилка на этапе компиляции.

 

{$ ifdef <Имя режима>}

< Операторы, которые «видны» компилятору только в режиме “<Имя режима>”>

{$ endif }

Упрощенная развилка.

 

 

{$ ifndef <Имя режима>}

Заголовок «перевернутой» развилки


Ниже приводится текст программы, которая строит «самый дешевый путь» из левого верхнего угла матрицы размерами в правый нижний угол любым из двух ранее описанных методов.

Первый метод (рекурсивный) включается, если «НЕ закомментирована» строка

{$define RECOURSIVE}.

 

Второй метод (динамического программирования) включается, если эта строка «закомментирована», т.е. имеет вид

// {$define RECOURSIVE}.

 


program Project3;

 

{$APPTYPE CONSOLE}

 

Uses

SysUtils;

 

//{$define RECOURSIVE}

 

Const

mMax = 20;

nMax = 20;

 


Type

MyRecord = record

 

{$ ifdef RECOURSIVE}

CellPrice, Frequency: integer;

{$ else }

CellPrice, PathPrice: integer;

{$ endif }

 

Direction: char;

end;

 

MyArray = array [1.. mMax, 1.. nMax] of MyRecord;

 


Var

m, n, p: integer;

A: MyArray;

tStart, tFinish: TDateTime;

 

procedure InputArray(var C: MyArray);

Var

F: Text;

i, j: Integer;

Begin

Assign(F, 'c:\a.txt');

Reset(F);

 

Readln(F, m);

if (m < 1) or (m > mMax) then Halt;

 

Readln(F, n);

if (n < 1) or (n > nMax) then Halt;

for i:= 1 to m do

Begin

for j:= 1 to n do

Begin

Read(F, C[i][j].CellPrice);

 

{$ ifdef RECOURSIVE}

C[i][j].Frequency:= 0;

{$ else }

C[i][j].PathPrice:= 0;

{$ endif }

 

C[i][j].Direction:= '?';

end;

Readln(F);

end;

Close(F);

end;


procedure ShowPrices(var C: MyArray);

Var

i, j: Integer;

Begin

Writeln('ShowPrices');

 

for i:= 1 to m do

Begin

for j:= 1 to n do

Write(C[i][j].CellPrice: 5);

 

Writeln;

end;

end;

 


{$ ifdef RECOURSIVE}

procedure ShowFrequencies(var C: MyArray);

Var

i, j: Integer;

Begin

Writeln('ShowFrequencies');

 

for i:= 1 to m do

Begin

for j:= 1 to n do

Write(C[i][j].Frequency: 5);

 

Writeln;

end;

end;

{$ endif }

 


procedure ShowDirections(var C: MyArray);

Var

i, j: integer;

Begin

Writeln('ShowDirections');

 

for i:= 1 to m do

Begin

for j:= 1 to n do

Write(C[i][j].Direction: 3);

 

Writeln;

end;

end;

 


function Right(i, j: integer): boolean;

Begin

if j < n then Right:= true else Right:= false;

end;

 

function Down(i, j: integer): boolean;

Begin

if i < m then Down:= true else Down:= false;

end;

 

 


{$ ifdef RECOURSIVE}

 

function BestPathRecoursive(i, j: integer; var C: MyArray): integer;

Var

id, ir: integer;

Begin

Inc(C[i][j].Frequency);

 

if (i = m) and (j = n) then

BestPathRecoursive:= 0

Else


Begin

IfRight(i, j) then

ir:= C[i][j + 1].CellPrice + BestPathRecoursive(i, j + 1, C)

Else

ir:= -1;

 

IfDown(i, j) then

id:= C[i + 1][j].CellPrice + BestPathRecoursive(i + 1, j, C)

Else

id:= -1;

 


if (ir >= 0) and (id >= 0) then

Begin

Ifir < id then

Begin

C[i][j].Direction:= 'r';

BestPathRecoursive:= ir;

End

Else

Begin

C[i][j].Direction:= 'd';

BestPathRecoursive:= id;

end;

End


Else

if ir >=0 then

Begin

C[i][j].Direction:= 'r';

BestPathRecoursive:= ir;

End

Else

if id >= 0 then

Begin

C[i][j].Direction:= 'd';

BestPathRecoursive:= id;

End

Else

Halt;

end;

end;

 


{$ else } // NonRecoursive

 

procedure BestPathNonRecoursive(var C: MyArray);

Var

i, j, k, ir, id: integer;

 

Begin

C[m][n].PathPrice:= 0;

 

for k:= m + n - 1 downto 1 do

for i:= m downto 1 do

Begin

j:= k - i;

if j > n then break;

if j < 1 then continue;

 








Дата добавления: 2015-10-12; просмотров: 340. Нарушение авторских прав; Мы поможем в написании вашей работы!




Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...


Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Тема: Кинематика поступательного и вращательного движения. 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью, проекция которой изменяется со временем 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

Пункты решения командира взвода на организацию боя. уяснение полученной задачи; оценка обстановки; принятие решения; проведение рекогносцировки; отдача боевого приказа; организация взаимодействия...

Что такое пропорции? Это соотношение частей целого между собой. Что может являться частями в образе или в луке...

Растягивание костей и хрящей. Данные способы применимы в случае закрытых зон роста. Врачи-хирурги выяснили...

Studopedia.info - Студопедия - 2014-2025 год . (0.014 сек.) русская версия | украинская версия