Решение системы регулярных уравнений

Рассмотрение понятия регулярных выражений и множеств; их сокращенное обозначение. Представление алгоритма программы, предназначенной для решения системы линейных уравнений методом исключения Гаусса. Ознакомление с содержимым файлов input.txt и output.txt.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 08.02.2013
Размер файла 251,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Задание

Решение системы регулярных уравнений.

Во входном файле (с именем INPUT.TXT) задается размерность системы регулярных уравнений n (1 ? n ? 8) а затем - ее коэффициенты:

б10 б11 б12 … б1n

б20 б21 б22 … б2n

…………………

бn0 бn1 бn2 … бnn

Максимальная длина регулярного выражения для каждого коэффициента равна 3.

1. Короткая теория

Определение. Регулярные выражения в алфавите У и регулярные множества, которые они обозначают, определяются рекурсивно следующим образом:

1) - регулярное выражение, обозначающее регулярное множество ;

2) e - регулярное выражение, обозначающее регулярное множество {e};

3) если aУ, то a - регулярное выражение, обозначающее регулярное множество {a};

4) если p и q - регулярные выражения, обозначающие регулярные множества P и Q, то

а) (p+q) - регулярное выражение, обозначающее PQ;

б) pq - регулярное выражение, обозначающее PQ;

в) p* - регулярное выражение, обозначающее P*;

5) ничто другое не является регулярным выражением.

Принято обозначать p+ для сокращенного обозначения рр*. Расстановка приоритетов:

- * (итерация) - наивысший приоритет;

- конкатенация;

- + (объединение).

Например, 0 + 10* = (0 + (1 (0*))).

Таким образом, для каждого регулярного множества можно найти регулярное выражение, его обозначающее, и наоборот.

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

1) б + в = в + б

2) * = e

3) б + (в + г) = (б + в) + г

4) б(вг) = (бв)г

5) б (в + г) = бв + бг

6) (б + в)г = бг + вг

7) бe = eб = б

8) б = б =

9) б* = б+б*

10) (б*)* = б*

11) б+б = б

12) б+ = б

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

X = aX + b,

где a и b - регулярные выражения. Можно проверить прямой подстановкой, что решением этого уравнения будет a*b:

aa*b + b = (aa* + e) b = a*b,

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

Определение. Систему уравнений с регулярными коэффициентами назовем стандартной системой с множеством неизвестных Д = {X1, X2, …, Xn}, если она имеет вид:

X1 = б10 + б11X1 + б12X2 + … + б1nXn

X2 = б20 + б21X1 + б22X2 + … + б2nXn

………………………………………

Xn = бn0 + бn1X1 + бn2X2 + … + бnnXn

где бij - регулярные выражения в алфавите, не пересекающемся с Д. Коэффициентами уравнения являются выражения бij.

Если бij = , то в уравнении для Xi нет числа, содержащего Xj. Аналогично, если бij = e, то в уравнении для Xi член, содержащий Xj, - это просто Xj. Иными словами, играет роль коэффициента 0, а e - роль коэффициента 1 в обычных системах линейных уравнений.

Алгоритм решения.

Вход. Стандартная система Q уравнений с регулярными коэффициентами в алфавите У и множеством неизвестных Д = = {X1, X2, …, Xn}.

Выход. Решение системы Q.

Метод: Аналог метода решения системы линейных уравнений методом исключения Гаусса.

Шаг 1. Положить i = 1.

Шаг 2. Если i = n, перейти к шагу 4. В противном случае с помощью тождеств леммы записать уравнения для Xi в виде

Xi = бXi + в,

где б - регулярное выражение в алфавите У, а в - регулярное выражение вида

в0 + вi+1Xi+1 + … + вnXn,

причем все вi - регулярные выражения в алфавите У. Затем в правых частях для уравнений Xi+1, …, Xn заменим Xi регулярным выражением б*в.

Шаг 3. Увеличить i на 1 и вернуться к шагу 2.

Шаг 4. Записать уравнение для Xn в виде Xn = бXn + в, где б и в - регулярные выражения в алфавите У. Перейти к шагу 5 (при этом i = n).

Шаг 5. Уравнение для Xi имеет вид Xi = бXi + в, где б и в - регулярные выражения в алфавите У. Записать на выходе Xi = = б*в, в уравнениях для Xi-1, …, X1 подставляя б*в вместо Xi.

Шаг 6. Если i = 1, остановиться, в противном случае уменьшить i на 1 и вернуться к шагу 5.

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

Пример 1.

Содержимое input.txt:

Содержимое output.txt

Пример 2.

Содержимое input.txt:

регулярный выражение множество программа

Содержимое output.txt

Выводы

программа уравнение регулярный решение

В данной работе создана программа для решения системы регулярных уравнений. На вход программы из файла INPUT.TXT подается размерность системы регулярных уравнений и ее коэффициенты. Программа анализирует имеющуюся в текстовом файле систему и выдает в текстовый файл OUTPUT.TXT ее решение.

Список литературы

