c # Фильтр int для конкретного параметра - PullRequest
0 голосов
/ 11 октября 2019

Есть ли еще какой-нибудь "элегантный" способ отфильтровать ввод чисел по конкретным параметрам?

Как и здесь, мне нужно говорить разные вещи, если вы слишком высоки, низки или ограничены.

Буду признателен, если вы объясните, что вы предлагаете. Я как 2 недели в программировании.

      //VARIABLES
      int userNumber;//uN
      int searchedNumber;//sN

      //NUMBER WE'RE LOOKING FOR
      searchedNumber = 87;

      //TASK FOR "CUSTOMER"
      Console.WriteLine("Type in a number between 1-100!");

      //DO-WHILE, because it hast to run one either way
      do 
      {
        //READING OUT CONSOLE
        string userNumberString = Console.ReadLine();

        //CONVERTING STRING TO INT
        userNumber = int.Parse(userNumberString);

        //uN > THAN sN BUT <= 100
        if (userNumber > searchedNumber && userNumber <= 100)
        {
          Console.WriteLine("To High! /n Try again.");
        }
        //uN < THAN sN BUT >= 1
        else if (userNumber < searchedNumber && userNumber >= 1)
        {
          Console.WriteLine("To Low!  /n Try again.");
        }
        //uN >= 101 AND uN <= 0
        else if (userNumber >= 101 || userNumber <= 0)
        {
          Console.WriteLine("Between 1 and 100, Dummy!");
        }
        else
        {
        //IF NOTHING IS TRUE uN=sN
          Console.WriteLine("JACKPOT!");
        }
      //LOOPING CONDITION
      } while (userNumber != searchedNumber);

Если этот вопрос где-то уже получен, прошу прощения. Английский не мой родной язык, и я изо всех сил пытался найти правильный термин для поиска.

Ответы [ 4 ]

2 голосов
/ 11 октября 2019

Я предлагаю методы извлечения , пожалуйста, не объединяйте все в одну огромную процедуру:

  public static int ReadInteger(string title) {
    if (!string.ISNullOrWhiteSpace(title))  
      Console.WriteLine(title);

    while (true) {
      if (int.TryParse(Console.ReadLine(), out int result))
        return result;

      Console.WriteLine("This is not a valid integer! Try again.");
    }
  }

  public static string FeedBack(int user, int actual) {
    if (user < 0 || user > 100)
      return "Between 1 and 100, Dummy!"
    else if (user < actual)
      return "Too Low!  /n Try again.";
    else if (user > actual)
      return "Too High! /n Try again.";
    else
      return "JACKPOT!"
  }

Затем используйте эти методы в крошечном цикле:

  int userNumber = 0;
  int searchedNumber = 87;

  do {
    userNumber = ReadInteger("Type in a number between 1-100!");

    Console.WriteLine(FeedBack(userNumber, actual)); 
  }     
  while (userNumber != searchedNumber); 
0 голосов
/ 11 октября 2019

Думая о коде уборщика:

public static void Main()
{
    //VARIABLES
    int userNumber;//uN
    int searchedNumber = 87;
    int min = 1;
    int max = 100;

    //TASK FOR "CUSTOMER"
    Console.WriteLine($"Type in a number between {min}-{max}!");

    //DO-WHILE, because it hast to run one either way
    do
    {
        //READING OUT CONSOLE
        string userNumberString = Console.ReadLine();
        //CONVERTING STRING TO INT
        if (int.TryParse(userNumberString, out userNumber))
        {
            if (userNumber >= min && userNumber <= max)
            {
                if (userNumber == searchedNumber)
                {
                    Console.WriteLine("JACKPOT!");
                }
                else
                {
                    Console.WriteLine("To " + (userNumber < searchedNumber ? "Low" : "High") + "! Try again.");
                }
            }
            else
            {
                Console.WriteLine($"Between {min} and {max}, Dummy!");
            }
        }
        else
        {
            Console.WriteLine($"One integer number, Dummy!");
        }

    } while (userNumber != searchedNumber);
}

TryParse это очень важно

0 голосов
/ 11 октября 2019

Этот код может стать немного чище, если изменить условия - if станет намного проще :) Кроме того, если у вас есть одна строка в if, вы можете опустить фигурные скобки, см. Код ниже. Я также включил некоторые комментарии, которые, я надеюсь, будут полезны:

do 
{
  //READING OUT CONSOLE
  string userNumberString = Console.ReadLine();

  //CONVERTING STRING TO INT
  // here you need to be careful, what if user types "a"?
  // I suggest reading about int.TryParse :)
  userNumber = int.Parse(userNumberString);

  //uN >= 101 AND uN <= 0
  if (userNumber >= 101 || userNumber <= 0)
    Console.WriteLine("Between 1 and 100, Dummy!");
  // now we are sure we are in the range
  if (userNumber > searchedNumber)
    Console.WriteLine("To High! /n Try again.");
  else if (userNumber < searchedNumber)
    Console.WriteLine("To Low!  /n Try again.");
  else
    //IF NOTHING IS TRUE uN=sN
    Console.WriteLine("JACKPOT!");
//LOOPING CONDITION
} while (userNumber != searchedNumber);
0 голосов
/ 11 октября 2019

Один из способов избавиться от всех операторов else - переместить код в метод и вернуться из метода, как только вы узнаете, каким должен быть ответ. Как то так

public string EvaluateNumber(int userNumber, int searchedNumber)
{
    if (searchedNumber <= 0 || searchedNumber >= 101)
        return "Between 1 and 100, Dummy!";
    if (searchedNumber < userNumber)
        return "Too low! /n Try again.";
    if (searchedNumber > userNumber)
        return "Too high! /n Try again.";
    return "JACKPOT!"; // If we get to here, the numbers are equal
}
...