繁体   English   中英

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

[英]How to Make User Input into Array and Pass It to a Method in C#?

所以我创建了这个非常简单的程序,它获取用户输入,然后将值传递给名为 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);                                 
    }
 }
}

我将不胜感激任何帮助。 谢谢!

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

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

namespace Averages
{
    class Program
    {
        static void Main(string[] args)
        {
            //list to hold your numbers, way more flexible than array
            List<double> enteredNubers = new List<double>();

            //message user
            Console.WriteLine("Enter number(s) or 0 to end: ");

            //run this block of code indefinitely
            while (true)
            {
                //take user input
                string userinput = Console.ReadLine().Trim();
                //if user enters 0, exit this loop
                if (userinput == "0")
                    break;


                double num;
                //try to convert text to number
                if (double.TryParse(userinput, out num))
                {
                    //if it is successful, add number to list
                    enteredNubers.Add(num);
                }
                else //else message user with error
                    Console.WriteLine("Wrong input. Please enter number or 0 to end");
            }

            //when loop is exited (when user entered 0), call method that calculates average
            Average(enteredNubers);
            Console.ReadKey();
        }
        static void Average(List<double> numbers)
        {
            double sum = 0;
            //go through list and add each number to sum
            foreach (double num in numbers)
            {
                sum += num;
            }
            //or, you can sum it using linq like this:
            //sum = numbers.Sum();
            //or you can even calculate average by calling Average method on list, like numbers. Average();

            //show message  - all the entered numbers, separated by comma
            Console.WriteLine("You have entered: " + string.Join(", ", numbers.ToArray()));
            //write average
            Console.WriteLine("The average is: " + sum/numbers.Count);
        }
    }
}

在这里相应地更新您的方法

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);                                
}

让我们一步步解决问题。 首先我们要添加一个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}"); 
  } 

类似以下内容应该可以满足您的需求:

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());
}

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

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);
}

你有几个选择。 要么要求以某种方式分隔用户输入。 例如,逗号分隔的用户输入将是“1、2、3、4”。 然后,您必须担心解析它并确保用户输入有效的输入。

另一种选择是有一个包含Console.ReadLine()while循环,只有当用户输入一个预先确定的退出词(例如“停止”或“退出”)时,您才退出循环

    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 ,我们可以将我们的列表传递给这个方法。 IEnumerable有一个内置的Average()方法。

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);
}

一般来说,对于这种事情,Lists 比 Arrays 好; 列表是有弹性的,数组不是。 如果您希望它处理 4(或 200)个数字,您所要做的就是更改 for 循环的边界。

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

看着所有这些花哨的答案,我猜人们忘记了编程的基础知识。

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));
    }

}

您还可以通过让用户输入其长度来动态设置数组的长度,只需玩弄代码并发挥您的想象力。 快乐编码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM