1

タスクは次のとおりです。テキスト ボックス、リスト ボックス、およびコマンド ボタンを含むプログラムを作成します。テキスト ボックスの上に、テキスト ボックス内に 1 から 10 までの数字を入力するようにユーザーに指示するラベルを付けます。ユーザーがコマンド ボタンをクリックすると、有効な数値のテキスト ボックスをチェックし、数値が予想される範囲内にない場合、または空の入力の場合は、エラー メッセージ ボックスを発行します。ユーザーが有効な数値を入力した場合は、それを整数変数 n に割り当て、For...Next ループを使用して、Dim numList() ステートメントで宣言された配列の最初の n 個の要素の合計を Integer = {2, 4, 10, 5, 6, 8, 9, 3, 2, 4} リストボックスに合計を表示します。

Private Sub bCom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bCom.Click
    Dim n As Integer = CInt(tNum.Text)

    If CDbl(tNum.Text) > 10 Then
        MessageBox.Show("Please Enter a Number from 1 to 10")
        tNum.Focus()
    End If

    Dim numList() As Integer = {2, 4, 10, 5, 6, 8, 9, 3, 2, 4}
    Dim sum As Integer
    For Each n As Integer In numList
        sum += n
    Next

    lOut.Items.Add(sum)
End Sub

クラス終了

4

3 に答える 3

1

for eachループの代わりにループを使用しているforため、最初の要素だけでなく、配列内の各要素を反復処理しnます。

次のようなものを使用する必要があります。

For x = 0 To n - 1 
    sum += numList(x)
Next

さらにいくつかの問題:

  • 前の行で既に整数に変換している場合は、テキストを double に変換する必要はありません。

  • Int32.TryParseユーザーが数字以外の何かを入力した場合に使用する必要があります。

  • 数値が 10 より大きいかどうかを確認するだけで、1 より小さいかどうかは確認しません。

  • 番号が無効な場合は、ユーザーにメッセージを表示して続行しますが、メソッドを終了する必要があります

于 2013-04-30T14:07:38.747 に答える
0

他の人が述べているように、ForEach ループではなく、インデックス付きの For..Loop が必要です。「有効な数値かどうか」のロジックを別の関数に移動することも検討してください。

Public Class Form1

    Private Sub btnCompute_Click(sender As System.Object, e As System.EventArgs) Handles btnCompute.Click
        'is the number valid?
        Dim n As Integer = -1
        If IsInputValid(txbInput.Text, n) Then
            Dim sum As Integer = 0

            'declare an array of numbers
            Dim numList() As Integer = {2, 4, 10, 5, 6, 8, 9, 3, 2, 4}

            'accumulate the sum of the first N elements of the array
            For i As Integer = 0 To n - 1
                sum += numList(i)
            Next

            'refresh the listbox with the sum
            lbxOutput.Items.Clear()
            lbxOutput.Items.Add(sum.ToString)
        Else
            MessageBox.Show("Please enter a number between 1 and 10")
        End If
    End Sub

    Private Function IsInputValid(input As String, ByRef validnumber As Integer) As Boolean
        'input must be a number between 1 and 10
        'if it is valid, assign it to the byref validNumber parameter.
        Dim i As Integer = -1
        If Integer.TryParse(input, i) Then
            If i >= 1 AndAlso i <= 10 Then
                validnumber = i
                Return True
            End If
        End If
        validnumber = i
        Return False
    End Function
End Class
于 2013-04-30T14:16:45.950 に答える
0

あなたの質問を正しく理解できれば、配列 numList の最初の n 桁を合計したいでしょう。
この場合、この方法でループ コードを変更する必要があります。

For x = 0 To n -1 
    sum += numList(x)
Next

x を numList 配列へのインデクサーとして使用し、配列の最初の要素 (x=0) から開始し、インデクサーが n - 1 の値に達したときに停止します

これにより、要求されたとおりに要件を満たすことができます。
必要に応じて、明示的なループなしで LinQ を使用したエレガントなアプローチも示すことができます

sum = numList.Take(n).Sum()

ただし、凝った作業を行う前に、コード内の明らかなエラーをいくつか削除することをお勧めします

if Not Int32.TryParse(tNum.Text, n) Then
     MessageBox.Show("Error......")
     tNum.Focus()
     Return
End If

if n < 1 OrElse n > 10 Then
     MessageBox.Show("Error......")
     tNum.Focus()
     Return
End if

また、VB6 との互換性のためだけに保持されている CInt e CDbl のような旧式の関数は使用しないでください。Int32.TryParse、Convert.ToInt32 などの最新のメソッドを使用します...

于 2013-04-30T14:00:09.567 に答える