Решение задач линейного программирования с помощью Excel

Рассмотрим пример задачи линейного программирования.

Требуется определить, в каком количестве надо выпустить продукцию четырех типов Прод1, Прод2, Прод3, Прод4, для изготовления которой требуются ресурсы трех видов: трудовые, сырье и финансы. Количество ресурса каждого вида, необходимое для выпуска единицы продукции данного типа, называется нормой расхода. Нормы расхода, а также прибыль, получаемая от реализации единицы каждого типа продукции, приведены на рис. 1.

Ресурс

Прод1

Прод2

Прод3

Прод4

Знак

Наличие

Прибыль

60

70

120

130

max

--

Трудовые

1

1

1

1

<=

16

Сырье

6

5

4

3

<=

110

Финансы

4

6

10

13

<=

100

Рисунок 1.

Математическая модель задачи имеет вид:

clip_image002 , (1)

где xj – количество выпускаемой продукции j-го типа; F – функция цели; в левых частях выражений ограничений указаны величины потребного ресурса, а правые части показывают количество имеющегося ресурса.

Ввод условий задачи

Для решения задачи с помощью Excel следует создать форму для ввода исходных данных и ввести их. Форма ввода показана на рис. 2.

В ячейку F6 введено выражение целевой функции как суммы произведений значений прибыли от выпуска единицы продукции каждого типа на количество выпускаемой продукции соответствующего типа. Для наглядности на рис. 3 представлена форма ввода исходных данных в режиме вывода формул.

В ячейки F8:F10 введены левые части ограничений для ресурсов каждого вида.

clip_image004

Рисунок 2.

clip_image006

Рисунок 3.

Решение задачи линейного программирования

Для решения задач линейного программирования в Excel используется мощный инструмент, называемый Поиск решения. Обращение к Поиску решения осуществляется из меню Сервис, на экран выводится диалоговое окно Поиска решения (рис. 4).

clip_image008

Рисунок 4.

Ввод условий задачи для поиска ее решения состоит из следующих шагов:

1 Назначить целевую функцию, для чего установить курсор в поле Установить целевую ячейку окна Поиск решения и щелкнуть в ячейке F6 в форме ввода;

2 Включить переключатель значения целевой функции, т.е. указать ее Равной Максимальному значению;

3 Ввести адреса изменяемых переменных (xj): для этого установить курсор в поле Изменяя ячейки окна Поиск решения, а затем выделить диапазон ячеек B3:E3 в форме ввода;

4 Нажать кнопку Добавить окна Поиск решения для ввода ограничений задачи линейного программирования; на экран выводится окно Добавление ограничения (рис. 5) :

- ввести граничные условия для переменных xj (xj³0), для этого в поле Ссылка на ячейку указать ячейку В3, соответствующую х1, выбрать из списка нужный знак (³), в поле Ограничение указать ячейку формы ввода, в которой хранится соответствующее значение граничного условия, (ячейка В4), нажать кнопку Добавить; повторить описанные действия для переменных х2, х3 и х4;

- ввести ограничения для каждого вида ресурса, для этого в поле Ссылка на ячейку окна Добавление ограничения указать ячейку F9 формы ввода, в которой содержится выражение левой части ограничения, наложенного на трудовые ресурсы, в полях Ограничение указать знак £ и адрес Н9 правой части ограничения, нажать кнопку Добавить; аналогично ввести ограничения на остальные виды ресурсов;

- после ввода последнего ограничения вместо Добавить нажать ОК и возвратиться в окно Поиск решения.

clip_image010

Рисунок 5.

Решение задачи линейного программирования начинается с установки параметров поиска:

- в окне Поиск решения нажать кнопку Параметры, на экран выводится окно Параметры поиска решения (рис. 6);

- установить флажок Линейная модель, что обеспечивает применение симплекс-метода;

- указать предельное число итераций (по умолчанию – 100, что подходит для решения большинства задач);

- установить флажок Показывать результаты итераций, если необходимо просмотреть все этапы поиска оптимального решения;

- нажать ОК, возврат в окно Поиск решения .

clip_image012

Рисунок 6.

Для решения задачи нажать кнопку Выполнить в окне Поиск решения, на экране – окно Результаты поиска решения (рис. 7), в котором содержится сообщение Решение найдено. Все ограничения и условия оптимальности выполнены. Если условия задачи несовместны, то выводится сообщение Поиск не может найти подходящего решения. Если целевая функция не ограничена, то появляется сообщение Значения целевой ячейки не сходятся.

clip_image014

Рисунок 7.

Для рассматриваемого примера решение найдено и результат оптимального решения задачи выводится в форме ввода: значение целевой функции, соответствующее максимальной прибыли и равное 1320, указывается в ячейке F6 формы ввода, оптимальный план выпуска продукции х1=10, х2=0, х3=6, х4=0 указывается в ячейках В3:С3 формы ввода (рис. 8).

Количество использованных для выпуска продукции ресурсов выводится в ячейки F9:F11: трудовых – 16, сырья – 84, финансов – 100.

clip_image016

Рисунок 8.

Если при установке параметров в окне Параметры поиска решения (рис. 6) был установлен флажок Показывать результаты итераций, то будут показаны последовательно все шаги поиска. На экран будет выводиться окно Текущее состояние поиска решения (рис. 9). При этом текущие значения переменных и функции цели будут показаны в форме ввода. Так, результаты первой итерации поиска решения исходной задачи представлены в форме ввода на рисунке 10 .

clip_image018

Рисунок 9.

clip_image020

Рисунок 10.

Чтобы продолжить поиск решения, следует нажимать кнопку Продолжить в окне Текущее состояние поиска решения.

Анализ оптимального решения

Прежде чем, перейти к анализу результатов решения, представим исходную задачу в форме

clip_image022 (2),

введя дополнительные переменные уi, представляющие собой величины неиспользованных ресурсов.

Составим для исходной задачи двойственную задачу и введем дополнительные двойственные переменные vi.

clip_image024 (3).

Анализ результатов поиска решения позволит увязать их с переменными исходной и двойственной задач.

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

- результаты,

- устойчивость,

- пределы.

Для вызова отчета в поле Тип отчета выделить название нужного типа и нажать ОК.

1 Отчет по результатам (рис. 11) состоит из трех таблиц:

- таблица 1 содержит сведения о целевой функции; в столбце Исходно указывается значение целевой функции до начала вычислений;

- таблица 2 содержит значения искомых переменных xj , полученных в результате решения задачи (оптимальный план выпуска продукции);

- таблица 3 показывает результаты оптимального решения для ограничений и для граничных условий.

Для Ограничений в графе Формула приведены зависимости, которые были введены при задании ограничений в окне Поиск решения; в графе Значение указаны величины использованного ресурса; в графе Разница показано количество неиспользованного ресурса. Если ресурс используется полностью, то в графе Состояние выводится сообщение связанное; при неполном использовании ресурса в этой графе указывается не связан. Для Граничных условий приводятся аналогичные величины с той лишь разницей, что вместо неиспользованного ресурса показана разность между значением переменной xj в найденном оптимальном решении и заданным для нее граничным условием (xj³0).

Именно в графе Разница можно увидеть значения дополнительных переменных yi исходной задачи в формулировке (2). Здесь у1=у3=0, т.е. величины неиспользованных трудовых и финансовых ресурсов равны нулю. Эти ресурсы используются полностью. Вместе с тем, величина неиспользованных ресурсов для сырья у2=26, значит, имеются излишки сырья.

clip_image026

Рисунок 11.

2 Отчет по устойчивости (рис. 12) состоит из двух таблиц.

В таблице 1 приводятся следующие значения:

- результат решения задачи (оптимальный план выпуска);

- Нормир. стоимость, т.е. величины, показывающие, насколько изменится целевая функция при принудительном включении единицы продукции соответствующего типа в оптимальный план;

- коэффициенты целевой функции;

- предельные значения приращения коэффициентов целевой функции, при которых сохраняется оптимальный план выпуска.

