Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Электронный учебно-методический комплекс по учебной дисциплине «Системное программирование» для специальностей 1-40 01 01 «Программное обеспечение информационных технологий», 6-05-0612-01 «Программная инженерия»

.pdf
Скачиваний:
0
Добавлен:
28.12.2025
Размер:
3.06 Mб
Скачать

void protec() {

if (countc>50) exiter(f_time);

}

// Контроль и модификация сигнатуры файла

void main(int na,char **la) { old1ch=getvect(0x1c); countc=0; setvect(0x1c,new1ch);

if (na>1) { _harderr(handler);

FILE *fp=fopen(la[1],"r+b"); protec();

if (fp) { char t[11];

isname(t,la[1]);

protec();

struct dtfitm far *fx=search(t); if (fx) {

struct {

 

 

 

char s1[11];

 

 

 

unsigned int

sl;

// Размер сектора

 

unsigned char

ks;

// Число секторов

кластера

unsigned int

rs;

// Число резервируемых секторов

unsigned char

fn;

// Количество FAT

 

unsigned int

rn;

// Число записей корневого каталога

unsigned int

vs;

// Число секторoв

на томе

unsigned char

bd;

// Байт описания носителя

unsigned int

fs;

// Число секторов

в FAT

unsigned int

ts;

// Число секторов

на дорожке

unsigned int

hn;

// Число головок

 

char s2[11];

 

 

 

unsigned long

vi;

// Серийный номер

тома

unsigned char

vl[11];

// Метка тома

 

char s3[458]; } sector;

int disk=diskon(la[1]);

if (absread(disk,1,0,§or)) exiter(r_disk); protec();

unsigned int clustbyte=sector.sl*sector.ks; char *clsbuf=new char[clustbyte];

if (clsbuf) {

unsigned int tailsz=fx->l%clustbyte; fseek(fp,long(fx->l-tailsz),0); fread(clsbuf,1,tailsz,fp);

long clsnum=1l; clsnum+=long(sector.fn)*long(sector.fs); protec();

clsnum+=long(sector.rn>>4); clsnum+=long(fx->r-2)*long(sector.ks); protec();

if (absread(disk,sector.ks,clsnum,clsbuf))

141

exiter(r_disk); srand(clsbuf[tailsz]); protec();

for (int i=tailsz+1; i<clustbyte; i++) if (clsbuf[i]!=char(random(256))) exiter(f_random);

protec();

randomize();

clsbuf[tailsz]=random(256);

protec();

srand(clsbuf[tailsz]);

for (i=tailsz+1; i<clustbyte; i++) { protec();

clsbuf[i]=random(256);

}

protec();

if (abswrite(disk,sector.ks,clsnum,clsbuf)) exiter(w_disk);

delete clsbuf;

}else exiter(f_core);

}else exiter(f_search);

}else exiter(f_open); fclose(fp);

}else exiter(f_call); protec();

exiter(ok);

}

1.13 ИНТЕРПРЕТАЦИЯ СИСТЕМ ПРОДУКЦИЙ НА ЯЗЫКЕ С

1.13.1 Сетевое представление системы продукций

Под продукцией понимают элементарную систему типа «условиедействие». Частный случай систем продукций - сети Петри и их расширения. Очевидно, что системы продукций характеризуются дискретностью поведения как упорядоченной последовательности действий, управляемой соответствующим набором условий. Управление здесь подразумевает не обязательно связанные с понятием времени этапы анализа состояния сети с целью активизации соответствующих действиям переходов. Можно показать, что система продукций эквивалентна расширенной сети Петри с задержками в переходах (TPN).

Переход t системы продукций представим четверкой функций, определяемых на множестве переменных состояния системы продукций:

A(t) - проверка условия активизации;

B(t) - изменение переменных состояния в момент активизации (входные действия);

142

C(t) - автономный процесс актисного состояния;

D(t) - изменение переменных состояния в момент пассивизации (выходные действия).

