Language Delphi
(OO version - Delphi 7)
Date: | 09/10/05 |
Author: | Luis Carlos F. Dias |
URL: | n/a |
Comments: | 9 |
Info: | n/a |
Score: | ![]() |
// ---- file Singers.pas ---- unit Singers; interface uses SysUtils ; type ISinger = interface(IUnknown) function Sing: String ; function CanSing: boolean ; end ; TAbstractSinger = class(TInterfacedObject,ISinger) private FLine: String ; FCanSing: boolean ; function GetLine: String ; virtual ; procedure SetLine(aLine: String) ; virtual ; public function CanSing: boolean ; virtual ; property Line: String read GetLine write SetLine ; function Sing: String ; virtual ; abstract ; end ; TBottlesSinger = class(TAbstractSinger) private FCounter: integer ; function EvalS: String ; procedure SetCounter(aValue: integer) ; procedure PrepareLine ; property Counter: integer read FCounter write SetCounter ; public constructor Create ; function Sing: String ; override ; end ; const CRLF: String = '' + #13#10 ; implementation { TAbstractSinger } function TAbstractSinger.CanSing: boolean; begin result := FCanSing ; end; function TAbstractSinger.GetLine: String; begin result := FLine ; end; procedure TAbstractSinger.SetLine(aLine: String); begin FLine := aLine ; end; { TBottlesSinger } constructor TBottlesSinger.Create; begin inherited; FCounter := 99 ; FCanSing := true ; end; function TBottlesSinger.EvalS: String; var res : string ; begin res := 's' ; if FCounter = 1 then res := '' ; result := res ; end; procedure TBottlesSinger.PrepareLine; var lineForOne, lineForMore, lineForNone: String ; begin lineForMore := inttostr(Counter) + ' bottles of beer on the wall, ' + inttostr(Counter) + ' bottles of beer.' + CRLF + 'Take one down and pass it around, ' + inttostr(Counter-1) + ' bottle' + EvalS + ' of beer on the wall.' + CRLF ; lineForOne := '1 bottle of beer on the wall, 1 bottle of beer.' + CRLF + 'Take one down and pass it around,' + ' no more bottles of beer on the wall.' + CRLF ; lineForNone := 'No more bottle of beer on the wall,' + ' no more bottles of beer.' + CRLF + 'Go to the store and buy some more,' + ' 99 bottles of beer on the wall.' + CRLF ; case Counter of 1 : begin FLine := lineForOne ; Counter := Counter-1 ; end ; 0 : begin FLine := lineForNone ; FCanSing := false ; end ; else begin FLine := lineForMore ; Counter := Counter-1 ; end ; end ; {case} end; procedure TBottlesSinger.SetCounter(aValue: integer); begin FCounter := aValue ; end; function TBottlesSinger.Sing: String; begin PrepareLine ; result := Line ; end; end. // ---- end of file Singers.pas ---- // ---- file Bottles.dpr ---- program Bottles; {$APPTYPE CONSOLE} uses SysUtils, Singers in 'Singers.pas'; var Singer: ISinger ; begin Singer := TBottlesSinger.Create ; While Singer.CanSing do WriteLn(Singer.Sing) ; FreeAndNil(Singer) ; end. // ---- end of file Bottles.dpr
Download Source | Write Comment
Alternative Versions
Version | Author | Date | Comments | Rate |
---|---|---|---|---|
Recursive version | Juan Carlos Molinos | 01/12/06 | 2 | ![]() ![]() |
standard version | Anonymous | 04/20/05 | 4 | ![]() ![]() |
OO Simple version (not using Interfaces) | Luis Carlos F. Dias | 09/04/05 | 0 | ![]() ![]() |
NonVCL version | Philipp Winterberg | 04/20/05 | 0 | ![]() ![]() |
OO version (with interface) | Luis Carlos F. Dias | 09/05/05 | 0 | ![]() ![]() |
Download Source | Write Comment
Add Comment
Please provide a value for the fields Name,
Comment and Security Code.
This is a gravatar-friendly website.
E-mail addresses will never be shown.
Enter your e-mail address to use your gravatar.
Please don't post large portions of code here! Use the form to submit new examples or updates instead!
Comments
My goal here was to put as many Object Pascal/Delphi features as I could and by the way, Object Pascal is a language and Delphi is an IDE that uses Object Pascal.
program Bottles;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i:integer;
begin
i:=99;
while i > 0 do
begin
writeln(inttostr(i) + ' bottles of beer on the wall,' + inttostr(i) + ' bottles of beer.');
writeln('Take one down and pass it around, ' + inttostr(i-1) + ' bottle' + ' of beer on the wall.');
i := i -1;
end;
writeln('No more bottle of beer on the wall,' + ' no more bottles of beer.' );
writeln('Go to the store and buy some more,' + ' 99 bottles of beer on the wall.');
readln
end.
:D
begin
FLine := aLine ;
end;"
-> TAbstractSinger.SetLine(const aLine: String);