-1

一般来说,我知道int32错误意味着没有为控制台程序转换字符串值。我已经看到很多代码试图找到这个问题的答案,包括以下 stackoverflow 问题(见得多,但这些是最有用的:

话虽如此,这也是一项家庭作业,标题为 UsingSum.cs,如其中几个链接所示。我和这些的不同之处在于我试图让用户输入他们想要的任何整数,然后将它们相加。整个作业写在链接2中......

问题:尽管我做出了改变,但我总是得到 0 或System.Int32[]而不是总和。

我不能使用 Linq。

这是代码:

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

namespace UsingSum
{
class Program
{
    static void Main(string[] args)
    {
        int i;
        int usrInput;
        bool running = true;

        //Enter Question Asking Loop w/ running=true
        while (running)
        {
            Console.Write("Enter a number or enter 999 to exit: ");

            int[] array1 = new int[0];
            for (i = 0; i < array1.Length; i++)
            {
                usrInput = Convert.ToInt32(Console.ReadLine());
                array1[i] = Convert.ToInt32(usrInput);
            }

                for (i = 0; i < array1.Length; i++)
                {
                    Console.WriteLine(array1[i]);
                }

            /*If the user enters 999, calls Sum() and asks user to press any key to exit.
             changes 'running' from true to false to exit the question loop*/

            int exit = Convert.ToInt32 (Console.ReadLine());
            if (exit == 999)                    
            {
                running = false;                                       
                Sum(array1);
            }                        
        }
        //Loop complete

        Console.WriteLine("Press any key to exit.");
        Console.ReadLine();
    }

    public static void Sum(int[] numbers)
    {
        int [] sum1 = new int [0];
        int sum2 = 0;

        //Program accepts user responses with or w/o this loop...Int.32 error present both ways
        //for (int a = 0; a < numbers.Length; ++a)
            //sum1[a] = a;

        //additional loop tried w/o the loop above/below; 
            //when used in the WriteLine w/ sum2 it displays 0, when used with sum1 or numbers Int.32 error
       //Array.ForEach(sum1, delegate(int i) { sum2 += i; });

        foreach (int i in numbers)
            sum2 =+ i;

        Console.WriteLine("The sum of the values in your array is: " + sum1);
        /*tried changing 'numbers' to sum1, sum2, sum1.Convert.ToString(),sum2.Convert.ToString()
         numbers.Convert.ToString(), also tried converting sum2 to a string.*/
    }
}
}

这是我的最终解决方案!

  static void Main(string[] args)
    {
        AskUserForNumbers();
        Console.WriteLine("Press any key to exit");
        Console.ReadLine(); 
    }
public static List<Int32> AskUserForNumbers()
        {
            bool running = true;
            List<int> numbers = new List<int>();
            while (running)
            {
                Console.Write("Enter a number or enter 999 to exit: ");
                int inputValue;
                var inputString = Console.ReadLine();

                //Check for "999" which indicates we should display the numbers entered, the total and then exit our loop.
                if (inputString == "999")
                {                        
                    Console.WriteLine("The sum of the values in your array is: " + numbers.Sum());
                    running = false;
                }
                else if (Int32.TryParse(inputString, out inputValue) && inputValue > 0)
                {
                    numbers.Add(inputValue);
                }
                else
                {
                    Console.WriteLine("Please enter a whole number greater than 0");
                }
            }
            return numbers;
        }
    }
}
4

5 回答 5

2

几个问题:

首先,您总是将数组声明为int[] array1 = new int[0];. 这意味着您用于实际获取用户输入的代码永远不会命中。也许您应该尝试使用不同的集合类型(List<int>也许)。

其次,您在解析整数时从不执行任何错误检查。这是不好的做法。int.TryParse(string input, out result)在将其添加到数组之前,您应该使用它来验证它是一个有效数字。

第三,您正在循环输入数组的长度,这意味着您将循环遍历数组的长度,并将继续这样做,直到您拥有的最后一个输入是退出号(999)。

第四,您为退出代码获得的输入被丢弃(未添加到数组中进行求和)。

请记住,编程是非常程序化的。从 a 点到 b 点应该有清晰的(合乎逻辑的)步骤。事实上,假设你是一个程序,你要一个朋友给你一些数字来为他总结。给他任何你认为可能有用的信息(比如退出条件)。绘制步骤图,然后尝试将其转换为代码。

编辑:要点是数组(具有固定大小)不是这里工作的工具。你实际上并没有用任何数据填充数组,所以这就是总和永远不会发生的原因。罪魁祸首在这里:

int[] array1 = new int[0]; // Instantiate a zero-length array? Can't hold any values
// Will never hit inside the loop here, because i < array1.Length (which is zero) will always be false.
for (i = 0; i < array1.Length; i++) 

