Tải bản đầy đủ (.docx) (19 trang)

BÁO cáo ASSIGNMENT SOF

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (476.82 KB, 19 trang )

BÁ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
LỜ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!
Phầ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
Còn tài khoản User sẽ được dẫn tới form làm bài:
Phầ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
- 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.
- 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
FW.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()

txtDA2.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
Me.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
Public 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
Và khi đã chọn:
Tiế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
office, 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

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:
Dim 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
- 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 :

Private 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
- Thời gian chúng ta gán cho Timer sẽ được chia thành 100 giá trị, và
progressBar sẽ chạy từng giá trị một cho đến khi kết thúc. Khi hết thời gian
thì các button dùng để làm bài sẽ bị ẩn đi
~ END ~

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×