В случае TPN переменные состояния – разметка позиций, функции A, B, D связывают разметку позиций с весами дуг сети, а функция C – задержка во времени.

Нетрудно заметить, что цель интерпретации системы продукций - построение последовательности активизаций переходов. Решение такой задачи может решаться на основе схемы интерпретации процессов на TPN. Действительно, если некоторый переход t=i стал пассивным, то это особое событие порождает необходимость проверки условий активизации переходов j, функции A(j) которых включают переменные, измененные функцией D(i). Если условие A(j) истинно, то выполняются действия B(j), после чего активизируется переход j и проверяется возможность активизации переходов, условия активизации которых определены и на переменных функции B(j).

Таким образом, порождение процесса активизации переходов основано на восприимчивости отдельных переходов системы продукций к изменению только локальных переменных состояния. Отсюда следует, что на переходах системы продукций можно формально построить сеть, связывающую переходы с потенциальной возможностью активизации. Например, пусть TPN со стартовым переходом as и начальной нулевой разметкой позиций преставлена структурой смежности

as:b1;b2;b6

a1:b3;b4

a2:b5

a3:b2;b1

a4:b7

b1:af;a1

b2:af;a1

b3:a2

b4:a3

b5:a3

b6:a4

b7:af

Сеть интерпретации процессов в этом случае имеет вид:

as:a1,a4

a1:a2,a3

a2:a3

a3:af,a1

a4:af

Переменные состояния здесь образуют множество

143

X={b1,b2,b3,b4,b5,b6,b7}.

При этом предполагается, что в исходный момент времени начальное состояние

X={0,0,0,0,0,0,0},

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

A(as)=0;

A(a1)=b1&&b2;

A(a2)=b3;

A(a3)=b4&&b5;

A(a4)=b6;

A(af)=b1&&b2&&b7;

B(as)=0;

B(a1)=b1--, b2--;

B(a2)=b3--;

B(a3)=b4--, b5--;

B(a4)=b6--;

B(af)=b1--, b2--, b7--;

C(as)=0;

C(a1)=d1;

C(a2)=d2;

C(a3)=d3;

C(a4)=d4;

C(af)=b1--, b2--, b7--;

D(as)=b1++, b2++, b5++;

D(a1)=b3++, b4++;

D(a2)=b5++;

D(a3)=b1++, b5++;

D(a4)=b7++;

D(af)=0;

(логические и арифметические операции здесь обозначены символами операции языка C/C++) [1].

1.13.2 Входное описание систем продукций

Для решения практических задач описание системы продукций конкретизируется в реальной вычислительной среде. Например, в системе моделирования дискретных процессов в реальном времени СМДП-РВ TPN (1.7.1-1.7.5) может быть закодирована в выде:

// РАЗДЕЛ СТАТИЧЕСКОГО ОПИСАНИЯ МОДЕЛИ

PLACES

144

//Позиции тестовой TPN

int b1,b2,b3,b4,b5,b6,b7;

//РАЗДЕЛ ДИНАМИЧЕСКОГО ОПИСАНИЯ МОДЕЛИРУЕМЫХ ПРОЦЕССОВ */ TRANSITION

as: {0},

{printf("\nМОДЕЛИРОВАНИЕ ПРОЦЕССОВ НА TPN"); b1=b2=b3=b4=b5=b6=b7=0;

count=0;

},,{b1++,b2++,b6++;};

af: { b1 && b2 && b7 },

{b1--, b2--, b7--; printf("\n ФИНИШ... "); };

a1: { b1 && b2 },

{b1--, b2--; },

{d1 },

{b3++, b4++; };

a2: { b3 },

{b3--; },

{d2 },

{b5++; };

a3: { b4 && b5 },

{b4--, b5--; },

{d3 },

{b1++, b2++;

printf("\n Время %ld, cчетчик %d, ",Event_Time,++count);

};

a4: { b6 },