您需要首先增加数组的大小(并重用索引或调整数组的大小)或使用非固定集合(例如 List)。最后,当您传递array1给 Sum 方法时,array1它是空的,因为您将其声明为零元素数组。这就是为什么你总是得到零打印。就像我之前说的,想象你是程序,并且实际上逐行运行所有这些步骤。

例如,您从循环开始。你准备了一个微型笔记本,记下你朋友告诉你的所有数字,里面没有任何页面。对于笔记本中的每一页(并意识到没有),你问你的朋友要一个数字。在你浏览完每一页之后,你现在再次浏览每一页以阅读他给你的所有值(记住他不能给你任何数字,因为笔记本是空的)。然后你再问他一个数字,如果是 999,你告诉他你已经完成了,然后给他你写下的所有数字的总和。如果他没有给你 999 作为号码,你就重复这个循环。

你明白为什么它现在不起作用了吗?

于 2012-05-25T19:27:27.397 回答
1
  public static void Sum(int[] numbers)
  {
    int sum2 = 0;

    foreach (int i in numbers)
        sum2 =+ i;

    Console.WriteLine("The sum of the values in your array is: " + sum2);
  }
于 2012-05-25T19:21:08.273 回答
0
foreach (int i in numbers)
    sum2 =+ i;

应该成为

foreach (int i in numbers)
    sum2 += i;
于 2012-05-25T19:22:27.927 回答
0

您的问题在于您的第一个 for 循环。您永远不会将项目添加到您的数组中,因为您的

 for (i = 0; i < array1.Length; i++)

由于您只在进入循环时添加到 array1 数组,因此它永远不会增加。由于 i = 0 并且 array1.Length 为 0 开始,所以 i 永远不会小于长度。

这是我建议你做的。

private static void Main(string[] args) {
        var running = true;
        var numbers = new List<int>();

        //Enter Question Asking Loop w/ running=true
        while (running) {
            Console.Write("Enter a number or enter 999 to exit: ");
            int inputValue;
            var inputString = Console.ReadLine();

            //Check for "999" which indicates we should display the numbers entered, the total and then exit our loop.
            if (inputString == "999") {
                //Display the numbers entered
                foreach (var number in numbers) {
                    Console.WriteLine(number);
                }

                Console.WriteLine("The sum of the values in your array is: " + numbers.Sum());
                running = false;

            }
            else if (Int32.TryParse(inputString, out inputValue) && inputValue > 0) {
                //We have valid input, append it to our collection
                numbers.Add(inputValue);                    
            }
            else {
                //The user entered invalid data. Let them know.
                Console.WriteLine("Please enter a whole number greater than 0");
            }                
        }

        //Loop complete

        Console.WriteLine("Press any key to exit.");
        Console.ReadLine();
    }
于 2012-05-25T19:35:21.247 回答
-2

你这里有几个小错误。

在您的Sum方法中,您不再使用数组sum1,而是将值相加sum2,但您正在打印sum1。您的 sum 方法应该是(如Wiktor所述):

public static void Sum(int[] numbers)
{
  int sum2 = 0;

  foreach (int i in numbers)
      sum2 += i;

  Console.WriteLine("The sum of the values in your array is: " + sum2);
}

另请注意,您使用sum2 =+ i而不是sum2 =+ i. 这就是说“设置sum2为等于”的正值,i而不是“添加isum2.

接下来,您在如何收集用户输入方面存在一些问题。首先,数组没有可变大小。它们的大小在创建时是固定的,并且您创建的用于保存要从用户汇总的值的数组被初始化为大小为 0。 ( int[] array1 = new int[0];) 如果您想从中获取固定数量的值用户您可以在数组大小中放置 0 以外的内容,但根据上下文,您似乎希望用户能够添加值,直到他们输入999您结束的位置。由于您事先不知道大小,因此您需要使用 aList<int>而不是数组,因为您只需向其中添加项目,它就会神奇地增长以支持新项目。

我还建议创建一种新方法来从用户那里获取所有值,而不是将其嵌入到您的Main方法中。

public static List<int> AskUserForNumbers()
{
  List<int> numbers = new List<int>();

  while(...)//todo determine end condition
  {
    string userInput = Console.ReadLine();
    if(...)//todo determine if user is done
    {

    }
    else
    {
      int nextNumber = ...;//todo parse user input
      numbers.Add(nextNumber);
    }
  }
  return numbers;
}

我不确定当用户输入 999 时是否要求您停止询问数字,或者这就是您所做的。如果您有选择,我建议您使用不同的内容,例如空行、0、“退出”、“退出”等。999 是有人可能想要求和的数字。

正如SPFiredrake所提到的,最好用于int.TryParse()解析用户输入,这样如果他们输入一个不是 int 的数字,它就不会崩溃,并且您可以告诉用户这不好,他们需要再试一次。

于 2012-05-25T19:40:34.037 回答