В таблице 2 содержатся аналогичные данные для ограничений:

- величины использованных ресурсов;

- Теневая цена, показывающая, как изменится целевая функция при изменении величины соответствующего ресурса на единицу;

- допустимые значения приращений ресурсов, при которых сохраняется оптимальный план выпуска продукции.

clip_image028

Рисунок 12.

Отчет по устойчивости позволяет позволяет получить двойственные оценки.

Как известно, двойственные переменные zi показывают, как изменится целевая функция при изменении ресурса i-го типа на единицу. В отчете Excel двойственная оценка называется Теневой ценой.

В нашем примере сырье не используется полностью и его ресурс у2=26. Очевидно, что увеличение количества сырья, например, до 111 не повлечет за собой увеличения целевой функции. Следовательно, для второго ограничения двойственная переменная z2=0. Таким образом, если по данному ресурсу есть резерв, то дополнительная переменная будет больше нуля, а двойственная оценка этого ограничения равна нулю.

В рассматриваемом примере трудовые ресурсы и финансы использовались полностью, поэтому их дополнительные переменные равны нулю (у1=у3=0). Если ресурс используется полностью, то его увеличение или уменьшение повлияет на объем выпускаемой продукции, и следовательно, на величину целевой функции. Двойственные оценки ограничений на трудовые и финансовые ресурсы отличны от нуля, т.е. z1=20, z3=10.

Значения двойственных оценок находим в Отчете по устойчивости, в таблице 2, в графе Теневая цена.

При увеличении (уменьшении) трудовых ресурсов на единицу целевая функция увеличится (уменьшится) на 20 единиц и будет равна

F=1320+20×1=1340 ( при увеличении).

Аналогично, при увеличении объема финансов на единицу целевая функция будет

F=1320+10×1=1330.

Здесь же, в графах Допустимое увеличение и Допустимое уменьшение таблицы 2, показаны допустимые пределы изменения количества ресурсов j-го вида. Например, для при изменении приращения величины трудовых ресурсов в пределах от –6 до 3,55, как показано в таблице, структура оптимального решения сохраняется, т.е наибольшую прибыль обеспечивает выпуск Прод1 и Прод3, но в других количествах.

Дополнительные двойственные переменные также отражены в Отчете по устойчивости в графе Нормир. стоимость таблицы 1.

Если основные переменные не вошли в оптимальное решение, т.е. равны нулю ( в примере х2=х4=0), то соответствующие им дополнительные переменные имеют положительные значения (v2=10, v4=20). Если же основные переменные вошли в оптимальное решение (х1=10, х3=6), то их дополнительные двойственные переменные равны нулю (v1=0, v3=0).

Эти величины показывают, насколько уменьшится (поэтому знак минус в значениях переменных v2 и v4) целевая функция при принудительном выпуске единицы данной продукции. Следовательно, если мы захотим принудительно выпустить единицу продукции вида Прод3, то целевая функция уменьшится на 10 единиц и будет равна 1320 -10×1 =1310.

Обозначим через Dсj изменение коэффициентов целевой функции в исходной модели (1). Эти коэффициенты определяют прибыль, получаемую при реализации единицы продукции j-го вида.

В графах Допустимое увеличение и Допустимое Уменьшение таблицы 1 Отчета по устойчивости показаны пределы изменения Dсj , при которых сохраняется структура оптимального плана, т.е. будет выгодно по-прежнему выпускать продукцию вида Продj. Например, при изменении Dс1 в пределах -12£ Dс1 £ 40, как показано в отчете, по-прежнему будет выгодно выпускать продукцию вида Прод1. При этом значение целевой функции будет F=1320+x1×Dсj =1320+10×Dсj.

3 Отчет по пределам приведен на рис. 13. В нем показывается, в каких пределах могут изменяться значения xj, вошедшие в оптимальное решение, при сохранении структуры оптимального решения. Кроме этого, для каждого типа продукции приводятся значения целевой функции, получаемые при подстановке в оптимальное решение значения нижнего предела выпуска изделий соответствующего типа при неизменных значениях выпуска остальных типов. Например, если при оптимальном решении х1=10, х2=0, х3=6, х4=0 положить х1=0 (нижний предел) при неизменных х2, х3 и х4, то значение целевой функции будет равно 60×0+70×0+120×6+130×0=720.

Далее приводятся верхние пределы изменения xj и значения целевой функции при выпуске продукции, вошедшей в оптимальное решение на верхних пределах. Поэтому везде F=1320.

clip_image030

Рисунок 13.

Определение системных ресурсов ПЭВМ

Цель работы: изучение и использование функций BIOS и DOS, системных данных и таблиц для решения задачи определения состава, типов и параметров присоединенного оборудования и некоторых других системных ресурсов и данных ПЭВМ:

1. типа персонального компьютера;

2. размера основной и дополнительной памяти;

3. даты изготовления базовой системы ввода/вывода;

4. числа и типов накопителей на магнитных дисках;

5. типа и параметров видеосистемы;

6. типов и числа других периферийных устройств;

7. номера версии установленной операционной системы.

Краткие теоретические сведения:

Для решения указанных задач предлагается составить программу на языке Turbo Pascal с использованием его расширенных возможностей, таких как : размещение переменных по абсолютным адресам памяти, непосредственный доступ к ячейкам памяти и портам, организация программных прерываний и системных вызовов, программирование на низком уровне. Кратко рассмотрим эти возможности Turbo Pascal. В Turbo Pascal имеются средства размещения переменных по конкретным адресам оперативной памяти. Такие переменные называются абсолютными. Для описания абсолютных переменных предназначено зарезервированное слово Absolute. Формат описания переменных этого типа выглядит так :

Var <идентификатор> : <тип> Absolute BA:BS;

Здесь BA:BS - абсолютный адрес ячейки оперативной памяти (байта памяти), начиная с которой отводится место для хранения значения переменной <идентификатор> указанного типа <тип>;

BA - базовый адрес сегмента; BS - смещение внутри этого сегмента.

Для работы с абсолютными переменными (определения абсолютных адресов переменных, записи и считывания информации из конкретных ячеек памяти) в Turbo Pascal имеется ряд стандартных подпрограмм : Addr, CSeg, DSeg, Ofs, Ptr, Seg, SSeg.

В Turbo Pascal определены пять предварительно объявленных массивов : Mem, MemW, MemL, Port и PortW. Первые три массива обеспечивают непосредственный доступ (запись и чтение) к любому участку памяти по абсолютному адресу, два других массива - доступ к портам ввода/вывода.

Для осуществления работы с регистрами процессора ПЭВМ, организации программных прерываний, использования большинства возможностей операционной системы MS-DOS предназначен системный модуль DOS Turbo Pascal.

Реализация всех этих возможностей практически всегда предполагает обращение к регистрам центрального процессора.

Для этих целей в модуле DOS определен специальный тип данных Registers :

Type Registers = Record

Case Integer of 0 : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : Word);

1 : (AL, AH, BL, BH, CL, CH, DL, DH : Byte)

End;

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

Для организации программных прерываний и выполнения системных функций MS-DOS в модуле DOS Turbo Pascal имеются две стандартные процедуры Intr и MsDos.

Первая процедура Intr инициирует программное прерывание с требуемым номером:

Intr(Num_Int : Byte; var Regs : Registers);

Здесь : Num_Int - номер программного прерывания, которое не обходимо вызвать (0..255);

Regs - запись, в которой процедуре обработки прерывания с номером Num_Int передаётся содержимое регистров и в ней же возвращается выходная информация.

Язык Turbo Pascal допускает три основные возможности для использования средств программирования на низком уровне (язык машинных команд и фрагменты на языке Ассемблера) :

1. Можно написать одну или несколько процедур на языке Ассемблера (вне среды Turbo Pascal), оттранслировать их, получив объектные модули этих процедур, и затем подключить эти модули к Pascal-программе. Для этого в Turbo Pascal существует служебное слово External, указываемое в заголовке процедуры, и директива компилятора $L.

