【问题标题】:Getting Values from User从用户那里获取价值
【发布时间】:2015-08-21 03:15:47
【问题描述】:

您好,我在获取系统生成变量的值时遇到问题。这是从用户那里获取值的代码;

public void DetailsRate()
{
 begin1:
        Console.WriteLine("\n \t Rate the Acting on a scale of 0 to 5");
        RateActing = int.Parse(Console.ReadLine());
        switch (RateActing)
        {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                Console.WriteLine("\n you have rated the action of the movie {0}", RateActing);
                break;
            default:
                Console.WriteLine("you have selected the wrong choice {0}", RateActing);
                goto begin1;
        }

        begin2:
        Console.WriteLine("\n \t Rate the music of the movie on a scale of 0 to 5");
        RateMusic = int.Parse(Console.ReadLine());
        switch (RateMusic)
        {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                Console.WriteLine("you have rated the music of the movie {0}", RateMusic);
                break;
            default:
                Console.WriteLine("you have selected the wrong choice {0}", RateMusic);
                goto begin2;
        }
}

我将输入的值调用到这段代码中

public double getoverallRate(double rateact, double ratemus)
    {
        double totrate = 0;

         rateact = RateActing * 0.25;
         ratemus = RateMusic * 0.15;


        totrate = (rateact + ratemus);
        return totrate;
    }

这里是主要方法

static void Main(string[] args)
    {

        MovieRating MR = new MovieRating();
        MR.DetailsRate();

        MovieRating MT = new MovieRating();
        double totrate = MT.getoverallRate(1, 2);
        Console.WriteLine("total rate is {0}", totrate);

        Console.ReadKey();
    }

请我错过 totrate 的值只是给我 0。请帮助我。

【问题讨论】:

  • getoverallRate 有两个参数,你传递的是 5。它是如何编译的?那是那里著名的“goto”声明吗:o?
  • 这应该是一个错误,我没有复制整个参数。它实际上是 5 个参数。我不明白著名的“goto”的含义。
  • 你的DetailRate()呢? MRMT 的用途是什么,为什么不只使用一个而不是两个? RateActingRateMusic 存储在哪里?它们是全局变量吗?很抱歉,您可能需要重写整个程序……遵循 OO 方式。

标签: c# class get


【解决方案1】:

首先摆脱 goto 语句。快速浏览一下,您可以这样写:

    static void Main(string[] args)
    {
        double RateActing = -1;
        double RateMusic = -1;

        RateActing = GetMovieRating(RateActing);

        RateMusic = GetMovieMusicRating(RateMusic);

        double totrate = getoverallRate(RateActing, RateMusic);

        Console.WriteLine("total rate is {0}", totrate);

        Console.ReadKey();
    }

    private static double GetMovieRating(double RateActing)
    {
        do
        {
            Console.WriteLine("\n \t Rate the Acting on a scale of 0 to 5");
            double.TryParse(Console.ReadLine(), out RateActing);
        }
        while (RateActing < 0 || RateActing > 5);
        Console.WriteLine("\n you have rated the action of the movie {0}", RateActing);
        return RateActing;
    }

    private static double GetMovieMusicRating(double RateMusic)
    {
        do
        {
            Console.WriteLine("\n \t Rate the music of the movie on a scale of 0 to 5");
            double.TryParse(Console.ReadLine(), out RateMusic);
        }
        while (RateMusic < 0 || RateMusic > 5);
        Console.WriteLine("\n you have rated the music of the movie {0}", RateMusic);
        return RateMusic;
    }

    public static double getoverallRate(double rateact, double ratemus)
    {
        rateact *= 0.25;
        ratemus *= 0.15;

        return rateact + ratemus;
    }

【讨论】:

    【解决方案2】:

    这里有很多问题 - 几乎可以重新开始!

    首先:永远不要使用goto - 有更好的方法来构建您的程序流。

    第二:您的方法getoverallRate 采用的参数 (2) 比您传入的参数 (5) 少,所以这甚至不应该构建。

    第三:您在getoverallRate 中引用了三个附加变量,它们看起来应该是局部变量,但它们没有在任何地方定义。这些是否应该像 Main 中的用法暗示的那样传入。

    第四:您在变量rateactratemus 中传递值,但您会立即用您的计算覆盖它们。

    第五:如果您将用户的输入值与您需要的任何其他方法一起传递给此方法,对我来说会更有意义。您不应该在任何计算值并返回结果的方法中使用来自用户输入的全局变量。您应该始终传递计算所需的任何内容。

    第六:MR 声明的意义何在?DetailsRate 有什么作用?

    【讨论】:

    • “从不使用 goto”——我强烈反对。 goto 有有效用途。 “尽量避免 goto”更合适
    • 我认为第五条规则是错误的。当 Integer 与 Double 相乘时,结果为 Double。不需要类型转换,请自行尝试。
    • 感谢@J.C 和@Rob。我删除了不正确的点。 @Rob,我尊重您对 goto 的看法。我仍然相信有更好的构造可以使代码更具可读性和可维护性。话虽如此,这是一个古老的哲学论点。它已在其他地方完成,不值得在这里再次拥有。这只是其中之一……stackoverflow.com/questions/6545720/…
    • 谢谢@大家。向经验丰富的程序员学习是一种莫大的荣幸。非常感谢您的贡献。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多