运行总计

时间:2017-03-03 22:35:54

标签: c# global-variables running-total

我非常喜欢C#,但是对于课程我必须编写一个程序来保持食品销售的总量。

我们已经被教会使用全局变量,但它不仅感觉不是最简单的方式,我读到的任何地方都说它不使用它们。

如果不使用全局变量,我还没有找到一种方法来保持两种不同巧克力棒的成本。它可以使总成本达到1巴 - 无论数量多少,但是当我添加另一个时,之前的任何选择都会从总成本中消失。

简而言之:我的工作是什么,但我觉得我需要学习更好的练习。

以下是我的代码示例(请注意,我还没有复制到多个方法):

class Program
{
    static double total = 0;

    static void Main(string[] args)
    {
        string choice = "y";

        while (choice == "y")
        {
            Console.WriteLine("Main Menu:\nChocolate\nSandwiches");

            int menu = int.Parse(Console.ReadLine());

            switch (menu)
            {
                case 1:
                    chocolate();
                    break;
                case 2:
                    sandwich();
                    break;
            }
        }
    }

    static void chocolate()
    {
        int menu = 0;

        //double cost = quant * price;
        Console.WriteLine("Chocolate bar menu:\nMars bar\nSnickers\nTwix\nMilky Bar\nTurkish Delight");

        int chocBar = int.Parse(Console.ReadLine());

        Console.Clear();
        Console.WriteLine("Quantity");

        double quant = double.Parse(Console.ReadLine());

        Console.Clear();

        if (chocBar == 1)
        {
            Console.Clear();

            double costMars = quant * 0.5;
            total = total + costMars;

            Console.WriteLine("current total: £" + total.ToString("0.00"));
            Console.WriteLine("Press 1 for main menu");
            menu = int.Parse(Console.ReadLine());
            if (menu == 1)
            {
                chocolate();
            }
            else
            {
            }
        }

        if (chocBar == 2)
        {
            double costSnick = quant * 0.8;
            total = total + costSnick;

            Console.WriteLine("current total: £" + total.ToString("0.00"));
            Console.WriteLine("Press 1 for main menu");
            menu = int.Parse(Console.ReadLine());
            if (menu == 1)
            {
                chocolate();
            }
            else
            {
            }
        }

        Console.ReadKey();

3 个答案:

答案 0 :(得分:1)

恭喜您选择C#作为编程语言来学习。它确实是一种很棒的编程语言。

你读到的是正确的,全局变量有很多含义。它通常是最后的手段。由于您是初学者,我将推荐另一种简单的技巧。我找到了一个很棒的链接,它将介绍通过值和引用传递变量的概念。看看

https://msdn.microsoft.com/en-us/library/0f66670z.aspx

祝你好运。

答案 1 :(得分:1)

很高兴您能够在教育早期积极主动地学习良好的编码实践!我认为你的导师可能会告诉你现在使用全局变量,以免一次过多地使用过多的概念,但是,作为一般的经验法则,你应该尝试将变量作为方法参数传递给代码。 。原因是因为如果你在一个拥有成千上万行代码的大型应用程序中有一个全局变量,并且该全局变量在某种程度上最终会得到一个不正确的值,那么找出哪一块可能是一个真正的噩梦。代码将不正确的值写入变量。

答案 2 :(得分:0)

有多种方法可以在调用数据时允许数据流入和流出方法。最糟糕的方法是使用“全局”变量。

除此之外:C#技术上本身没有“全局”变量,因为该术语描述了可以从任何上下文完全访问的变量,没有限定条件。所有C#变量必须限定为类型或方法。但是,同样的一般警告确实适用于这些变量。在C#中,用法区分变量是否按照最佳实践声明,而不是声明本身。

在您的代码中,最明显的方法是让每个方法返回要添加到总数中的值。

此外,由于某种原因,您已将循环实现为递归调用。我不清楚为什么你这样做,但除非你的课堂作业中有特定的要求,否则我会建议不要这样做。在这种情况下你不太可能遇到任何特定的问题,但它是高度不规则的,使得代码难以理解,并且至少给出了堆栈溢出的理论可能性(实际上,你不太可能找到用户患者足以导致这种情况发生,但代码中没有实际的保证,递归最终会终止)。

我通常对重写家庭作业犹豫不决,但在这种情况下,我认为你提供了足够的代码,如果提供更多代码,建议会更清晰。你仍然有一些工作要做,实现sandwich()方法和其他糖果,我只解决了眼前的问题,而不是代码中的其他缺陷。所以我不觉得我只是在为你做学校工作。 :)

以下是我认为代码应该的一般概念:

class Program
{

    static void Main(string[] args)
    {
        double total = 0;
        string choice = "y";

        while (choice == "y")
        {
            Console.WriteLine("Main Menu:\nChocolate\nSandwiches");

            int menu = int.Parse(Console.ReadLine());

            switch (menu)
            {
                case 1:
                    total += chocolate();
                    break;
                case 2:
                    total += sandwich();
                    break;
            }

            Console.WriteLine("current total: £" + total.ToString("0.00"));
            Console.WriteLine("Press 1 for main menu");
            menu = int.Parse(Console.ReadLine());
        }
    }

    static double chocolate()
    {
        int menu = 0;

        Console.WriteLine("Chocolate bar menu:\nMars bar\nSnickers\nTwix\nMilky Bar\nTurkish Delight");

        int chocBar = int.Parse(Console.ReadLine());

        Console.Clear();
        Console.WriteLine("Quantity");

        double quant = double.Parse(Console.ReadLine());

        Console.Clear();

        double cost;

        switch (chocBar)
        {
        case 1: // Mars
            cost = 0.5;
            break;
        case 2: // Snickers
            cost = 0.8;
            break;
        default:
            throw new Exception("Invalid user input");
        }

        Console.Clear();

        return quant * cost;
    }
}

注意:

  • 我不清楚“按主菜单1”的提示是什么意思。用户可以做什么除了返回主菜单?无论你的意图是什么,无论用户是否选择了“巧克力”“三明治”选项,你似乎都会做同样的事情,所以我提出了这个提示主要方法。
  • 在处理货币时,decimal类型是比double更好的选择,因为人类不喜欢double中基数2算术发生的舍入误差类型。使用decimal类型可确保以十进制形式输入的值仍然完全表示为十进制,从而消除了舍入错误的来源。
  • 我不清楚你是否真的打算让用户能够购买一小部分直板。您解析输入的类型为double,这将允许用户购买例如1.25个糖果棒。如果这是你想要的,那很好。但如果没有,请考虑将数量用户输入的类型更改为int
  • 您的原始代码无法突破顶级菜单,即将choice设置为"y"以外的其他内容。我没有做任何事来解决这个问题。这里的代码仍然存在同样的问题。
  • “土耳其快乐”可能会描述各种各样的糖果,但我从来没有见过一个我认为是巧克力棒的糖果。如果要销售那些,您可能需要重新考虑顶级菜单项描述。 :)