2. Turbo Pascal позволяет непосредственно включать в текст программы фрагменты, написанные на машинном коде. Это достигается использованием inline-операторов и inline-процедур.

3. Начиная с шестой версии Turbo Pascal появилась возможность включения в текст Pascal-программы фрагментов на языке Ассемблера. Средства, поддерживающие эту возможность, называют "встроенный Ассемблер".

ТЕКСТ ПРОГРАММЫ:

program xyz;

uses crt,dos,art,PRINTER;

type zapis=record

OS_Pam,DOP_PAm,Video_Pam:word;

Tip_Kompa,data_biosa:string[20];

NZMD,GMDA,GMDB,Displai,so_proch,igr,_print,MSDOS:string;

posled_port,paral_port:integer;

end;

var st:array [1..4] of string;

ch:integer;

My:zapis;

function type_Pc:string;

var s:byte absolute $F000:$FFFE;

begin

case s of

$FF:type_Pc:='Тип компьютера IBM PC';

$FD:type_Pc:=' Тип компьютера IBM PCjr';

$FE:type_Pc:= Тип компьютера IBM PC/XT';

$FC:type_Pc:=' Тип компьютера IBM PC/AT';

end;

end;

function MS_DOS:string;

var Regs:Registers;

s1,s2:string;

begin

Regs.AH:=$30;

MsDos(Regs);

str(Regs.AL,s1);str(Regs.AH,s2);

MS_DOS:='Версия MS-DOS '+s1+'.'+s2;

end;

procedure SIZE_MEM(var os:word;var dp:word;var video:word);

var Regs:Registers;

begin

os:=memw[$0000:$0413];

Intr($15,Regs);

dp:=Regs.AX;

video:=memw[$40:$4C];

end;

function Date_Bios:string;

var i:integer;

stroka:string;

W:byte;

begin

stroka:='';

write('Дата создания биоса ');w:=$0004;

for i:=1 to 8 do

begin

w:=w+1;

stroka:=stroka+chr(mem[$ffff:w]);

end;

Date_Bios:=stroka;

end;

function video_sys:string;

var regs:Registers;

begin

Regs.AH:=$1A;Regs.AL:=$00;

intr($10,regs);

case Regs.BL of

$00:video_sys:='Монохромный дисплей';

$01:video_sys:='Монохромний адаптер - Монохромный дисплей';

$02:video_sys:='Адаптер CGA-цветной дисплей';

$04:video_sys:='Адаптер EGA-цветной дисплей';

$05:video_sys:='Адаптер EGA-монохромный дисплей';

$07:video_sys:='Адаптер VGA-монохромный аналоговый дисплей';

$08:video_sys:='Адаптер VGA- цветной аналоговый дисплей';

$0A:video_sys:='Адаптер VGA- цветной цифровой дисплей';

end;

end;

function Kol_GMD(var s:string):string;

var i:integer;

k:byte;

begin

for i:=1 to 2 do

begin

port[$70]:=$10;

k:=port[$71];

if i=1 then k:=k shr 4 else k:=k shl 4;

case k of

0:s:='Дисковода нет или его тип не известен';

1:s:=' на 360 Kb, для дискет диаметром 5.25';

2:s:=' на 1.2 Mb, для дискет диаметром 5.25';

3:s:=' на 720 Kb, для дискет диаметром 3.5';

4:s:=' на 1.44 Mb, для дискет диаметром 3.5';

5:s:=' на 2.88 Mb, для дискет диаметром 3.5';

6:s:=' не установлен’;

end;

if i=1 then Kol_GMD:=s;

end;

end;

function kol_ZMD:string;

var k:byte;

s:string;

begin

k:=mem[$45:$75];

str(k,s);

kol_ZMD:='Колличество жеских магнитных дисков-'+s;

end;

function soproch:string;

var k:word;

begin

k:=memw[$40:$10] and 2;

k:=k shr 1;

if k=1 then soproch:='есть математический сопроцессор'

else soproch:=' математический сопроцессор отсутсвует';

end;

function igr_adap:string;

var k:word;

begin

k:=memw[$40:$10] and 4096;

k:=k shr 13;

if k=1 then igr_adap:='есть игровой адаптер '

else igr_adap:='игровой адаптер отсутсвует';

end;

function Kol_posled_port:integer;

var k:word;

begin

k:=memw[$40:$10];

k:=k shl 4;k:=k shr 13;

Kol_posled_port:=k;

end;

function Kol_paral_port:integer;

var k:word;

begin

k:=memw[$40:$10];

k:=k shr 14;

Kol_paral_port:=k;

end;

function print:string;

var k:word;

begin

k:=memw[$40:$10] and 4096;

k:=k shr 14;

if k=1 then print:='установлен последовательный принтер'

else print:=' последовательный принтер не установлен’;

end;

procedure zopolnenie;

begin

with my do

begin

tip_kompa:=type_pc;

size_mem(os_pam,dop_pam,video_pam);

data_biosa:=Date_Bios;

GMDA:=Kol_GMD(GMDB);

displai:=video_sys;

NZMD:=kol_ZMD;

so_proch:=soproch;

igr:=igr_adap;

_print:=print;

posled_port:=Kol_posled_port;

paral_port:=Kol_paral_port;

MSDOS:=MS_DOS;

end;

end;

procedure vivod_disp;

begin

clrscr;

with my do

begin

textcolor(2);writeln(' ОБЩИЕ СВЕДЕНИЯ'); textcolor(7);

writeln(tip_kompa);writeln(MSDOS);

writeln('Дата создания BIOSa-',data_biosa);

textcolor(2);Writeln(' ПАМЯТЬ ');textcolor(7);

writeln('Колличество основной памяти (Kб)-',os_pam);

writeln('Колличество дополнительной памяти(Kб)-',dop_pam);

writeln('Память видео страницы(байт)-',video_pam);

textcolor(2);writeln(' ДИСКИ');textcolor(7);

writeln('Дисковод A:',GMDA);

writeln('Дисковод B:',GMDB);

writeln(NZMD);

textcolor(2);writeln(' ВИДЕО');textcolor(7);

writeln(displai);

textcolor(2);writeln(' ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ');textcolor(7);

writeln(so_proch);

writeln(igr);

writeln(_print);

writeln('Колличество последовательных портов -',posled_port);

writeln(' Колличество паралельных портов -',paral_port);

end;

end;

procedure vivod_fail;

var f:text;

s:string;

begin

clrscr;

write('Введите путь к файлу -');readln(s);

assign(f,s);rewrite(f);

with my do

begin

writeln(f,' ОБЩИЕ СВЕДЕНИЯ');

writeln(f,tip_kompa);writeln(f,MSDOS);

writeln(f,'Дата создания BIOSa-',data_biosa);

Writeln(f,' ПАМЯТЬ');

writeln(f,'Колличество основной памяти (Kб)-',os_pam);

writeln(f,'Колличество дополнительной памяти (Kб)-',dop_pam);

writeln(f,'Память видео страницы (байт)-',video_pam);

writeln(f,' ДИСКИ');

writeln(f,'Дисковод A:',GMDA);

writeln(f,'Дисковод B:',GMDB);

writeln(f,NZMD);

writeln(f,' ВИДЕО');

writeln(f,displai);

writeln(f,' ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ ');

writeln(f,so_proch);

writeln(f,igr);

writeln(f,_print);

writeln(f,'Колличество последовательных портов -',posled_port);

writeln(f,' Колличество паралельных портов -',paral_port);

end;

close(f);

end;

procedure vivod_print;

var Lst:text;

s:string;

begin

clrscr;

write('Введите путь к файлу -');readln(s);

assign(Lst,s);reset(lst);

while not eof(Lst) do

begin

readln(Lst,s);

writeln(Lst,s);

end;

close(Lst);

end;

BEGIN

clrscr;

st[1]:='Вивод информации на дисплей';st[2]:='Вывод информации в файл';

