【问题标题】:Write a program in C# and ask the user to enter 5 unique numbers用 C# 编写程序并要求用户输入 5 个唯一数字
【发布时间】:2018-10-22 11:01:10
【问题描述】:

编写一个程序并要求用户输入 5 个数字。如果一个号码有 之前已输入,显示错误消息并要求用户 重试。用户成功输入 5 个唯一数字后,对它们进行排序 并在控制台上显示结果。

有人可以帮我解决这个问题吗?我真的很困惑如何解决这个问题。这是我的代码。

var number = new int[5];
Console.WriteLine("Enter 5 unique numbers");

for (int i = 0; i < 5; i++)
{
    number[i] = Convert.ToInt32(Console.ReadLine());
    var numberValue = number[i];

    var currentNumber = Array.IndexOf(number, numberValue);
    if (number[i] == number[0])
    {
        continue;
    }
    else
    {
        if (!(currentNumber == number[i]))
        {
            continue;
        }
        else
        {
            Console.WriteLine("Hold on, you already entered that number. Try again.");
        }
    }

    /* foreach (var n in number) { ... } */
    continue;
}

Array.Sort(number);
Console.WriteLine();

foreach (var n in number)
    Console.WriteLine(n);

Console.WriteLine();

我在检查是否已经输入了相同的数字时找不到解决方案。请帮帮我。并请解释为什么它是答案。

PS:你能不能只用简单的代码,不要用HashSet之类的关键字?我知道这会解决问题,但我还不知道。我只是想一步一步地学习 C#,所以对此我很抱歉。谢谢!

