如何使用户输入成为数组并将其传递给C#中的方法?

时间:2018-07-20 13:53:10

标签: c# .net arrays

因此,我有一个非常简单的程序,该程序可以获取用户输入,然后将值传递给名为average的方法。一切都很好,但是,诸如“如果用户仅输入两个数字或一个数字数组该怎么办?”之类的想法就浮现在我的脑海。我知道我必须使用数组作为参数,但是以某种方式我不确定如何完成我想做的事情。你们对我如何实现我想做的事情有任何提示吗?我的代码在这里:

using System;

namespace Averages
{
class Program
{
    static void Main(string[] args)
    {                    
        Console.WriteLine("Enter number(s): ");
        double num1 = Convert.ToInt32(Console.ReadLine());
        double num2 = Convert.ToInt32(Console.ReadLine());
        double num3 = Convert.ToInt32(Console.ReadLine());
        average(num1, num2, num3);         
        Console.ReadKey();           
    }
    static void average(double num1, double num2, double num3)
    {
        double avg = (num1 + num2 + num3) / 3;
        Console.WriteLine("You have entered: " + num1 + ", " + num2 + ", " + num3);
        Console.WriteLine("The average is: " + avg);                                 
    }
 }
}

我将不胜感激。谢谢!

8 个答案:

答案 0 :(得分:3)

您可以要求用户输入逗号分隔的数字。或者,您可以重复输入,直到用户输入0为止。在这种情况下,您可以将程序更改为:

{{1}}

答案 1 :(得分:2)

在此相应地更新您的方法

static void Main(string[] args)
{                    
    Console.WriteLine("Type Exit to stop the program... \nEnter number");
    List<double> doubleList = new List<double>();
    string input = Console.ReadLine();
    double d;
    while(!input.Equals("Exit"))
    {
        if(String.IsNullOrEmpty(input) || !Double.TryParse(input,out d))
        {
            break;
        }
        doubleList.Add(d);
        input = Console.ReadLine();
    }
    average(doubleList);         
    Console.ReadKey();           
}
static void average(List<double> doubleData)
{
    double total = 0;
    foreach (double number in doubleData)
    {
        total += number;
    }
    Console.WriteLine("Average = " + total/doubleData.Count);                                
}

答案 2 :(得分:2)

让我们逐步解决问题。首先,我们要添加一个double

  private static bool ReadDouble(out double value) {
    value = 0.0;

    while (true) {
      Console.WriteLine("Enter number or X to exit:");

      string input = Console.ReadLine().Trim();

      if (input == "X" || input == "x") 
        return false;
      else if (double.TryParse(input, out value)) 
        return true;

      Console.Write("Syntax error, please, try again.");
    }
  }

现在,我们可以读取值的任意数了。由于我们不知道数字,因此List<double>double[]

更好
  using System.Collections.Generic;

  ...

  private static List<double> ReadDoubles() {
    List<double> result = new List<double>();

    while (ReadDouble(out var value))
      result.Add(value);

    return result;        
  }

最后,我们要计算平均值

  static void Main(string[] args) {
    List<double> list = ReadDoubles();

    if (list.Count <= 0)
      Console.WriteLine("Empty list: no average");
    else {
      double sum = 0.0;

      foreach (double item in list)
        sum += item;

      double avg = sum / list.Count;

      Console.Write("The average is: " + avg);
    }
  }

但是,您可以通过 Linq 仅几行即可完成操作:

  using System.Collections.Generic;
  using System.Collections.Linq;

  ...

  static void Main(string[] args) {
    Console.WriteLine("Enter numbers separated by spaces, e.g. 1 2 3 15");

    double avg = Console
      .ReadLine()
      .Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries)
      .Select(item => double.Parse(item))  
      .Average();

    Console.Write($"The average is: {avg}"); 
  } 

答案 3 :(得分:1)

以下内容应能满足您的需求:

string stopLine = "STOP";
List<double> lines = new List<double>();
string line;
while ((line = Console.ReadLine()) != stopLine) {
    lines.Add(Convert.ToDouble(line));
}
Average(lines);
Console.ReadLine();

现在您的平均方法变为

private static void Average(List<double> lines) {
    Console.WriteLine(lines.Average());
}

请注意,您应该处理输入不是数字的情况。

答案 4 :(得分:1)

static void Main(string[] args)
{
    Console.WriteLine("Enter number(s): ");
    string input = "";
    List<double> doubleList = new List<double>();
    while (input != "q")
    {
        input = Console.ReadLine();
        if(input != "q")
        {
            try
            {
                doubleList.Add(Convert.ToInt32(input));
            }
            catch
            {
                Console.WriteLine("Invalid input");
            }
        }
    }

    average(doubleList);
    Console.ReadKey();
}
static void average(List<double> myList)
{
    double sum = 0;
    Console.Write("You have entered: ")
    foreach (int element in myList)
    {
        sum += element;
        Console.Write(element + ", ");
    }
    Console.WriteLine("");

    double avg = sum / myList.Count;

    Console.WriteLine("The average is: " + avg);
}

