# 企业代码PK课程设计代码 --- FizzBuzzWhizz 的实现

## 代码片段(4)[全屏查看所有代码]

### 1. [代码]FizzBuzzWhizz     跳至 [1] [2] [3] [全屏预览]

``` public class FizzBuzzWhizz
{
private IList<NumberProcessor> number_processors;

public FizzBuzzWhizz()
{
number_processors=new List<NumberProcessor>
{
new NumberProcessor(3,"Fizz",new Matcher(3)),
new NumberProcessor(5,"Buzz",new Matcher(5)),
new NumberProcessor(7,"Whizz",new Matcher(7))
};

}

public void run()
{
for (int i = 1; i <= 100; i++)
{
process(i);
}
}

public void process(int num)
{
var builder = new StringBuilder();
foreach (NumberProcessor processor in number_processors)
{
builder.Append(processor.process(num));
}
var result = builder.ToString();
if(!string.IsNullOrEmpty(result))
Console.WriteLine(result);
else
Console.WriteLine(num.ToString());
}
}
public class NumberProcessor
{
private int assigned_number;
private string replace;
private Matcher matcher;

public NumberProcessor(int assignedNumber, string replace, Matcher matcher)
{
assigned_number = assignedNumber;
this.replace = replace;
this.matcher = matcher;
}

public string process(int num)
{
return matcher.is_match(num) ? replace : string.Empty;
}
}
public class Matcher
{
private int determine_by;

public Matcher(int determineBy)
{
determine_by = determineBy;
}

public bool is_divisible(int num)
{
return num%determine_by == 0;
}

public bool is_appear_in(int num)
{
return num.ToString().Contains(determine_by.ToString());
}

public bool is_match(int num)
{
return is_divisible(num) || is_appear_in(num);
}
}
```

### 2. [代码]FizzBuzzWhizz单元测试     跳至 [1] [2] [3] [全屏预览]

``` public class NumberProcessSpecs
{
Because of = () => { subject = new NumberProcessor(3, "Fizz", new Matcher(3)); };

It should_not_repalce_1 = () => subject.process(1).ShouldBeEmpty();
It should_not_repalce_2 = () => subject.process(2).ShouldBeEmpty();
It should_repalce_3 = () => subject.process(3).ShouldEqual("Fizz");

private static NumberProcessor subject;
}
public class MatchSpecs
{

Because of = () => { subject = new Matcher(3); };

It should_not_be_divisble_by_1 = () => subject.is_divisible(1).ShouldBeFalse();
It should_not_be_divisble_by_2 = () => subject.is_divisible(2).ShouldBeFalse();
It should_be_divisble_by_3 = () => subject.is_divisible(3).ShouldBeTrue();
It should_not_be_divisble_by_4 = () => subject.is_divisible(4).ShouldBeFalse();
It should_not_be_divisble_by_5 = () => subject.is_divisible(5).ShouldBeFalse();
It should_nbe_divisble_by_6 = () => subject.is_divisible(6).ShouldBeTrue();
It should_not_be_divisble_by_7 = () => subject.is_divisible(7).ShouldBeFalse();

private It should_not_appear_in_1 = () => subject.is_appear_in(1).ShouldBeFalse();
private It should_appear_in_3 = () => subject.is_appear_in(3).ShouldBeTrue();
private It should_appear_in_13 = () => subject.is_appear_in(13).ShouldBeTrue();
private It should_not_appear_in_12 = () => subject.is_appear_in(12).ShouldBeFalse();

private It should_not_match_in_1 = () => subject.is_match(1).ShouldBeFalse();
private It should_not_match_in_11 = () => subject.is_match(11).ShouldBeFalse();
private It should_match_in_12_for_divisible = () => subject.is_match(12).ShouldBeFalse();
private It should_match_in_13_for_apear = () => subject.is_match(13).ShouldBeFalse();

private static Matcher subject;
}
[TestFixture]
public class FizzBuzzWhizzSpecs {
[Test]
public void Run() {
new FizzBuzzWhizz().run();
}
}
```