【问题讨论】:

  • 不要使用 for (5) 循环,而是使用 while (list_of_input.Count 的数组并使用它的 Contains 方法。
  • 顺便说一句:尽量避免嵌套 if 和太多 continue 语句
  • 好的,谢谢您的提示。但这将如何帮助我找出问题的答案?
  • 如果元素不在数组中,您应该检查if (currentNumber == -1)。 indexOf 方法将返回 -1 不存在于数组中并且有效索引为 0 - n 如果有效。

标签: c# unique


【解决方案1】:

让我们提取一个方法并使用HashSet&lt;int&gt; 来确保数字是唯一的

   using System.Linq; // We are going to use .ToArray()

   ...

   private static int[] ReadUniqueNumbers(int count) {
     HashSet<int> numbers = new HashSet<int>();

     Console.WriteLine($"Enter {count} unique numbers"); 

     while (numbers.Count < count) {
       int number = 0;

       if (!int.TryParse(Console.ReadLine(), out number))  
         Console.WriteLine("Syntax error. Not a valid integer value. Try again.");
       else if (!numbers.Add(number))
         Console.WriteLine("Hold on, you already entered that number. Try again."); 
     }

     // Or if you want ordered array
     // return numbers.OrderBy(item => item).ToArray(); 
     return numbers.ToArray(); 
   }

...

   int[] number = ReadUniqueNumbers(5);

编辑:让我们使用好的旧循环,没有HashSetLinq

   private static int[] ReadUniqueNumbers(int count) {
     int[] result = new int[count];
     int numberCount = 0;

     while (numberCount < count) {
       int number = 0;

       // When working with user input we should be ready for any string:
       // user may well input "bla-bla-bla" (not an integer at all)
       if (!int.TryParse(Console.ReadLine(), out number))  
         Console.WriteLine("Syntax error. Not a valid integer value. Try again.");
       else {
         bool found = false;

         // Do we have duplicates? 
         // Linq (for reference only)
         // found = result.Take(numberCount).Any(item => item == number);
         for (int i = 0; i < numberCount; ++i)
           if (result[i] == number) {
             found = true; 

             break;
           }

         if (found) // Duplicate found
           Console.WriteLine("Hold on, you already entered that number. Try again."); 
         else {
           result[numberCount] = number;
           numberCount += 1; 
         }
       }  
     }

     return result;       
   } 

【讨论】:

  • 起初我想按照这个思路回答一些问题,但 OP 显然是一个初学者,他使用数组而不是集合,此外理想的代码不一定是理想的答案(它可能为零OP 的值,无需进一步解释)
  • 我不明白为什么这个答案被否决了!可能是 OP 是初学者,目前正在使用数组。但他应该足够热衷于学习新事物。如果他在看到这个答案后至少对 Hashset 到底是什么不感兴趣,那么我认为他不值得回复。
  • @Developer - 如果我错误地点击了赞成票和反对票,我很抱歉。我正在为每个人的回答点赞,因为我很感谢他们至少抽出一部分时间来在这里查看我的问题。如果我说我正在寻找以最简单形式编码的答案,我也很抱歉。我是初学者是的。我在没有专业人士指导的情况下学习 C#。我只是在看不同来源的视频。也许我不像你一样学得很快。我只想一步一步地学习这门语言,以便完全理解我在学习什么。谢谢。
  • @Developer 如果 OP 热衷于谷歌 Hashset 到底是什么,他就不会问这样一个基本问题......
  • 实际上,当 Dmitry 先生在他的原始代码中使用 HashSet 时,我早先在 Google 上搜索过 HashSet。但是,我不想在脑海中加载太多信息。我只是想完全掌握我正在观看的视频源中所学的内容。对不起,如果我在学习方面不像其他人。无论如何,谢谢。
【解决方案2】:
        var number = new int[5];
        Console.WriteLine("Enter 5 unique numbers");

        for (int i = 0; i < 5; i++)
        {
            while (true)
            {
                var newValue = Convert.ToInt32(Console.ReadLine());
                var currentNumber = Array.IndexOf(number, newValue);
                if (currentNumber == -1)
                {
                    number[i] = newValue; // Accept New value
                    break;
                }
                Console.WriteLine("Hold on, you already entered that number. Try again.");
            }
        }

        Array.Sort(number);
        Console.WriteLine();

        foreach (var n in number)
            Console.WriteLine(n);

        Console.ReadLine();

Array.IndexOf() 返回数组中 numberValue 的索引,如果不存在则返回 -1

【讨论】:

    【解决方案3】:
    for (int i = 0; i < 5; i++)
    {
        var numberValue = Convert.ToInt32(Console.ReadLine());
        var currentNumberIndex = Array.IndexOf(number, numberValue);
        if (currentNumberIndex >= 0)
        {
            Console.WriteLine("Hold on, you already entered that number. Try again.");
            i--;
        }
        else
        {
            number[i] = numberValue;
        }
    }
    

    Array.IndexOf() 返回数组中numberValue 的索引,如果不存在则返回-1

    【讨论】:

    • 这是朝着正确方向迈出的一步,但请注意,OP 已经将数字保存在数组中,您需要避免将默认情况下存在的 index >= i 匹配为 0。
    • 我不明白
    • 默认情况下 number[] 数组将被初始化为五个零。因此,如果我输入“0”,那么即使它还不是重复的,它也会在数组中找到。
    • 但是,即使我不输入 0,我的号码也会始终在数组中找到。您在循环中的第一行将数组中的数字放在索引 i 处,因此如果没有重复,那么 currentNumberIndex 将是 i,因为它找到了您刚刚添加的那个。
    【解决方案4】:
      List<Int32> Numbers=new List<Int32>();
      Console.WriteLine("Enter 5 unique numbers");
    
      while (Numbers.Count<5) {
        int result=-1;
        Boolean IsNumber=Int32.TryParse(Console.ReadLine(),out result);
        if (IsNumber==false) {
          Console.WriteLine("Please enter a number!!!");
          continue;
        }
    
        if (Numbers.IndexOf(result)>=0) {
          Console.WriteLine("Hold on, you already entered that number. Try again.");
          continue;
        }
        Numbers.Add(result);
      }
    

    【讨论】:

      【解决方案5】:

      其他人已经粘贴了他们的答案,但这是我的策略。它使用一个可以为空的数组和Contains 来避免每次用户输入数字时遍历数组中的数字。

      static void Main(string[] args)
      {
          var numbers = new int?[5];
      
          for (int i = 0; i < 5; i++)
          {
              Console.WriteLine($"Please enter number {i+1}.");
      
              do
              {
                  int n;
                  while (!int.TryParse(Console.ReadLine(), out n))
                      Console.WriteLine("Invalid number. Please try again.");
      
                  var currentNumber = Convert.ToInt32(n);
                  var containsNumber = numbers.Contains(currentNumber);
      
                  if (!containsNumber)
                  {
                      numbers[i] = currentNumber;
                      break;
                  }
      
                  Console.WriteLine("Number was entered previously, please enter a different number.");
              } while (true);
      
      
          }
      
          Console.Clear();
          Array.Sort(numbers);
      
          foreach (int? n in numbers)
              Console.WriteLine(n);
      
          Console.ReadLine();
      }
      

      【讨论】:

        【解决方案6】:
        var input = new HashSet<int>(); // accepts only unique values
        
        while (input.Count() < 5)
        {
            Console.WriteLine("enter value");
        
            int temp; // In newer C# it can be moved to TryParse e.g "out int temp"
            if (Int32.TryParse(Console.ReadLine(), out temp))
            {
                if (input.Contains(temp))
                {
                    Console.WriteLine("this number is already in collection");
                }
                else
                {
                    input.Add(temp);
                }
            }
            else
            {
                Console.WriteLine("incorrect value");
            }
        }
        // order by(lambda_expression) allows you to specify by "what things" 
        // you'd want to order that collection. In this case you're just sorting 
        // by numbers, but if it was complex objects collection then you'd be
        // able to sort by e.g student => student.Money; which would mean that 
        // you're sorting students by their Money count.
        foreach (var number in input.OrderBy(x => x))
        {
            Console.WriteLine(number);
        }
        

        【讨论】:

        • 注意这部分要求“如果之前输入过数字,显示错误信息并要求用户重试”
        • 虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。
        【解决方案7】:
          public static void Main (string[] args) {
            var numbers = new List<int>();
            while(numbers.Count() < 5)
            {
              var line = Console.ReadLine();
              int number;
              if (int.TryParse(line, out number)) {
                if (numbers.Contains(number))
                  Console.WriteLine("You already entered " + line);
                else
                  numbers.Add(number);
              } else
                Console.WriteLine(line + " is not a number");
            }
            Console.WriteLine(string.Join(", ", numbers.OrderBy(i => i)));
          }
        

        【讨论】:

          【解决方案8】:
          using System;
          using System.Collections.Generic;
          
          namespace exercise2
          {
              class Program
              {
                  static void Main(string[] args)
          
               {
                          //exercise 2 : question 3
                          Console.WriteLine("Please write 5 numbers");
                          var array = new int[5];
                          const int loop_leng = 5;
          
                          for(var i = 0; i < loop_leng; i++)
                          {
                              var input = Console.ReadLine();
                              if(string.IsNullOrWhiteSpace(input))
                              {
                                  Console.WriteLine("Re-try");
                                  break;
                              }
                              int numbers = Convert.ToInt32(input);
                              foreach (var x in array)
                              {
                                  if (numbers == x)
                                  {
                                  Console.WriteLine("don't repeat! re-try..");
                                  break;
                                  }
                              }
                              array[i] = numbers;
          
                              var a = Array.IndexOf(array, numbers);
                              var b = Array.LastIndexOf(array, numbers);
                              if(a != b)
                              { 
                              if(array[a] == array[i])
                              {
                                  break;
                              }
                              }
                          }
                          { 
                          Console.WriteLine();
                          Array.Sort(array);
                          foreach (var n in array)
                              Console.WriteLine(n);
                          }
          
                      }
                  }
              }
          }
          

          【讨论】:

          • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。
          【解决方案9】:

          兄弟你犯的小错误.. 你写的代码 if(number[i] == number[0] ) 将不起作用 正确答案 如果(数字[i] == 数字[i])

          【讨论】:

          • If(number[i] == number[i]) 等于 if (true) !
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-10
          • 2017-07-10
          • 2020-02-16
          • 1970-01-01
          • 2021-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多