替代FizzBu​​zz示例错误

时间:2013-10-25 23:38:54

标签: c# fizzbuzz

现在试图解决这个问题2天了,我无法让它工作!程序布局必须保持不变(挑战的一部分)。真的很烦我,希望有人能说清楚......

我一直收到以下错误: 使用未分配的局部变量'countOfFizz'
使用未分配的局部变量'countOfBuzz' 使用未分配的局部变量'countOfFizzBu​​zz' 使用未分配的局部变量'countOfPrime'

在这些方面:

fb.IsFizz(input, countOfFizz);
fb.IsFizz(input, countOfBuzz);
fb.IsFizz(input, countOfFizzBuzz);
fb.IsFizz(input, countOfPrime);

这是完整的代码。 (如果已经提供了糟糕的编码,基础知识和布局,那么再次道歉。)

class FizzBuzz
{
    public static void Main()
    {
        int input;
        string enter;
        int countOfFizz;
        int countOfBuzz;
        int countOfFizzBuzz;
        int countOfPrime;

        Console.WriteLine("Please enter a number: ");
        enter = Console.ReadLine();
        input = int.Parse(enter);

        while (input != 0)
        {
            Console.WriteLine("Please enter a number: ");
            enter = Console.ReadLine();
            input = int.Parse(enter);

            FizzBuzz fb = new FizzBuzz();
            fb.IsFizz(input, countOfFizz);
            FizzBuzz fb1 = new FizzBuzz();
            fb1.IsBuzz(input, countOfBuzz);
            FizzBuzz fb2 = new FizzBuzz();
            fb2.IsFizzBuzz(input, countOfFizzBuzz);
            FizzBuzz fb3 = new FizzBuzz();
            fb3.IsPrime(input, countOfPrime);
            FizzBuzz fb4 = new FizzBuzz();
            fb4.TotalFizz(countOfFizz);
            FizzBuzz fb5 = new FizzBuzz();
            fb5.TotalBuzz(countOfBuzz);
            FizzBuzz fb6 = new FizzBuzz();
            fb6.TotalFizzBuzz(countOfFizzBuzz);
            FizzBuzz fb7 = new FizzBuzz();
            fb7.TotalPrime(countOfPrime);
        }
        Console.WriteLine("Finished.");
    }

    public bool IsFizz(int input, int countOfFizz)
    {
        if (input % 9 == 0)
        {
            Console.WriteLine("Fizz");
            countOfFizz++;
            return true;
        }
        return false;
    }

    public bool IsBuzz(int input, int countOfBuzz)
    {
        if (input % 13 == 0)
        {
            Console.WriteLine("Buzz");
            countOfBuzz++;
            return true;
        }
        return false;
    }

    public bool IsFizzBuzz(int input, int countOfFizzBuzz)
    {
        if (input % 9 == 0 && input % 13 == 0)
        {
            Console.WriteLine("FizzBuzz");
            countOfFizzBuzz++;
            return true;
        }
        return false;
    }

    public bool IsPrime(int input, int countOfPrime)
    {
        for (int i = 2; i < input; i++)
        {
            if (input % i == 0 && i != input)
            {
                return false;
            }
        }
        Console.WriteLine("Prime");
        countOfPrime++;
        return true;
    }

    public void BeginTesting(int countOfFizz, int countOfBuzz, int countOfFizzBuzz, int countOfPrime)
    {
        countOfFizz = 0;
        countOfBuzz = 0;
        countOfFizzBuzz = 0;
        countOfPrime = 0;
    }

    public int TotalFizz(int countOfFizz)
    {
        Console.WriteLine("Number of Fizz: ");
        return countOfFizz;
    }

    public int TotalBuzz(int countOfBuzz)
    {
        Console.WriteLine("Number of Buzz: ");
        return countOfBuzz;
    }

    public int TotalFizzBuzz(int countOfFizzBuzz)
    {
        Console.WriteLine("Number of FizzBuzz: ");
        return countOfFizzBuzz;
    }

