如何有效地将变量从一个函数放到另一个函数中

问题描述 投票:1回答:1

我想不出好名字,所以随时更改。

我正在制作一个C#数学控制台项目,用户将根据他们选择的难度回答加,减,乘,除,乘方和平方根问题!

这是我的代码:

using System;
using System.Collections.Generic;

namespace mathstester
{
    class Program
    {
        public enum UserDifficulty
        {
            Easy,
            Normal,
            Hard
        }

        public enum MathOperation
        {
            Addition = 1,
            Subtraction = 2,
            Multiplication = 3,
            Division = 4,
            Power = 5,
            SquareRoot = 6
        }
        public static (int operationMin, int operationMax) GetPossibleOperationsByDifficulty(UserDifficulty userDifficulty)
        {

            switch (userDifficulty)
            {
                case UserDifficulty.Easy:
                    return (1, 4);
                case UserDifficulty.Normal:
                    return (1, 5);
                case UserDifficulty.Hard:
                    return (3, 7);
                default:
                    throw new Exception();
            }
        }
        public static (string message, double correctAnswer) GetMathsEquation(MathOperation mathOperation, UserDifficulty userDifficulty)
        {

            int number1;
            int number2;
            Random randomNumber = new Random();

            switch (mathOperation)
            {
                case MathOperation.Addition:
                    number1 = randomNumber.Next(1000);
                    number2 = randomNumber.Next(1000);
                    return ($"{number1} + {number2}", number1 + number2);
                case MathOperation.Subtraction:
                    number1 = randomNumber.Next(1000);
                    number2 = randomNumber.Next(1000);
                    return ($"{number1} - {number2}", number1 - number2);
                case MathOperation.Multiplication:
                    number1 = userDifficulty == UserDifficulty.Easy ? randomNumber.Next(13) : randomNumber.Next(1000);
                    number2 = userDifficulty == UserDifficulty.Easy ? randomNumber.Next(13) : randomNumber.Next(1000);
                    return ($"{number1} * {number2}", number1 * number2);
                case MathOperation.Division:
                    number1 = randomNumber.Next(10000);
                    number2 = randomNumber.Next(1000);
                    return ($"{number1} / {number2}", number1 / (double)number2);
                case MathOperation.Power:
                    number1 = randomNumber.Next(13);
                    number2 = randomNumber.Next(5);
                    return ($"{number1} ^ {number2}", Math.Pow(number1, number2));
                case MathOperation.SquareRoot:
                    number1 = randomNumber.Next(1000);
                    return ($"√{number1}", Math.Sqrt(number1));
                default:
                    throw new Exception();
            }
        }

        public static (int operationQuestion, int operationScore) Score(MathOperation mathOperation)
        {
            int additionQuestion = 0;
            int additionScore = 0;
            int subtractionQuestion = 0;
            int subtractionScore = 0;
            int multiplicationQuestion = 0;
            int multiplicationScore = 0;
            int divisionQuestion = 0;
            int divisionScore = 0;
            int powerQuestion = 0;
            int powerScore = 0;
            int squareRootQuestion = 0;
            int squareRootScore = 0;

            switch (mathOperation)
            {
                case MathOperation.Addition:
                    return (additionQuestion, additionScore);
                case MathOperation.Subtraction:
                    return (subtractionQuestion, subtractionScore);
                case MathOperation.Multiplication:
                    return (multiplicationQuestion, multiplicationScore);
                case MathOperation.Division:
                    return (divisionQuestion, divisionScore);
                case MathOperation.Power:
                    return (powerQuestion, powerScore);
                case MathOperation.SquareRoot:
                    return (squareRootQuestion, squareRootScore);
                default:
                    throw new Exception();
            }
        }
        public static (int, int, int) RunTest(int numberOfQuestionsLeft, UserDifficulty userDifficulty)
        {
            int totalScore = 0;
            Random random = new Random();
            var (operationMin, operationMax) = GetPossibleOperationsByDifficulty(userDifficulty);
            var (operationQuestion, operationScore) = (0, 0);

            while (numberOfQuestionsLeft > 0)
            {
                int mathRandomOperation = random.Next(operationMin, operationMax);
                MathOperation mathOperation = (MathOperation)mathRandomOperation;
                (operationQuestion, operationScore) = Score(mathOperation);
                var (message, correctAnswer) = GetMathsEquation(mathOperation, userDifficulty);
                if (mathRandomOperation == 4 || mathRandomOperation == 6)
                {
                    Console.Write($"To the nearest integer, What is {message} =");
                }
                else
                {
                    Console.Write($"What is {message} =");
                }
                double userAnswer = Convert.ToDouble(Console.ReadLine());
                if (Math.Round(correctAnswer) == userAnswer)
                {
                    Console.WriteLine("Well Done!");
                    totalScore++;
                    operationQuestion++;
                    operationScore++;
                }
                else
                {
                    Console.WriteLine("Your answer is incorrect!");
                    operationQuestion++;
                }
                numberOfQuestionsLeft--;
            }
            return (totalScore, operationQuestion, operationScore);
        }
        public static void Main(string[] args)
        {
            Dictionary<string, UserDifficulty> dict = new Dictionary<string, UserDifficulty>();
            dict.Add("E", UserDifficulty.Easy);
            dict.Add("N", UserDifficulty.Normal);
            dict.Add("H", UserDifficulty.Hard);

            string userInputDifficulty = "";
            do
            {
                Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
                userInputDifficulty = Console.ReadLine().ToUpper();
            } while (userInputDifficulty != "E" && userInputDifficulty != "N" && userInputDifficulty != "H");

            UserDifficulty userDifficulty = dict[userInputDifficulty];

            int numberOfQuestions = 0;
            do
            {
                Console.WriteLine("How many questions would you like to answer? Please type a number divisible by 10!");
                int.TryParse(Console.ReadLine(), out numberOfQuestions);
            } while (numberOfQuestions % 10 != 0);

            var (totalScore, operationQuestion, operationScore) = RunTest(numberOfQuestions, userDifficulty);
            Console.WriteLine($"You got a score of {totalScore} out of {numberOfQuestions}");

            if(userDifficulty == UserDifficulty.Easy)
            {
                Console.WriteLine($"You got an addittion score of {operationScore} out of {operationQuestion}");
                Console.WriteLine($"You got an addition score of {operationScore} out of {operationQuestion}");
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
            }
            else if (userDifficulty == UserDifficulty.Normal)
            {
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
            }
            else if (userDifficulty == UserDifficulty.Hard)
            {
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
                Console.WriteLine($"You got a score of {operationScore} out of {operationQuestion}");
            }
        }
    }
}

在函数“ Score”中,我有很多要在函数“ RunTest”中使用的变量。如何移动变量而不必再次全部写入?

谢谢!

c# function variables
1个回答
0
投票

如@devNull所指出,Score始终返回(0,0)。该函数可以如下重写:

    public static (int operationQuestion, int operationScore) Score(MathOperation mathOperation)
    {
        switch (mathOperation)
        {
            case MathOperation.Addition:
            case MathOperation.Subtraction:
            case MathOperation.Multiplication:
            case MathOperation.Division:
            case MathOperation.Power:
            case MathOperation.SquareRoot:
                return (0, 0);
            default:
                throw new Exception();
        }
    }

或者如果您确定不需要不兼容 MathOperator:]的异常处理,

// Note: no more parameters as well
public static (int operationQuestion, int operationScore) Score()
{
    return (0, 0);
}

这在RunTest中的while循环中仍然具有相同的功能因为Score中的变量是本地定义的,并且不是参考值。

© www.soinside.com 2019 - 2024. All rights reserved.