st[3]:='Вывод информации на принтер';st[4]:='Выход';

zopolnenie;

repeat

ch:=menu_s(st,4,0,0);

case ch of

1:begin vivod_disp;readln;end;

2:vivod_fail;

3:vivod_print;

end;

until ch=4 ;

END.

РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ:

OBCHIE SVEDENIYA

Tip kompa IBM PC/AT

Versiya MSDOS 5.0

data sozdaniya BIOSa-03/28/02

PAMYAT'

kollicestvo osnovnoi pamyati(Kb)-640

kollicestvo dopolnitel'noi pamyati(Kb)-34336

Pamyat' video stranichi(bait)-4096

DISKI

Diskovod A: na 1.44 Mb, dlya disket diametrom 3.5

Diskovod B:Diskovoda net ili ego tip neizvesten

Kolichestvo zhestkih magnitnih diskov-0

VIDEO

Adapter VGA-chvetnoi analogovii displai

DOPOLNITEL'NIE SVEDENIYA

est' matematicheskii soprochessor

igrovoi adapter otsytstvyet

posledovatel'nii printer ne ystanovlen

kolichestvo poslrdovatel'nih portov-4

kolichestvo paralel'nih portov-3

Общие сведения о языке GPSS и пакете GPSS/PC

Одним из наиболее распространенных языков имитационного моделирования является язык GPSS (от General Purpose Simulation System), разработанный в 1974 г. фирмой IBM. Язык применяется для моделирования дискретных процессов, реализует метод “по особым событиям” с целочисленным модельным временем.

При выполнении цикла работ используется пакет GPSS/PC, который полностью реализует язык GPSS и обладает развитыми интерактивными возможностями, характерными для пакетов программ персональных компьютеров.

Пакет состоит из двух загрузочных модулей с именами gpsspc.exe и gpssrept.exe. Первый содержит итнтерпретатор языка и основные интерактивные средства. Второй имеет вспомогательный характер и предназначен для выдачи на печать итогового отчета о результатах моделирования.

Ввод и редактирование программы моделирования

Работа с пакетом начинается с загрузки модуля gpsspc.exe, после чего в нижней части экрана высвечивается приглашение для ввода операторов языка в виде >.

Если программа моделирования набивается впервые, после приглашения > набираются последовательно строки программы или команды. Каждая строка при этом завершается нажатием клавиши “Возврат каретки” (ВК), после чего введенная строка переходит в верхнюю часть экрана, а в его нижней части вновь высвечивается приглашение >. Если набирается строка, содержащая синтаксическую ошибку, то в месте ошибки ввод прекращается, выдается звуковой сигнал, а под строкой высвечивается ^. Иногда имеют место ошибки, выявляемые в процессе интерпретации всей строки. В этом случае сообщение об ошибке появляется в верхней части экрана после нажатия клавиши ВК. Следует отметить, что возможны ошибки в процессе исполнения программы моделирования. В этом случае соответствующие сообщения появляются на экране вверху.

При наборе оператора GPSS следует строго выполнять синтаксические правила, в частности, разбиение оператора на поля. Для облегчения этого редактором GPSS/PC предоставляются удобные средства в виде подсказок. После набора первого поля следует нажать клавишу пробела. Тогда в нижней строке курсор перескочит к первой позиции следующего поля - поля меток, где временно высветится символ L. С началом набора имени метки этот символ “забьется” именем метки. Аналогичные подсказки высвечиваются и для других полей (V-для поля операций, X,A,B,C,D и т.д. - для полей операндов, ; - для поля комментариев). Для перехода к следующему полю необходимо нажимать клавишу пробела или клавишу с запятой.

В процессе набора строки ее можно исправлять, пользуясь клавишами передвижения курсора, клавишей Ins (вставки), клавишами Home,End,Ctrl. Для передвижения к началу следующего (предыдущего) слова удобно использовать комбинации клавиш Ctrl/-> (Ctrl/<-).

Если требуется исправить уже введенную строку, необходимо выполнить команду

EDIT <номер строки>

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

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

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

DISPLAY a,b

где a и b - начальная и конечная строки программы. Как a, так и b могут отсутствовать. Если не задано a, то на экран выведется фрагмент от начала программы до строки с номером b; если не задано b, то выведется строка с номером a; если не заданы ни a, ни b, то выведутся все строки программы (так же, как при нажатии F2).

Для удаления набранных строк используется команда

DELETE a,b

где a и b имеют тот же смысл, что и у команды DISPLAY, но аргумент a обязательно должен быть.

Для загрузки уже существующей на диске программы необходимо выполнить команду

@<спецификация файла с программой на GPSS>

например,

@GAUNETS.GPS

После исполнения такой команды начнется построчная загрузка программы на GPSS в память компьютера с одновременной ее трансляцией. После завершения загрузки введенную программу можно запускать на счет либо редактировать с помощью внутреннего редактора. Следует отметить, что программу на GPSS можно набирать с помощью любого текстового редактора, работающего с ASCII-файлами.

Введенную или отредактированную программу, как правило, необходимо сохранить в файле на диске, для чего следует набрать на клавиатуре и исполнить команду

SAVE <спецификация файла>, a, b

где аргументы a и b имеют тот же смысл и правила использования, что и в команде DISPLAY (см. выше).

3.3.Запуск на счет и управление процессом моделирования

Запуск на счет вновь введенной или прочитанной с диска программы осуществляется путем исполнения команды

START a,c ,

где a - начальное значение счетчика завершения, c - отсутствует или NP (NP - если не нужен выходной файл статистики).

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

Обычно для управления временем моделирования в программу вводится отдельный сегмент вида

GENERATE b

TERMINATE 1

Тогда время моделирования бутет определяться произведением указанных выше параметров a и b.

Для визуального контроля процесса моделирования в пакете предусмотрены окна и микроокна. Окна могут быть высвечены на экране с помощью функциональных клавиш F4,F5,...F10, Всего предусмотрено 7 окон - данных, блоков, устройств, таблиц, многоканальных устройств, позиций, матриц.

В окне данных производится редактирование программы с помощью внутреннего редактора, выводятся сообщения об ошибках и результатах работы некоторых команд.

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

Особенно часто окно блоков используется совместно с нижним горизонтальным меню, в котором имеются пункты CONTINUE, STEP, STOP, UNSTOP, EDIT, INSERT, DELETE, позволяющие редактировать программу непосредственно по блок-схеме из окна блоков. Так, для удаления некоторого блока требуется с помощью клавиш передвижения курсора совместить курсор с данным блоком и нажать на клавишу Ins, затем вернуть курсор на горизонтальное меню, совместив его с пунктом DELETE и вновь нажать на клавишу Ins. Аналогично выполняются и другие пункты - останов и продолжение моделирования (STOP и CONTINUE), снятие условия останова (UNSTOP), редактирование оператора блока (EDIT), вставка блока (INSERT).

В окне устройств (facilities) помещается информация о текущем состоянии устройств - их имена, интегральные коэффициенты загрузки (Ut), величины очереди к устройствам (Q), средние времена пребывания сообщений в устройстве Av.time) и некоторая другая информация. Эти данные приведены частично в графическом виде, что облегчает визуальный контроль за процессом моделирования.

В окне многоканальных устройств (storages) помещается информация о многоканальных устройствах (МУ). Информация приводится в форме, близкой к форме представления в окне устройств. Поскольку МУ в данный момент времени может быть занято частично, то помимо интегрального коэффициента загрузки Ut и длины очереди к устройству Q, здесь также выводится информация о проценте загрузки МУ в текущий момент времени (Part Used) и количество сообщений в устройстве в текущий момент времени(Content).

В окне таблиц (Tables) выводятся гистограммы выходных данных модели, формируемые пользователем в программе моделирования с помощью описаний TABLE или QTABLE и оператора- блока TABULATE.

В окне матриц (matrices) отображаются текущие значения элементов матриц.

