我编写了一个这样的计算器,我也在这里找到了控制台选项,我仍然只是弄清楚它是如何工作的,问题是添加之后,结果变量中会放置零,因此代码无法正常工作。
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();
}
}
}
}
}
首先,你将了解什么是局部变量,什么是静态类字段,什么是类实例字段。类的静态字段
result和类方法的参数具有相同的名称ActionResult。这就是造成您困惑的原因。您从类方法返回的未分配到任何地方,而仅输出到控制台。因此,当您进一步执行某些操作时,将类的静态字段传递给您的方法,您传递,使用该类型字段默认进行初始化。val1val2resultresult0int理想情况下,您通常应该摆脱静态类字段并明确分配所有值。
result从类方法返回- 分配给一个变量。然后这个变量被传递给某个函数。这样你就会了解变量实际发生的情况。一旦您理解了编程的函数式风格,当所有内容都被明确传递和返回时,您就可以继续进行 OOP、封装和处理类字段。然后也许它会变成静态字段。但直到你了解常规变量、函数/方法参数、向方法/函数传递值、返回并在某处分配这些值之后,你才有可能做到这一点。现在您只是对不同类型的变量感到困惑,这就是您遇到问题的原因。从简单类型(局部变量)开始,然后转到复杂的概念:OOP、类及其字段、方法等。
result方法中的变量是按值传递的,而不是按引用传递的。这意味着方法内部的任何改变都不会影响全局变量result。例如,你可以像这样更正它:
以及:
总而言之:
result未被保存- 方法获取它的副本,而不是改变全局变量。需要result从参数中删除并将结果result写入Start()。ActionResult方法内部不会改变全局值——因为声明了一个新变量。您只需分配,ActionResult = true;无需创建新的。计算结果未保存——程序将其显示在屏幕上,但未记录。调用该方法后需要进行赋值
result = Slozhenie(val1, val2);。