C# 控制台应用错误 - 无法识别/正确计算返回的 int



我试图了解方法是如何工作的,我以为我已经把它记下来了,但似乎我没有作为我的RunSelect();方法没有做我希望的。在第 #19 行,我要求用户选择值(1 或 2)并将其作为 int (Run) 返回。然后在 #25 行,我们根据所选的 int 执行 if/if else/else 语句。无论选择什么,int 都无法识别并要求用户重试 - 无论我输入什么,它都无法识别,所以我的控制台方法失败,我不确定我做错了什么。

我尝试跟踪我的代码,打印出来进行分析,花了一夜时间睡在上面等等。我不知道为什么它不起作用。我是新手,非常感谢任何帮助。我不认为问题出在我的循环或方法上,我认为问题在于我如何将 int 交给 if 语句。但是我不知道为什么它没有像我想象的那样工作。

感谢并为所有人的任何帮助欢呼

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace a032_Factorial_Fibonacci_Sequencer
{
class Program
{
String command = "";
//Need to get the runSelect to work as method
public void Play()
{
Announcer("+ + + Welcome To MegaCorps Factorial Fibioci Sequencer + + +nn");
int run = 0;
do
{
RunSelect(run);
if (run == 1) { RunFact(); }
else if (run == 2) { RunFib(); }
else
{
Announcer("Non Valid Selection"); 
RunSelect(run);
}
Announcer("Enter 'Y' to Run another sequence? ");
command = Console.ReadLine().ToLower().Trim();
}
while (command == "y" || command == "yes");
}

//HelperMethods
public String Announcer(String strTxt)
{
Console.WriteLine(strTxt);
return strTxt;
}
public int RunSelect(int run)
{
Announcer("Enter '1' to run Factor | Enter '2' to run Fibioci");
run = int.Parse(Console.ReadLine());
return run;
}
public void Closer()
{ Console.Read(); }
public void RunFact()
{
//craft program to factor a number entered and return factor
//use double not int to handle factored numbers larger then 57+
Console.WriteLine("Factorial Sequencer Entered/n/n");
Announcer("Enter A Number to FACTOR: ");
double num = double.Parse(Console.ReadLine());
double numNew = 1;
for (int i = 1; i <= num; i++)
{ numNew = numNew * i; }
Announcer("nFACTORED result: " + numNew);
}

public void RunFib()
{
//craft program to fib a number entered and return fib
//use double not int to handle factored numbers larger then 57+
Console.WriteLine("Fibioci Sequencer Enteredn");
Announcer("Enter A Number to FIBIOC: ");
double iSequence = double.Parse(Console.ReadLine());
Announcer("nFIBIOC result: ");
double iPrevious = -1;
double iNext = 1;
for (int i = 1; i <= iSequence; i++)
{
double iSum = iNext + iPrevious;
iPrevious = iNext;
iNext = iSum;
Console.Write(iNext + ", ");
}
}


static void Main(string[] args)
{
Program myProgram = new Program();
myProgram.Play();
}
}
}

问题:您没有存储RunSelect()方法的返回值。

解决方案:您需要存储RunSelect()方法的返回值,否则变量run值不会被修改(即使调用该方法后仍然为零RunSelect())。

替换它:

RunSelect(run);

对此:

run=RunSelect(run);

编辑:如果你正在调用一个返回某些东西的方法,那么你需要读取/存储该方法的return值,因为它包含修改后的值。

步骤1:在您的代码中,您使用以下语句初始化了变量run

int run = 0;

步骤2:在循环do-while您调用了RunSelect()方法,如下所示:

do
{
RunSelect(run);
------

步骤3:在方法RunSelect()中,使用以下语句将run变量与console给出的实际用户输入一起分配:

注意:这里RunSelect()方法中的运行变量是该方法的局部变量,因此即使您将值分配给run它也不会反映到函数中声明run变量Play()

public int RunSelect(int run)
{
Announcer("Enter '1' to run Factor | Enter '2' to run Fibioci");
run = int.Parse(Console.ReadLine());/here you are assigning userinput to run variable.
return run;
}

第 4 步:您将修改后的变量值run发回给此方法的调用者(RunSelect()):

步骤5:在那里,您不会再次将该方法发送的此return值存储RunSelect()变量中run如下所示:

RunSelect(run);

所以run变量仍然具有初始化值zero

要使其工作,您只需存储RunSelect()方法的返回值,如下所示:

run=RunSelect(run);

你有一个函数,它接受一个值参数并返回一个 int,但你没有将返回 int 分配给任何东西。 在您的情况下,该参数是多余的,因为它无论如何都不会在方法中使用。 在 C# 中,默认情况下,参数是值参数。这意味着将在函数成员声明中为变量创建新的存储位置,并且该位置从您在函数成员调用中指定的值开始。如果更改该值,则不会更改调用中涉及的任何变量。

试试这个:

public int RunSelect()
{
Announcer("Enter '1' to run Factor | Enter '2' to run Fibioci");
int run = int.Parse(Console.ReadLine());
return run;
}

并在您的方法调用中:

int run = RunSelect();

无需在调用前预先初始化 RUN,因此您可以删除线路int run = 0;

当你调用RunSelect(run)时,你不会改变run的当前值。传入run无法更改其值。RunSelect函数返回一个新值,您必须像这样分配该值:run = RunSelect(run)

您还会注意到,RunSelect不使用传入的run的值,因此可以像这样轻松编写:

public int RunSelect()
{
Announcer("Enter '1' to run Factor | Enter '2' to run Fibioci");
int run = int.Parse(Console.ReadLine());
return run;
}

最新更新