    public int TotalPrime(int countOfPrime)
    {
        Console.WriteLine("Number of Prime: ");
        return countOfPrime;
    }

}

4 个答案:

答案 0 :(得分:2)

问题是,当int(或intfloat等)传递给方法时,您将bool传递给方法< strong>它被复制,它不作为参考变量传递。因此,您在方法中更改的countOfBuzzmain方法中的{{1}}不同。

要解决此问题,请不要将这些参数传递给方法。相反,将这些变量的范围更改为在类内而不是在main方法内。

此外,最好将变量初始化为零(方法需要中的局部变量进行初始化,否则会得到您询问的消息)。

答案 1 :(得分:1)

正如Simon在他的回答中已经解释的那样,整数是值类型,所有值类型总是按值传递(默认情况下)。这意味着当您使用IsFizz调用示例countOfFizz时,所有发生的事情是该变量的被传递给函数,该函数随后具有自己的变量价值的副本。因此,当函数更改值时,只有该局部变量的值发生了变化,但该变化永远不会使其变为原始变量。

解决此问题的一种方法是通过引用明确地传递这些变量。您可以在参数的函数签名中使用ref int countOfFizz来执行此操作(即添加ref关键字)。但是,我建议您这样做,因为它不会提供FizzBuzz类可能具有的状态。

因此,在面向对象编程中,您可以创建包含状态的对象。在您的情况下,FizzBuzz是类,即这些对象的类型。现在,如果我们考虑一下,并考虑到您显然想要计算Fizz / Buzz / FizzBu​​zz案例的数量,那么将这些计数包含在对象中是有意义的。

首先,您应该制作绑定到对象的countOfX变量实例变量

查看IsFizz等方法,它们都应该返回一个布尔值。所以很可能它们最初只是为了检查输入并返回true或false,具体取决于检查是否成功。在这里我们也可以在找到一个falue时增加我们的计数器。所以最后,这些方法应该只接受输入,执行检查,递增计数器并返回检查结果。

TotalX方法可以简单地返回当前计数器结果,而BeginTesting方法可以将它们重置为零(不带任何参数)。

最后,在Main函数中,您只想创建FizzBuzz的单个实例,以便我们可以在整个程序期间共享状态。您应该检查IsX方法的返回值并在此处打印相应的响应(通常您不希望类类型随意打印,但在不同的层中处理 - 在您的情况下,控制台应用程序在主要功能)。

作为最后一点,我希望您知道我在这里解释了很多原始任务,并且不能完美地说明这段代码背后的初衷是什么。从我的观点来看,这样做看起来有点荒谬。即使在这个改变的实例中,FizzBu​​zz问题也是一个简单的问题,旨在表明一个人是否能够基本的编程相关思维。它不一定意味着以复杂的面向对象的方式工作,但就像典型的“Hello World”一样,似乎有些人喜欢过度概括它以使其非常复杂的乐趣或实践。我并不是真的同意这个具有预定义基本代码的FizzBu​​zz实例既可以是通用的也不是有趣的,也不是一个好的做法。但同样,这只是我的意见。

最后提示完成“正确”操作:输出“FizzBu​​zz”是“Fizz”和“Buzz”两种条件的组合。这意味着如果一个数字符合“FizzBu​​zz”的条件,那么 也适用于个人。因此,您应该确保对各个组合的检查明确地阻止“FizzBu​​zz”组合匹配,或者您首先检查组合的组合并中止进一步检查它是否匹配。

答案 2 :(得分:-1)

初始化变量可能会为您解决问题:

int countOfFizz = 0;
int countOfBuzz = 0;
int countOfFizzBuzz = 0;
int countOfPrime = 0;

答案 3 :(得分:-1)

从IsFizz中删除参数(countOfFizz),它应该可以工作。对其他类似方法也这样做。

public bool IsFizz(int input)
{
    if (input % 9 == 0)
    {
        Console.WriteLine("Fizz");
        countOfFizz++;
        return true;
    }
    return false;
}