1. Епанешников А.М., Епанешников В.А. Программирование в среде Turbo Pascal 7.0. - М.: ДИАЛОГ-МИФИ, 1996

2. Фаронов В.В. Turbo Pascal 7.0. Начальный курс. - Нолидж, 1998. - 620 с.

3. Грызлов В.И., Грызлова Т.П. Турбо Паскаль 7.0. - М.: «ДМК», 2000. - 416 с.

4. Калайда В.Т. Теория вычислительных процессов и структур: Учеб. пособие. - Томск: ТМЦДО, 2007. - 269 с.

Приложение

Листинг программы

program lab3;

uses Crt;

type

IPtr = ^IStruct;

IStruct = record

kind: Char;

sim: Char;

Lf: IPtr;

Rg: IPtr;

end;

type

IVStruct = array [0..8] of IPtr;

type

StrArray = array [1..10] of string[20];

const

rQ = '*';

mQ = 'x';

cQ = '+';

var

N: Integer;

M1, M2: array [1..8] of IVStruct;

S, expr: string;

P, T: PChar;

sObj: IPtr;

i, j, k: Integer;

x, f, R: IVStruct;

function ICreate (kind: Char; sim: Char; Lf, Rg: IPtr): IPtr;

var

result_: IPtr;

begin

New (result_);

result_^.Lf:= Lf; result_^.Rg:= Rg; result_^.kind:= kind; result_^.sim:= sim;

ICreate:= result_;

end;

function sCreate (sim: Char): IPtr;

begin

