альтернатива глобальной переменной для запуска total
Я очень новичок в C#, но для класса я должен написать программу, которая держит текущий общий объем продаж продуктов питания.
Нас учили использовать глобальные переменные, но это не только не кажется самым простым способом, везде, где я читаю, говорится не использовать их.
Не используя глобальную переменную, я не нашел способа сохранить стоимость двух разных шоколадных батончиков, например. Он работает, чтобы получить общую стоимость 1 бар-независимо от количества, но когда я добавляю другой, любой предыдущие выборки исчезают из общей стоимости.
Итак, вкратце: то, что у меня есть, работает, но я чувствую, что мне нужно научиться лучшей практике.
Вот пример моего кода (обратите внимание, что есть несколько методов, которые я не скопировал сюда):
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();
3 ответов:
Поздравляю с выбором C# в качестве языка программирования для изучения. Это действительно отличный язык программирования.
То, что Вы читаете, верно, глобальные переменные имеют много значений. Обычно это последнее средство. Поскольку вы новичок, я порекомендую вам другую простую технику. Я нашел для вас отличную ссылку, которая введет понятия передачи переменных по значению и ссылке. Проверьте это
Https://msdn.microsoft.com/en-us/library/0f66670z.aspx
Хорошо удача.
Хорошо, что вы активно изучаете хорошие методы кодирования на ранних этапах обучения! Я думаю, что ваш инструктор, вероятно, говорит вам использовать глобалы прямо сейчас, чтобы не перегружать вас слишком большим количеством концепций сразу, Но да, как общее эмпирическое правило, вы должны попытаться передать переменные вокруг вашего кода в качестве параметров метода вместо этого. Причина в том, что если у вас есть глобальная переменная в большом приложении с десятками тысяч строк кода, и эта глобальная переменная переменная каким-то образом оказывается с неправильным значением в ней, то это может быть настоящим кошмаром, чтобы выяснить, какой кусок кода написал неправильное значение в переменную.
Существует множество способов, позволяющих потоку данных входить и выходить из методов при их вызове. Худший способ-использовать "глобальную" переменную.
в стороне: 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, потому что людям не нравится ошибка округления, возникающая при арифметике base-2 в типеdouble. С помощью типdecimalгарантирует, что значения, введенные как десятичные, остаются представленными точно как десятичные, исключая этот источник ошибки округления.double, который позволит пользователю купить, например, 1.25 шоколадных батончиков. Если это то, что вы задумали, прекрасно. Но если нет, рассмотрите возможность изменения типа ввода количества пользователем наint.- ваш оригинал у кода не было механизма, чтобы вырваться из Меню верхнего уровня, т. е. установить
choiceна что-то другое, чем"y". Я вообще ничего не сделал, чтобы решить эту проблему. Та же проблема все еще существует в коде здесь.- "рахат-лукум" может описывать широкий спектр конфет, но я никогда не видел ни одной, которую я бы охарактеризовал как шоколадный батончик. Вы можете пересмотреть описание пунктов меню верхнего уровня, если собираетесь их продавать. :)
Comments