现在试图解决这个问题2天了,我无法让它工作!程序布局必须保持不变(挑战的一部分)。真的很烦我,希望有人能说清楚......
我一直收到以下错误:
使用未分配的局部变量'countOfFizz'
使用未分配的局部变量'countOfBuzz'
使用未分配的局部变量'countOfFizzBuzz'
使用未分配的局部变量'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;
}
}
答案 0 :(得分:2)
问题是,当int
(或int
,float
等)传递给方法时,您将bool
传递给方法< strong>它被复制,它不作为参考变量传递。因此,您在方法中更改的countOfBuzz
与main
方法中的{{1}}不同。
要解决此问题,请不要将这些参数传递给方法。相反,将这些变量的范围更改为在类内而不是在main方法内。
此外,最好将变量初始化为零(方法需要中的局部变量进行初始化,否则会得到您询问的消息)。
答案 1 :(得分:1)
正如Simon在他的回答中已经解释的那样,整数是值类型,所有值类型总是按值传递(默认情况下)。这意味着当您使用IsFizz
调用示例countOfFizz
时,所有发生的事情是该变量的值被传递给函数,该函数随后具有自己的变量价值的副本。因此,当函数更改值时,只有该局部变量的值发生了变化,但该变化永远不会使其变为原始变量。
解决此问题的一种方法是通过引用明确地传递这些变量。您可以在参数的函数签名中使用ref int countOfFizz
来执行此操作(即添加ref
关键字)。但是,我不建议您这样做,因为它不会提供FizzBuzz
类可能具有的状态。
因此,在面向对象编程中,您可以创建包含状态的对象。在您的情况下,FizzBuzz
是类,即这些对象的类型。现在,如果我们考虑一下,并考虑到您显然想要计算Fizz / Buzz / FizzBuzz案例的数量,那么将这些计数包含在对象中是有意义的。
首先,您应该制作绑定到对象的countOfX
变量实例变量。
查看IsFizz
等方法,它们都应该返回一个布尔值。所以很可能它们最初只是为了检查输入并返回true或false,具体取决于检查是否成功。在这里我们也可以在找到一个falue时增加我们的计数器。所以最后,这些方法应该只接受输入,执行检查,递增计数器并返回检查结果。
TotalX
方法可以简单地返回当前计数器结果,而BeginTesting方法可以将它们重置为零(不带任何参数)。
最后,在Main函数中,您只想创建FizzBuzz
的单个实例,以便我们可以在整个程序期间共享状态。您应该检查IsX
方法的返回值并在此处打印相应的响应(通常您不希望类类型随意打印,但在不同的层中处理 - 在您的情况下,控制台应用程序在主要功能)。
作为最后一点,我希望您知道我在这里解释了很多原始任务,并且不能完美地说明这段代码背后的初衷是什么。从我的观点来看,这样做看起来有点荒谬。即使在这个改变的实例中,FizzBuzz问题也是一个简单的问题,旨在表明一个人是否能够基本的编程相关思维。它不一定意味着以复杂的面向对象的方式工作,但就像典型的“Hello World”一样,似乎有些人喜欢过度概括它以使其非常复杂的乐趣或实践。我并不是真的同意这个具有预定义基本代码的FizzBuzz实例既可以是通用的也不是有趣的,也不是一个好的做法。但同样,这只是我的意见。
最后提示完成“正确”操作:输出“FizzBuzz”是“Fizz”和“Buzz”两种条件的组合。这意味着如果一个数字符合“FizzBuzz”的条件,那么 也适用于个人。因此,您应该确保对各个组合的检查明确地阻止“FizzBuzz”组合匹配,或者您首先检查组合的组合并中止进一步检查它是否匹配。
答案 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;
}