我非常喜欢C#的新手,但是对于课程,我必须编写一个程序,以保持食物销售的总和。
我们被教导使用全球变量,但不仅感觉不像最简单的方法,我读到的到处都说不使用它们。
没有使用全局变量,我还没有找到一种方法来保留两个不同巧克力棒的成本。它有助于获得1个bar的总成本 - 无论数量多少,但是当我添加另一个bar,任何以前的选择都会从总成本中消失。
简而言之:我有效的工作,但是我觉得我需要学习更好的练习。
这是我的代码的一个示例(请注意,我没有复制到其中多种方法):
class Program
{
static double total = 0;
static void Main(string[] args)
{
string choice = "y";
while (choice == "y")
{
Console.WriteLine("Main Menu:nChocolatenSandwiches");
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 barnSnickersnTwixnMilky BarnTurkish 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();
恭喜选择C#作为一种编程语言要学习。这确实是一种很棒的编程语言。
您阅读的是正确的,全球变量具有许多含义。通常是最后的手段。由于您是初学者,我会推荐另一种简单的技术。我为您找到了一个很好的链接,该链接将介绍按值和参考的传递变量的概念。检查一下
https://msdn.microsoft.com/en-us/library/0f66670z.aspx
祝你好运。
对您的教育早期学习良好的编码实践的积极性!我认为您的教练可能正在告诉您现在使用Globals,以免一次使用太多概念过多,但是,是的,作为一般的经验法则,您应该尝试将代码周围的变量作为方法参数传递。原因是因为如果您在具有数万行代码的大型应用程序中具有全局变量,并且该全局变量以某种方式以不正确的价值而最终,那么找出哪一块是真正的噩梦代码将不正确的值写入变量。
有多种允许数据调用方法流入和流出的方法。最糟糕的方法是使用"全局"变量。
旁边:C#从技术上讲,C#本身没有"全局"变量,因为该术语描述了可以从任何上下文中完全访问的变量,而没有资格。所有C#变量都必须范围为类型或方法。但是,同样的一般警告确实适用于这些变量。在C#中,用法区分了是否按照最佳实践声明变量,而不是声明本身。
在您的代码中,最明显的方法是让每个方法返回要添加到总数的值。
此外,由于某种原因,您已将循环作为递归电话实现。我为什么这样做并不清楚,但是除非您的课堂作业中的特定要求,否则我建议反对。在这种情况下,您不太可能遇到任何特定问题,但是它非常不规则,使代码难以理解,并且至少给出了堆栈溢出的理论可能性(实际上,您不太可能找到用户患者足以导致这种情况发生,但是在代码中没有实际的保证,即递归最终将终止)。
我通常不愿重写作业分配,但是在这种情况下,我认为您提供了足够的代码,如果将其作为更多代码,建议将更加清晰。您仍然需要做一些工作,以实现sandwich()
方法和其他糖果棒,而我只解决了直接问题,而不是代码中的其他缺陷。因此,我不觉得我只是为您做您的学校工作。:)
这是我认为代码应该的一般思想:
class Program
{
static void Main(string[] args)
{
double total = 0;
string choice = "y";
while (choice == "y")
{
Console.WriteLine("Main Menu:nChocolatenSandwiches");
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 barnSnickersnTwixnMilky BarnTurkish 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
类型中Base-2算术发生的舍入错误。使用decimal
类型可确保以十进制输入的值保持准确表示为十进制,从而消除了四舍五入误差的来源。 - 对我来说,您是否真正打算能够购买糖果棒的一小部分。您分析输入的类型是
double
,该输入将允许用户购买,例如1.25糖果。如果那是您打算的,很好。但是,如果不是,请考虑将用户输入的数量类型更改为int
。 - 您的原始代码没有任何机制可以突破顶级菜单,即将
choice
设置为"y"
以外的其他设置。我什么也没做来解决这个问题。这里的代码中仍然存在相同的问题。 - "土耳其美食" 可能会描述各种各样的糖果,但我从未见过我将其描述为巧克力棒。如果要出售这些内容,您可能需要重新考虑顶级菜单项描述。:)