Прочитал тут про задачку, которую дают "тру" программистам при собеседовании: надо написать программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»
Я не тру програмист :), поэтому решил бы так:
unit FizzBuzz; interface uses windows, sysutils; type EFizzBuzzLessZero = class (Exception); EFizzBuzzTooBig = class (Exception); TFizzBuzz = class const MAX_VAL = 100; private FCount: integer; public constructor Create (const ACount: integer); function Execute: HResult; end; implementation { TFizzBuzz } constructor TFizzBuzz.Create(const ACount: integer); begin FCount := ACount; end; function TFizzBuzz.Execute: HResult; type TNumberType = (ntUsual, ntFizz, ntBuzz, ntComplex); var x: integer; r: TNumberType; begin try if FCount <= 0 then raise EFizzBuzzLessZero.Create('Invalid argument') else if FCount > MAX_VAL then raise EFizzBuzzTooBig.Create('Invalid argument') else begin for x := 1 to FCount do begin r := ntUsual; if x mod 3 = 0 then r := ntFizz; if (x mod 5) = 0 then if r = ntFizz then r := ntComplex else r := ntBuzz; case r of ntUsual: Writeln(x); ntFizz: Writeln('Fizz'); ntBuzz: Writeln('Buzz'); ntComplex: Writeln('FizzBuzz'); end; end; end; Result := S_OK; except on e: EFizzBuzzLessZero do begin Writeln('Value cannot be less or equal to zero!'); Result := E_INVALIDARG; end; on e: EFizzBuzzTooBig do begin Writeln('Too big value to calculating!'); Result := E_INVALIDARG; end; on e: Exception do begin Writeln('Unexpected error in Execute (', e.Message, ')'); Result := E_FAIL; end; end; end; end.
И
program Project1; {$APPTYPE CONSOLE} uses windows, SysUtils, FizzBuzz in 'FizzBuzz.pas'; var fb: TFizzBuzz; begin try if ParamCount < 1 then raise Exception.Create('Not enought parameters'); fb := TFizzBuzz.Create(StrToIntDef(ParamStr(1), 100)); try if Failed(fb.Execute) then raise Exception.Create('Something wrong with calculating FIZZBUZZ..'); finally fb.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Только что-то мне кажется, тут не в лоб ожидается решение, результат:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
наводит на то, что закономерность надо “обыграть”
Хотя для жизни – пока я буду искать эту закономерность, я мог бы в лоб все сделать и дальше чем-то заняться.. Ну не художник вот я, не художник :-/
Комментариев нет:
Отправить комментарий