Академический Документы
Профессиональный Документы
Культура Документы
unit Vector;
interface functionSearchMin(const
uses SysUtils; K:Tkomp):real;
const n=6; //размерность n=6 var i:integer;
type begin
Tkomp=array[1..N] of real result:=K[1];
for i:=2 to n do
procedureInputKomp(var K:Tkomp); if K[i]<result then
procedureOutputKomp(const K:Tkomp); result:=K[i];
functionSearchMax(const end;//SearchMinPos
K:Tkomp):real;
functionSearchMin(const functionScalPr(const
K:Tkomp):real; X,Y:Tkomp):real;
functionScalPr(const vari:integer;
X,Y:Tkomp):real; begin
//проверканавозрастание result:=0;
functionIsRise(const for i:=1 to ndo
K:Tkomp):boolean; result:=result+X[i]*Y[i];
//проверканаубывание end;//ScalPr
functionIsWane(const
K:Tkomp):boolean; functionIsRise(const
K:Tkomp):boolean;
implementation vari:integer;
procedureInputKomp(var K:Tkomp); begin
var i:integer; result:=true;
begin for i:=1 to n-1 do
for i:=1 to ndo if result then
read(K[i]); result:=K[i]<=k[i+1];
readln; end;
end;//InputKomp
functionIsWane(const
procedureOutputKomp(const K:Tkomp); K:Tkomp):boolean;
vari:integer; vari:integer;
begin begin
for i:=1 to ndo result:=true;
write(K[i]:8:2,' '); for i:=1 to n-1 do
writeln; if result then
end;//OutputKomp result:=K[i]>=k[i+1];
end;
functionSearchMax(const
K:Tkomp):real; end.
vari:integer;
begin
result:=K[1];
for i:=2 to ndo
if K[i]>result then
result:=K[i];
end;//SearchMaxPos
program N1;
uses
SysUtils,Windows,
Vector in 'Vector.pas';
var
X,Y,Z:Tkomp;
begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Input(X,Y,Z);
ifIsRise(X) then
Task(X,Y,Z)
elseifIsRise(Y) then
Task(Y,X,Z)
else Task(Z,X,Y);
Readln;
end.
Билет №2. Задача: проверить правильность расстановки скобок трех видов: '(', '{', '[', ')', '}' //и
']'.
//Функция определяет правильность расстановки скобок'(', '{', '[', ')', '}'и ']'
//в выражении _expr
functionRightBracketArrangement(_expr: string): boolean;
var
i, ExprLength: Integer;
OpeningBrackets, ClosingBrackets: set of Char;
bracket: Char;
stack: TStack;
begin
Result:= true;
Init(stack);
ExprLength:= length(_expr);
OpeningBrackets:= ['(', '{', '['];
ClosingBrackets:= [')', '}', ']'];
i:= 1;
bracket:= #0;
while Result and (i<= ExprLength) dobegin
if _expr[i] inOpeningBracketsthen
Push(stack, _expr[i])
elseif _expr[i] inClosingBracketsthen
ifnotTryPop(stack, bracket)
or (_expr[i] <>AccordingClosingBracket(bracket)) then
Result:= false;
inc(i);
end;
Result:= Result andIsEmpty(stack);
end;//RightBracketArrangement
Задача : проверить, является ли дерево деревом поиска.
//модульUNode
unitUNode;
interface
usesComCtrls, Math, SysUtils;
const
MinElem = 1;
MaxElem = 100;
type
TElem = MinElem..MaxElem;
TNode = class
private
FInfo : TElem;
FLeft, FRight :TNode;
protected
procedureSetInfo(const Value: Telem);
public
constructor Create(el : TElem);
procedureAddRandom (el : TElem);// AddOrder / AddRandom
procedureAddOrder(el:TElem);
procedure Show (TV : TTreeView; pn : TTreeNode);
functionIsSearch(var min, max : TElem):boolean;
property Info : Telem read FInfo write SetInfo;
property Left : TNode read FLeft write FLeft;
property Right : TNode read FRight write FRight;
destructor Destroy; override;
end;
implementation
constructorTNode.Create(el: TElem);
begin
FInfo:=el;
FLeft:=nil;
FRight:=nil;
end;
destructorTNode.Destroy;
begin
FLeft.Free;
FRight.Free;
inherited;
end;
procedureTNode.AddRandom(el: TElem);
varrand:Integer;
begin
rand:=RandomRange(1,3); //в каждом узле случайным образом определяем
ifrand=1 then //направление движения
ifFLeft=nilthen //кактолькопришливnil, создаемузел
FLeft:=TNode.Create(el)
else
FLeft.AddRandom(el)
else
ifFRight=nil then
FRight:=TNode.Create(el)
else
FRight.AddRandom(el);
end;
procedureTNode.AddOrder(el: TElem);
begin
if Info > el then
ifFLeft=nil then
FLeft:=TNode.Create(el)
else
FLeft.AddOrder(el)
else
ifFRight=nil then
FRight:=TNode.Create(el)
else
FRight.AddOrder(el);
end;
functionTNode.IsSearch(varmin,max:TElem):Boolean;
varmintmp,maxtmp:TElem;
begin
Result:=true;
min := Info;
max := Info;
ifFLeft<> nil then
if not FLeft.IsSearch(mintmp,maxtmp) or (maxtmp> Info) then
Result := false
else
min := mintmp;
if Result and (FRight<> nil) then
if not FRight.IsSearch(mintmp,maxtmp) or (info >mintmp) then
Result := false
else
max := maxtmp;
end;
unitUTree;
interface
type
TTree = class
private
FRoot : TNode;
public
//создание нового дерева
constructorCreate;
//добавление в дерево элемента el
procedureAddRandom (el : TElem);
//добавление в дерево поиска элемента el
procedureAddOrder(el : TElem);
//проверкадереванапустоту
function IsEmpty : boolean;
//формирование случайного дерева из N элементов
procedureRandom (N :integer);
//формирование случайного дерева поиска из N элементов
procedureRandomSearchTree(N: integer);
//отображениедереванаформе
procedure Show (TV : TTreeView);
//проверяем является ли бинарное дерево деревом поиска
functionIsSearchTree:Boolean;
//очисткадерева
procedure Clear;
destructor Destroy; override;
end;
implementation
{ TTree }
//добавлениевдеревоэлемента el
procedureTTree.AddRandom(el: TElem);
begin
if IsEmpty then
FRoot :=TNode.Create(el)
else
FRoot.AddRandom(el);
end;
//очисткадерева
procedureTTree.Clear;
begin
FreeAndNil(FRoot);
end;
//созданиедерева
constructorTTree.Create;
begin
FRoot:=nil
end;
destructorTTree.Destroy;
begin
Clear;
inherited;
end;
//проверканапустоту
functionTTree.IsEmpty: boolean;
begin
Result:=FRoot=nil;
end;
//отображение дерева
procedureTTree.Show(TV: TTreeView);
begin
TV.Items.Clear;
if not IsEmpty then
FRoot.Show(TV, nil);
TV.FullExpand;
end;
end.
Составить модуль, реализующий следующие операции над векторами:
- ввод и вывод компонент вектора;
- определение порядкового номера минимальной (максимальной) компоненты вектора;
- определение минимальной (максимальной) компоненты вектора;
- вычисление скалярного произведения двух векторов.
Даны два вектора Х и Y размерности n = 6. Используя составленный модуль, вычислить
n∑ xi y i − ∑ xi ∑ y i
(k ∑ )(p∑ )
,
− (∑ xi ) − (∑ y i )
2 2
x i2 y i2
где k – порядковый номер максимальной компоненты вектора Х, p –порядковый номер
минимальной компоненты вектора Y.
Output('Вектор X: ',X);
Output('Вектор Y: ',Y);
writeln('Формула=',(n*ScalarP(X,Y)-ScalarP(X,I)*ScalarP(Y,I))/
(Sqrt((k*ScalarP(X,X)- sqr(ScalarP(X,I)))*(p*ScalarP(Y,Y)-
sqr(ScalarP(Y,I))))));
end.
Задача:Описать процедуру или функцию, которая находит в непустом дереве 𝒕𝒕 количество
вершин уровня 𝒍𝒍𝒍𝒍𝒍𝒍𝒍𝒍𝒍𝒍. Корень взять за элемент 1-го уровня.
//UNode.pas
interface
const
MinElem = 0;
MaxElem = 20;
type
TElem = MinElem..MaxElem;
TNode = class
private
FInfo:TElem;
FLeft, Fright:TNode;
public
//поиск количества элементов на заданном уровне дерева
function CountOnLevel(depth:integer):integer;
property Info:TElem read FInfo write FInfo;
property Left:TNode read FLeft write FLeft;
property Right:TNode read FRight write FRight;
...
end;
implementation
...
//поиск количества элементов на заданном уровне дерева
function TNode.CountOnLevel(depth:integer):integer;
begin
if (depth = 1) then
result:=1
else
begin
result:=0;
if (Left <> nil) then
result:=result + Left.CountOnLevel(depth-1);
if (Right <> nil) then
result:=result + Right.CountOnLevel(depth-1);
end
end;
end.
//UTree.pas
interface
type
TTree = class
private
FRoot:TNode;
public
//рекурсивно
function CountOnLevel(level:integer):integer;
//итеративно
function CountOnLevelIteratively(level:Integer):integer;
end;
implementation
//рекурсивно
function TTree.CountOnLevel(level:integer):integer;
begin
result:=0;
if (FRoot<>nil) and (level>0) then
result:=FRoot.CountOnLevel(level);
end;
//итеративно
function TTree.CountOnLevelIteratively(level:Integer):integer;
var
queue:TQueue;
node:TNode;
cnt_cur, cnt_next , depth:integer;
i:integer;
begin
result:=0;
if (FRoot<>nil) then begin
queue:=TQueue.Create;
queue.Push(FRoot);
depth:=1; //глубина, на которую мы забрались
cnt_cur := 1; //число элементов на текущем уровне
while (queue.Count>0) and (depth<level) do begin
cnt_next:=0; //число элементов на следующем уровне
for i:=1 to cnt_cur do begin
node:=queue.Pop; //вытаскиваем первый элемент
из дерева
if (node.Left<>nil) then begin
queue.Push(node.Left);
inc(cnt_next);
end;
if (node.Right<>nil) then begin
queue.Push(node.Right);
inc(cnt_next)
end;
end;
Inc(depth);
cnt_cur:=cnt_next;
end;
result:=cnt_cur;
queue.Free;
end
end;
Задача: Разработать модуль для реализации операций с комплексными числами.
Вычислить значение комплексной функции в заданной комплексной точке z при
заданном значении n
unit Complex;
interface
type
re,im: real;
end;
function InitComplex;
begin
result.re := ARe;
result.im := AIm;
end;
procedure ReadComplex;
begin
readln (z.re);
readln(z.im);
end;
procedure WriteComplex;
begin
with z do
write('0')
else
begin
if re<>0 then
write(re:2:2);
if im<>0 then
begin
write('+');
write(im:2:2,'i')
end;
end;
writeln;
end;
function AddComplex;
begin
result.re:=x.re+y.re;
result.im:=x.im+y.im;
end;
function SubComplex;
begin
result.re:=x.re-y.re;
result.im:=x.im-y.im;
end;
function MultComplex;
begin
result.re:=x.re*y.re-x.im*y.im;
result.im:=x.re*y.im+x.im*y.re;
result:=result;
end;
function DivComplexByNum;
begin
if n<>0 then
begin
result.re:=z.re/n;
result.im:=z.im/n;
end;
end;
function AbsComplex;
begin
result:=sqrt(z.re*z.re+z.im*z.im);
end;
function ExpComplex;
var i: integer;
a,z2,sum:TComplex;
begin
i:=1;
sum:=InitComplex(1,0);
a:=InitComplex(1,0);
z2:=z;
while AbsComplex(a)>eps do
begin
a:=DivComplexByNum(MultComplex(a,z2),+i*i);
sum:=AddComplex(sum,a);
i:=i+1;
end;
result:=sum;
end;
end.
Задача:
В арифметическое выражение входят:
- переменные;
- целые числа;
- знаки '+', '–', '*', '/';
- скобки '(', ')'.
Вычислить значение арифметического выражения, хранящегося в постфиксной записи.
// Поискпервогоподходящегослова
functionSearchFirstWord(var Q: TQueue; varfirstWord: string): boolean;
begin
repeat
result := TryPop(Q, firstWord);
untilnotConsonantsMoreThanVowels(firstWord) or not result;
end;
unit UNode;
interface
const
MinElem = 0;
MaxElem = 10;
type
TElem = MinElem..MaxElem;
TNode = class
private
FInfo: TElem;
FLeft, FRight: TNode;
Public
constructor Create(el: TElem);
destructor Destroy; override;
procedure AddRnd(el: TElem);
procedure Show(TV: TTreeView; pn: TTreeNode);
function CountElem (el: TElem): Integer;
end;
implementation
//конструктор
constructor TNode.Create(el: TElem);
begin
FInfo := el;
FLeft := nil;
FRight := nil;
end;
//удаление узла
destructor TNode.Destroy;
begin
if FLeft <> nil then
FLeft.Destroy;
if FRight <> nil then
FRight.Destroy;
inherited;
end;
//показ узла
procedure TNode.Show(TV: TTreeView; pn: TTreeNode);
var
node: TTreeNode;
begin
node := TV.Items.AddChild(pn, IntToStr(FInfo));
if (FLeft <> nil) or (FRight <> nil) then
begin
if FLeft = nil then
TV.Items.AddChild(node, 'x')
else
FLeft.Show(TV, node);
if FRight = nil then
TV.Items.AddChild(node, 'x')
else
FRight.Show(TV, node);
end;
end;
end.
unit UTree;
interface
type
TTree = class
private
FRoot: TNode;
public
//конструктор
constructor Create;
//деструктор
destructor Destroy; override;
//очистка дерева
procedure Clear;
//проверка на пустоту
function IsEmpty: boolean;
//добавление узла
procedure AddRandom(el: TElem);
//заполнение случайным образом
procedure Random (N: integer);
//показ дерева
procedure Show (TV: TTreeView);
//подсчет количества вхождений элемента в дерево
function CountElem (el: TElem): Integer;
function CountElemIter(el: TElem): Integer;
end;
implementation
//конструктор
constructor TTree.Create;
begin
FRoot := nil
end;
//деструктор
destructor TTree.Destroy;
begin
Clear;
inherited;
end;
//очистка
procedure TTree.Clear;
begin
FreeAndNil(FRoot)
end;
//проверка на пустоту
function TTree.IsEmpty: boolean;
begin
Result := FRoot = nil
end;
//добавление узла
procedure TTree.AddRandom(el: TElem);
begin
if IsEmpty then
FRoot := TNode.Create(el)
else
FRoot.AddRnd(el);
end;
// Показ дерева
procedure TTree.Show(TV: TTreeView);
begin
TV.Items.Clear;
if not IsEmpty then
FRoot.Show(TV, nil);
TV.FullExpand;
end;
end.
//объявление очереди
type
TElem = string;
TPtr = ^TNote;
TNote = record
inf: TElem;
next: TPtr;
end;
TQueue = record
head, tail: TPtr;
end;
//основная задача
procedure Main(var Q1,Q2: TQueue);
begin
Process(Q1,Q2);
ClearQueue(Q1);
ClearQueue(Q2);
end;
Задача: Проверить, что элементы данного дерева встречаются в нем еще хотя бы
один раз.
begin
Result:=ch in ['0'..'9'];
end;
begin
letters:=['a'..'z', 'A'..'Z'];
Result:=ch in letters;
end;
begin
len:=Length(buf);
inc(i);
end;
ok: boolean;
begin
len:=length(buf);
exprPos:=i;
ok:=true;
ok:=false
else
inc(i);
end;
end;
ok: boolean;
begin
len:=length(buf);
numPos:=i;
ok:=true;
begin
ok:=false
else
inc(i);
end;
end;
ok: boolean;
s: TStack;
begin
ok:=true;
len:=Length(buf);
i:=1;
Result:=-1;
Init(s);
begin
case buf[i] of
'~':
begin
Result:=i;
ok:=false;
end
else
begin
Push(s, '('+'-'+lEl+')');
inc(i);
end;
'+', '-', '*', '/':
begin
Result:=i;
ok:=false;
end
else
begin
Push(s, '('+fEl+buf[i]+lEl+')');
inc(i);
end;
else //case
begin
Result:=i;
ok:=false;
end;
end;
end;
if Result = -1 then
infix:=lEl
else
Result:=i;
Clear(s);
end;
interface
uses Dialogs;
const
MaxN=1000;
type
TElem=string;
TMas=array[1..MaxN] of TElem;
TStack=record
mas: TMas;
top: integer;
end;
{Инициализация стека}
{Проверка на пустоту}
{Проверка на заполненность}
{Очистить стек}
implementation
{Инициализация стека}
procedure Init(var s: TStack);
begin
s.top:=0;
end;
{Проверка на пустоту}
begin
Result:=s.top=0;
end;
{Проверка на заполненность}
begin
Result:=s.top=MaxN;
end;
begin
begin
inc(s.top);
s.mas[s.top]:=el;
end
else
end;
begin
Result:=s.mas[s.top];
dec(s.top);
end
else
end;
begin
begin
el:=s.mas[s.top];
dec(s.top);
Result:=true;
end
else
Result:=false;
end;
{Очистить стек}
begin
Pop(s);
end;
end.
Задача:Дан текст, сбалансированный по круглым скобкам. Требуется для
каждой пары соответствующих открывающей и закрывающей скобок
напечатать номера их позиций в тексте, упорядочив пары номеров в
порядке возрастания номеров позиций открывающих скобок.
{
TElem=record
open_index:integer;
close_index:integer
end;
всеф-ииизмодуля UStack_list?
}
unitmain;
uses
UStack, SysUtils;
type
TKindError = (keNone, keOpen, keClose);
implementation
//проверка стека на сбалансированность скобок
functionisBracketMissed(s1,s2:TStack):TKindError;
var
el:TElem;
begin
result:=keNone;
whilenotIsEmpty(s1) and not ((result=keOpen) or (result=keClose)) do
begin
el:=Pop(s1);
ifel.open_index = 0 then result:=keOpen;
ifel.close_index = 0 then result:=keClose;
Push(s2,el)
end;
Move(s2,s1)
end;
var
s_main, s_help:TStack;
index:integer;
elem:TElem;
isFound:boolean;
begin
Init(s_main);
Init(s_help);
index:=1;
result:=keNone;
while (index <= length(str)) dobegin
isFound:=false;
while (index<=length(str)) and (str[index]<>'(') and (str[index]<>')')
do
inc(index);
ifstr[index]='(' thenbegin
Element(elem);
elem.open_index:=index;
Push(s_main,elem)
end;
ifstr[index]=')' thenbegin
repeat
ifnotTryPop(s_main,elem) then
result:=keOpen
elsebegin
ifelem.close_index=0 thenbegin
isFound:=true;
elem.close_index:=index;
Push(s_main,elem)
end
else
Push(s_help,elem)
end
untilIsEmpty(s_main) orisFound;
ifnotisFoundandIsEmpty(s_main) then
result:=keOpen;
Move(s_help,s_main);
end;
inc(index)
end;
if result<>keOpenthen
result:=isBracketMissed(s_main,s_help);
if result=keNonethen
SL:=PrintResultToStr(s_main,s_help)
end;
//где-то в главной процедуре (в лабах – btnOKClick)
error:=OpenBracketIndex(Text.Text,tmp);
case error of
keOpen: MessageDlg('Нехватаетоткрывающейскобки!', mtError, [mbOk], 0);
keClose: MessageDlg('Не хватает закрывающей скобки!', mtError, [mbOk],
0);
elseResultText.Text:=tmp
end
end.
Задача: Напечатать обращенные строки файла в обратном порядке.
uses
SysUtils,UStack_list, StackUtils;
{Типошибки}
type
TKindError=(keNone, keOpen, keClose);
{Расшифровкаошибки}
const
TextError :array[TKindError] ofstring = ('','Не хватает
открывающихся скобок','Не хватает закрывающихся скобок');
MoveAll(Stack,TmpStack);
MoveAll(TmpStack,Stack);
while (Result=keNone) and (not IsEmpty(Stack)) dobegin
Pop(Stack, el);
if (el.TOpen<>0) then
SL.Add(IntToStr(el.TOpen)+' - '+IntToStr(el.TClose))
elsebegin
result:=keOpen;
SL.Clear;
end;
end;
ClearStack(Stack);
ClearStack(TmpStack);
end;{Process}
Посчитать число листьев (терминальных end.
элементов) в заданном двоичном дереве
unit UNode;
interface unit UTree;
uses ComCtrls, Math, SysUtils, interface
Contnrs; uses ComCtrls, Math, SysUtils,
const UNode, Contnrs;
MinElem = 0; type
MaxElem = 20; TTree = class
private
type FRoot : TNode;
TElem = MinElem..MaxElem; public
TNode = class constructor Create;
public procedure Clear;
FInfo : TElem; //или в private со function IsEmpty : boolean;
свойствами procedure Random (N : integer);
FLeft, FRight : TNode; function FindLeaf():integer;
//создание с nil destructor Destroy; override;
constructorCreate(el : TElem = 0); end;
//создание очереди с N
элементов implementation
constructor Random (n : integer); constructor TTree.Create;
function FindLeaf():integer begin
destructor Destroy; override; FRoot:=nil
end; end;
const N = 100;
var
Name : array [1..N] of string;
Children : array [1..N, 1..N] of Boolean;
…
procedure GetAllChildren (k : integer);
var
q1, q2 : TQueue;
j : integer;
s : set of 1..N;
begin
Init(q1);
Init(q2);
writeln(Name[k]);
Push(q1, k);
s := [k];
while not IsEmpty(q1) do
begin
while not IsEmpty(q1) do
begin
k := Pop(q1);
for j:= 1 to N do
if Children[k, j] and not (j in s) then
begin
write (Name[j], ' ');
s := s + [j];
Push(q2, j);
end;
end;
writeln;
while not IsEmpty(q2) do
Push(q1, Pop(q2));
end;
end;
Задача №21. Определить высоту заданного двоичного дерева.
//рекурсивно
function TNode.Height : integer;
var
l, r: integer;
begin
if self= nil then
result:=0
else
begin
l:=Left.Height;
r:=Right.Height;
if l > r then
result := l + 1
else
result := r + 1
end
end;
//итеративно
function TTree.HeightIter : integer;
var Q: TQueue;
n, n_new: integer;
t: TNode;
begin
result:=0;
if FRoot<>nil then
begin
Q:=TQueue.Create;
Q.Push(FRoot);
n:=1;
while (Q.Count > 0) do
begin
inc(Result);
n_new:=0;
while (n>0) do
begin
t:=Q.Pop;
dec(n);
if t.Left <> nil then
begin
Q.Push(t.Left);
inc(n_new);
end;
if t.Right <> nil then
begin
Q.Push(t.Right);
inc(n_new);
end;
end;
n:=n_new;
end;
Q.Free;
end;
end;
Задача:
Даны два стека, содержащие целые числа (считать, что все числа различны).
Напечатать максимальное и минимальное числа, восстановив при этом содержимое
стеков. Не использовать дополнительные структуры данных, кроме набора
переменных.
type
SetChar = set of Char;
…
{Решение задачи}
function ProcessStr (str : string) : string;
const
punkt_marks= [',','.','?','!','"'];
var
bufer: TQueue;
i : integer;
ch: char;
begin
Init(bufer);
Result:='';
while TryPop(bufer,ch) do
Result:=Result+ch;
end;
unit UQueue;
interface
const
N=100;
type
TElem=Char;
TMas=array[0..N-1] of TElem;
TQueue=record
mas: TMas;
head, count: Integer;
end;
implementation
procedure Init;
begin
Q.head:=0;
Q.count:=0;
end;
function IsEmpty;
begin
result:=Q.count=0;
end;
function IsFull;
begin
result:=Q.count=N;
end;
function TryPop;
begin
if not IsEmpty(Q) then
with Q do
begin
el:=mas[head];
head:=(head+1)mod N;
dec(count);
result:=true
end
else
result:=False;
end;
function TryPush;
var
tail: Integer;
begin
result:=not IsFull(Q);
if Result then
with Q do
begin
tail:=(head+count)mod N;
mas[tail]:=el;
inc(count);
end;
end;
end.