-1

int32一般に、エラーは、文字列値がコンソール プログラム用に変換されていないことを意味することを知っています。次のstackoverflowの質問を含む、これに対する答えを見つけようとする多くのコードを見てきました(もっと多く見ましたが、これらは最も役に立ちました:

そうは言っても、これは、これらのリンクのいくつかに見られるように、UsingSum.cs というタイトルの宿題でもあります。私とこれらの違いは、ユーザーが必要な数の整数を入力してから合計されるようにしようとしていることです。課題全体はリンク 2 に書かれています。

System.Int32[]問題:変更を行ったにもかかわらず、合計が0 または代わりに表示され続けます。

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)配列に追加する前に、それが有効な番号であることを確認するために使用する必要があります。

第3に、入力の配列の長さをループします。つまり、配列の長さがどれだけ長くてもループし、最後の入力が出口番号(999)になるまでループを続けます。

第4に、終了コードに対して取得した入力は破棄されます(合計する配列に追加されません)。

プログラミングは非常に手続き型であることを忘れないでください。ポイント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++) 

最初に配列のサイズを大きくする(そして、インデックスを再利用するか、配列のサイズを変更する)か、固定されていないコレクション(たとえば、リスト)を使用する必要があります。最後にarray1、Sumメソッドに渡すとarray1、ゼロ要素配列として宣言したため、は空になります。そのため、常にゼロの印刷が行われます。前に言ったように、あなたがプログラムであると想像して、実際にこれらすべてのステップをLINEBYLINEで実行してください。

たとえば、ループから始めます。ミニチュアノートを用意して、友達が言っているすべての数字をページなしで書き留めます。ノートブックのすべてのページ(そして何もないことに気付く)について、あなたはあなたの友人に番号を尋ねます。すべてのページを確認した後、もう一度すべてのページを確認して、彼が提供したすべての値を読み取ります(ノートブックが空だったため、彼は番号を提供できなかったことに注意してください)。次に、もう一度彼に番号を尋ねます。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

あなたの問題は、最初の 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 に答える
0
foreach (int i in numbers)
    sum2 =+ i;

なるべき

foreach (int i in numbers)
    sum2 += i;
于 2012-05-25T19:22:27.927 に答える
-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の正の値に等しくなるように設定する」ということです。iisum2

次に、ユーザーからの入力を収集する方法に問題があります。まず、配列には変更可能なサイズがありません。それらのサイズは作成時に固定され、ユーザーから合計する値を保持するために作成する配列は、サイズ 0 に初期化されint[] array1 = new int[0];ます。 ( ) から固定数の値を取得する場合ユーザーは配列サイズに0以外のものを入れることができますが、コンテキストに基づいて、ユーザーが入力999して終了するまで値を追加できるようにする必要があるようです。事前にサイズがわからないためList<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 に答える