2017-10-17 3 views
0

この特定の問題の練習問題は、選択したグレード値に基づいて生徒の数をリストボックスに表示し、番号ラベルの選択された等級:Form Designグレードに対応する名前と成績とリスト名の文字列の検索

グレードの数字を上に追加することができます。問題は、グレード配列と同時に名前配列を検索し、選択したグレードに基づいて個々の名前を表示することです。

Grade文字の各インデックス値がName配列に対応することは知っていますが、文字列なのでGrade配列のIndex値を取得する方法はわかりません。

EDIT:

:ここでは、割り当てが呼びかけているまさにです。このプロシージャは、strNamesとstrGradesという2つの並列1次元配列を宣言して初期化します。
lstGradesコントロールで選択した成績を取得した学生の名前を表示する手順を記述します。また、その学年を取得した学生の数を表示する必要があります。

b。インターフェイスが表示されたら、lstGradesコントロールの最初の項目を選択する必要があります。適切な手順を記入してください。

c。 lstGradesコントロールで異なるグレードが選択されると、lstNamesおよびlblNumberコントロールの内容がクリアされます。適切な手順を記入してください。

d。ソリューションを保存し、アプリケーションを起動してテストします。代わりに、文字列の配列を作成する

Private Sub btnDisplay_Click(sender As Object, e As EventArgs) Handles btnDisplay.Click 
    ' Display the names and number of students earning a specific grade. 

    Dim strNames() As String = {"Helen", "Peter", "Yolanda", "Carl", "Jennifer", "Charles", "Addison", "Aiden", "Treyson", "Sydney", "Jacob", "Nancy", "George", "Ursula", "Jack"} 
    Dim strGrades() As String = {"A", "B", "B", "A", "D", "F", "A", "B", "A", "B", "F", "C", "C", "B", "D"} 

    Dim intNumGrades(4) As Integer 

    ' searches through each value in strGrade array, counter is added for each instance 
    For Each strGradeLetter As String In strGrades 
     Select Case strGradeLetter 
      Case "A" 
       intNumGrades(0) += 1 
      Case "B" 
       intNumGrades(1) += 1 
      Case "C" 
       intNumGrades(2) += 1 
      Case "D" 
       intNumGrades(3) += 1 
      Case "F" 
       intNumGrades(4) += 1 
     End Select 
    Next strGradeLetter 

    lblNumber.Text = intNumGrades(lstGrades.SelectedIndex).ToString 
End Sub 
+0

[お問い合わせ]を読んで[ツアー]をご覧ください。 'For n'ループを使用した場合、インデクサー(' n')は対応する名前配列を指します(またはArray.IndexOfを使うこともできます)。おそらく、あなたは各レターグレードの名前を格納するために別のコレクションが必要になります – Plutonix

+0

Array.IndexOfを使用することはできません。それは、このエクササイズを使用せずにこのエクササイズを完了しなければならないということです。 – user3472383

+0

[Ask]を読んで[ツアー]を取る – Plutonix

答えて

0

:代わりに「」gradeAStudent += strNames(index) + " "

のためのケースでは、リストにそれらを追加することができますABCDF ' lbStudentsの設計時の等級リストボックスはリストボックスです。 lstGradesと呼ばれる問題lbGradesと呼んでいます。差はありません 名前を除きます。

Public Class Form1 
     Private Sub lbGrades_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lbGrades.SelectedIndexChanged 
      'Clear the list before adding new students 
      lbStudents.Items.Clear() 
      Dim strNames() As String = {"Helen", "Peter", "Yolanda", "Carl", "Jennifer", "Charles", "Addison", "Aiden", "Treyson", "Sydney", "Jacob", "Nancy", "George", "Ursula", "Jack"} 
      Dim strGrades() As String = {"A", "B", "B", "A", "D", "F", "A", "B", "A", "B", "F", "C", "C", "B", "D"} 
      'Using a variable for the size of your arrays makes the code more generic so it could be 
      'used for different size arrays. 
      Dim n As Integer = strGrades.Count - 1 
      Dim itgCount As Integer = 0 
      'This and the matching .EndUpdate prevents the list box from repainting on each iteration 
      'Not important in this example but could be very important for long list additions 
      lbStudents.BeginUpdate() 
      'loop through the idexes of the arrays 
      'VB arrays are zero based = the first element is index 0 
      For index As Integer = 0 To n 
       'Check the grades array for the item selected in the list box 
       If strGrades(index) = lbGrades.SelectedItem Then 
        'if found, increment the counter 
        itgCount += 1 
        'find the name of the student by using the same index as the grades array 
        'this is the value of parallel arrays 
        'Add the name to the other list box 
        lbStudents.Items.Add(strNames(index)) 
       End If 
      Next 
      lbStudents.EndUpdate() 
      'Display the count in a label using an interpolated string 
      lblCount.Text = $"The number of students with Grade {lbGrades.SelectedItem} is {CStr(itgCount)}." 
     End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     'This satisfies the requirement in b. of the problem 
     lbGrades.SelectedItem = "A" 
    End Sub 
End Class 
+0

ありがとう!これはまさに私が執着していたものです。 私はSelect Caseステートメントを使いたかったので私は自分自身を悩ましたと思うが、単純なIf/Elseステートメントはそのトリックをやったようだった。 – user3472383

0

、独自の定義クラスのリストを作成します。

たとえば、名前、等級のプロパティを持つ生徒を作成し、各生徒の各オブジェクトに値を割り当ててから、リストに追加します。そのリストで、LINQクエリを書くことができます。

あなたがここでこれを行う方法についての詳細を学ぶことができます。https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/concepts/linq/basic-query-operations

EDIT

使用したい場合は、単にループのためにforeachループを変更するなど何かを、次にアレイ:

For index As Integer = 0 To (strGrades.Length -1) 
    Select Case strGrades(index) 
      Case "A" 
       intNumGrades(0) += 1 
      Case "B" 
       intNumGrades(1) += 1 
      Case "C" 
       intNumGrades(2) += 1 
      Case "D" 
       intNumGrades(3) += 1 
      Case "F" 
       intNumGrades(4) += 1 
     End Select 
    Next 

インデックスを使用して、対応する他の配列にアクセスすることができます。

あなただけの、あなたは文字列例:へのすべての名前を追加することができ、それらを表示したい場合:私はいっぱい studentList.Add(strNames(index))

+0

List of(T)ははるかに良い選択ですが、これは配列での作業の点で宿題であると確信しています – Plutonix

+1

ここにお読みください。あなたはそれを洞察に思うかもしれません.. [宿題問題を持つ学生への公開書簡](https://softwareengineering.meta.stackexchange.com/questions/6166/open-letter-to-students-with-homework-problems) –

+0

これは宿題の割り当てではなく、Visual Basicの本の章の最後の演習です。私は、エクササイズが私のメインポストに求めていることを再追加しました。 – user3472383

関連する問題