Объекты - списки unit list; interface type telem = class public p: telem; s: integer;...

17
Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum: integer; end;

Upload: howard-york

Post on 18-Jan-2016

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Объекты - списки

unit List;

interface

type TElem = class

public

p: TElem;

s: integer;

constructor Create(r: TElem);

function Len: integer;

function Sum: integer;

end;

Page 2: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Объекты - списки

implementation constructor TElem.Create(r: TElem); begin inherited Create; p:=r; end; function TElem.Len: integer; begin if p = nil then Result := 1 else Result := 1 + p.Len; end; function TElem.Sum: integer; begin if p = nil then Result := s else Result := s + p.Sum; end;end.

Page 3: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Объекты – списки (вариант 2)

function TElem.Len: integer; var p1: TElem; d:integer; begin d:=1; p1:=p; while p<>nil do begin d:=d+1; p1:=p1+1 end; Result:=d end; function TElem.Sum: integer; var p1: TElem; d:integer; begin d:=s; p1:=p; while p<>nil do begin d:=d+p.s; p1:=p1+1 end; Result:=d end;

Page 4: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Формирование списка

program TestList;{$APPTYPE CONSOLE}Uses List;var p1, p2: TElem; i, n: integer;

begin readln(n); p1 := nil; for i := 1 to n do begin p1 := TElem.Create(p1); readln(p1.s) end; writeln('len = ',p1.Len); writeln('sum = ',p1.Sum);. . .

Page 5: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Вывод и уничтожение списка

p2 := p1; while p2 <> nil do begin write(p2.s:8); p2 := p2.p end; writeln; p2 := p1; while p2 <> nil do begin p2 := p2.p; p1.Destroy; p1 := p2; end; readlnend.

Page 6: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Списки: наследование и полиморфизм

unit List2; interface type TElem = class public p: TElem; function Len: integer; end; TElemI = class(TElem) public s: integer; function Sum: integer; end; TElemR = class(TElem) public s: real; function Sum: real; end;

Page 7: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Списки: наследование и полиморфизм

implementation function TElem.Len: integer; begin if p = nil then Result := 1 else Result := 1 + p.Len; end; function TElemI.Sum: integer; begin if p = nil then Result := s else Result := s + (p as TElemI).Sum; end; function TElemR.Sum: real; begin if p = nil then Result := s else Result := s + (p as TElemR).Sum; end;end.

Page 8: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Формирование списка (тип TElemI)

program TestList2;{$APPTYPE CONSOLE}uses List2;var p1, p2: TElemI; i, n: integer;begin readln(n); p1 := nil; for i := 1 to n do begin p2 := TElemI.Create; p2.p := p1; readln(p2.s); p1 := p2; end; writeln('len = ',p1.Len); writeln('sum = ',p2.Sum);

Page 9: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Вывод и уничтожение списка (тип TElemI)

p2 := p1; while p2 <> nil do begin write(p2.s:8); p2 := (p2.p as TElemI); end; writeln; p2 := p1; while p2 <> nil do begin p2 := (p2.p as TElemI); p1.Destroy; p1 := p2; end;end.

Page 10: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Задача о ферзях

ФФ

ФФ

Page 11: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Задача о ферзях

unit Queens;interface var n,ch: integer; type TQueen = class public i,j:integer; p:TQueen; function TestQ:boolean; procedure PrintQ; end; procedure GenQ(q:TQueen);

implementation procedure TQueen.PrintQ; begin if p<>nil then p.PrintQ; write(i:3) end;

Page 12: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Задача о ферзях

function TQueen.TestQ:boolean; var p1:Tqueen; b:boolean; begin if p=nil then Result:=true else begin p1:=p; b:=true; while b and(p1<>nil) do begin if (i=p1.i)or((j-p1.j)=abs(i-p1.i)) then b:=false; p1:=p1.p end; Result:=b; end; end;

Page 13: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Задача о ферзях

procedure GenQ(q:TQueen); var q1:TQueen; t:integer; begin for t:=1 to n do begin q.i:=t; if q.TestQ then begin if q.j=n then begin ch:=ch+1; q.PrintQ; writeln; end else begin q1:=TQueen.Create; q1.j:=q.j+1; q1.p:=q; GenQ(q1); q1.Destroy; end; end; end; end;end.

Page 14: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Задача о ферзях

program Queen;{$APPTYPE CONSOLE}uses Queens;var p: TQueen;

begin readln(n); p := TQueen.Create; p.j := 1; p.p := nil; GenQ(p); p.Destroy; writeln(ch); readlnend.

Page 15: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

Задача о ферзях: решение на основе алгоритма генерации перестановок чисел

Диагонали:

правые: (столбец – строка) левые: (столбец + строка)

2 3 4 5

3 4 5 6

4 5 6 7

5 6 7 8

0 1 2 3

-1 0 1 2

-2 -1 0 1

-3 -2 -1 0

Page 16: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

program TestQueen;{$APPTYPE CONSOLE}var S,Q:array[1..20]of integer; R:array[-19..19]of integer; L:array[2..40]of integer; n,i,ch:integer;procedure Queen(j:integer); . . .begin readln(n); for i:=1 to n do S[i]:=0; for i:=1-n to n-1 do R[i]:=0; for i:=2 to 2*n do L[i]:=0; ch:=0; Queen(1); writeln('var=', ch); readlnend.

Page 17: Объекты - списки unit List; interface type TElem = class public p: TElem; s: integer; constructor Create(r: TElem); function Len: integer; function Sum:

procedure Queen(j:integer); var i,k:integer; begin for i:=1 to n do if (S[i]=0)and(R[j-i]=0)and(L[j+i]=0) then begin S[i]:=1; R[j-i]:=1; L[j+i]:=1; Q[j]:=i; if j=n then begin ch:=ch+1; for k:=1 to n do write(Q[k]:3); writeln end else Queen(j+1); S[i]:=0; R[j-i]:=0; L[j+i]:=0; end; end;