1

已经尝试解决这个问题 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

4 回答 4

2

问题是您将ints 传递给方法,当int(或float,bool等)传递给它被复制的方法时,它不会作为引用变量传递。因此,countOfBuzz您在方法中更改的内容与在方法中更改的内容不同main

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

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

于 2013-10-25T23:43:37.480 回答
1

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

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

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

因此,首先,您应该将那些countOfX变量作为绑定到对象的实例变量。

查看IsFizz等方法,它们都应该返回一个布尔值。因此,它们最初可能仅用于检查输入并根据检查是否成功返回真或假。在这里,我们还可以在发现错误时增加我们的计数器。所以最后,这些方法应该只接受输入,执行检查,增加它们的计数器并返回检查结果。

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

最后,在 Main 函数中,您只想创建一个实例,FizzBuzz以便我们可以在整个程序期间共享状态。您应该检查IsX方法的返回值并在此处打印适当的响应(通常您不希望类类型任意打印内容,而是在不同的层中处理它——在您的情况下,控制台应用程序发生在 Main 函数中)。

作为最后一点,我想让你知道我在这里对原始任务进行了很多解释,并且不能完美地说明这段代码背后的初衷是什么。从我的角度来看,这样做看起来有点荒谬。FizzBu​​zz 问题,即使在这个变化的例子中,也是一个简单的问题,旨在显示一个人是否有能力进行与编程相关的基本思维。以复杂的面向对象方式处理它不一定是一个问题,但就像典型的“Hello World”一样,似乎有些人喜欢过度概括它,使其变得非常复杂以供娱乐或练习. 我并不是真的同意这个带有预定义基本代码的 FizzBu​​zz 实例既不是通用的,也不是有趣的,也不是一个好的实践。但同样,这只是我的意见。

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

于 2013-10-26T00:31:14.793 回答
-1

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

int countOfFizz = 0;
int countOfBuzz = 0;
int countOfFizzBuzz = 0;
int countOfPrime = 0;
于 2013-10-25T23:43:32.650 回答
-1

从 IsFizz 中删除参数 (countOfFizz),它应该可以工作。对其他类似方法执行相同操作。

public bool IsFizz(int input)
{
    if (input % 9 == 0)
    {
        Console.WriteLine("Fizz");
        countOfFizz++;
        return true;
    }
    return false;
}
于 2013-10-25T23:44:15.890 回答