```2
Fizz
4
Buzz
Fizz
Whizz
8
Fizz
Buzz
11
Fizz
Fizz
Whizz
FizzBuzz
16
Whizz
Fizz
19
Buzz
FizzWhizz
22
Fizz
Fizz
Buzz
26
FizzWhizz
Whizz
29
FizzBuzz
Fizz
Fizz
Fizz
Fizz
FizzBuzzWhizz
Fizz
FizzWhizz
Fizz
Fizz
Buzz
41
FizzWhizz
Fizz
。。。```

## 发表评论 回到顶部 网友评论(7)

•  1楼：lengyao 发表于 2014-05-15 22:50 #include int main() {     int a,b,c;     while(~scanf("%d%d%d",&a,&b,&c))//可以一直更改a,b,c的值     {         for(int i=1;i<=100;i++)         {             if(i%10==a||i/10==a)printf("Fizz\n");             else if(i%(a*b*c)==0)printf("FizzBuzzWhizz\n");             else if(i%(a*b)==0)printf("FizzBuzz\n");             else if(i%(b*c)==0)printf("BuzzWhizz\n");             else if(i%(a*c)==0)printf("FizzWhizz\n");             else if(i%a==0)printf("Fizz\n");             else if(i%b==0) printf("Buzz\n");             else if(i%c==0)printf("Whizz\n");             else printf("%d\n",i);         }     } }
•  2楼：lengyao 发表于 2014-05-15 22:51 你的代码好长，好长啊。。。。。。。。。。。
• 3楼：予沁安 发表于 2014-05-16 01:39

#### 引用来自“lengyao”的评论

你的代码好长，好长啊。。。。。。。。。。。
短不见得好。
• 4楼：予沁安 发表于 2014-05-16 01:43

#### 引用来自“lengyao”的评论

#include<stdio.h>
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))//可以一直更改a,b,c的值
{
for(int i=1;i<=100;i++)
{
if(i%10==a||i/10==a)printf("Fizz\n");
else if(i%(a*b*c)==0)printf("FizzBuzzWhizz\n");
else if(i%(a*b)==0)printf("FizzBuzz\n");
else if(i%(b*c)==0)printf("BuzzWhizz\n");
else if(i%(a*c)==0)printf("FizzWhizz\n");
else if(i%a==0)printf("Fizz\n");
else if(i%b==0) printf("Buzz\n");
else if(i%c==0)printf("Whizz\n");
else printf("%d\n",i);
}
}
}

你的这个其实 复杂度（http://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E8%A4%87%E9%9B%9C%E5%BA%A6）很高！
• 5楼：予沁安 发表于 2014-05-16 03:41

#### 引用来自“lengyao”的评论

你的代码好长，好长啊。。。。。。。。。。。
你看看我最后添加的截图, 是用VS复杂度分析。Other类是你的代码，做了一点C#的转换。 可以看到，你一个方法复杂度就有12了，我那么多代码才15。先不说别的，就是复杂度平均下来讲，(如每个方法的复杂度，每行代码的平均复杂度), 我的要比你简单多了。 我最复杂的方法 4, 而你的方法是 11。 这个就影响到代码的阅读性和可维护性，这个也是我分享这段代码的原因，和所有其他实现代码不一样。 可以简单说，我的是企业代码，你的是课程设计代码。
•  6楼：大王叫我来卖萌 发表于 2014-05-27 00:46 @予沁安 现在还在澳洲吗？ 很久没更新blog了
• 7楼：予沁安 发表于 2014-05-27 11:13

#### 引用来自“JeffreyWu”的评论

@予沁安 现在还在澳洲吗？ 很久没更新blog了
在加拿大啊。没时间啊，没人帮忙，要分享的东西很多，但是变成文字要时间和精力啊。