Phần mềm thi trắc nghiệm này sẽ gồm 3 form chính là: Form đăng nhập, Form ghi và test câu hỏi và form làm bài.. Từ form đăng nhập chúng ta có thể truy nhập với tài khoản admin và user, v
Trang 1BÁO CÁO ASSIGNMENT SOF 101
Sinh viên : Lê Xuân Anh Giảng viên hướng dẫn: Lê Thanh Hải
Trang 2LỜI MỞ ĐẦU
Để hoàn phần mềm ghi câu hỏi và chấm thi trắc nghiệm cũng là bài Assignment này
Em xin được gửi lời cảm ơn đến thầy Lê Thanh Hải và trợ giảng Nguyễn Huy Toản là những người đã tận tình giúp đỡ em
từ những bước đầu cho đến khi phần mềm được hoàn thành.
Em xin chân thành cảm ơn!
Trang 3Phần I : Giới thiệu về bài Assignment
Đề tài em đã chọn là phần mềm thi trắc nghiệm, với phần mềm này chúng ta có thể ghi thêm câu hỏi và làm bài trắc nghiệm
Phần mềm thi trắc nghiệm này sẽ gồm 3 form chính là: Form đăng nhập, Form ghi và test câu hỏi và form làm bài
Từ form đăng nhập chúng ta có thể truy nhập với tài khoản admin và user, với tài khoản admin thì sẽ được dẫn tới form Ghi và test câu hỏi
Trang 4Còn tài khoản User sẽ được dẫn tới form làm bài:
Trang 5Phần II: Phần Design của các form
Form 1: Về phần Design của form 1 sẽ có 3 phần chính:
- Textbox tên đăng nhập
- Textbox password
- Button Login
Ngoài ra còn có thêm 2 Label để chú thích cho Textbox đăng nhập và password
Form 2: Ghi và test câu hỏi, về phần Design gồm:
- Textbox ghi tên file
- Textbox ghi câu hỏi
- Textbox các câu trả lời ( 4 Textbox)
- 4 radiobutton tương ứng cho 4 câu trả lời, dùng để đánh dấu câu trả lời đúng
Trang 6- Button Next có chức năng để lưu lại câu hỏi vừa tạo và chuẩn bị cho việc viết câu hỏi mới
- Button Test giúp cho người viết câu hỏi có thể kiểm tra lại các câu hỏi vừa tạo
- Button trở về form đăng nhập để đăng nhập với 1 tài khoản khác
- Button Exit để thoát tất cả chương trình đang chạy
- Và các Label để chú thích
Form 3: Phần dành cho người làm bài, phần design gồm có:
- Button browse để chọn file câu hỏi
- Label hiển thị tên file và đường dẫn tới file câu hỏi
- Button bắt đầu làm bài
- Label hiển thị số lượng câu hỏi
- Label hiển thị câu hỏi
- RadioButton để hiển thị đáp án và chọn đáp án
- Button quay lại câu hỏi liền trước
- Button câu hỏi tiếp theo
- Button kết thúc làm bài và xem kết quả
- Button Exit để thoát tất cả chương trình đang chạy
- Các Label chú thích
Phần 3: Code cho các thành phần của các form:
1 – Form đăng nhập
Private Sub btnLog_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnLog.Click
If txtUser.Text = "admin" And txtPass.Text = "admin" Then
Me Hide()
Form2 Show()
ElseIf txtUser.Text = "sinhvien" And txtPass.Text = "sinhvien" Then
Me Hide()
Form3 Show()
End If
txtUser.Focus()
End Sub
Về phần viết code cho form đăng nhập thì chúng ta chỉ cần viết code cho button Login,
Ý nghĩa của phần code đó sẽ là :
- Nếu phần text nhập vào trong txtUser.text và txtPass.text trùng với dữ liệu được lưu sẵn, khớp với tài khoản “admin” thì khi click vào button đăng nhập
sẽ được dẫn tới form 2, form này dùng để viết và kiểm tra các câu hỏi Và form đăng nhập sẽ vẫn chạy nhưng bị ẩn đi
Trang 7- Nếu khớp với tài khoản “sinhvien” thì sẽ được dẫn tới form 3, form 3 dành cho việc làm bài Và form đăng nhập cũng sẽ bị ẩn đi
- Ngoài ra chúng ta sẽ chỉnh thuộc tính PasswordChar cho textbox password,
và dùng thuộc tính Focus để con trỏ mặc định trỏ vào txxUser.text
2- Form viết và kiểm tra câu hỏi ( dành cho tài khoản admin)
Imports System.IO
Imports System
Public Class Form2
Đầu tiên chúng ta khai báo Namespace là System.IO có chức năng “đọc” và
“viết” files và các datastreams khác, classes điển hình của namespace này là
FileStream, Path, StreamReader, StreamWriter
Dim FW As StreamWriter
Khai báo 1 biến thuộc lớp StreamWriter dùng để ghi văn bản ra file, và bắt đầu việc định nghĩa cho sự kiện Button_Click Trong chế độ Design nhấn đúp vào Button cần định nghĩa ( ở đây là btnNext)
Private Sub btnNext_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnNext.Click
FW = New StreamWriter (txtLuu.Text, True )
Cho phép ghi
Nơi ghi tên file lưu
Trang 8FW.Write(txtCH.Text & ControlChars Tab)
Ghi phần text của phần câu hỏi ra file, còn với các textbox chứa nội dung đáp án thì khai báo để có thể phục vụ cho việc dễ dàng tách các mảng, bản ghi và chấm điểm
If radDA1.Checked = True Then
FW.Write( "#" & txtDA1.Text & ControlChars Tab)
Else
FW.Write(txtDA1.Text & ControlChars Tab)
End If
If radDA2.Checked = True Then
FW.Write( "#" & txtDA2.Text & ControlChars Tab)
Else
FW.Write(txtDA2.Text & ControlChars Tab)
End If
If radDA3.Checked = True Then
FW.Write( "#" & txtDA3.Text & ControlChars Tab)
Else
FW.Write(txtDA3.Text & ControlChars Tab)
End If
If radDA4.Checked = True Then
FW.Write( "#" & txtDA4.Text & Chr(13))
Else
FW.Write(txtDA4.Text & Chr(13))
End If
FW.Close()
End Sub
Khi RadioButton trước textbox đáp án được đánh dấu ( Checked ) thì phần text đáp án được ghi vào file sẽ có thêm dấu “ # “ đường trước để đánh dấu đáp án đúng, ControlChars.Tab tương ứng với Tab trong Microsoft Word office và có chức năng tách các bản ghi
( Chú ý: FW.Close ( ) kết thúc việc ghi )
'Xoá dữ liệu cũ để nhập dữ liệu mới vào
txtCH.Clear()
txtDA1.Clear()
Trang 9txtDA2.Clear()
txtDA3.Clear()
txtDA4.Clear()
FW.Close()
Thêm phần code này để sau khi click vào button để lưu thì dữ liệu cũ sẽ bị xóa
để ghi dữ liệu mới
Private Sub TextBox1_TextChanged( ByVal sender As System Object , ByVal e As
System EventArgs ) Handles txtCH.TextChanged, txtDA4.TextChanged, txtDA3.TextChanged, txtDA2.TextChanged, txtDA1.TextChanged
If txtLuu.Text = "" Or txtCH.Text = "" Or txtDA1.Text = "" Or txtDA2.Text = "" Or
txtDA3.Text = "" Or txtDA4.Text = "" Then
btnNext.Enabled = False
Else
btnNext.Enabled = True
End If
End Sub
Khi chưa nhập đủ dữ liệu vào các textbox thì ẩn button dùng để lưu và ngược lại khi đủ dữ liệu rồi button đó sẽ không bị ẩn nữa
Tiếp tục định nghĩa cho sự kiện Button_Click cho các button còn lại trong form 2,
Private Sub btnTest_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnTest.Click
Form3 Show()
End Sub
Vì hoàn thành được form test nên em sẽ tạm thời lấy form 3 (form dành cho user vào làm bài) cho sự kiện này Khi Click vào button “ Test” thì form3 sẽ được chạy
Private Sub btnTrove_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnTrove.Click
Trang 10Me Close()
Form1 Show()
End Sub
Tạo cho form2 một button để quay trở lại với form đăng nhập, điều này rất cần thiết khi muốn đăng nhập lại bằng tài khoản khác Form2 sẽ được đóng lại để chạy form1 Lúc đầu khi cho hiện form2 em không đóng form1 bởi vì form2 chạy dựa trên form1, nếu form1 bị đóng lại thì form2 sẽ ko chạy được
Private Sub btnExit_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnExit.Click
Me Close()
Form1 Close()
Form3 Close()
End Sub
Với button Exit thì sẽ dùng để đóng tất cả các chương trình vừa được chạy
Và như vậy là Form2 để ghi câu hỏi đã hoàn thành, tiếp tục với form3 dùng để làm bài
3 – Form Làm bài
Imports System.IO
Giống như form2, đầu tiên sẽ là khai báo Namespace
Trang 11Public Class Form3
Dim FR As StreamReader
Khai báo 1 biến thuộc lớp StreamReader để đọc câu hỏi
Tiếp theo sẽ là định nghĩa cho button tìm file thì chúng ta sẽ định nghĩa như sau:
Dim CH, i As Integer
Dim mangCH() As String
Khai báo các biến cần thiết để quản lý số câu hỏi lấy ra, mảng câu hỏi, và vị trí các bản ghi
Private Sub btnBro_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnBro.Click
Using Mofile As New OpenFileDialog
If Mofile.ShowDialog = Windows.Forms DialogResult OK Then
CH = 0
i = 0
lblTT.Text = Mofile.FileName
btnBD.Enabled = True
btnTien.Enabled = True
Else
btnTien.Enabled = False
btnBD.Enabled = False
MsgBox( "Bạn cần chọn file để làm bài" )
End If
End Using
FR = New StreamReader (lblTT.Text)
Do While Not FR.EndOfStream
mangCH(i) = FR.ReadLine
i += 1
Loop
CH = i
FR.Close()
End Sub
Khi click vào button để tìm file câu hỏi thì sẽ có 1 cửa sổ được mở để tìm file câu hỏi, nếu click “ Ok” thì đường link dẫn tới file câu hỏi sẽ được ghi lại trên 1 Label, chúng
ta sẽ click vào button” Bắt đầu làm bài” để bắt đầu làm bài Ngược lại nếu không chọn file câu hỏi thì button “ Bắt đầu làm bài” sẽ bị ẩn đi, sẽ không thể bắt đầu làm bài
Hình bên dưới là khi chưa chọn file để làm bài
Trang 12Và khi đã chọn:
Trang 13Tiếp theo sẽ là định nghĩa cho sự kiện click vào button “Bắt đầu làm bài”
Private Sub btnBD_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnBD.Click
i = 0
Timer1.Start()
Dim record() As String = mangCH(i).Split(vbTab)
lblTongCH.Text = "Câu hỏi" & i + 1 & "/" & CH
lblCH.Text = XoaDauThang(record(0))
rad_A.Text = XoaDauThang(record(1))
rad_B.Text = XoaDauThang(record(2))
rad_C.Text = XoaDauThang(record(3))
rad_D.Text = XoaDauThang(record(4))
End Sub
Theo như phần ghi file của form2 thì mỗi một câu hỏi và các đáp án sẽ được ghi trên 1 dòng, cuối dòng sẽ là (Chr(13)), tương ứng như Enter trong Microsoft Word
Trang 14office, câu hỏi và các đáp án sẽ được phân tách bằng (Controlchar.Tab) tương ứng với khi ta dùng “Tab” trong Microsoft Word office Từ cách ghi file thì chúng ta sẽ thực hiện những bước ngược lại để đọc file
Một dòng bất kỳ trong file text sẽ được lấy ra, sẽ được hiểu là gồm 1 câu hỏi và
4 đáp án Tất cả sẽ được gán cho 1 mảng, và mỗi lần “Tab” sẽ kết thúc 1 bản ghi, chúng ta sẽ có 5 bản ghi được đánh dấu lần lượt là 0, 1, 2, 3, 4
Bản ghi được đánh dấu là 0 sẽ là câu hỏi và được ghi lại trên Label câu hỏi, tương tự thì 4 bản ghi còn lại sẽ được ghi lại trên phần text của các radiobutton
Tiếp theo sẽ là phần định nghĩa cho các button dùng để làm bài:
- Đầu tiên là button dùng để di chuyển tới câu hỏi tiếp
Private Sub btnTien_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnTien.Click
If i >= CH - 1 Then
btnTien.Enabled = False
Else
i += 1
btnLui.Enabled = True
End If
Dim record() As String = mangCH(i).Split(vbTab)
lblTongCH.Text = "Câu hỏi" & i + 1 & "/" & CH
lblCH.Text = XoaDauThang(record(0))
rad_A.Text = XoaDauThang(record(1))
rad_B.Text = XoaDauThang(record(2))
rad_C.Text = XoaDauThang(record(3))
rad_D.Text = XoaDauThang(record(4))
End Sub
- Button để quay lại câu hỏi trước
Private Sub btnLui_Click( ByVal sender As System Object , ByVal e As
System EventArgs ) Handles btnLui.Click
If i <= 0 Then
btnLui.Enabled = False
Else
i -= 1
btnTien.Enabled = True
End If
Trang 15
Dim record() As String = mangCH(i).Split(vbTab)
lblTongCH.Text = "Câu hỏi" & i + 1 & "/" & CH
lblCH.Text = XoaDauThang(record(0))
rad_A.Text = XoaDauThang(record(1))
rad_B.Text = XoaDauThang(record(2))
rad_C.Text = XoaDauThang(record(3))
rad_D.Text = XoaDauThang(record(4))
End Sub
Mỗi lần click vào 2 button này thì đều phải định nghĩa lại việc ghi câu hỏi, chi khác nhau là ghi lại câu hỏi liền trước hay liền sau
- Xong việc đọc câu hỏi và ghi các câu hỏi thì đây sẽ là phần quan trọng nhất, phần chấm điểm cho bài vừa làm
Khai báo 1 thủ tục để chấm điểm cho bài thi:
Public Function Chambai( ByVal str As String ) As Boolean
If Microsoft.VisualBasic.Left(Trim(str), 1) = "#" Then
Return True
Else
Return False
End If
End Function
Việc khai báo thủ tục này có thể làm trên phần code của form hoặc chúng ta có thể tạo 1 Moduel riêng để tiện cho việc quản lý Từ phần ghi bài thì mỗi đáp án đúng đều đã được đánh dấu bằng cách ghi vào đầu dòng đáp án đúng đó 1 ký tự “ # ” nhờ việc đã đánh dấu nên thủ tục chấm bài của chúng ta sẽ áp dụng ngược lại Đáp án nào
có ký tự “ # ” ở đầu sẽ là đáp án đúng
Nhưng từ đây lại phải xử lý tiếp vấn đề ký tự “ # ” có ở đầu dòng, chúng ta sẽ tạo một thủ tục nữa để xóa ký tự “ # ”
Public Function XoaDauThang( ByVal str As String ) As String
If Microsoft.VisualBasic.Left(Trim(str), 1) = "#" Then
Return Microsoft.VisualBasic.Right(Trim(str), str.Length - 1)
Else
Return str
End If
End Function
End Module
Thủ tục này sẽ chọn các chuỗi ký tự có ký tự “ # “ ở đầu và thực hiện việc lấy tất
cả các ký tự bên phải của chuỗi trừ đi ký tự đầu tiên chính là ký tự “ # ”
Thực hiện việc chấm điểm trên form 3 như sau:
Trang 16Dim diem As Double
Khai báo một biến để lưu lại số điểm
Private Sub rad_A_CheckedChanged( ByVal sender As System Object , ByVal e As
System EventArgs ) Handles rad_A.CheckedChanged
If Chambai(rad_A.Text) Then
diem += 1
End If
End Sub
Private Sub rad_B_CheckedChanged( ByVal sender As System Object , ByVal e As
System EventArgs ) Handles rad_B.CheckedChanged
If Chambai(rad_B.Text) Then
diem += 1
End If
End Sub
Private Sub rad_C_CheckedChanged( ByVal sender As System Object , ByVal e As
System EventArgs ) Handles rad_C.CheckedChanged
If Chambai(rad_C.Text) Then
diem += 1
End If
End Sub
Private Sub rad_D_CheckedChanged( ByVal sender As System Object , ByVal e As
System EventArgs ) Handles rad_D.CheckedChanged
If Chambai(rad_D.Text) Then
diem += 1
End If
End Sub
Nếu radiobutton được người dùng đánh dấu có phần text mà ký tự “ # ” ở đầu sẽ được tính là một câu trả lời đúng, biến ghi điểm sẽ được cộng thêm 1, việc này sẽ được định nghĩa trên thuộc tính radiobutton.checked
Như thế này là việc chấm điểm cho bài thi đã được hoàn thành, chúng ta có thể làm thêm phần quản lý thời gian làm bài của người dùng bằng cách thêm một Timer vào form3 như sau:
- Tại phần Design của form 3 chúng ta tìm Toolbox, trong đó có Timer ( có thể kéo hoặc đúp chuột để đưa Timer ra form3
Trang 17- Thêm ProGressBar vào một góc thích hợp trên form3 để hiện thời gian làm bài
- Quản lý thời gian chạy của Timer ngay ở phần Design của form :
Trang 18Private Sub btnBD_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnBD.Click
i = 0
Timer1.Start()
Khi click vào Button “ Bắt đầu kiểm tra” thì timer bắt đầu tính thời gian, và khi click vào button kết thúc thì Timer sẽ dừng tính thời gian
Private Sub btnKet_Click( ByVal sender As System Object , ByVal e As System EventArgs )
Handles btnKet.Click
Timer1.Stop()
Private Sub Timer1_Tick( ByVal sender As System Object , ByVal e As System EventArgs )
Handles Timer1.Tick
ProgressBar1.Increment(1)
If ProgressBar1.Value = 100 Then
Timer1.Stop()
btnLui.Enabled = False
btnTien.Enabled = False
End If
End Sub