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

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

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






 

{$ 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; просмотров: 327. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Словарная работа в детском саду Словарная работа в детском саду — это планомерное расширение активного словаря детей за счет незнакомых или трудных слов, которое идет одновременно с ознакомлением с окружающей действительностью, воспитанием правильного отношения к окружающему...

Правила наложения мягкой бинтовой повязки 1. Во время наложения повязки больному (раненому) следует придать удобное положение: он должен удобно сидеть или лежать...

ТЕХНИКА ПОСЕВА, МЕТОДЫ ВЫДЕЛЕНИЯ ЧИСТЫХ КУЛЬТУР И КУЛЬТУРАЛЬНЫЕ СВОЙСТВА МИКРООРГАНИЗМОВ. ОПРЕДЕЛЕНИЕ КОЛИЧЕСТВА БАКТЕРИЙ Цель занятия. Освоить технику посева микроорганизмов на плотные и жидкие питательные среды и методы выделения чис­тых бактериальных культур. Ознакомить студентов с основными культуральными характеристиками микроорганизмов и методами определения...

Огоньки» в основной период В основной период смены могут проводиться три вида «огоньков»: «огонек-анализ», тематический «огонек» и «конфликтный» огонек...

Упражнение Джеффа. Это список вопросов или утверждений, отвечая на которые участник может раскрыть свой внутренний мир перед другими участниками и узнать о других участниках больше...

Влияние первой русской революции 1905-1907 гг. на Казахстан. Революция в России (1905-1907 гг.), дала первый толчок политическому пробуждению трудящихся Казахстана, развитию национально-освободительного рабочего движения против гнета. В Казахстане, находившемся далеко от политических центров Российской империи...

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