{b6--; },

{d4 },

{b7++; };

SOURCE

#include <stdio.h>

long d1=2, d2=3, d3=4, d4=10; int count;

После трансляции такого исходного текста система СМДП-РВ подготовит следующий текст программы, пригодный для обработки системой программирования на языках C/C++:

// ТЕКСТ ДЕТАЛИЗАЦИИ ОПИСАНИЯ МОДЕЛИ

#include <stdio.h>

long d1=2, d2=3, d3=4, d4=10;

145

int count;

// ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ СОСТОЯНИЯ

int b1, // 0 b2, // 1 b3, // 2 b4, // 3 b5, // 4 b6, // 5 b7; // 6

// ОПИСАНИЕ ФУНКЦИЙ УСЛОВИЙ АКТИВИЗАЦИИ И ДЕЙСТВИЙ ПЕРЕХОДОВ

int as_1(void), // 0 af_1(void), // 1 a1_1(void), // 2 a2_1(void), // 3 a3_1(void), // 4 a4_1(void); // 5

int (*smdp_1[])(void) = { as_1,af_1,a1_1,a2_1,a3_1,a4_1

};

void as_2(void), af_2(void), a1_2(void), a2_2(void), a3_2(void), a4_2(void);

void (*smdp_2[])(void) = { 0,af_2,a1_2,a2_2,a3_2,a4_2

};

long a1_3(void), a2_3(void), a3_3(void), a4_3(void);

long (*smdp_3[])(void) = { 0,0,a1_3,a2_3,a3_3,a4_3

};

void as_4(void), a1_4(void), a2_4(void), a3_4(void), a4_4(void);

void (*smdp_4[])(void) = { as_4,0,a1_4,a2_4,a3_4,a4_4

};

146

// ОПРЕДЕЛЕНИЕ ФУНКЦИЙ УСЛОВИЙ АКТИВИЗАЦИИ И ДЕЙСТВИЙ ПЕРЕХОДОВ

int as_1(void) { return(0); }

void as_4(void) {

printf("\nМОДЕЛИРОВАНИЕ ПРОЦЕССОВ НА TPN");

b1=b2=b3=b4=b5=b6=b7=0;

count=0;

b1++,b2++,b6++;

}

int af_1(void) { return(b1 && b2 && b7);

}

void af_2(void) { b1--, b2--, b7--;

printf("\n ФИНИШ... ");

}

int a1_1(void) { return(b1 && b2); }

long a1_3(void) { return(d1); }

void a1_2(void) { b1--, b2--; }

void a1_4(void) { b3++, b4++; } int a2_1(void) { return(b3); } long a2_3(void) { return(d2); } void a2_2(void) { b3--; }

void a2_4(void) { b5++; }

int a3_1(void) { return(b4 && b5); } long a3_3(void) { return(d3); }

void a3_2(void) { b4--, b5--; } void a3_4(void) {

b1++, b2++;

printf("\n Время %ld, cчетчик %d, ",EL_time,++count); }

int a4_1(void) { return(b6); } long a4_3(void) { return(d4); } void a4_2(void) { b6--; }

void a4_4(void) { b7++; }

// СХЕМА СВЯЗИ ПЕРЕХОДОВ

#define N_tran 6

int L_tran[] = { // Индексы списка связанных позиций переходов

0,7,10,14,16,20,22 };

int M_tran[] = { // Связи

переходов

 

 

0,1,2,3,4,5,6,

0,1,6,

0,1,2,3,

2,4,

3,4,0,1,

5,6

// as

af

a1

 

a2

a3

a4

};

 

 

 

 

 

 

147

// СХЕМА СВЯЗИ ПОЗИЦИЙ

int L_plac[] = { // Индексы списка связанных переходов позиций

0,2,4,5,6,7,8,9,9

};

