【问题标题】:Sum Average Min Max without using inbuild functions or Methods in C#在不使用 C# 中的内置函数或方法的情况下求和平均最小值最大值
【发布时间】:2016-05-09 09:31:45
【问题描述】:

我编写了一个程序,用于计算 Sum、Average、Min 和 Max,而不使用 inbulit 函数或方法。我发现了许多技术并锁定在下面的一个。 但问题是,虽然以正常方式进行。结果来了。 在转换为 Windows 窗体时,我无法获得输出。它总是抛出错误。

private void button1_Click(object sender, EventArgs e)
{
int n = int.Parse(textBox7.Text);
int[] numbers = new int[n];
int sum = 0;
float average;

for(int i=0; i<n; i++)
{
numbers[i] = int.Parse(textBox1.Text);
}
Array.Sort(numbers);

for(int i=0; i<n; i++)
{
sum += numbers[i];
}

average = ((float)sum / n);

textBox4.Text = numbers[0].ToString();
textBox5.Text = numbers[-1].ToString();
textBox2.Text = sum.ToString();
textBox3.Text = average.ToString();
}

输出应该是这样的,

sum : 45
avg : 15
min : 8
max : 10

【问题讨论】:

  • 想一想您在问题中遗漏了哪些明显且重要的信息。
  • 你的代码中抛出了什么错误,是否与OutOfRange异常有关

标签: c# .net windows winforms


【解决方案1】:

我认为,您的代码中的问题在这里:

textBox5.Text = numbers[-1].ToString();

您的数组中不会有索引为 -1 的条目。

如果你想在 textBox5 中显示最大值,你需要这样做:

textBox5.Text = numbers[n-1].ToString();

如果你想在 textBox5 中显示最小值,你需要这样做:

textBox5.Text = numbers[0].ToString();

谢谢!

【讨论】:

  • n 不是最后一个数组索引,在你的情况下它会给出超出范围的异常。
  • 谢谢。但问题仍然存在。 for(int i=0; i
  • 我明白了。在你的 textBox1 中,你在输入什么?
  • 您需要使用一些分隔符输入您的号码,并且在您的代码中,您需要使用该分隔符将该输入字符串拆分为数组。
  • 我输入的是 34,89,54
【解决方案2】:

将数组 i 设置为包含通过表单上的用户输入传入的所有值。然后,您可以使用此代码获取所需的所有值。然后只需将变量 iMax、iMin、iSum 和 flAvg 写入输出标签。在本例中,我只是将自己的数据放入其中来说明代码。

    int[] i = { 1, 2, 3, 4, 5 };
    int iSum = 0;
    float flAvg = 0.0f;
    int iMax = 0;
    int iMin = Int32.MaxValue;
    foreach (int iElement in i)
    {
        iSum = iSum + iElement;
        flAvg = flAvg + iElement;
        if (iElement > iMax)
        {
            iMax = iElement;
        }
        if (iElement < iMin)
        {
            iMin = iElement;
        }
    }
        flAvg = flAvg / i.Length;
//carry on to do stuff with the data down here.

【讨论】:

    【解决方案3】:

    使用 linq,非常干净,工作正常:

              int n = int.Parse(textBox7.Text); ;
                int[] numbers = new int[n];
                for (int i = 0; i < n; i++)
                {
                    numbers[i] = int.Parse(textBox1.Text);
                }
               // var array = new short[] { 4, 4, 5, 6,9 };
    
                var sum = numbers.Select(x => (int)x).Sum();
                var avg = numbers.Select(x => (int)x).Average();
                var max = numbers.Select(x => (int)x).Max();
                var min = numbers.Select(x => (int)x).Min();
    
                textBox4.Text = sum.ToString();
                textBox5.Text = avg.ToString();
                textBox2.Text = min.ToString();
                textBox3.Text = max.ToString();
    

    【讨论】:

    • 禁止使用函数/方法。我应该可以没有这些
    • 你能解释一下为什么禁止使用函数/方法
    • Itz 用户要求。他们不需要任何内置函数。
    【解决方案4】:

    更改此行的代码:

     textBox5.Text = numbers[n-1].ToString();
    

    因为 -1 不是这里的索引,所以你在这里选择最大值,它将在 n-1 索引处。

    对于代码行:

      numbers[i] = int.Parse(textBox1.Text);
    

    使用这个:

    numbers[i] = Convert.ToInt32(textBox1.Text);
    

    【讨论】:

    • 这是错误,我正在排队 Numbers[i] = Convert.ToInt32(textbox.Text) 在 mscorlib.dll 中发生“System.FormatException”类型的未处理异常附加信息:输入字符串的格式不正确.
    • 您在文本框中输入的值是什么,它应该是整数值,因为您没有在代码中应用任何检查。所以你必须确保这种情况。
    • 请问Textbox1和textbox7的值是什么?
    • 您的程序不是动态的,无法在您提供数组时读取这些值。它应该在实际进行计算之前为您的号码创建一个数组。
    • @saadi 已清除我的错误。例如,Textbox1 的值为 21,45,76 (根据范围的数字集)。 Textbox7 为 3 (范围)
    猜你喜欢
    • 2023-03-31
    • 2021-04-14
    • 2018-03-28
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多