Hi everyone, I have to make a program that reads a txt file after reading it, show it in a richtext box and in another tab make the average of the grades the input received sort it by the student id and then in the same rtb sort it by the average of their grades, and finally save it on a new text file.
The text file input is something like this
12 3 10.0 6.9 7.3
19 2 6.7 9.3
10 3 4.5 9.3 4.5
and the output should look like this
sorted by student ID
10 6.1 4.5 9.3 4.5
12 8.1 10.0 6.9 7.3
19 5.3 6.7 9.3
sorted by grade average
12 8.1 10.0 6.9 7.3
10 6.1 4.5 9.3 4.5
19 5.3 6.7 9.3
As you noticed in the input the first number is the student ID, the second number is the number of tests made by the student, and the other 3 numbers are grades, in the output the first number is the student ID, the second number is the average of the tests, and the other 3 numbers are grades, but my problem is that I can't get the values from the list that I 've created, here is the code:
Code:
Imports System.IO
Public Class Form1
Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click
' Try
Dim txtString As String()
txtString = System.IO.File.ReadAllLines("C:\read.txt")
' Catch ioexception As IOException
'MsgBox("File Not Found")
Dim studentList As New System.Collections.Generic.Dictionary(Of Integer, Decimal())
For Each line As String In txtString
If (String.IsNullOrEmpty(line)) Then
Continue For
End If
Dim data As String() = line.Split(" ")
Dim studentId As Integer = Convert.ToInt32(data(0))
Dim gradeList As New List(Of Decimal)
For i1 As Integer = 1 To data.Length - 1
gradeList.Add(Convert.ToDecimal(data(i1)))
Next
studentList.Add(studentId, gradeList.ToArray())
Next
'At this point I have it all in memory :)
'this code should retrieve me the values but it doesn't
'the error says that the key has not been found on the dictionary
Dim value1 As Object
value1 = studentList(1)
RichTextBox1.Text = value1
'End Try
End Sub
thanks in advance I really appreciate all your help
I hope you don't mind if I rewrite the code for definition interpretation.
In the program, you should use the following approach in writing this program.
1. Load a file definition (which you have done)
2. Declare a Student Class definition
3. Define the sorting ability of the class (IComparable)
4. Read the definition into student class list
According to the guidelines, i have written the class definition as followed. Class Definition
Code:
Public Class Student : Implements IComparable(Of Student)
Public StudentID As Integer
Public ReadOnly Property TestCount() As Integer
Get
Return Grades.Count
End Get
End Property
Public Grades As New List(Of Decimal)
Public ReadOnly Property AverageGrade() As Decimal
Get
Return Math.Round(Grades.Average(), 1)
End Get
End Property
Public Sub New(ByVal def As String)
Dim tmp As String() = def.Split(" ")
If tmp.Length = 0 Then Throw New ApplicationException("The student definition cannot be empty.")
StudentID = Integer.Parse(tmp(0))
Dim count As Integer = Integer.Parse(tmp(1)) 'tmp(1) is the test count, use it for validation only
For n = 2 To tmp.Length - 1
Grades.Add(Decimal.Parse(tmp(n)))
Next
If Not count = Grades.Count Then Throw New ApplicationException("The number of test and grades does not match")
End Sub
Public Function GetResult() As String
Dim tmp1 As String = StudentID & " " & AverageGrade.ToString()
Dim tmp2 As String = ""
For n As Integer = 0 To Grades.Count - 1
If n = 0 Then
tmp2 = Grades(n)
Else
tmp2 &= " " & Grades(n)
End If
Next
Return tmp1 & " " & tmp2
End Function
Public Function CompareTo(ByVal other As Student) As Integer Implements System.IComparable(Of Student).CompareTo
Return StudentID.CompareTo(other.StudentID)
End Function
End Class
Public Class StudentGradeComparer : Implements IComparer(Of Student)
Public Function Compare(ByVal x As Student, ByVal y As Student) As Integer Implements System.Collections.Generic.IComparer(Of Student).Compare
Return x.AverageGrade.CompareTo(y.AverageGrade)
End Function
End Class
Also, to use this class, you should create 3 textboxes and 3 buttons.
Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim students As New List(Of Student)
'Read input lines
For Each line In TextBox1.Lines
students.Add(New Student(line))
Next
'Sort By Student ID
students.Sort()
TextBox2.Text = ""
For n As Integer = 0 To students.Count - 1
TextBox2.Text &= students(n).GetResult() & vbCrLf
Next
'Sort By Average Grade
students.Sort(New StudentGradeComparer())
TextBox3.Text = ""
For n As Integer = students.Count - 1 To 0 Step -1
TextBox3.Text &= students(n).GetResult() & vbCrLf
Next
End Sub
By the way, you have got a mistake in the example (You divided the total score by 3, which should be 2 !)
19 5.3 6.7 9.3 should be 19 8 6.7 9.3
This program use Visual Basic 2008 functionality, therefore, it should be opened by Visual Basic 2008.
I have attached the code for you for your reference. Hope that i can help you ^.^.
Last edited by chkmos; August 29th, 2009 at 08:03 PM.
* The Best Reasons to Target Windows 8
Learn some of the best reasons why you should seriously consider bringing your Android mobile development expertise to bear on the Windows 8 platform.