[英]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.