C#Console App错误 - 无法识别/正确评估返回的int

时间:2014-01-25 17:09:50

标签: c# loops if-statement 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 + + +\n\n");

        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 Entered\n");

        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();
    }
}
}

3 个答案:

答案 0 :(得分:1)

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

解决方案:您需要存储RunSelect() Method.otherwise变量run值的返回值不会被修改(即使在调用{{1}之后仍然为零方法)。

替换它:

RunSelect()

用这个:

RunSelect(run);

编辑:如果您正在调用返回某些内容的方法,则需要读取/存储该方法的run=RunSelect(run); 值,因为它包含修改后的值。

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

run

第2步:int run = 0; 循环内,您调用了do-while方法,如下所示:

RunSelect()
方法 do { RunSelect(run); ------ 中的

第3步:您使用以下语句为RunSelect()变量分配了run给出的实际用户输入:

注意:此处console方法中的运行变量是该方法的局部变量,因此即使您将值赋给RunSelect(),它也不会反映到runrun函数中声明的变量。

Play()

第4步:您要将修改后的变量值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; } 发回给此方法的调用方(run):

第5步:您没有将RunSelect()方法发送的return值再次存储到RunSelect()变量中,如下所示:

run

所以RunSelect(run); 变量仍具有初始化值run

要使其正常工作,您只需存储zero方法的返回值,如下所示:

RunSelect()

答案 1 :(得分:1)

你有一个Function接受一个值参数并返回一个int,但是你没有将return 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();

无需在通话前预先初始化投放,因此您可以删除第int run = 0;

答案 2 :(得分:1)

当您致电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;
    }