В окне позиций при необходимости отображается процесс моделирования в виде совокупности неподвижных и перемещающихся объектов (мультипликация)

Микроокна заводятся с помощью команды MICROWINDOWS непосредственно с клавиатуры или при исполнении программы, если среди ее операторов имеется такая команда. В последнем случае микроокно откроется только при загрузке такой программы с диска, но не после внесения команды MICROWINDOWS в программу с помощью внутреннего редактора. Микроокно представляет собой прямоугольную рамку, внутри которой указывается номер микроокна, задаваемый короткий текст (до 8 символов) и отображаемое значение (стандартный числовой атрибут - СЧА или СЧА$параметр). Максимальное количество микроокон - 4. Микроокна располагаются в правой части всех окон, кроме окна данных. Указанная команда имеет синтаксис:

MICROWINDOWS a,b;c ,

где a - номер микроокна (от 1 до 4),

b - отображаемый СЧА или СЧА$параметр,

c - короткий текст (до 8 символов).

Для вывода значений СЧА и выражений в текущий момент модельного времени используется также команда SHOW. Для этого необходимо приостановить процесс моделирования путем нажатия клавиши ESC или другим способом (например, с помощью нижнего горизонтального меню) и с клавиатуры набрать команду

SHOW a ,

где a - выражение GPSS.

Имеются и некоторые другие средства вывода информации - команды EVENTS, ANOVA, GROUPS, USERCHAINS, PLOT, с которыми можно ознакомиться по технической документации [1].

3.4.Вывод итоговых результатов моделирования

В отличие от других языков программирования, в языке GPSS нет специальных средств для формирования отчетов об итогах моделирования. Здесь имеются две возможности - воспользоваться стандартным файлом отчета либо формировать нестандартный отчет в подпрограмме HELP на языке FORTRAN. Последнее требует наличия компилятора FORTRAN в составе программного обеспечения персональной ЭВМ. В большинстве случаев стандартный отчет удовлетворяет потребности пользователей.

Он формируется автоматически в файле REPORT.GPS либо в файле с заданным именем с помощью команды REPORT. Кроме того, имеются средства (команды RESULT и ANOVA) для вывода и статистической обработки значений ячеек сохраняемых величин.

Так, если требуется получить математическое ожидание и стандартное отклонение ячеек сохраняемых величин с именами NAME1 и NAME2, необходимо в программе моделирования в нужном месте поместить операторы

RESULT FILE.RES,NAME1,1

...

RESULT FILE.RES,NAME2,2

...

ANOVA FILE.RES .

Первые два оператора помещаются в тех местах программы, где уже известны значения NAME1 и NAME2, последний оператор обычно задают в виде команды с клавиатуры терминала либо в конце программы моделирования. Здесь FILE.RES - спецификация файла результатов моделирования, числа 1 и 2 задают так называемые уровни обработки. Уровни обработки позволяют различать выборки различных случайных величин в одном файле результатов. После работы команды ANOVA на экране терминала для каждого уровня обработки будут выведены математическое ожидание (Mean) и стандартное отклонение (Std.Dev).

Изучить возможности создания интерактивных Web - страниц в сети INTERNET с использованием языка обработки сценариев JavaScript.

1. Основные положения

Язык обработки сценариев JavaScript не следует путать с языком Java. Во-первых, Java — это язык программирования, разработанный в Sun Microsystems, а JavaScript создан в Netscape Corporation. Оба языка представляют собой ООР (Object Orientated Programming). Главное отличие в том, что Java позволяет создавать совершенно самостоятельные программы - "Java-applets", которые могут запускаться с Web - страницы, но на самом деле это полностью независимые программы, хоть и маленькие. К тому же их нельзя просмотреть в виде текста. Для запуска апплета браузеру необходимо "транслировать" его в то, что называется "машинным языком".

Netscape как бы упростил Java до набора более простых команд. JavaScript не может существовать сам по себе, он должен находиться внутри Web - страницы, а Web - страницу необходимо просматривать в браузере, который понимает язык JavaScript (скажем, Netscape Navigator или Internet Explorer).

Итак, в отличие от Java-апплетов , загружаемых отдельно от HTML- документа, в котором они используются, программы, написанные на языке JavaScript, располагаются непосредственно в HTML- документах. Для этого используется специальный тег <SCRIPT> и парный ему </SCRIPT>. Обязательным атрибутом тега <SCRIPT> является атрибут LANGUAGE, который указывает на каком языке написана программа (в данном случае JavaScript). Обычно функции, составляющие программу, написанную на языке JavaScript, располагаются в секции <HEAD> HTML –документа. Вызов функции, реализованной на JavaScript, осуществляется из секции <BODY> В общем случае, структура HTML –документа с имеющимися в его составе функциями, написанными на JavaScript, имеет следующий вид:

<HTML>

<HEAD>

<TITLE> Пример_программы_на_ JavaScript </TITLE>

<SCRIPT LANGUAGE = “JavaScript” >

< ! - -

….

Функции на JavaScript

….

-- >

</SCRIPT>

</HEAD>

<BODY>

< ! - -

….

Текст HTML –документа и вызов функций на JavaScript

….

-- >

</BODY>

</HTML>

Основным элементом языка JavaScript, как уже говорилось выше, является функция. Функция должна иметь уникальное имя и ее код должен быть заключен в фигурные скобки ( {и} ). Например, заголовок функции может быть представлен в следующем виде:

Function showTime ( ) {

…

// функция выводит время на экран

…

}

В этом случаи вызов этой функции внутри HTML –документа будет иметь простой вид: showTime ( )

Функции являются основными единицами большинства скриптовых программ. В редких случаях можно обойтись без их использования - в этом случае последовательность действий на языке JavaScript указывается непосредственно в теле документа, т.е. блок <SCRIPT> … </SCRIPT> размещается внутри секции BODY.

Для удобства отладки Web - документов с JavaScript выберите в Internet Explorer пункт меню «Сервис» - «Свойства обозревателя» и закладку «Дополнительно» и установите флажок «Показывать уведомление о каждой ошибке сценария».

При выдаче браузером сообщения об обнаружении ошибки нажмите кнопку «Показать подробности» и Вы увидите № строки Web – документа (считаются сверху вниз, включая и пустые строки), № символа в строке, где обнаружена ошибка, а также сообщение о виде ошибки.

1. Объектная модель браузера в JavaScript

Объектная модель браузера в JavaScript - это набор связанных между собой объектов, обеспечивающих доступ к содержимому страницы и ряду функций браузера. В составе объектной модели могу быть три основных объекта - объект window, находящийся на вершине иерархии и представляющий собой текущее окно браузера; объект document - предназначен для программного представления самого документа и его содержимого. Последним в перечне основных объектов модели браузера является объект frames, предназначенный для работы с кадрами (фреймами) в окне браузера. В ходе выполнения заданий лабораторной работы используются основные объекты: window и document, свойства, методы и коллекции которых будут определены ниже. Будут затронуты и другие объекты названной модели браузера.


3.1. Методы объекта window

Методы, предоставляемые объектом window, позволяют управлять самим окном, а также выполнять ряд действий внутри него.

Для открытия нового или закрытия уже существующего окна используются методы open и close соответственно. Метод open имеет ряд дополнительных аргументов, которые позволяют задать местоположение окна, его размер и тип, а также указывают, должно ли окно иметь полосы прокрутки, полосу команд и т.п. Полный синтаксис метода open объекта window может быть представлен следующим образом:

New_Wnd = window.open (URL, name, features, replace),

где URL - адрес документа, отображаемого в новом окне; если адрес не задан, будет отображено пустое окно (необходимо указать: “about: blank”).

name - строка, задающая имя окна.

features - строка, задающая параметры нового окна (об этом речь пойдет ниже).

replace - указывает, замещает ли новое окно текущее в списке history или нет ( этот параметр можно и не указывать).

Все параметры окна задаются последовательностью значений, сгруппированной под единым обозначением “ features”. Наиболее важные из этих параметров могут быть прокомментированы следующим образом:

