Распараллеливание арифметических выражений. Обратная польская запись. Процедура добавления звена в цепочку

Страницы работы

Содержание работы

Федеральное Агентство по образованию

Государственное образовательное учреждение высшего профессионального образования Московский Государственный Университет

Приборостроения и Информатики филиал в г. Сергиев Посад

Кафедра ИТ-4

Отчет по лабораторной работе №1

По дисциплине «Организация ЭВМ, комплексов и систем»

На тему: «Распараллеливание арифметических выражений.»

Преподаватель        

                   Студент                  

                   Специальность        230101 Курс 3

            Группа                  ИТ4-06-01Д

Сергиев Посад 2008 г.


Распараллеливание арифметических выражений. Обратная польская запись.

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

В поле ОПЗ будет выводится исходное выражение переведенное в обратную польскую запись.

В левом окне показывается распределение ассоциативной памяти.

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

Данная программа имеет возможность пошагового отображения хода выполнения задачи.

Надпись:  Окно программы:

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

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, Grids;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Button1: TButton;

Button3: TButton;

Label1: TLabel;

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

StringGrid3: TStringGrid;

StringGrid4: TStringGrid;

Button2: TButton;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Memo1: TMemo;

Label5: TLabel;

Memo2: TMemo;

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

Type

Ppiece = ^Piece; //Тип указателя на звено

Piece = record

s:string; //текст звена

number:byte; //номер оператора

TurnNumber:integer; //состояние шага

mem:string; //память о прошлых операторах

next:Ppiece //указатель на звено

end;

Var

MainP,TempP:Ppiece; //Переменные указатели на звенья

TurnNumber:integer=1; //Текущий шаг

m1:integer=1;

m2:integer=1;

m3:integer=1;

m4:integer=1;

exceptions: array [1..100] of string; //массив исключительных цепочек

e:integer=1; //размерность массива исключительных цепочек

Procedure AddPiece(var p:Ppiece; s:string; number:integer; mem:string);

var  //Процедура добавления звена в цепочку

Tp: Ppiece;

Begin

if p=nil then //если звено в цепи первое

Begin

New(p);

p^.s:=s;

p^.mem:=mem;

if number=0 then

begin

if s='*' then begin p^.number:=m1; p^.mem:='У'+inttostr(m1); inc(m1); end;

if s='/' then begin p^.number:=m2; p^.mem:='Д'+inttostr(m2); inc(m2); end;

if s='+' then begin p^.number:=m3; p^.mem:='С'+inttostr(m3); inc(m3); end;

if s='-' then begin p^.number:=m4; p^.mem:='В'+inttostr(m4); inc(m4); end;

end else p^.number:=number;

p^.TurnNumber:=1;

p^.next:=nil;

end

else //если в цепи уже есть звенья

Begin

Tp:=p;

While tp^.next<>nil do

tp:=tp^.next;

New(tp^.Next);

Tp:=tp^.next;

tp^.next:=nil;

tp^.s:=s;

tp^.mem:=mem;

if number=0 then

Begin

if s='*' then begin tp^.number:=m1; tp^.mem:='У'+inttostr(m1); inc(m1); end;

if s='/' then begin tp^.number:=m2; tp^.mem:='Д'+inttostr(m2); inc(m2); end;

if s='+' then begin tp^.number:=m3; tp^.mem:='С'+inttostr(m3); inc(m3); end;

if s='-' then begin tp^.number:=m4; tp^.mem:='В'+inttostr(m4); inc(m4); end;

end else tp^.number:=number;

tp^.TurnNumber:=1;

end;

end;

Procedure turn(var p:Ppiece);

var //Процедура выполнения следующего шага

q,start,c:Ppiece;

Begin

start:=p;

While p<>nil do

if p^.next<>nil then

if p^.next^.next<>nil then

Begin

If (p^.next^.next^.s='*') or (p^.next^.next^.s='/') or (p^.next^.next^.s='+') or (p^.next^.next^.s='-') then

If (not((p^.next^.s='*') or (p^.next^.s='/') or (p^.next^.s='+') or (p^.next^.s='-'))) and (not((p^.s='*') or (p^.s='/') or (p^.s='+') or (p^.s='-'))) then

Begin

q:=p^.next^.next;

c:=p^.next;

p.s:=p.s+p^.next^.next^.s+p^.next^.s; //изменение звена с первым операндом

p^.next:=p^.next^.next^.next; //изменения связи звеньев

dispose(q); //удаление звена со знаком

dispose(c); //удаление звена со вторым операндом

p:=p^.next; //переход на следующее звено

end

else

p:=p^.next //переход на следующее звено

else

p:=p^.next; //переход на следующее звено

end else

Begin

p:=start; //возвращение на первое звено

exit;

end

else

p:=p^.next;

p:=start; //возвращение на первое звено

end;

Procedure memolinessearch(s:string);

var //формирование временного ССО

i,cou:integer;

be:boolean;

Begin

be:=false;

cou:=form1.Memo1.Lines.Count;

for i:=0 to cou do

if length(form1.Memo1.Lines[i])>1 then

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
102 Kb
Скачали:
0