sCreate:= ICreate (#0, sim, nil, nil);

end;

function operCreate (kind: Char; Lf, Rg: IPtr): IPtr;

begin

if (kind in [mQ, cQ]) and ((lf = nil) or (rg = nil)) then

begin

kind:= kind;

end;

operCreate:= ICreate (kind, #0, Lf, Rg);

end;

function isE (sObj: IPtr): Boolean;

begin

isE:= (sObj <> nil) and (sObj^.kind = #0) and (sObj^.sim in ['e', 'E']);

end;

function is0 (sObj: IPtr): Boolean;

begin

is0:= (sObj <> nil) and (sObj^.kind = #0) and (sObj^.sim = '0');

end;

function IVOf (const Expr: string): IPtr;

var

result_: IPtr;

begin

if Length(Expr) = 1 then

begin

result_:= sCreate (Expr[1]);

end else

if Length(Expr) = 2 then

begin

if Expr[2] = '*' then

result_:= ICreate (rQ, #0, sCreate (Expr[1]), nil)

else

result_:= ICreate (mQ, #0, sCreate (Expr[1]), sCreate (Expr[2]));

end else

if Length(Expr) = 3 then

begin

if Expr[2] = '+' then

result_:= ICreate (cQ, #0, sCreate (Expr[1]), sCreate (Expr[3]))

else if Expr[2] = '*' then

result_:= ICreate (mQ, #0, ICreate (rQ, #0, sCreate (Expr[1]), nil), sCreate (Expr[3]))

else if Expr[3] = '*' then

result_:= ICreate (mQ, #0, sCreate (Expr[1]), ICreate (rQ, #0, sCreate (Expr[2]), nil))

else if (Expr[1] = '(') and (Expr[3] = ')') then

result_:= sCreate (Expr[2])

else

result_:= ICreate (mQ, #0,

ICreate (mQ, #0,

sCreate (Expr[1]), sCreate (Expr[2])), sCreate (Expr[3]));

end else

begin

result_:= nil;

end;

IVOf:= result_;

end;

function sFormat (sObj: IPtr): string;

var

S1, S2: string;

result_:string;

begin

case sObj^.kind of

#0: result_:= sObj^.sim;

mQ:

begin

if Assigned (sObj^.Lf) and (sObj^.Lf^.kind = cQ) then {(a+)}

result_:= ' (' + sFormat (sObj^.Lf) + ')' + sFormat (sObj^.Rg)

else

if Assigned (sObj^.Rg) and (sObj^.Rg^.kind = cQ) then

result_:= sFormat (sObj^.Lf) + ' (' + sFormat (sObj^.Rg) + ')'

else

result_:= sFormat (sObj^.Lf) + sFormat (sObj^.Rg);

end;

cQ:

begin

S1:= sFormat (sObj^.Lf);

S2:= sFormat (sObj^.Rg);

result_:= S1 + '+' + S2;

end;

rQ:

begin

if Assigned (sObj^.Lf) and (sObj^.Lf^.kind = #0) then

result_:= sFormat (sObj^.Lf) + '*'

else

result_:= ' (' + sFormat (sObj^.Lf) + ')' + '*'

end;

else

result_:= «;

end;

sFormat:= result_;

end;

function IsSame (IV1, IV2: IPtr): Boolean;

var

result_: Boolean;

begin

if (IV1 = nil) and (IV2 = nil) then

result_:= True

else if Assigned(IV1) and Assigned(IV2) then

result_:= (IV1^.kind = IV2^.kind) and (IV1^.sim = IV2^.sim)

and IsSame (IV1^.Lf, IV2^.Lf) and IsSame (IV1^.Rg, IV2^.Rg)

else

result_:= False;

IsSame:= result_;

end;

function isAArep (sObj: IPtr; var Arep: IPtr): Boolean;

begin

if sObj = nil then

isAARep:= False

else

if sObj^.kind = mQ then

begin

if (sObj^.Rg^.kind = rQ) and IsSame (sObj^.Lf, sObj^.Rg^.Lf) then

begin

isAArep:= True;

Arep:= sObj^.Rg;

end

else

if (sObj^.rg <>nil) and (sObj^.lf<>nil) and

(sObj^.rg^.Lf <>nil) and (sObj^.rg^.Lf^.kind = rQ) and

IsSame (sObj^.rg^.Rg, sObj^.rg^.Lf^.Lf) then

begin

isAArep:= True;

Arep:= sObj^.rg;

end

else

if (sObj^.Lf^.kind = rQ) and IsSame (sObj^.Rg, sObj^.Lf^.Lf) then

begin

isAArep:= True;

Arep:= sObj^.lf;

end

else

isAArep:= False;

end

else

isAArep:= False;

end;

function isarep (a, sObj:IPtr):Boolean;

begin

if IsSame (a, sObj) then

begin

isarep:=True;

Exit;

end;

if sObj^.kind = mq then

begin

isarep:= isarep (a, sObj^.Lf) and isarep (a, sObj^.Rg);

Exit;

end;

isarep:= False;

end;

function Simple (sObj: IPtr): IPtr;

var

result_, T: IPtr;

s1, s2:string;

begin

result_:= sObj;

if sObj = nil then

begin

Simple:=result_;

Exit;

end;

if (sObj^.kind in [mQ, cQ]) and ((sObj^.Lf = nil) or (sObj^.Rg = nil)) then

begin

sObj:= sObj;

result_:= result_;

end;

sObj^.Lf:= Simple (sObj^.Lf);

sObj^.Rg:= Simple (sObj^.Rg);

s1:= sFormat(sObj);

s2:= sFormat (result_);

if (sObj^.kind in [mQ, cQ]) and ((sObj^.Lf = nil) or (sObj^.Rg = nil)) then

begin

sObj:= sObj;

result_:= result_;

end;

case sObj^.kind of

mQ: {x}

begin

if isE (sObj^.Lf) then result_:= sObj^.Rg {ae=a}

else if isE (sObj^.Rg) then result_:= sObj^.Lf {ea=a}

else if is0 (sObj^.Lf) or is0 (sObj^.Rg) then result_:= sCreate('0') {a0=0a=0}

else if (sObj^.Lf^.kind = rQ) and (sObj^.Rg^.kind = rQ) and {A* A* = A*}

IsSame (sObj^.Lf, sObj^.Rg) then result_:= sObj^.Lf

else if (sObj^.Rg^.kind=rQ) and IsSame (sObj^.Lf, sObj^.Rg^.Lf) then {aa*=a*a}

begin

t:=sObj^.Rg;

sObj^.Rg:=sObj^.Lf;

sObj^.Lf:=t;

result_:= sObj;

end

else if (sObj^.Rg^.kind=cQ) then {a (b+c) = ab+ac}

begin

result_:= operCreate (cQ,

operCreate (mq, sObj^.Lf, sObj^.Rg^.Lf),

operCreate (mq, sObj^.Lf, sObj^.Rg^.rg)

);

end

else if (sObj^.Lf^.kind=cQ) then {(a+b) c = ac+bc}

begin

result_:= operCreate (cQ,

operCreate (mq, sObj^.Lf^.Lf, sObj^.Rg),

operCreate (mq, sObj^.Lf^.rg, sObj^.Rg)

);

end

else if (sObj^.Lf^.kind = rQ) and (sObj^.Rg^.kind = mQ) and {!!!! A* (A*B) = (A*A) B= A*B}

(sObj^.Rg^.lf^.kind = rQ) and IsSame (sObj^.Lf^.lf, sObj^.Rg^.lf^.lf) then

begin

result_:= sObj^.rg;

end;

end;

cQ: {+}

begin

if is0 (sObj^.Lf) then result_:= sObj^.Rg {0+a=a}

else if is0 (sObj^.Rg) then result_:= sObj^.Lf {a+0=a}

else if IsSame (sObj^.Lf, sObj^.Rg) then result_:= sObj^.Lf {a+a = a}

else if (sObj^.Rg^.kind = rQ) and IsSame (sObj^.Lf, sObj^.Rg^.Lf) then

result_:= sObj^.Rg {A + A* = A*}

else if (sObj^.Lf^.kind = rQ) and IsSame (sObj^.Rg, sObj^.Lf^.Lf) then

result_:= sObj^.Lf {A* + A = A*}

else if (sObj^.Lf^.kind = rQ) and isE (sObj^.Rg) then result_:= sObj^.Lf {A* + 1 = A*}

else if (sObj^.Rg^.kind = rQ) and isE (sObj^.Lf) then result_:= sObj^.Rg {1 + A* = A*}

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.