- fullscreen = (yes | no) - определяет, показывать окно на полный экран или как обычное окно;

- toolbar = (yes | no) - указывает, отображается ли полоса кнопок;

- location = (yes | no) - указывает, отображается ли полоса для ввода адреса;

- menubar = (yes | no) - указывает, отображается ли полоса меню;

- scrollbar = (yes| no) -задает отображение вертикальной и горизонтальной полос прокрутки;

- width = число - задает ширину окна в пикселях, минимум равен 100 ;

- heiqht = число - задает высоту окна в пикселях, минимум равен 100.

В качестве примера использования метода open объекта window приведено решение задачи возврата на вызывающую страницу из вызываемой, если в ее конце отображена кнопка (а не гиперссылка !!) возврата на первую страницу:

<HTML>

<HEAD>

<TITLE> Пример для объекта window </TITLE>

<Script LANGUAGE = "JavaScript" >

function ZAGR_ishod_okna() {

new_WND = window.open ( "2.htm", "w1", “height =300,width =300,toolbar = yes, scrollbar = yes, menubar = no")

}

</SCRIPT>

</HEAD>

<BODY>

….

Тело документа

….

<FORM>

<input TYPE = BUTTON VALUE = "Возврат на исходную страницу" OnClick = " ZAGR_ishod_okna() " >

</FORM>

</BODY>

</HTML>

В конце HTML- документа, загружаемого в окно браузера имеется кнопка “Возврат на исходную страницу”, которая реализована тегом <input> с атрибутом TYPE = BUTTON. Значение BUTTON специально введено и поддерживается браузером типа Internet Explorer 4.0 для расширения функций кнопок.

Событие OnClick определяет действие - вызов функции на JavaScript - в случае нажатия этой кнопки. Вызов функции приводит к открытию нового окна и загрузки в него требуемого документа h2.htm (документ должен находится в той же папке, что и вызывающий).

Кроме указанной возможности открывать и закрывать окна, объект window имеет еще ряд методов, позволяющих вводить информацию в программу и выводить ее на экран, печатая в Web – странице.

Язык JavaScript предоставляет два способа вывода информации. Объект window поддерживает один из них - метод alert, который позволяет отображать на экране клиентского браузера небольшие по размеру сообщения - эти сообщения появляются в диалоговой панели, содержащей кнопку OK (панель рассматривается в JavaScript как панель сообщений). Синтаксис метода alert объекта window следующий:

<SCRIPT LANGUAGE = “JavaScript” >

window.alert ( “Пример вывода сообщения ”)

</SCRIPT>

Второй способ вывода информации осуществляется методом write объекта document, о чем речь пойдет ниже.

Для ввода информации используются два стандартных метода объекта window - confirm u prompt.

Метод confirm отображает диалоговую панель, содержащую сообщение и две кнопки - ОК и Cancel. Нажатие кнопки ОК возвращает значение true, Cancel – false.

Фрагмент программы, приведенной ниже, поясняет синтаксис и назначение метода confirm:

<SCRIPT LANGUAGE = “JavaScript” >

if (confirm (“Хотите перейти по переписке?”))

document.write ( “Переход по гиперссылке ”)

else

document.write ( “Отмена перехода по гиперссылке ”)

</SCRIPT>

Второй метод, обеспечивающий ввод информации, является метод prompt. Он выводит диалоговую панель, содержащую текст, строку для ввода текста и кнопки ОК и Cancel. При нажатии кнопки ОК, метод prompt возвращает строку ввода. Общий формат метода prompt следующий:

prompt( “Текст над строкой ввода”, “Текст по умолчанию в строке ввода”)

Следующий пример пояснит использование метода prompt:

<SCRIPT LANGUAGE = “JavaScript” >

var s

s = prompt (“ Введите ваше имя ”, “Иванов Иван”)

document.write ( s )

</SCRIPT>

Наряду с методом open объекта window, для перехода к новой Web-странице может быть использован еще один элемент объектной модели браузера, предоставляемый языком JavaScript, - объект location.

Этот объект содержит информацию об URL-адресе текущей страницы и обеспечивает методы для перезагрузки страницы или загрузки новой страницы.

Для загрузки новой страницы в окно браузера используется или свойство href объекта location, или метод assign. В первом случае свойству присваивается новый URL, например:

window.location.href = “http://www.newsite.com”.

Несмотря на то, что в состав объектной модели браузера входит большое число элементов, их определение завершим рассмотрением еще одного объекта - document.

Объектная модель обеспечивает объект document и ряд дополнительных объектов и коллекций для программного представления самого документа и его содержимого. Из всех методов объекта document упомянем только метод write, выводящий указанный текст в окно браузера, и writeln, выводящий текст, в конце которого устанавливается символ “возврата каретки” (аналог тега <BR>). При этом метод writeln должен быть заключен между тегами <PRE>, </PRE>:

<PRE>

<SCRIPT LANGUAGE = “JavaScript” >

document.writeln ( “Первая строка ”)

document.writeln ( “Вторая строка”)

</SCRIPT>

</PRE>

Другие методы объекта document в рамках данной лабораторной работы использоваться не будут.

Наряду с методами объекта document при программировании сценариев на языке JavaScript используется понятие коллекции (массивы). Для доступа к информации, хранимой на HTML-странице, объект document предоставляет 12 коллекций, среди которых можно выделить следующее, как наиболее важные:

- applets - коллекция всех объектов, находящихся в документе;

- frames - коллекция всех фреймов (кадров), заданы тегами <frameset>;

- forms - коллекция всех форм в данном документе;

- links - коллекция всех ссылок;

- scripts - коллекция всех скриптовых программ, определенных в данном документе.

Каждая из коллекций имеет свойство lenght, определяющее число элементов в коллекции. Метод tags возвращает коллекцию, содержащую только указанные теги языка HTML. Это может быть использовано при поиске того или иного элемента в документе:

if (0 = = document.all.tags( “ H2”).lenght )

{

alert (“ В документе нет тегов <H2>”)

}

Первый элемент коллекции имеет номер 0, последний - lenght –1.

Кроме вышеназванных свойств в коллекциях (в частности в коллекции all ) имеется свойство, позволяющее получать не непосредственно теги, а их названия. Это относится в частности к тегу заголовков в документе <H#>. В результате использования свойства, которое идентифицируется как innerText, можно получать не просто коллекцию (список) тегов заголовков, а список самих названий этих заголовков. Это удобно для получения содержания всего документа по заголовкам в итоговом окне. Для создания такой коллекции нужно присвоить какой-либо переменной (которая является объектом) значения, получаемые при использовании метода tags:

K2 = document.all.tags (“H2”),

где “H2” - идентификатор стиля оформления заголовка.

После этого во вновь открытом пустом окне (“about:blank”) отображение содержания документа может быть осуществлено следующим способом:

WND.document.write (K2( i ).innerText, “<BR>”)

при изменении i в указанных выше пределах с помощью оператора цикла for. В этой записи WND является именем вновь создаваемого окна.

3.2. Встроенные объекты JavaScript

В рамках этой лабораторной работы из всех встроенных объектов JavaScript особое внимание будет уделено объектам Array, Date, String.

Язык JavaScript не имеет встроенного тега данных для создания массивов, поэтому для решения таких задач используется объект Array и его методы. При этом индексирование элементов в массиве начинается с 0 и т.д. Для создания конкретного массива используется конструктор new и после этого каждому элементу присваивается его значение:

AllStr = new Array (4);

AllStr [0] = 1;

AllStr [1] = 2;

AllStr [2] = 3;

AllStr [3] = 4;

AllStr [4] = 5;

Конструктор new в этом случае создал массив AllStr, состоящий из пяти элементов, а затем скрипт произвел заполнение массива.

Для объекта Array в языке JavaScript реализовано всего три метода:

- join - объединяет все элементы массива в одну строку;

- reverse - изменяет порядок элементов в массиве с первого на последний;

- sort - выполняет сортировку массива.

Говоря о массиве, следует указать обязательное для этого объекта свойство - lenght, определяющее длину массива (число его элементов).

Таким образом, для определенного выше массива оговоренные методы будут выглядеть следующим образом:

AllStr.join(); AllStr.reverse(); AllStr.sort().

Помимо методов join, reverse и sort объект Array в Microsoft Internet Explorer поддерживает методы concat и slice. Первый метод обеспечивает конкатенацию двух массивов. Следующий пример поясняет суть использования этого метода:

Var first = new Array (‘январь’, ‘февраль’)

Var second = new Array (‘март’, ‘апрель’)

Var full = new Array

full = first.concat (second)

Метод slice наоборот используется для получения части массива. При вызове метода указываются индексы начального и конечного элементов подмассивов (следует помнить, что нумерация элементов начинается с 0).

Пример, поясняющий использование этого метода приведен ниже:

Var first = new Array

Var second = new Array

// зимние месяцы

first = full.slice (0,1)

document.write ( first )

// весенние месяцы

second = full.slice (2,3)

document.write ( second ).

Значительно большим набором методов обладает объект Date, который используется для работы с датой и временем в скриптовых программах. Для создания экземпляра объекта Date также используется конструктор new:

Mydate = new date ( [параметры] )

Определение переменной Mydate может содержать некоторые параметры, однако неуказание никаких параметров приводит к тому, что переменная будет содержать текущую дату и время (т.е. указывается Mydate = new date ( )).

В этом случае экземпляру объекта типа Date присваивается значение года, месяца, дня, часов, минут и секунд. Большинство методов объекта Date направлено на то, чтобы выделить из полученной исходной последовательности типа даты требуемую информацию. Ниже в таблице приведено описание каждого из этих методов и диапазон значений, с их помощью достигаемый.

Метод

Описание

Диапазон

GetDate

Возвращает день месяца как целое число

 1 - 31

GetDay

Возвращает день недели как целое число

 0 ( воскресенье ) -         6 ( суббота )

GetHours

Возвращает число часов как целое

   0 - 23

GetMinutes

Возвращает минут часов как целое

   0 - 59

GetMonth

Возвращает день месяца как целое число

   0 ( январь ) -

11 ( декабрь )

GetSeconds

Возвращает число секунд как целое

    0 - 59

GetYear

Возвращает две последние цифры года

       -

Пример программы, приведенный ниже, поясняет использование основных методов объекта Date.

<HTML>

<HEAD>

<TITLE> Пример_использования_объекта_Date </TITLE>

<SCRIPT LANGUAGE = “JavaScript” >

function show_Time () {

var now = new Date ()

var s

// определение числа

s = now.getDate ()

document.write ( ‘текущее число ’ + s )

// определение месяца

s = now.getMonth ()

document.write ( ‘ текущий месяц ’ + s )

// определение года

s = now.getYear ()

document.write ( ‘ текущий год ’ + s )

}

</SCRIPT>

<IHEAD>

<BODY>

<SCRIPT LANGUAGE = “JavaScript” >

show_Time ()

</SCRIPT>

</BODY>

</HTML>

В том случае, если на Web-странице необходимо отобразить не просто число, характеризующее месяц или день недели, а название того и другого, то для этого создаются специальные массивы имен дней недели и месяцев и из них осуществляется выбор содержимого по индексу, определяемому тем или иным методом объекта Date, например,

mNames [now.getMonth () ], где mNames - массив имен месяцев.

Последний из встроенных объектов, рассматриваемых в рамках лабораторной работы - объект String. С помощью этого объекта возможно изменять шрифты символьных строк так, как это необходимо пользователю. Ниже приведены некоторые методы этого объекта, позволяющие изменять шрифты строк:

- bolds - полужирный шрифт;

- italic - курсив;

- fixed - “обычный” шрифт;

- sub - нижний индекс;

- sup - верхний индекс;

- strike – перечеркнутый шрифт.

Данный объект имеет также ряд других методов, подробно останавливаться на которых не будем.

В заключении приведем текст программы, включающий функции на JavaScript, которые позволяют открыть новый документ в новом окне, вывести содержание документа (при условии, что все заголовки сформированы тегом стиля <H2>), а также представить текущую дату в требуемой форме.

<HTML>

<HEAD>

<TITLE> Пример_программы_с_функциями_ JavaScript </TITLE>

<SCRIPT LANGUAGE = "JavaScript" >

// функция, определяющая содержание документа

function SODERG_DOC ( ) {

WND1 = window.open ("about: blank")

<!-- открытие пустого окна, в котором отображается содержание //-->

K2 = document.all.tags ("H2")

// формирование коллекции заголовков

for (i=0; i< K2.length; i++)

{WND1. document.write ( K2 ( i ).innerText, "<BR>" )

// печать элементов коллекции - заголовков

}

}

</SCRIPT>

<SCRIPT LANGUAGE = "JavaScript" >

<!-- функция, открывающая новое окно и загружающая в него документ //-->

function new_window ( ) {

WND2 = window.open ("DOC2.HTML - документ", “win2”, "height =300,widht =300,fullscreen = no, toolbar = no, csrollbar =yes, menubar =yes" )

}

</SCRIPT>

</HEAD>

<BODY>

<H2> Форма для выполнения заказов на покупки через Internet </H2> < BR >

// скрипт, выводящий текущую дату в требуемой форме

<SCRIPT LANGUAGE = "JavaScript" >

new_DATA = new Date ( )

// определение текущего месяца

s1 = new_DATA.getMonth ( )

s1 += 1

s = "Вы делаете заказ"

s += new_DATA.getDate ( ) + " . "

s += s1 + " . "

s += new_DATA.getYear ( )

</SCRIPT>

Текст документа HTML

<!-- определение кнопок перехода к другому документу и вывода в окно содержания этой страницы //-->

<FORM>

<input TYPE = "BUTTON" VALUE = "Открыть документ" OnClick = " new_window ( ) " >

<input TYPE = "BUTTON" VALUE = "Содержание доку-мента" OnClick = " SODERG_DOC ( ) " >

</FORM>

</BODY> </HTML>

Изучение арифметических команд языка Ассемблер IBM PC.

 

Постановка задачи

Разработать программу для выполнения сложения над неотрицательными 80-ти разрядными двоичными операндами. Исходные данные представить в распакованном формате в 4-ричной системе счисления. Таким образом, при выполнении задания следут запрограммировать последовательность действий:

1) преобразование исходных данных;