答案 5 :(得分:1)

您有两种选择。要求以某种方式取消用户输入。例如,逗号分隔的用户输入将为“ 1、2、3、4”。然后,您就不必担心解析它并确保用户输入了有效的输入。

另一种选择是在while内创建一个Console.ReadLine()循环,并且只有当用户输入一个预定的退出词(例如“ stop”或exit”)时,您才退出循环

    static void Main(string[] args)
    {
        var inputValues = new List<double>();

        while (true)
        {
            var input = Console.ReadLine();

            if (input.Equals("stop", StringComparison.InvariantCultureIgnoreCase))
                break;

            if (double.TryParse(input, out double inputValue))
            {
                inputValues.Add(inputValue);
            }
            else
            {
                Console.WriteLine("Invalid input!");
            }
        }


        PrintAverage(inputValues);
        Console.ReadKey();
    }

    static void PrintAverage(IEnumerable<double> values)
    {
        Console.WriteLine("You have entered: {0}", string.Join(", ", values));
        Console.WriteLine("The average is: {0}", values.Average());
    }

在这里,我选择了第二个选项。它将不断循环直到输入为stop。现在,它还将尝试解析该值,而不是直接进行转换,并且如果解析失败,将打印警告消息。

如果解析成功,则将其添加到我们的inputValues集合中。一旦退出while循环,我们会将集合传递给PrintAverage-一种采用IEnumerable<double>的方法(可以是一个值,100个值或没有值)。由于List实现了IEnumerable,因此我们可以将列表传递给此方法。 IEnumberable具有内置的Average()方法。

答案 6 :(得分:1)

static void Main(string[] args)
{
    var numbers = new List<double>();
    Console.WriteLine("Enter the three numbers, one per line");
    for (var i = 0; i < 3; ++i)
    {
        while (true)
        {
            if (double.TryParse(Console.ReadLine(), out var enteredNumber))
            {
                //the number is a number, so...
                numbers.Add(enteredNumber);
                break;
            }
            //if not a number...
            Console.WriteLine("That's not a number, try again");
        }
    }

    Average(numbers);
    Console.ReadKey();
}
static void Average(IEnumerable<double> numbers)
{
    var average = numbers.Average();
    Console.Write("You have entered: ");
    foreach (var num in numbers)
    {
        Console.Write($" {num}  ");
    }
    Console.WriteLine(String.Empty);
    Console.WriteLine("The average is: " + average);
}

通常,在这种情况下,列表比数组要好。列表是可伸缩的,数组不是。如果要让它使用4(或200)个数字,则只需更改for循环的边界即可。

我正在使用double.TryParse,这样我可以让用户纠正输入错误的数字(始终假设用户将输入错误的数据)。我将数字集合作为IEnumerable而不是列表传递给平均值函数(几乎不需要平均值函数(请注意,平均值的计算只是对数字集合的扩展方法),但是您只有一个,所以我包含了它。IEnumerable不能被调用的函数更改,因此在这里更合适(而且所有列表(就此而言,所有数组)都是可枚举的)。

答案 7 :(得分:1)

看着所有这些奇特的答案,我想人们正在忘记编程的基础。

OP确实声明使用数组,而不是所有人都将他推入难以阅读的代码中。这个家伙正在尝试学习那些没人在乎的基础知识。

亲爱的赛勒斯(Cyrus)不会马上进入仿制药。我建议您坚持使用一段时间。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter number(s): ");
        double[] values = new double[3]; //initialize double array with its size

        for (int i = 0; i < values.Length; i++)
        {
            //iterate through the array and assign value to each index of it.
            values[i]=Convert.ToDouble(Console.ReadLine());
        }
        average(values);
        Console.ReadKey();
    }
    //set method that accepts double array as parameter
    static void average(double[] values)
    {
        double average =0;// declare var that will hold the sum of numbers 
        int length = values.Length;//get array length, use it to divide the summation of numbers
        Console.WriteLine("You have entered: ");
        for (int i = 0; i < values.Length; i++)
        {
            //also display the numbers if you need to
            Console.WriteLine(values[i]);
            //iterate through each value in the array and sum it up.
            average = values[i] + average;
        }
        //divide the sum of numbers by the length of array
        Console.WriteLine("The average is: " + (average/length));
    }

}

您还可以通过让用户输入array的长度来动态设置Unicode Byte Order Mark的长度,只需玩代码并放松您的想象力即可。编码愉快!