-1

In general, I know that int32 errors mean that a string value is not getting converted for the console program. I have seen a lot of code trying to find the answer to this including the following stackoverflow questions (seen much more but these were most useful:

That being said, this is also a homework assignment, titled UsingSum.cs as seen in a couple of these links. The difference in mine and these is that I am trying to make it so that the user enters however many Integers they want, then they are added up. The entire assignment is written in link 2....

The problem: I keep getting either 0 or System.Int32[] instead of the sum, despite the changes I make.

I cannot use Linq.

Here is the code:

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.*/
    }
}
}

Here is my final solution!

  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;
        }
    }
}
Community
  • 1
  • 1
Chris
  • 934
  • 1
  • 17
  • 38

5 Answers5

2

A few problems:

First, you're always declaring your arrays as int[] array1 = new int[0];. This means that your code for actually getting the user input will never hit. Maybe you should try using a different collection type (List<int> maybe).

Second, you never perform any error checking when parsing the integer. That's bad practice. You should be using int.TryParse(string input, out result) to verify it was a valid number before adding it to the array.

Third, you are looping over the length of the array for inputs, meaning you will loop through however long the array is, and will continue doing so until the last input you have is the exit number (999).

Fourth, the input you get for the exit code is discarded (not added to the array to sum).

Just remember that programming is very procedural. There should be clear (logical) steps from point a to point b. In fact, imagine you are the program and you're asking a friend to give you numbers to sum up for him. Give him whatever information you think might be useful (such as the exit condition). Diagram the steps, and then try to translate that to code.

Edit: The main point is that an array (which has a fixed size) is NOT the tool for the job here. You're not actually filling the array with any data, so that's why the sum never happens. The culprit is here:

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++) 

You need to either increase the size of the array to begin with (and either reuse the indexes or resize the array) or use an non-fixed collection (List, for example). Finally, when you pass array1 to the Sum method, array1 is empty because you declared it as a zero element array. That is why you always get a zero printing out. Like I said before, imagine you are the program, and actually run through all these steps, LINE BY LINE.

For example, you start in the loop. You prepare a miniature notebook to write down all the numbers your friend is telling you with no pages in it. For every page (and realize there are none) in the notebook, you ask your friend for a number. After you've gone through every page, you now go through every page again to read all the values he gave you (keep in mind he couldn't give you any numbers, since the notebook was empty). Then you ask him one more time for a number, and if it's 999 you tell him you're done and give him the sum of all the numbers you wrote down. If he didn't give you 999 as the number, you repeat the cycle.

Do you understand WHY it's not working now?

SPFiredrake
  • 3,852
  • 18
  • 26
  • the error handling is not present because I have not advanced that far in the course, lol. As you mentioned however, my question is now to I get my array1 to maintain its values and pass them to the Sum()? – Chris May 25 '12 at 19:47
  • Yes, I understand now. I thought it was possible to leave the array size empty and have the array expand/collapse as values were entered or taken out. I thought maybe the zero would make it dynamic...Thank you for taking the time to explain this :) – Chris May 25 '12 at 20:15
  • Glad you understand the problem now. Programming is very logical, there is no "magic" to it if you understand how to think one step at a time. Don't forget to mark one of the answers as having fixed your problem. – SPFiredrake May 25 '12 at 20:35
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);
  }
Wiktor Zychla
  • 47,367
  • 6
  • 74
  • 106
0
foreach (int i in numbers)
    sum2 =+ i;

should become

foreach (int i in numbers)
    sum2 += i;
Douglas
  • 53,759
  • 13
  • 140
  • 188
  • This is one of his problems, just not the *only* one. – Servy May 25 '12 at 19:23
  • @MattEllen: “The problem: I keep getting either 0 or "System.Int32[]" instead of the sum, despite the changes I make.” The above might explain the ‘0’ part of the problem. And you do know that having this operator “a different way around” completely changes its semantics? – Douglas May 25 '12 at 19:25
0

Your problem is with your first for loop. You never will add items to your array because your

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

Since you only add to your array1 array when you enter the loop, it won't ever increment. Since i = 0 and the array1.Length is 0 to start, i will never be less than the length.

Here is what I would suggest you do.

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();
    }
Jeff Reddy
  • 5,551
  • 9
  • 55
  • 88
  • Things: One, I'm getting the error "The name 'numbers' does not exist in the current context. Two, it displays the number entered but only allows one number to be entered... – Chris May 25 '12 at 20:28
  • Jeff! I got this to work :) Essentially I removed the old method I had and replaced it with this. Then used my main method to call this and it works just how I had pictured it would when I started :D Thank you very much for your time and help!! – Chris May 25 '12 at 21:06
  • It's best not to provide full-code solutions to homework problems. They learn less that way. – Servy May 25 '12 at 21:09
  • in his defense, the code as it is posted, does not work, it still required some playing around – Chris May 25 '12 at 21:15
  • @Servy I disagree. He will learn as much as he wants to. He can change this code all he wants, try different things and learn all he can. Or, he can take it as is and not learn. That's his choice. – Jeff Reddy May 26 '12 at 15:56
  • @ChristopherDay. The code worked as is, but the first line of code was't included in the 'code' section. I've edited the post and now it is displayed correctly. – Jeff Reddy May 26 '12 at 16:01
-2

You have several small mistakes here.

In your Sum method you are no longer using the array sum1, you're summing the values into sum2, but you're printing sum1. Your sum method should be (as described by 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);
}

Also note that you used sum2 =+ i rather than sum2 =+ i. What that's saying is "set sum2 to be equal to the positive value of i" rather than, "add i to sum2.

Next, you have some issues in how you gather your input from the user. First off, arrays don't have a mutable size. The size that they have is fixed when they are created, and the array that you create to hold onto the values to sum up from the users is initialized to a size of 0. (int[] array1 = new int[0];) If you want to get a fixed number of values from the user you can put something other than 0 there for the array size, but based on the context it appears that you want the users to be able to add values until they enter 999 at which point you end. Since you don't know the size before hand you'll want to use a List<int> rather than an array, as you can just add items to it and it will magically grow to support the new items.

I would also suggest making a new method to get all of the values from the user, rather than embedding it in your Main method.

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

I'm not sure if it's a requirement for you to stop asking for numbers when the user enters 999 or if that's just what you did. if you have a choice, I would suggest using something different such as a blank line, 0, "quit", "exit", etc. 999 is a number that someone might want to sum.

As mentioned by SPFiredrake, it's best to use int.TryParse() to parse user input, that way if they enter a number that's not an int it won't crash, and you can tell the user that it was no good and they need to try again.

Community
  • 1
  • 1
Servy
  • 202,030
  • 26
  • 332
  • 449