2) выполнение арифметической операции;

Под распакованным форматом в заданной системе счисления следует понимать представление числа в виде последовательности ASCII-кодов арабских цифр, используемых этой системой счисления.

Исходные данные определить с помощью директив определения данных.

Кроме того, в качестве информации о корректности выполнения арифметической операции сложения или вычитания сформировать однобайтовый код ошибки, равный 0, если результат операции представляет собой 80-битовое неотрицательное число, и равный FFH в противном случае.

Выполнить тестирование программы, по крайней мере, для трех типов тестов, соответствующих ситуациям:

1) операнды и результат выполнения операции представляют собой положительные 80-разрядные двоичные числа;

2) один из операндов равен 0;

3) длина результата выполнения операции сложения превышает 80 бит или результат выполнения операции вычитания – отрицательное число.

Описание алгоритма

Преобразование исходных данных

Т.к. для представления одной цифры 4-ричной системы в двоичной системе используются две цифры, то для преобразования чисел я использую следующий алгоритм:

1) Загружаем очередной байт исходного числа в регистр AL.

2) Вычисляем в нём цифру 4-ричного числа.

3) Сдвигаем регистр AL на 6 знаков.

4) Сдвигаем регистр AX на 2 знака.

5) Повторяем пункты 1-4 ещё три раза.

6) Значение регистра AH записывается в число результат

7) Действия повторяются до тех пор пока все байты исходного числа не будут обработаны.

Сложение чисел

