close

Вход

Забыли?

вход по аккаунту

?

Отчет по Lab 1 ОС

код для вставкиСкачать
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное Учреждение высшего профессионального образования
"Рязанский государственный радиотехнический университет"
Кафедра ЭВМ
Отчет О лабораторной работе №1
"Создание многопоточных программ в среде Delphi и исследование свойств потоков"
Выполнил: ст. гр. 142
Никифоров М.С. Проверил:
Засорин С.В.
Рязань 2013 г.
Приложение 1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Timer1: TTimer;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Execute1;
procedure Execute2;
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Count1, Count2: Integer;
ThreadID1, ThreadID2: DWORD;
HThread1, HThread2: THandle;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
HThread1 := CreateThread(nil, 0, @TForm1.Execute1, nil, 0, ThreadID1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
HThread2 := CreateThread(nil, 0, @TForm1.Execute2, nil, 0, ThreadID2);
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
SetThreadPriority(HThread1, TrackBar1.Position);
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
SetThreadPriority(HThread2, TrackBar2.Position);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Edit1.Text := IntToStr(Count1); Count1 := 0;
Form1.Edit2.Text := IntToStr(Count2); Count2 := 0;
end;
procedure TForm1.Execute1;
var i, Total, Avg: Integer;
begin
while True do
begin
Total := 0;
for i:=1 to 10 do inc(Total, Random(MaxInt));
Avg := Total div 10;
Inc(Count1);
end;
end;
procedure TForm1.Execute2;
var i, Total, Avg: Integer;
begin
while True do
begin
Total := 0;
for i:=1 to 10 do inc(Total, Random(MaxInt));
Avg := Total div 10;
Inc(Count2);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
end.
Рисунок 1 - Форма для работы с приложением 1.
Рисунок 2 - работа приложения, минимальные приоритеты потоков.
Рисунок 3 - максимальные приоритеты потоков.
Приложение 2.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Thread;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button3: TButton;
Timer1: TTimer;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
Thread1, Thread2: TSimpleThread;
end;
var
Form1: TForm1;
Count1, Count2: Integer;
ThreadID1, ThreadID2: DWORD;
HThread1, HThread2: THandle;
implementation
{$R *.dfm}
procedure TForm1.TrackBar1Change(Sender: TObject);
var i: Integer;
Priority: TThreadPriority;
begin
Priority := tpLowest;
for i:=0 to (Sender as TTrackBar).Position-1 do
Inc(Priority);
if Sender = TrackBar1
then Thread1.Priority := Priority
else Thread2.Priority := Priority;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
TrackBar1.OnChange(Sender);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Edit1.Text := IntToStr(Thread1.Count); Thread1.Count := 0;
Form1.Edit2.Text := IntToStr(Thread2.Count); Thread2.Count := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Thread1 := TSimpleThread.Create(False);
Thread1.Priority := tpLowest;
Thread2 := TSimpleThread.Create(False);
Thread2.Priority := tpLowest;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
end.
unit Thread;
interface
uses
Classes;
type
TSimpleThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
Count: Integer;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TSimpleThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TSimpleThread }
procedure TSimpleThread.Execute;
var i, Total, Avg: Integer;
begin
while True do
begin
Total := 0;
for i:=1 to 10 do inc(Total, Random(MaxInt));
Avg := Total div 10;
Inc(Count);
end;
end;
end.
Рисунок 4 - работа приложения при низких приоритетах потоков.
Рисунок 5 - работа приложения при высоких приоритетах потоков.
Приложение 3
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, MoveThread;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
PaintBox2: TPaintBox;
PaintBox3: TPaintBox;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure ButtonClickHandle(Sender: TObject);
procedure TrackBarChange(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
Thread: array[1..3] of TMoveThread;
PaintBox: array[1..3] of TPaintBox;
TrackBar: array[1..3] of TTrackBar;
Button: array[1..3] of TButton;
Taxi00, Taxi01: TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
for i:=1 to 3 do
begin
Button[i] := TButton(FindComponent('Button' + IntToStr(i)));
PaintBox[i] := TPaintBox(FindComponent('PaintBox' + IntToStr(i)));
TrackBar[i] := TTrackBar(FindComponent('TrackBar' + IntToStr(i)));
Button[i].Tag := i;
TrackBar[i].Tag := i;
Button[i].OnClick := ButtonClickHandle;
TrackBar[i].OnChange := TrackBarChange;
end;
end;
procedure TForm1.ButtonClickHandle(Sender: TObject);
var i: Integer;
begin
i := (Sender as TButton).Tag;
if Thread[i].Suspended = True then
begin
Thread[i].Resume;
Button[i].Caption := 'Stop';
end
else if Thread[i].Suspended = False then
begin
Thread[i].Suspend;
Button[i].Caption := 'Start';
end;
end;
procedure TForm1.TrackBarChange(Sender: TObject);
var Priority: TThreadPriority;
i, k: Integer;
begin
k := (Sender as TTrackBar).Tag;
Priority := tpIdle;
for i:=0 to ((Sender as TTrackBar).Position-1) do Inc(Priority);
Thread[k].Priority := Priority;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Taxi00.Free;
Taxi01.Free;
end;
procedure TForm1.FormShow(Sender: TObject);
var Taxi00, Taxi01: TBitmap;
i: Integer;
begin
Taxi00 := TBitmap.Create;
Taxi01 := TBitmap.Create;
Taxi00.LoadFromFile('mashinki mal 21.bmp');
Taxi01.LoadFromFile('mashinki mal 2.bmp');
for i:=1 to 3 do
begin
Thread[i] := TMoveThread.Create(Taxi00, Taxi01, PaintBox[i]);
Thread[i].Priority := tpIdle;
end;
end;
end.
unit MoveThread;
interface
uses
Classes, Graphics, ExtCtrls, SysUtils;
type
TMoveThread = class(TThread)
private
FBox: TPaintBox;
b0, b1: TBitmap;
i: Integer;
procedure DoVisualSwap;
procedure DoVisual;
protected
procedure Execute; override;
public
constructor Create(a,b: TBitmap; c:TPaintBox);
destructor Destroy; override;
end;
implementation
constructor TMoveThread.Create(a,b: TBitmap; c:TPaintBox);
begin
b0:=a; b1:=b; FBox:=c; i:=0;
inherited Create(True);
Priority:=tpIdle;
end;
destructor TMoveThread.Destroy;
begin
b0.Free; b1.Free; FBox.Free;
inherited Destroy;
end;
procedure TMoveThread.DoVisualSwap;
begin
FBox.Canvas.Draw(i,0,b0);
Inc(i);
end;
procedure TMoveThread.DoVisual;
begin
FBox.Canvas.Draw(i,0,b1);
Dec(i);
end;
procedure TMoveThread.Execute;
begin
while True do
begin
while i<=(FBox.Width-b0.Width) do Synchronize(DoVisualSwap);
while i>=(0+b0.Width) do Synchronize(DoVisual);
Sleep(10); //Опционально
end;
end;
end.
Рисунок 6 - Форма для работы с приложением 3.
Рисунок 7 - Пользовательский интерфейс приложения 3.
Клавиатурный тренажер
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Unit3;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
TrackBar1: TTrackBar;
Label3: TLabel;
Button3: TButton;
Timer1: TTimer;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
GroupBox2: TGroupBox;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure TrackBar1Change(Sender: TObject);
private
{ Private declarations }
public
Win: Integer;
Fail: Integer;
FallThread: array [1..3] of TFallThread;
procedure Scores(Guess: Boolean);
end;
var
Form1: TForm1;
Level:Integer;
Start:Boolean;
implementation
{$R *.dfm}
{Begin/Pause/Resume training}
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
if Button1.Caption = 'Начать' then
begin
for i:=1 to Level do
begin
FallThread[i] := TFallThread.Create(Image1, i);
FallThread[i].Priority := tpLowest;
end;
Start:=True;
RadioButton1.Enabled:=False;
RadioButton2.Enabled:=False;
RadioButton3.Enabled:=False;
Win:=0;
Fail:=0;
Button1.Caption := 'Пауза';
end
else if Button1.Caption = 'Пауза' then
begin
for i:=1 to Level do
FallThread[i].Suspend;
Start:=False;
Button1.Caption := 'Продолжить';
end
else if Button1.Caption = 'Продолжить' then
begin
for i:=1 to Level do
FallThread[i].Resume;
Start:=True;
Button1.Caption := 'Пауза'; end;
end;
{Stop training}
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
for i:=1 to Level do
if Assigned(FallThread[i]) then
FallThread[i].Terminate;
Start:=False;
RadioButton1.Enabled:=True;
RadioButton2.Enabled:=True;
RadioButton3.Enabled:=True;
Button1.Caption := 'Начать';
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
end;
{Exit program}
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
{Time elapsed}
procedure TForm1.Timer1Timer(Sender: TObject);
var i:Integer;
begin
if Start=True then
begin
for i:=1 to Level do
if Assigned(FallThread[i]) then
FallThread[i].ThreadDone := False;
end;
end;
{Exit Program, Destroy Threads}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i:Integer;
begin
for i:=1 to 1 do
if Assigned(FallThread[i]) then
FallThread[i].Terminate;
end;
{Initialize}
procedure TForm1.FormShow(Sender: TObject);
begin
RadioButton1.Checked := True;
RadioButton4.Checked := True;
Level:=1;
Start:=False;
TrackBar1.Position := 1;
Image1.Canvas.Brush.Color := ClWhite;
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Level:=1;
Form1.Caption := 'Level' + IntToStr(Level);
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Level:=2;
Form1.Caption := 'Level' + IntToStr(Level);
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
Level:=3;
Form1.Caption := 'Level' + IntToStr(Level);
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var i:Integer;
begin
if Start=True then
begin
for i:=1 to Level do
begin
if FallThread[i].ThreadLetter = Key then
begin
FallThread[i].NewLetter;
Scores(True);
Exit;
end;
end;
Scores(False);
end;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Timer1.Interval := 200 - TrackBar1.Position*70;
end;
procedure TForm1.Scores(Guess: Boolean);
begin
if Guess then
begin
Inc(Win);
Label1.Caption:='Угадано: '+IntToStr(Win);
end
else
begin
Inc(Fail);
Label2.Caption:='Ошибки: '+IntToStr(Fail);
end;
end;
end.
Рисунок 8 - окно при запуске приложения. Рисунок 9 - запуск тренажера.
Лабиринт
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ComCtrls, StdCtrls, Buttons, DBGrids, AxCtrls, OleCtrls,
VCF1, ImgList, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
UpDown1: TUpDown;
Label2: TLabel;
Edit2: TEdit;
UpDown2: TUpDown;
DrawGrid1: TDrawGrid;
SButton1: TSpeedButton;
SButton3: TSpeedButton;
SButton2: TSpeedButton;
SButton4: TSpeedButton;
FindButton: TButton;
ClearButton: TButton;
ImageList1: TImageList;
Timer1: TTimer;
ResetButton: TButton;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure SButton1Click(Sender: TObject);
procedure SButton2Click(Sender: TObject);
procedure SButton3Click(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SButton4Click(Sender: TObject);
procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure FindButtonClick(Sender: TObject);
procedure ResetButtonClick(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
EditMode: byte;
ar: array[-1..20, -1..20] of integer;
m, n, StartX, StartY, FinX, FinY: integer;
implementation
{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject);
begin
DrawGrid1.ColCount:=strtoint(Edit1.Text);
m:=strtoint(Edit1.Text);
ClearButtonClick(Form1);
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
DrawGrid1.RowCount:=strtoint(Edit2.Text);
n:=strtoint(Edit2.Text);
ClearButtonClick(Form1);
end;
procedure TForm1.SButton1Click(Sender: TObject);
begin
EditMode:=1;
end;
procedure TForm1.SButton2Click(Sender: TObject);
begin
EditMode:=2;
end;
procedure TForm1.SButton3Click(Sender: TObject);
begin
EditMode:=3;
end;
procedure TForm1.SButton4Click(Sender: TObject);
begin
EditMode:=0;
end;
procedure TForm1.ClearButtonClick(Sender: TObject);
var
i, j: integer;
begin
for i:=0 to 20 do
for j:=0 to 20 do
ar[i,j]:=0;
StartX:=0;
StartY:=0;
FinX:=1;
FinY:=1;
ar[FinX,FinY]:=1;
DrawGrid1.Canvas.Rectangle(-1,-1,DrawGrid1.Width-1,DrawGrid1.Height-1);
ImageList1.Draw(DrawGrid1.Canvas,StartX*25+5,StartY*25+5,0);
ImageList1.Draw(DrawGrid1.Canvas,FinX*25+5,FinY*25+50,2);
DrawGrid1.Repaint;
SButton1.Enabled:=true;
SButton2.Enabled:=true;
SButton3.Enabled:=true;
SButton4.Enabled:=true;
ResetButton.Enabled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
m:=10;
n:=10;
EditMode:=0;
DrawGrid1.Canvas.Brush.Color:=clWhite;
DrawGrid1.Canvas.Brush.Style:=bsSolid;
ClearButtonClick(Form1);
end;
procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if (ACol=StartX) and (ARow=StartY)
then exit;
if (ACol=FinX) and (ARow=FinY)
then exit;
case EditMode of
0: begin
ar[ACol, ARow]:=0;
DrawGrid1.Canvas.Rectangle(ACol*25-1,ARow*25-1,ACol*25+25,ARow*25+25);
end;
1: begin
ar[ACol, ARow]:=0;
DrawGrid1.Canvas.Rectangle(StartX*25-1,StartY*25-1,StartX*25+25,StartY*25+25);
StartX:=ACol;
StartY:=ARow;
DrawGrid1.Canvas.Rectangle(ACol*25-1,ARow*25-1,ACol*25+25,ARow*25+25);
ImageList1.Draw(DrawGrid1.Canvas,ACol*25+5,ARow*25+5,0);
end;
2: begin
ar[FinX,FinY]:=0;
ar[ACol, ARow]:=1;
DrawGrid1.Canvas.Rectangle(FinX*25-1,FinY*25-1,FinX*25+25,FinY*25+25);
FinX:=ACol;
FinY:=ARow;
DrawGrid1.Canvas.Rectangle(ACol*25-1,ARow*25-1,ACol*25+25,ARow*25+25);
ImageList1.Draw(DrawGrid1.Canvas,ACol*25+5,ARow*25+5,1);
end;
3: begin
ar[ACol, ARow]:=-1;
DrawGrid1.Canvas.Rectangle(ACol*25-1,ARow*25-1,ACol*25+25,ARow*25+25);
ImageList1.Draw(DrawGrid1.Canvas,ACol*25+5,ARow*25+5,2);
end;
end;
DrawGrid1.Repaint;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ImageList1.Draw(DrawGrid1.Canvas,StartX*25+5,StartY*25+5,0);
ImageList1.Draw(DrawGrid1.Canvas,FinX*25+5,FinY*25+5,1);
end;
procedure TForm1.FindButtonClick(Sender: TObject);
var
k, i, j: integer;
begin
for k:=1 to 150 do
for i:=0 to m-1 do
for j:=0 to n-1 do
if ar[i,j]>0
then begin
if ar[i-1,j]=0 then ar[i-1,j] := ar[i,j]+1;
if ar[i+1,j]=0 then ar[i+1,j] := ar[i,j]+1;
if ar[i,j-1]=0 then ar[i,j-1] := ar[i,j]+1;
if ar[i,j+1]=0 then ar[i,j+1] := ar[i,j]+1;
end;
if ar[StartX,StartY]=0
then begin
showmessage('Маршрут до цели отсутствует');
ResetButtonClick(Form1);
end
else begin
i:=StartX;
j:=StartY;
repeat
if (ar[i-1,j]<ar[i,j]) and (i>0) and (ar[i-1,j]>0)
then begin
if (i<>StartX) or (j<>StartY)
then ImageList1.Draw(DrawGrid1.Canvas,i*25+5,j*25+5,3);
dec(i);
end;
if (ar[i+1,j]<ar[i,j]) and (i<m-1) and (ar[i+1,j]>0)
then begin
if (i<>StartX) or (j<>StartY)
then ImageList1.Draw(DrawGrid1.Canvas,i*25+5,j*25+5,4);
inc(i);
end;
if (ar[i,j-1]<ar[i,j]) and (j>0) and (ar[i,j-1]>0)
then begin
if (i<>StartX) or (j<>StartY)
then ImageList1.Draw(DrawGrid1.Canvas,i*25+5,j*25+5,5);
dec(j);
end;
if (ar[i,j+1]<ar[i,j]) and (j<n-1) and (ar[i,j+1]>0)
then begin
if (i<>StartX) or (j<>StartY)
then ImageList1.Draw(DrawGrid1.Canvas,i*25+5,j*25+5,6);
inc(j);
end;
SButton1.Enabled:=false;
SButton2.Enabled:=false;
SButton3.Enabled:=false;
SButton4.Enabled:=false;
EditMode:=10;
ResetButton.Enabled:=true;
until ar[i,j]=1;
end;
end;
procedure TForm1.ResetButtonClick(Sender: TObject);
var
i, j: integer;
begin
SButton1.Enabled:=true;
SButton2.Enabled:=true;
SButton3.Enabled:=true;
SButton4.Enabled:=true;
ResetButton.Enabled:=false;
for i:=0 to m-1 do
for j:=0 to n-1 do
if ar[i,j]>1
then begin
DrawGrid1.Canvas.Rectangle(i*25-1,j*25-1,i*25+25,j*25+25);
ar[i,j]:=0;
end
else
if ar[i,j]=-1
then ImageList1.Draw(DrawGrid1.Canvas,i*25+5,j*25+5,2);
ImageList1.Draw(DrawGrid1.Canvas,StartX*25+5,StartY*25+5,0);
EditMode:=0;
SButton4.Down:=true;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
DrawGrid1.Repaint;
end;
end.
Рисунок 10 - окно приложения, после успешной загрузки лабиринта.
Рисунок 11 - поиск возможных маршрутов движения.
Рисунок 12 - движение лягушки по лабиринту, путь найден.
1
Документ
Категория
Рефераты
Просмотров
35
Размер файла
310 Кб
Теги
lab, отчет
1/--страниц
Пожаловаться на содержимое документа