2016-04-13 11:08:28 +03:00
|
|
|
|
// Пример иллюстрирует реализацию классом интерфейса IEnumerable
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// для использования его в операторе foreach
|
2015-05-14 22:35:07 +03:00
|
|
|
|
type
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Генератор чисел Фибоначчи
|
2016-04-13 11:08:28 +03:00
|
|
|
|
FibGen = class(IEnumerable<integer>, IEnumerator<integer>)
|
2015-05-14 22:35:07 +03:00
|
|
|
|
private
|
|
|
|
|
|
a,b,n,i: integer;
|
|
|
|
|
|
public
|
|
|
|
|
|
constructor Create(n: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
i := -1;
|
|
|
|
|
|
a := 0;
|
|
|
|
|
|
b := 1;
|
|
|
|
|
|
Self.n := n;
|
|
|
|
|
|
end;
|
2016-04-13 11:08:28 +03:00
|
|
|
|
function Get_Current: integer;
|
2015-05-14 22:35:07 +03:00
|
|
|
|
begin
|
|
|
|
|
|
if i=0 then
|
|
|
|
|
|
Result := 1
|
|
|
|
|
|
else Result := b;
|
|
|
|
|
|
end;
|
2016-04-13 11:08:28 +03:00
|
|
|
|
function System.Collections.IEnumerator.Get_Current: object := Get_Current;
|
|
|
|
|
|
function GetEnumerator: IEnumerator<integer> := Self;
|
|
|
|
|
|
function System.Collections.IEnumerable.GetEnumerator: System.Collections.IEnumerator := Self;
|
2015-05-14 22:35:07 +03:00
|
|
|
|
function MoveNext: boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
i += 1;
|
|
|
|
|
|
Result := i<n;
|
|
|
|
|
|
if i=0 then exit;
|
2016-04-13 11:08:28 +03:00
|
|
|
|
(a,b) := (b,a+b);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
end;
|
2016-04-13 11:08:28 +03:00
|
|
|
|
property Current: integer read Get_Current;
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure Reset;
|
|
|
|
|
|
begin
|
2016-04-13 11:08:28 +03:00
|
|
|
|
end;
|
|
|
|
|
|
procedure Dispose;
|
|
|
|
|
|
begin
|
2015-05-14 22:35:07 +03:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Числа Фибоначчи');
|
2016-04-13 11:08:28 +03:00
|
|
|
|
var f := new FibGen(25);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
foreach var x in f do
|
2016-04-13 11:08:28 +03:00
|
|
|
|
Print(x);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
end.
|