Для сложения чисел организуется цикл, в котором все цифры исходных чисел рассматриваются справа налево, и производится их сложение с учётом переноса.

Тестирование программы

1) Исходные данные:

A= '1203011123120301112312030111231203011123'

B= '2103121031210312103121031210312103121031'

Результат:

RES=F6798F6718F6798F67A8

ERROR=0

2) Исходные данные:

A= '1203011123120301112312030111231203011123'

B= 40 DUP(0)

Результат:

RES=6315B6315B6315B6315B

ERROR=0

2) Исходные данные:

A= '1203011123120301112312030111231203011123'

B= '3210332103321033210332103321033210332103'

Результат:

RES=470EF480EE470EF480EE

ERROR=FF

Текст программы

LAB5 SEGMENT

ASSUME CS:LAB5,DS:LAB5,SS:LAB5

ORG 100H

BEGIN: JMP MAIN

;//-----------------------------------

A DB '1203011123120301112312030111231203011123'

B DB '3210332103321033210332103321033210332103'

A_TR DB 10 DUP(0)

B_TR DB 10 DUP(0)

RES DB 10 DUP(0)

TR DB 0

ERROR DB 0

;//-----------------------------------

MAIN: XOR AX,AX

LEA SI,A

LEA DI,A_TR

MOV CL,10

CONV: MOV DL,CL

MOV CL,4

ONE_B: MOV DH,CL

MOV CL,6

MOV AL,[SI]

AND AL,3H

SHL AL,CL

SHL AX,1

SHL AX,1

INC SI

MOV CL,DH

LOOP ONE_B

MOV [DI],AH

INC DI

MOV CL,DL

LOOP CONV

XOR AX,AX

LEA SI,B

LEA DI,B_TR

MOV CL,10

CMP TR,0

MOV TR,1

JZ CONV

;//-----------------------------------

CLC

LEA SI,A_TR+9

LEA DI,B_TR+9

LEA BX,RES+9

MOV CL,10

ADDING: XOR AH,AH

MOV AL,[SI]

ADC AL,[DI]

MOV [BX],AL

DEC SI

DEC DI

DEC BX

LOOP ADDING

JNC EXIT

MOV ERROR,0FFH

EXIT: RET

LAB5 ENDS

END BEGIN

Вывод

В ходе проведенной лабораторной работы были изучены арифметические команд языка Ассемблер IBM PC. Была составлена программы производящая сложение двух 80-ти разрядных двоичных числа. По окончанию сложения формировался код ошибки (единица переноса). Программа была проверена на тестах, проверяющих условия: а) один из операндов = 0, б) проверялась единица переноса, в) вычитание двух положительных чисел с учётом переноса между байтами. Данные тесты являются исчерпывающими для данной постановки задачи (проверяют все возможные граничные условия).

Программа для суперскалярной обработки элементов массива с использованием технологии MMX.

1.1.1 Постановка задачи.

Предлагается написать программу для выполнения суперскалярной обработки элементов массива с использованием технологии MMX, согласно варианту.

5

Условное перемещениеclip_image001

1.1.2 Решение
1.1.2.1 Интерфейс пользователя

clip_image003

Нажимаем кнопку «Заполнение массивов» для инициализации исходных массивов случайно сгенерированными значениями от 0 до 127 и очистки целевого массива.. Нажатие кнопки «ТЕСТ» запускает процесс обработки согласно варианта задания.

1.1.2.2 Текст программы

program Project1;

uses

Forms,

Unit1 in 'Unit1.pas' {Form1},

intfunc in 'intfunc.pas',

URDTSC in 'URDTSC.pas';

{$R *.res}

begin

Application.Initialize;

Application.Title := 'Задача 4.3';

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, AdvSpin, Math, jpeg, ExtCtrls;

const

maxmass=16384;

type

TForm1 = class(TForm)

GroupBox1: TGroupBox;

Label2: TLabel;

Run_Test: TButton;

Times_result: TEdit;

Label4: TLabel;

CPU_Speed: TEdit;

Image1: TImage;

Label5: TLabel;

Label6: TLabel;

Label8: TLabel;

GroupBox2: TGroupBox;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

MassInit: TButton;

MasA_visual: TMemo;

MasC_visual: TMemo;

MasB_visual: TMemo;

procedure Run_TestClick(Sender: TObject);

procedure MassInitClick(Sender: TObject);

procedure Initmass;

procedure ProcessNoMMX;

procedure ProcessMMX;

procedure runs_test;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

ai,bi,ci:array[1..maxmass] of byte;

implementation

uses intfunc,URDTSC;

{$R *.dfm}

procedure visualmass(var ta:array of byte;var text:TMemo);

var tmp:string;

ct:TStringList;

i:word;

begin

ct:=TStringList.Create();

ct.Clear;

for i:=1 to maxmass do

begin

if(i=maxmass) then tmp:=';'

else tmp:=', ';

ct.Add(inttostr(ta[i])+tmp);

end;

text.Clear;

text.Lines:=ct;

ct.Destroy;

end;

procedure TForm1.Initmass;

var i:word;

begin

for i:=1 to maxmass do

begin

ai[i]:=0;

bi[i]:=random(127);

ci[i]:=random(127);

end;

visualmass(ai,MasA_visual);

visualmass(bi,MasB_visual);

visualmass(ci,MasC_visual);

end;

procedure TForm1.ProcessNoMMX;

var i:word;

begin

for i:=1 to maxmass do

begin

if(bi[i]<ci[i]) then ai[i]:= bi[i]

else ai[i]:=0;

end;

end;

procedure TForm1.ProcessMMX;

var

m:integer;

begin

m:=(maxmass div 8);

asm

mov ecx,m ;//Количество циклов maxmass/8

xor esi,esi ;//Чистим индекс

@l:

movq mm0, qword ptr ci+[esi];

movq mm1, qword ptr bi+[esi];//кешируем элемент

pcmpgtb mm0, mm1 ;//побайтно сравниваем

pand mm0, mm1 ;//выбераем больший байт или ноль

movq qword ptr ai+[esi], mm0;//сохраняем выбранное

add esi,8 ;//приращение счетчика

loop @l ;//цикл

emms ;//для делфи

end;

end;

procedure TForm1.runs_test;

begin

if(RadioButton1.Checked) then ProcessMMX;

if(RadioButton2.Checked) then ProcessNoMMX;

end;

procedure TForm1.Run_TestClick(Sender: TObject);

var Time_Lo, Time_Hi: comp;

Freq : comp;

begin

Freq:=GetFrequence;

CPU_Speed.Text:=FloatToStr(RoundTo(Freq/10E8,-2))+' ГГц';

Time_Lo:=RDTSC;

runs_test;

Time_Hi:=RDTSC;

Times_result.Text:= FloatToStr(RoundTo((Time_Hi-Time_lo)/Freq,-9))+' c';

visualmass(ai,MasA_visual);

end;

procedure TForm1.MassInitClick(Sender: TObject);

begin

initmass;

end;

end.

unit URDTSC;

interface

uses

Windows;

function RDTSC:comp;

function GetFrequence : longword;

implementation

function RDTSC:comp;

var

TimeStamp:record

case byte of

1: (Whole:comp);

2: (Lo,Hi: LongInt);

end;

begin

asm

db $0F, $31

mov [TimeStamp.lo],eax

mov [TimeStamp.Hi],edx

end;

result:= TimeStamp.Whole;

end;

function GetFrequence : longword;

var

Time_Lo, Time_Hi: comp;

begin

Sleep(1);

Time_Lo:= RDTSC;

Sleep(1000);

Time_Hi:= RDTSC;

result:= Round((Time_Hi-Time_lo));

end;

end.

1.1.2.3 Результаты отладки:

После заполнения массивов:

clip_image005

После завершения обработки (с использованием ММХ):

clip_image007

После завершения обработки (без использования ММХ):

clip_image009

Как видим, технология ММХ дает существенный прирост производительности. Обработка одновременно 8 байт и др. оптимизации дают представленный выше результат.