Подскажите почему Switch case 1 возвращает 0 в переменную result
Написал вот такой калькулятор, консольный выбор так же нашел тут, пока только разбираюсь как он работает, вопрос собственно в том, что после сложения в переменную result помещается ноль и соответственно дальше код работает не верно.
using System.Security.Cryptography.X509Certificates;
namespace ConsoleApp3
{
public class Program
{
public static int val1 = 1;
public static int val2 = 2;
public static int result;
public static bool ActionResult = false;
static int Slozhenie(int val1, int val2, int result, bool ActionResult)
{
ActionResult = true;
result = val1 + val2;
return result;
}
static int Vychitanie(int val1, int val2, int result)
{
result = val1 - val2 ;
bool ActionResult = true;
return result;
}
static int Umnozhenie(int val1, int val2, int result)
{
result = val1 * val2;
bool ActionResult = true;
return result;
}
static int Delenie(int val1, int val2, int result)
{
result = val1 / val2;
bool ActionResult = true;
return result;
}
static int SlozhenieAfter(int val2, int result, bool ActionResult)
{
ActionResult = true;
result = result * val2;
return result;
}
public static int Start()
{
ActionResult = true;
// done: // запускает все сначала
string[] menuItems = new string[] { "Сложение", "Вычитание", "Деление", "Умножение" };
Console.WriteLine("Меню\n");
int row = Console.CursorTop;
int col = Console.CursorLeft;
int index = 0;
while (true)
{
DrawMenu(menuItems, row, col, index);
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.DownArrow:
if (index < menuItems.Length - 1)
index++;
break;
case ConsoleKey.UpArrow:
if (index > 0)
index--;
break;
case ConsoleKey.Enter:
switch (index)
{
case 0:
Console.WriteLine("\nРезультат сложения равен: " + Slozhenie(val1, val2, result, ActionResult));
return 1;
case 1:
Console.WriteLine("\nРезультат вычитания равен: " + Vychitanie(val1, val2, result));
return Vychitanie(val1, val2, result);
case 2:
Console.WriteLine("\nРезультат деления равен: " + Delenie(val1, val2, result));
return Delenie(val1, val2, result);
case 3:
Console.WriteLine("\nРезультат умножения равен: " + Umnozhenie(val1, val2, result));
return Umnozhenie(val1, val2, result);
}
break;
}
}
}
public static int StartAfter ()
{
done1: // запускает все сначала
string[] menuItems = new string[] { "Сложение", "Вычитание", "Деление", "Умножение" };
Console.WriteLine("Меню\n");
int row = Console.CursorTop;
int col = Console.CursorLeft;
int index = 0;
while (true)
{
DrawMenu(menuItems, row, col, index);
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.DownArrow:
if (index < menuItems.Length - 1)
index++;
break;
case ConsoleKey.UpArrow:
if (index > 0)
index--;
break;
case ConsoleKey.Enter:
switch (index)
{
case 0:
Console.WriteLine("\nРезультат сложения равен: " + SlozhenieAfter(val2, result, ActionResult));
return 1;
case 1:
Console.WriteLine("\nРезультат вычитания равен: " + Vychitanie(val1, val2, result));
goto done1;
case 2:
Console.WriteLine("\nРезультат деления равен: " + Delenie(val1, val2, result));
goto done1;
case 3:
Console.WriteLine("\nРезультат умножения равен: " + Umnozhenie(val1, val2, result));
goto done1;
}
break;
}
}
}
static void DrawMenu(string[] items, int row, int col, int index)
{
Console.SetCursorPosition(col, row);
for (int i = 0; i < items.Length; i++)
{
if (i == index)
{
Console.BackgroundColor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Black;
}
Console.WriteLine(items[i]);
Console.ResetColor();
}
Console.WriteLine();
}
public static void Main(string[] args)
{
while (true) {
if (ActionResult)
{
StartAfter();
}
else
{
Start();
}
}
}
}
}
Ответы (2 шт):
Вы разберитесь сначала что такое локальные переменные, что такое статические поля класса, что такое поля экземпляра класса. У вас одинаковое название у статических полей класса result
, ActionResult
, val1
и val2
и у аргументов методов класса. Из-за этого у вас путаница. Ваш result
, который вы возвращаете из методов класса, никуда не присваивается, а только выводится в консоль. Поэтому когда вы дальше делаете какие-то действия, передавая в ваши методы статическое поле класса result
, вы передаёте 0
, которым это поле типа int
по дефолту инициализировано.
static int Slozhenie(int val1, int val2, int result, bool ActionResult)
{
// аргументы метода - это локальные переменные
ActionResult = true; // это присваивание в аргумент метода ничего не поменяет
result = val1 + val2; // тут result - это опять аргумент метода
return result; // _значение_ результата вернули, но см. ниже
}
// ...
// результат вызова метода, который вернули, тут никуда не записался
Console.WriteLine("\nРезультат сложения равен: " + Slozhenie(val1, val2, result, ActionResult));
По-хорошему вообще вам нужно избавляться от статических полей класса и присваивать все значения в явном виде. Вернули result
из метода класса - присвоили его в переменную. Дальше эту переменную передали в какую-то функцию. Так у вас будет понимание, что вообще происходит с вашими переменными. Когда разберётесь с функциональным стилем программирования, когда всё явно передаётся и возвращается - тогда можете переходить к ООП, инкапсуляции и обращению с полями класса. А там может и до статических полей дело дойдёт. Но не раньше, чем вы разберётесь с обычными переменными, аргументами функций/методов, передачей значений в методы/функции, возвратом и присваиванием куда-то этих значений.
А сейчас вы просто путаетесь в разных типах переменных, из-за чего у вас и проблемы. Начните с простых типов (локальных переменных) и потом уже переходите к сложным понятиям: ООП, классы и их поля, методы и т.д.
переменная result
в методах передается по значению, а не по ссылке. Это значит, что любое изменение внутри методов не отражается на глобальной переменной result
.
Можно например поправить так:
static int Slozhenie(int val1, int val2)
{
ActionResult = true;
return val1 + val2;
}
и еще:
static int Vychitanie(int val1, int val2)
{
ActionResult = true;
return val1 - val2;
}
В общем:
result
не сохраняется – методы получают его копию, а не изменяют глобальную переменную. Нужно убратьresult
из параметров и записывать результат вresult
вStart()
.ActionResult
внутри методов не меняет глобальное значение – из-за объявления новой переменной. Нужно просто присваиватьActionResult = true;
без создания новой.Результат вычислений не сохраняется – программа выводит его на экран, но не записывает. Нужно после вызова метода присваивать
result = Slozhenie(val1, val2);
.