Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornye_raboty_asd.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

4 Вихідні дані роботи

Дано рядок з цифрами та літерами, необхідно здійснити перетворення, з цього рядка в такий рядок, таким чином, що всі букви переносяться в початок, при цьому в кінець рядка всі вхідні в неї цифри зі збереженням вихідного взаємного порядку як серед цифр, так і серед решти букв рядка.

Вираз вводиться з вибираного файлу.

Також вираз вводиться з клавіатури.

  1. Хід виконання практичної роботи

У програмі використовується стек, який реалізовано таким чином:

type

tRange = Integer;

tValue = string;

tMas = array[0..MaxMem] of tValue;

tStack = record

Mas: tMas;

Top: tRange;

end;

Опис процедур і функцій:

function CreateStack: tLink;

Призначення: Створення стека.

Параметри: -

function Null (stack: tLink): boolean;

Призначення: Повертає true, якщо стек порожній.

Параметри: stack-посилання на стек [вх.]

function Top (stack: tLink): tValue;

Призначення: Повертає значення верхнього елементу стека.

Параметри: stack-посилання на стек [вх.]

procedure Pop (var stack: tLink);

Призначення: Видаляє верхній елемент стека.

Параметри: stack-посилання на стек [вх. - Вих.]

procedure Push (var stack: tLink; Val: tValue);

Призначення: Додає елемент в стек, який станови-ться верхнім елементом.

Параметри: stack-посилання на стек [вх. - Вих.]; Val-вставляється значення [вх.]

function TopPop (var stack: tLink): tValue;

Призначення: Повертає значення верхнього елементу стека і видаляє його з стека.

Параметри: stack-посилання на стек [вх. - Вих.]

procedure DestroyStack (var stack: tLink);

Призначення: Видаляє стек.

Параметри: stack-посилання на стек [вх. - Вих.]

function Transfer (InputStr: tValue): tValue;

Призначення: функція яка обробляє рядок, ко-торая вводиться в поле введення (InputStr) і виводить в поле виводу (Result).

Параметри: Inpustr [вх.]

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

unit stack2;

interface

uses

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

Dialogs, StdCtrls, Menus, StrUtils, ExtCtrls, MMSystem;

const

MaxMem = 32767;

type

tRange = Integer;

tValue = string;

tMas = array[0..MaxMem] of tValue;

tStack = record

Mas: tMas;

Top: tRange;

end;

TForm1 = class(TForm)

opOpenFile: TOpenDialog;

memInputStr: TMemo;

Label1: TLabel;

memOutputStr: TMemo;

Label2: TLabel;

btnFileOpen: TButton;

procedure memInputStrChange(Sender: TObject);

procedure mmFileOpenClick(Sender: TObject);

private

function CreateStack:tRange;

function Null(stack: tStack):boolean;

function Top(stack: tStack):tValue;

procedure Pop(var stack: tStack);

procedure Push(var stack: tStack; Val:tValue);

function TopPop(var stack: tStack):tValue;

procedure DestroyStack(var stack: tStack);

function Transfer(InputStr: tValue): tValue;

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.CreateStack:tRange;

begin

CreateStack:=-1;

end;

function TForm1.Null(stack: tStack):boolean;

begin

Null:= (stack.Top=-1);

end;

function TForm1.Top(stack: tStack):tValue;

begin

if Null(stack) then

Result:='0'

else

Result:= stack.Mas[stack.Top];

end;

procedure TForm1.Pop(var stack: tStack);

begin

if not Null(stack) then

dec(stack.Top);

end;

procedure TForm1.Push(var stack: tStack; Val:tValue);

begin

with stack do

begin

inc(Top);

Mas[Top]:=Val;

end;

end;

function TForm1.TopPop(var stack: tStack):tValue;

begin

TopPop:=Top(stack);

Pop(stack);

end;

procedure TForm1.DestroyStack(var stack: tStack);

begin

if not Null(stack) then

while not Null(stack) do

Pop(stack);

end;

procedure TForm1.memInputStrChange(Sender: TObject);

begin

memOutputStr.Lines.Clear;

memOutputStr.Lines.Add(Transfer(memInputStr.Lines.Text));

end;

procedure TForm1.mmFileOpenClick(Sender: TObject);

var f: TextFile;

begin

if opOpenFile.Execute then

begin

AssignFile(f,opOpenFile.FileName);

reset(f);

if eof(f) then

ShowMessage('Файл пуст!')

else

begin

memInputStr.Lines.Clear;

memInputStr.Lines.LoadFromFile(opOpenFile.FileName);

end;

end;

end;

function TForm1.Transfer(InputStr: tValue): tValue;

var

i: tRange;

stack1, stack2: tStack;

s2: tValue;

begin

stack1.Top:=CreateStack;

stack2.Top:=CreateStack;

for i:=1 to Length(InputStr) do

if InputStr[i] in ['0'..'9'] then

Push(stack2,InputStr[i])

else if (InputStr[i]<>#13) then

Push(stack1,InputStr[i]);

InputStr:='';

s2:='';

while not Null(stack1) do

InputStr:=InputStr+TopPop(stack1);

InputStr:=AnsiReverseString(InputStr);

while not Null(stack2) do

s2:=s2+TopPop(stack2);

s2:=AnsiReverseString(s2);

DestroyStack(stack1);

DestroyStack(stack2);

Result:=InputStr+s2;

end;

end.

program stack;

uses

Forms,

stack2 in 'stack2.pas' {Form1};

{$R *.res}

begin

Application.Initialize;

Application.MainFormOnTaskbar := True;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.