int M_plac[] = { // Связи позиций 1,2, 1,2, 3, 4, 4, 5, 1

// b1 b2 b3 b4 b5 b6 b7 };

Схема связи переходов и позиций по существу определяют TPN, соответствующую сети переходов системы продукций [1].

1.13.3 Интерпретация систем продукций

Здесь представлен результат конструирования процедуры интерпретации системы продукций посредством построения обрамляющей сети типа TPN на исходном тексте описания такой системы.

/****************************************************************

Процедура интерпретации системы продукций в ускоренном времени

****************************************************************/

// Включение описания варианта сети

#include "test.c"

// Описание списка событий

int

EL_next[N_tran]; // Поля ссылок

long

EL_time[N_tran]; // Моменты времени

#define HEAD EL_next[0]

// Указатель списка активных переходов

#define TEMP EL_time[0]

// Момент очередного особого события

void

main(void) {

 

int

i,j,k,l,m,n,p,q,t;

 

long

f;

 

// Инициализация списка событий

HEAD=0; // Стартовый переход имеет нулевой номер

TEMP=0; // Отсчет времени от нуля

// Фиксация пассивности переходов

for (i=1; i<N_tran; EL_next[i++]=N_tran);

// Выходные действия стартового перехода

if (smdp_2[0]) smdp_2[0]();

148

// Обработка последовательности событий

do {

t=HEAD, HEAD=EL_next[t]; // Выборка очередного перехода TEMP=EL_time[t]; // Mомент пассивизации

if (t) EL_next[t]=N_tran; // Фиксация пассивности перехода t

// Обработка последствий пассивизации перехода t

if (smdp_4[t]) smdp_4[t](); // Выходные действия for (i=L_tran[t], j=L_tran[t+1]; i<j; i++)

for (k=M_tran[i], l=L_plac[k], m=L_plac[k+1]; l<m; l++) {

// Обработка последствий изменения разметки позиции k

if (EL_next[n=M_plac[l]]!=N_tran)

continue; // Отказ от активизации активного перехода if (smdp_1[n]()) { // Проверка условий активизации if (smdp_2[n]) smdp_2[n](); // Входные действия

// Планирование момента пассивизации перехода n

f=EL_time[n]=TEMP+(smdp_3[n]? smdp_3[n]():0);

for (p=0, q=HEAD; (q>0)&&(f>=EL_time[q]); p=q, q=EL_next[p]); EL_next[n]=q, EL_next[p]=n;

}

}

} while (HEAD>0);

printf("\n* Завершение моделирования в момент %ld\n",TEMP);

}

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

МОДЕЛИРОВАНИЕ ПРОЦЕССОВ НА TPN Время 9, cчетчик 1

Время 18, cчетчик 2 ФИНИШ...

* Завершение моделирования в момент 18

Таким образом, полученные результаты полностью соответствуют результатам интерпретации представленной рассматриваемой системой продукций TPN [1].

ЗАКЛЮЧЕНИЕ

Говоря о программировании на языке С, следует предполагать знание не только собственно лингвистических конструкций, но и библиотек функций конкретной системы программирования. Язык С появился в годы широкого применения многопользовательского режима использования ЭВМ Понятие

149

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

Среди других алгоритмических языков программирования процедурного типа наиболее отличительным свойством языка С явилась поддержка адресной арифметики. Другое важное свойство - мобильность. Последнее позволило достичь успеха в создании крупных, развиваемых и долгоживущих программных систем. Логическим следствием эволюции языка С в направлении улучшения технологии программирования явилось создание языка объектноориентированного программирования C++.

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

пакетирование – связывание в единое целое объектов существующих типов и функций доступа к ним с целью определения объектов нового типа;

наследование – использование элементов данных и функций ранее определенных объектов для образования иерархии производных объектов;

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

Объектно-ориентированное программирование на языке C++ - предмет изучения в следующем учебном курсе. Знание языка C и опыт его практического использования - непременное условие понимания языка C++, а также концепций построения современных систем программирования [1].

150

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]