因此,我有一个非常简单的程序,该程序可以获取用户输入,然后将值传递给名为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 :(得分: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的长度,只需玩代码并放松您的想象力即可。编码愉快!