首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >备用FizzBuzz示例错误

备用FizzBuzz示例错误
EN

Stack Overflow用户
提问于 2013-10-26 07:38:54
回答 4查看 363关注 0票数 1

我已经试着解决这个问题两天了,但我就是不能让它工作!程序布局必须保持不变(挑战的一部分)。真的很烦我希望有人能给我一些启发。

我一直收到以下错误:使用未赋值的局部变量'countOfFizz‘

使用未赋值的局部变量'countOfBuzz‘使用未赋值的局部变量'countOfFizzBuzz’使用未赋值的局部变量'countOfPrime‘

在这几行代码中:

代码语言:javascript
运行
复制
fb.IsFizz(input, countOfFizz);
fb.IsFizz(input, countOfBuzz);
fb.IsFizz(input, countOfFizzBuzz);
fb.IsFizz(input, countOfPrime);

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

代码语言:javascript
运行
复制
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;
    }

}
EN

回答 4

Stack Overflow用户

发布于 2013-10-26 07:43:37

问题是,当一个int(或floatbool等)传递给被复制的方法,则不会将其作为引用变量传递。因此,您在方法中更改的countOfBuzz与在main方法中更改的不同。

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

此外,将变量初始化为0(方法中的局部变量需要初始化,否则会得到您所询问的消息)也是一种好的实践。

票数 2
EN

Stack Overflow用户

发布于 2013-10-26 08:31:15

正如Simon在他的回答中所解释的那样,整数是值类型,所有的值类型都是通过值传递的(默认情况下)。这意味着,当您使用countOfFizz调用IsFizz时,所发生的一切就是将该变量的值传递给函数,然后该函数具有自己的变量以及该值的副本。因此,当函数改变值时,只有局部变量的值改变了,但这种改变永远不会发生在原始变量上。

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

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

因此,首先,您应该使这些countOfX变量成为绑定到对象的实例变量。

看看IsFizz等方法,它们都应该返回一个布尔值。因此,它们很可能最初只是为了检查输入,并根据检查是否成功而返回true或false。在这里,当我们发现一个错误时,我们也可以增加我们的计数器。因此,最终,这些方法应该只接受输入,执行检查,递增其计数器并返回检查结果。

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

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

最后,我想让你知道,我在这里解释了很多原始任务,不能完美地说出这段代码背后的初衷是什么。在我看来,这样做看起来有点可笑。FizzBuzz问题,即使在这个变化的情况下,也是一个简单的问题,旨在表明一个人是否有能力进行基本的编程相关思考。它不一定是一个复杂的面向对象的问题,但就像典型的“Hello World”一样,似乎有人喜欢过度泛化它,为了好玩或练习而使它变得非常复杂。我真的不同意这个带有预定义基代码的FizzBuzz实例既不是通用的,也不是有趣的,也不是一种好的实践。但再次声明,这只是我的观点。

最后给出一个“正确”的提示:输出“FizzBuzz”是“Fizz”和“Buzz”这两个条件句的组合。这意味着如果一个数字符合“FizzBuzz”的条件,那么它对单个数字也是如此。因此,您应该确保对单个组合的检查要么显式地阻止“FizzBuzz”组合匹配,要么首先检查组合的组合,如果匹配则中止进一步的检查。

票数 1
EN

Stack Overflow用户

发布于 2013-10-26 07:43:33

初始化变量可能会帮你做到这一点:

代码语言:javascript
运行
复制
int countOfFizz = 0;
int countOfBuzz = 0;
int countOfFizzBuzz = 0;
int countOfPrime = 0;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19601020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档