1

GUI で電卓を作成していますが、助けが必要です。テキスト ボックスにデータを入力するときは、それを配列に格納する必要があります。これが私がそれを考えた方法です。

    int numOfPackages;//used to get user input

    private void button3_Click(object sender, EventArgs e)
    {
        int[] weight = new int[numOfPackages];

        for(int i = 0; i < numOfPackages; i++)
        {
            weight[i] = Convert.ToInt32(weightBox.Text);
        }

        foreach (int i in weight)
            totalCostLabel.Text = "" + weight[i];

    }

要素を表示しようとすると、indexOutOfRange 例外が発生します。では、その配列の要素を表示するにはどうすればよいでしょうか。

前もって感謝します。

4

3 に答える 3

5

この行

foreach (int i in weight)
    totalCostLabel.Text = "" + weight[i];

する必要があります

foreach (int w in weight)
    totalCostLabel.Text = "" + w;

現在のコードは、重みの配列を反復し、その重みを重みの配列へのインデックスとして使用しようとするため、範囲外のインデックスの例外が発生します。

もう 1 つの問題は、最初のループにあります。すべての値をweight同じ数値に設定しています。

weight[i] = Convert.ToInt32(weightBox.Text); // That's the same for all i-s

重みが異なる場合は、異なる重みボックスから取得するか、単一の文字列をweightBox処理して複数の数値を生成する必要があります (たとえば、 を使用string.Split)。

于 2013-05-01T01:42:12.297 に答える
0

多分あなたはもっと似たものが欲しかったですか?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        btnAdd.Enabled = false;
    }

    int[] weight;
    int entriesMade;
    int numOfPackages;

    private void btnReset_Click(object sender, EventArgs e)
    {
        if (int.TryParse(numEntriesBox.Text, out numOfPackages))
        {
            weight = new int[numOfPackages];
            entriesMade = 0;
            btnReset.Enabled = false;
            btnAdd.Enabled = true;
            totalCostLabel.Text = "";
        }
        else
        {
            MessageBox.Show("Invalid Number of Entries");
        }
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        int value;
        if (int.TryParse(weightBox.Text, out value))
        {
            weight[entriesMade] = value;
            weightBox.Clear();

            totalCostLabel.Text = "";
            int total = 0;
            for (int i = 0; i <= entriesMade; i++)
            {
                total = total + weight[i];
                if (i == 0)
                {
                    totalCostLabel.Text = weight[i].ToString();
                }
                else
                {
                    totalCostLabel.Text += " + " + weight[i].ToString();
                }
            }
            totalCostLabel.Text += " = " + total.ToString();

            entriesMade++;
            if (entriesMade == numOfPackages)
            {
                btnAdd.Enabled = false;
                btnReset.Enabled = true;
                MessageBox.Show("Done!");
            }
        }
        else
        {
            MessageBox.Show("Invalid Weight");
        }
    }

}
于 2013-05-01T05:53:51.887 に答える
0

ここには複数の問題があります。最初はこれです:

    foreach (int i in weight)
        totalCostLabel.Text = "" + weight[i];

これは、重み配列を反復し、その配列の各値を使用しています。次に、その値をインデックスとして使用します。次の例を見てください。

weight[0] = 0
weight[1] = 1
weight[2] = 15

コードでは、最初の 2 つのエントリは、0 のインデックスと 1 のインデックスがあるため機能します。しかし、最後のエントリに到達すると、15 のインデックスが検索されます。この 2 つの方法を修正できます。最初の方法は次のとおりです。通常の for ループを使用するには:

for(int i=0; i < weight.Length; i++) 
{
    totalCostLabel.Text += weight[i];
}

これは2番目の間違いをもたらします。コードの totalCostLabel に何も追加していません。値を置き換えているだけです。これにより、重みのすべての値が 1 つに追加されます。

これを行う別の方法は、foreach ループを使用することです。

foreach(int i in weight) 
{
    totalCostLabel.Text += i;
}

これは上記と同じですが、索引付けについて心配する必要はありません。

要するに、ループを修正した後でも、おそらくラベルがテキストを取得する方法を修正する必要があるでしょう。そうしないと、目的の結果が得られません。

于 2013-05-01T02:53:55.740 に答える