Федеральное Агентство по образованию
Государственное образовательное учреждение высшего профессионального образования Московский Государственный Университет
Приборостроения и Информатики филиал в г. Сергиев Посад
Кафедра ИТ-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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.