Sau một thời gian nỗ lực thiết kế và hoàn thiện hệ thống chương trình, đề tài "Xây dựng chương trình thi trắc nghiệm môn Tin học Đại cương cho các Trường Trung Học Quân Sự" đã được hoàn thành. Qua quá trình áp dụng thử nghiệm trong thực tế, hệ thống đã đạt được một số kết quả nhất định sau:
+ Hệ thống đã tin học hoá phần lớn các khâu trong kỳ thi trắc nghiệm Tin học Đại cương tổ chức theo chương, phần và hết môn. Các quá trình từ việc tổ chức thi, ra đề thi, thu bài thi và chấm điểm đã được chương trình xử lý một cách nhanh chóng, chính xác.
+ Giao diện của chương trình được thiết kế bằng một hệ thống FORM thao tác tương tự trong WINDOWS, rất thân thiện với người dùng. Giúp cho người chưa thành thạo về tin học cũng sử dụng chương trình một cách dễ dàng.
Tuy vậy do trình độ kiến thức còn hạn chế, thời gian xây dựng chương trình lại không nhiều, nên hệ thống chương trình còn nhiều sai sót và chưa được hoàn chỉnh. Em rất mong được sự chỉ bảo của thầy cô và các bạn để hệ thống chương trình trong tương lai sẽ được hoàn thiện hơn.
Định hướng phát triển chương trình trong tương lai:
Trong thời gian tới, hệ thống chương trình sẽ cho phép cùng một lúc, có thể tiến hành nhiều môn thi trắc nghiệm, với nhiều dạng đề thi khác nhau, áp dụng cho các loại học viên thi. Đồng thời các dạng câu hỏi trắc nghiệm sẽ phong phú hơn, không chỉ có một loại câu hỏi dạng nhiều phương án trả lời như trong bài khoá đã đề cập.
70 trang |
Chia sẻ: aloso | Lượt xem: 1867 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Xây dựng chương trình thi trắc nghiệm môn Tin học Đại cương cho các Trường Trung Học Quân Sự, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ông tin máy sẽ kiểm tra tính hợp lệ của thông tin của học viên đảm bảo không có học viên nào được phép làm hai bài trong một lần thi
Sau khi đề được tạo, học viên bắt đầu làm bài kiểm tra. Học viên trả lời các câu hỏi mà hệ thống đưa ra. Với mỗi câu hỏi có 4 phương án trả lời, học viên sẽ chọn một phương án đúng trong 4 phương án. Học viên có thể quan sát được toàn bộ các câu hỏi trong bộ đề của mình và có thể làm câu nào trước cũng được. Nếu làm xong học viên có thể CLICK kết thúc để máy ghi kết quả, nếu quá thời gian qui định thì máy sẽ tự động tính điểm theo thang điểm qui định và thoát khỏi chương trình. Mọi truy nhập vào hoạt động làm bài ở thời điểm này đều bị ngăn cấm.
Sau khi thi xong đợt thi giáo viên sẽ in kết quả ra giấy có thể xoá toàn bộ kết quả thi để đảm bảo tính khách quan cho những lần thi sau.
Nếu số máy tính không đủ cho học viên, hệ thống cho phép giáo viên in đề thi ra giấy theo dạng trắc nghiệm cho học viên làm bài trên giấy
Chương IV
Các sơ đồ thể hiện mô hình dữ liệu hệ thống
1. Sơ đồ chức năng hệ thống thi trắc nghiệm:
Sơ đồ chức năng hệ thống thể hiện tổng quan về các chức năng của hệ thống giúp cho người đọc dễ hình dung trong qúa trình thiết kế chương trình.
Chương trình thi trắc nghiệm TH
Quản lý ngân hàng câu hỏi
Soạn câu hỏi
Trợ giúp
Tra cứu
HDSD
Tổ chức thi
Thi hết chương
Thi kết thúc môn
Xoá kết quả thi
Quản trị hệ thống
Login
Cập nhật hệ thống
Quyền sử dụng
Thoát
Tạo bộ đề thi
In kết quả thi
2. Sơ đồ luồng dữ liệu vào, ra của hệ thống
2.1. Xác định dòng thông tin nghiệp vụ:
Bước tiếp theo trong tiến trình phân tích là xem xét chi tiết hơn về các thông tin cần cho việc thực hiện các chức năng đã được nêu còn những thông tin cần cung cấp để hoàn thiện hệ thống. Công cụ mô hình được sử dụng cho mục đích này là sơ đồ dòng dữ liệu.
Sơ đồ dòng dữ liệu là một công cụ dùng để trợ giúp các hoạt động chính của nhà phân tích, sơ đồ dữ liệu nêu ra một mô hình về hệ thống có quan điểm cân xứng cho cả dữ liệu và tiến trình. Nó chỉ ra cách thông tin chuyển vận từ một tiến trình hoặc từ chưc năng này trong hệ thống sang một hệ thống khác.
2.2. Mục đích của sơ đồ chức năng nghiệp vụ:
- Giúp người phân tích viên xác định giới hạn, phạm vi hoạt động của hệ thống cần phân tích.
- Giúp tăng cường cách tiếp cận "logic" tới việc phân tích hệ thống.
- Chỉ ra vị trí của nền khảo cứu trong toàn bộ hệ thống tổ chức, nó làm rõ ràng trách nhiệm, giúp tránh được sự trùng lặp và dư thừa trong hệ thống.
Một số khái niệm và ký hiệu dùng trong sơ đồ dòng dữ liệu:
2.3. Tiến trình :
Là quá trình biến đổi thông tin,tức là nó làm thay đổi thông tin theo một cách nào đó như tổ chức lại thông tin ,bổ sung thông tin hoặc tạo ra thông tin mới.
Ký hiệu :
2.4. Dòng dữ liệu :
Là việc chuyển thông tin vào hoặc ra khỏi một tiến trình,hướng mũi tên chỉ ra hướng của dòng thông tin
Ký hiệu :
2.5. Kho dữ liệu :
Biểu diễn cho thông tin cần phải lưu giữ trong một khoảng thời gian để một hoặc nhiều quá trình hoặc tác nhân thâm nhập vào.
Ký hiệu :
2.6. Tác nhân ngoài :
Là một người, một nhóm người hoặc một tổ chức ở bên ngoài hệ thống có trao đổi thông tin với hệ thống.
Ký hiệu :
3. Sơ đồ dòng dữ liệu mức đỉnh:
Thi trắc nghiệm
Câu hỏi
TT Học viên
Kết quả
3.1. Sơ đồ dòng dữ liệu mức dưới đỉnh
Quản lý ngân hàng câu hỏi
Câu hỏi
Câu hỏi
Bộ đề
Tổ chức thi
Bộ đề
TT Học viên
Kết quả
3.2. Sơ đồ dòng dữ liệu mức 2
Soạn câu hỏi
TT câu hỏi
Câu hỏi
Tạo bộ đề
Bộ đề
Thi hết chương phần
TT học viên
Kết quả thi
Kết thúc môn
Bộ đề
4. Mô hình các bảng dữ liệu
Do tính chất của chương trình chỉ lưu trữ các câu hỏi, tổ chức thi và in kết quả do vậy bảng dữ liệu không cần nhiều và các mối quan hệ không có, chương trình chủ yếu đi sâu vào thuật toán, thuật giải, để giải quyết trong quá trình tạo bộ đề và thi cử.
4.1 Các bảng dữ liệu
Bộ đề
Mã bộ đề
Câu hỏi
P.án 1
P.án 2
P.án 3
P.án 4
P.án đúng
Câu hỏi
ID
Chương phần
Câu hỏi
P.án 1
P.án 2
P.án 3
P.án 4
P.án đúng
Kết qủa
Mã học viên
Họ tên
Ngày sinh
Lớp
Điểm
4.2. Mô tả chi tiết các bảng
4.2.1. Bảng câu hỏi
Cauhoi
STT
Tên trường
Kiểu trường
Độ rộng
Mô tả
1
ID
Autonumber
Long Integer
Số thứ tự
2
Chuong_phan
Number
Integer
Số thứ tự của chương
3
Cau_hoi
Text
255
Nội dung câu hỏi
4
Pa1
Text
255
Phương án 1
5
Pa2
Text
255
Phương án 2
6
Pa3
Text
255
Phương án 3
7
Pa4
Text
255
Phương án 4
8
Pa đúng
Number
Byte
Phương án đúng
4.2.2. Bảng bộ đề
Bode
STT
Tên trường
Kiểu trường
Độ rộng
Mô tả
1
Sobode
Number
Integer
Số bộ đề
2
Cau_hoi
Text
255
Nội dung câu hỏi
3
Pa1
Text
255
Phương án 1
4
Pa2
Text
255
Phương án 2
5
Pa3
Text
255
Phương án 3
6
Pa4
Text
255
Phương án 4
7
Pa đúng
Number
Byte
Phương án đúng
4.2.3. Bảng kết quả
Hocvien
STT
Tên trường
Kiểu trường
Độ rộng
Mô tả
1
Mahocvien
Text
5
Mã học viên
2
Hoten
Text
35
Họ và tên
3
Ngaysinh
Data/time
8
Ngày sinh
4
Lop
Text
50
Lớp
5
Diem
Text
10
Điểm
Chương V
Xây dựng chương trình
Chương trình được xây dựng trên ngôn ngữ VISUAL BASIC và cơ sở dữ liệu từ ACCESS.
1. Cơ sở lý thuyết về ngôn ngữ lập trình VISUAL BASIC
1.1. Tìm hiểu ngôn ngữ lập trình Visual Basic
1.1.1. Tổng quan về ngôn ngữ lập trình Visual Basic
Visual Basic, con đường nhanh nhất và đơn giản nhất để tạo những ứng dụng cho Microsoft Windows. Bất kể bạn là một nhà chuyên nghiệp hay là một người mới lập trình Windows, Visual Basic cung cấp cho bạn một tập hợp các công cụ hoàn chỉnh để nhanh chóng phát triển các ứng dụng.
Vậy Visual Basic là gì? Thành phần “Visual” nói đến các phương thức dùng để tạo giao diện đồ họa người sử dụng (GUI). Thay vì viết những dòng mã để mô tả sự xuất hiện và vị trí của những thành phần giao diện, ta chỉ cần thêm vào những đối tượng đã được định nghĩa trước ở vị trí nào đó trên màn hình.
Thành phần “Basic” nói đến ngôn ngữ “BASIC” (Beginners All-Purpose Symbolic Instruction Code) một ngôn ngữ được dùng bởi nhiều nhà lập trình hơn bất cứ một ngôn ngữ nào khác trong lịch sử máy tính. Visual Basic được phát triển dần dần dựa trên ngôn ngữ BASIC, và bây giờ chứa đựng hàng trăm điều lệnh, hàm, và từ khóa… có quan hệ trực tiếp với giao diện đồ họa của Windows.
Ngôn ngữ lập trình Visual Basic không chỉ là Visual Basic. Hệ thống lập trình Visual Basic, những ứng dụng bao gồm Microsoft Excel, Microsoft Access, và nhiều ứng dụng Windows khác đều dùng cùng một ngôn ngữ.
Mặc dù mục đích của chúng ta là tạo ra những ứng dụng nhỏ cho bản thân hay một nhóm, một hệ thống các công ty lớn, hoặc thậm chí phân phối những ứng dụng ra toàn cầu qua Internet. Visual Basic là cung cụ mà bạn cần.
- Những chức năng truy xuất dữ liệu cho phép ta tạo ra những cơ sở dữ liệu, những ứng dụng front-end, và những thành phần phạm vi server-side cho hầu hết các dạng thức cơ sở dữ liệu phổ biến, bao gồm Microsoft SQL Server và những cơ sở dữ liệu mức enterprise khác.
- Những kỹ thuật ActiveX cho phép ta dùng những chức năng được cung cấp từ những ứng dụng khác, như là chương trình xử lý văn bản Microsoft Word, bảng tính Microsoft Excel và những ứng dụng Windows khác.
- Khả năng Internet làm cho nó dễ dàng cung cấp cho việc thêm vào những tài liệu và ứng dụng qua Internet hoặc intranet từ bên trong ứng dụng của bạn, hoặc tạo những ứng dụng Internet server.
- ứng dụng của bạn kết thúc là một file .exe thật sự. Nó dùng một máy ảo Visual Basic để bạn tự do phân phối ứng dụng.
1.1.2. Cấu trúc của một ứng dụng Visual Basic
Một ứng dụng thật ra là một tập hợp các chỉ dẫn trực tiếp đến máy tính để thi hành một hay nhiều tác vụ. Cấu trúc của một ứng dụng là phương pháp trong đó các chỉ dẫn được tổ chức, đó là nơi chỉ dẫn được lưu giữ và thi hành những chỉ dẫn trong một trình tự nhất định.
Vì một ứng dụng Visual Basic, trên cơ bản là những đối tượng, cấu trúc mã đóng để tượng trưng cho những mô hình vật lý trên màn hình. Bằng việc định nghĩa, những đối tượng chứa mã và dữ liệu. Form, cái mà chúng ta nhìn thấy trên màn hình là tượng trưng cho những thuộc tính, quy định cách xuất hiện và cách cư xử. Cho mỗi form trong một ứng dụng, có một quan hệ module form (với tên file mở rộng là .frm) dùng để chứa đựng mã của nó.
Mỗi module chứa những thủ tục sự kiện – những đoạn mã, nơi đặt những chỉ dẫn, cái sẽ được thi hành trong việc đáp ứng những sự kiện chỉ định. Form có thể chứa những điều khiển. Tương ứng với mỗi điều khiển trên form, có một tập hợp những thủ tục sự kiện trong module form đó.
Mã không chỉ quan hệ với một form chỉ định hay điều khiển có thể được đặt trong một loại module khác, một module chuẩn (.bas). Một thủ tục được dùng để đáp ứng những sự kiện trong những đối tượng khác nhau phải được đặt trong cùng một chuẩn, thay vì tạo những bản sao mã trong những thủ tục sự kiện cho mỗi đối tượng. Một lớp module (.cls) được dùng để tạo những đối tượng, cái mà có thể được gọi từ những thủ tục bên trong ứng dụng của bạn. Trong khi một module chuẩn chỉ chứa mã, một lớp module chứa đựng cả mã và dữ liệu. Ta có thể nghĩ nó như một điều khiển.
1.2. Chúng ta có thể làm gì với Visual Basic
1.2.1. Tạo giao diện người sử dụng
Giao diện người sử dụng có lẽ là thành phần quan trọng nhất của một ứng dụng. Đối với người sử dụng, giao diện chính là ứng dụng ; họ không cần chú ý đến thành phần mã thực thi bên dưới. ứng dụng của chúng ta có thể phổ biến được hay không phụ thuộc vào giao diện.
1.2.2. Sử dụng những điều khiển chuẩn của Visual Basic
Ta dùng những điều khiển để lấy thông tin mà người sử dụng nhập vào, và để hiển thị và kết xuất. Những điều khiển mà ta có thể dùng trong ứng dụng bao gồm hộp văn bản, nút lệnh, và hộp danh sách,…. Những điều khiển khác cho ta truy xuất những ứng dụng khác, xử lý dữ liệu của nó như là một thành phần mã trong ứng dụng của bạn.
1.2.3. Lập trình với những đối tượng
Những đối tượng là thành phần chủ yếu để lập tình Visual Basic. Những đối tượng có thể là form, những điều khiển hay cơ sở dữ liệu.
1.2.4. Lập trình với phần hợp thành
Chúng ta đôi khi cần sử dụng khả năng tính toán của Microsoft Excel trong ứng dụng Visual Basic, hay định dạng một tài liệu sử dụng thanh công cụ định dạng của Microsoft Word, hoặc lưu trữ và xử lý dữ liệu dùng Microsoft Jet… Tất cả những điều này có thể thực hiện được bằng cách xây dựng những ứng dụng của chúng ta sử dụng những thành phần ActiveX. Thêm vào đó, Visual Basic có thể giúp chúng ta tạo ra những điều khiển ActiveX riêng.
1.2.5. Đáp ứng những sự kiện chuột và bàn phím
Những ứng dụng Visual Basic có thể đáp ứng một lượng lớn sự kiện chuột và bàn phím. Ví dụ form, hộp ảnh, và những điều khiển ảnh có thể phát hiện vị trí con trỏ chuột, có thể quyết định phím trái hay phím phải được nhấn, và có thể đáp ứng những tổ hợp của phím chuột với phím Shift, Ctrl, hay Alt. Sử dụng những điều khiển phím, ta có thể lập trình những điều khiển và form để đáp ứng các hành động phím hoặc phiên dịch và xử lý mã Ascii của ký tự.
Thêm vào đó, những ứng dụng Visual Basic có thể hỗ trợ sự kiện rê và thả cũng như tính năng rê và thả OLE.
1.2.6. Làm việc với văn bản và đồ họa
Visual Basic cung cấp khả năng đồ họa và văn bản phức tạp trong ứng dụng. Những thuộc tính văn bản có thể giúp ta nhấn mạnh các khái niệm quan trọng và các chi tiết cần quan tâm. Thêm vào đó, Visual Basic cung cấp khả năng đồ họa cho phép ta linh động trong thiết kế, bao hàm các hình ảnh động bằng cách hiển thị một loạt các hình ảnh liên tiếp nhau.
1.2.7. Gỡ rối mã và quản lý lỗi
Đôi khi có những lỗi xảy ra bên trong mã của ứng dụng. Những lỗi nghiêm trọng có thể là nguyên nhân một ứng dụng không đáp ứng lệnh, thông thường yêu cầu người sử dụng khởi động lại ứng dụng, và không lưu lại những gì ta đã làm. Quá trình tìm ra và sửa lỗi gọi là gỡ rối. Visual Basic cung cấp nhiều công cụ giúp chúng ta phân tích ứng dụng làm việc như thế nào. Những công cụ gỡ rối đặt biệt hữu ích trong việc tìm ra nguồn gốc lỗi, nhưng chúng ta cũng có thể dùng những công cụ này để kiểm tra chương trình hoặc tìm hiểu những ứng dụng khác nhau làm việc như thế nào.
1.2.8. Xử lý ổ đĩa, thư mục và file
Khi lập trình trong Windows, nó rất quan trọng để có khả năng thêm, di chuyển, tạo mới hoặc xóa những thư mục và file, lấy thông tin về và xử lý ổ đĩa. Visual Basic cho phép chúng ta xử lý ổ đĩa, thư mục và file bằng hai phương pháp : qua những phương htức cũ như là điều lệnh Open, Write#, và qua một tập hợp các công cụ mới như FSO (File System Object)
1.2.9. Thiết kế cho việc thi hành và tính tương thích
Visual Basic chia xẻ hầu hết những tính năng ngôn ngữ trong Visual Basic cho những ứng dụng, bao gồm trong Microsoft Office và nhiều ứng dụng khác. Visual Basic, VBScript, một ngôn ngữ script Internet, đều là tập hợp con của ngôn ngữ Visual Basic.
1.2.10. Phân phối những ứng dụng
Sau khi tạo một ứng dụng Visual Basic, ta có thể tự do phân phối bất kỳ ứng dụng nào đã tạo bằng Visual Basic đến bất cứ ai dùng Microsoft Windows. Ta có thể phân phối ứng dụng trên đĩa, trên CD, qua mạng, trên intranet hoặc Internet.
1.3. Tóm tắt ngôn ngữ
1.3.1. Biến
Biến được dùng để lưu tạm thời các giá trị tính toán trong quá trình xử lý chương trình.
- Cách khai báo biến
Visual Basic dùng cách khai báo biến trong chương trình như sau :
Dim As
Ta cũng có thể không cần khai báo kiểu biến (tức bỏ mệnh đề As phía sau), trong trường hợp này, biến có thể được dùng để lưu giữ một giá trị bất kỳ.
- Quy tắc đặt tên biến
Tên biến có chiều dài tối đa 255 ký tự.
Phải bắt đầu bằng một chữ cái.
Không đặt các khoảng trống và các ký hiệu (+ - * /…) trong tên biến.
Không được trùng với từ khóa của ngôn ngữ.
Tránh đặt tên trùng nhau.
- Phạm vi sử dụng biến
Phạm vi sử dụng biến tùy thuộc cách ta khai báo và chỗ ta đặt dòng lệnh khai báo biến.
Nếu ta khai báo trong phần General, biến có thể được dùng ở bất kỳ đoạn lệnh nào trong from và cũng chỉ mất đi khi from được giải phóng khỏi bộ nhớ.
Nếu ta khai báo biến trong phần viết lệnh cho một sự kiện của một đối tượng (tức khai báo giữa hai dòng Sub và End Sub của mã lệnh đó) thì biến chỉ tồn tại và dùng được trong phạm vi hai dòng Sub và End Sub đó mà thôi. Biến như vậy gọi là biến riêng hay biến nội bộ.
Nếu ta dùng từ khóa Public thay cho Dim để khai báo biến , biến sẽ tồn tại trong suốt thời gian thực hiện chương trình và có thể dùng được trong bất cứ đoạn lệnh nào của chương trình. Biến như vậy gọi là biến chung hay biến toàn cục.
1.3.2. Thủ tục
Cách định nghĩa thủ tục
Một thủ tục trước khi muốn sử dụng nó phải định nghĩa nó. Dùng từ khóa Sub để khai báo thủ tục như thế này.
Private/Pulic Sub
…
End Sub ‘Chỗ kết thúc thủ tục.
Nếu ta khai báo bằng từ khóa Public, thủ tục có thể được gọi để sử dụng trong bất kỳ form nào trong chương trình.
Nếu ta khai báo bằng từ khóa Private, thủ tục chỉ có thể dùng được trong form có chứa nó mà thôi
- Thủ tục có truyền tham số
Khi một thủ tục được gọi mà có truyền thêm một số giá trị vào, các giá trị này được gọi là các tham số của thủ tục đó. Để làm điều này, khi khai báo thủ tục ta cần ghi thêm nó sẽ nhận bao nhiêu tham số bằng cú pháp như sau :
Private/Public Sub ( As ,…)
2. Tổng quan về cơ sở dữ liệu ACCESS
Một cách tổng quát, một cơ sở dữ liệu của Microsoft Access bao gồm các thành phần dưới đây :
2.1. Table: Bảng dữ liệu
Là thành phần cơ bản quan trọng của cơ sở dữ liệu, nó dùng để ghi nhận các số liệu cơ sở, cần thiết của cơ sở dữ liệu. Có thể nói tất cả quá trình xử lý dữ liệu đều dựa trên cơ sở các dữ liệu thô được lưu trữ trong các table.
Trong 1 table số liệu được tổ chức thành các cột (fields or columns) và dòng (records). Mỗi cột ứng với một mục dữ liệu cần lưu trữ. Mỗi dòng chứa dữ liệu về một người hay vật cụ thể mà ta cần lưu trữ. Khi thiết kế các cột cho table, ta có thể ràng buộc điều kiện để Access kiểm tra các record nhập vào không bị sai sót.
2.2. Query : Bảng truy vấn
Query là công cụ dùng để tính tóan và xử lý dữ liệu từ các table và các query khác có sẵn trong Cơ Sở Dữ Liệu.
Dạng Query thường được sử dụng nhiều nhất là Select Query. Bằng lọai Query này ta có thể lọc ra những thông tin cần quan tâm từ nhiều bảng dữ liệu khác nhau của cơ sở dữ liệu, có thể phân tích và hiệu chỉnh dữ liệu ngay trên bản thân Query hay sử dụng làm cơ sở cho công việc khác.
Ngoài ra còn có các lọai Query khác như Update Query để cập nhật, chỉnh sữa dữ liệu cho table, Crosstab Query tổng hợp số liệu, Make Table Query nhằm phục hồi dữ liệu nếu có sơ sót xảy ra cho table. Ráp nối dữ liệu vào table có Append Query, xóa dữ liệu Delete Query … Query như là một nền tảng để tạo ra các báo biểu có đặc tính định dạng cao hơn Table
Sau khi đã tìm hiểu thế nào là hoạt động theo kiểu điều khiển bởi sự kiện và các hổ trợ của Access vàVisual Basic mà phiên bản mới nhất là Visual Basic 6.0, chúng ta sẽ thấy đây là một công cụ lập trình dễ chịu và có xu hướng trở thành môi trường lập trình hoàn hảo cho những năm sắp tới.
3. Thiết kế giao diện
Có nhiều kiểu thiết kế đã được tạo ra nhằm phục vụ cho giao diện. Mỗi kiểu đều có khả năng và đặc tính khác nhau. Song một điều quan trọng là kiểu thiết kế phải phù hợp với nhiệm vụ được giao và với người sử dụng, người sẽ tham gia vào đối thoại với máy. Chỉ tiêu quan trọng cần có để đánh giá cho mỗi đối thoại là :
Dễ sử dụng : Giao diện đó dễ sử dụng ngay cả với người sử dụng thiếu kinh nghiệm.
Dễ học : Các lệnh và chức năng của giao diện dễ học.
Tốc độ thao tác : Giao diện có hiệu quả trong hạn định của các bước thao tác, nhấn phím và thời gian trả lời.
Kiểm soát : Người sử dụng thực hiện hoặc bắt đầu kiểm soát đàm thoại.
Dễ phát triển : Phát triển các yêu cầu phải có kết quả như thế nào ?
Việc thiết kế đối thoại bắt đầu bằng việc chia các chức năng giao diện hệ thống từ dạng sơ đồ dòng dữ liệu hệ thống sang dạng đơn thể. Nội dung của mỗi đơn thể được xác định bằng các thuật ngữ tiêu đề “Một giao diện chỉ thực một và chỉ một việc” Ví dụ : một sữ liệu được đưa vào, màn hình chấp nhận dữ liệu, nhưng nó không chấp nhận thao tác soạn thảo. Điều này sẽ được thực hiện bằng việc link đến một màn hình khác. Việc đơn thể hoá này cho phép thay đổi các giao diện được dễ dàng hơn và làm giảm các khó khăn trong bảo trì.
4. Các form chương trình và các sơ đồ thuật giải
Chương trình được thiết kế bằng các sử dụng các FORM để cập nhật hay hiển thị dữ liệu.
4.1. FORM đăng nhập:
Hình 1
Khi đăng nhập thì giáo viên phải nhập mật khẩu
Kiểm tra
Mật khẩu
Vào hệ thống
T
F
Báo lỗi
4.2. FORM cập nhật ngân hàng câu hỏi
Hình 2
4.3.Tạo bộ đề ngẫu nhiên
Hình 3
Sơ đồ thuật giải
Ngân hàng câu hỏi
N=Số bộ đề ,số câu
Số câu=0
A1()=câu hỏi chương 1
.................................
An()=câu hỏi chương n
Tạo câu hỏi
Câu hỏi trùng nhau
N> Số bộ đề
Báo lỗi
Tiếp tục chương trình
F
T
T
F
F
T
4.4.FORM nhập thông tin vào thi
Hình 4
Kiểm tra TT
Thông tin học viên
Vào thi
T
F
Báo lỗi
Khi học viên chọn vào thi thì sẽ điền thông tin vào FORM trên, nếu giáo viên muốn có thể chọn thêm một số thông tin bằng cách CLICK vào nút CHI TIếT ở trên, nếu không khi học viên vào thi máy sẽ tự động lấy bộ đề ngẫu nhiên và tham số mặc định, khi vào thi máy sẽ kiểm tra thêm mã học viên xem đúng không, nếu mã học viên trùng nhau máy sẽ thông báo.
4.5. FORM thi hết chương phần
Hình 5
F
T
Vào thi
Thông tin học viên
Kiểm tra TT
Báo lỗi
Khi học viên chọn vào thi thì sẽ điền thông tin vào FORM trên, nếu giáo viên muốn có thể chọn thêm một số thông tin bằng cách CLICK vào nút CHI TIếT ở trên, nếu không khi học viên vào thi máy sẽ tự động lấy bộ đề ngẫu nhiên và tham số mặc định, khi vào thi máy sẽ kiểm tra thêm mã học viên xem đúng không, nếu mã học viên trùng nhau máy sẽ thông báo.Nếu số câu hỏi thi lớn hơn số câu có trong chương thì máy sẽ thông báo.
4.6. FORM thi
Hình 6
Khi vào thi, tất cả các câu hỏi được đưa ra thành từng cập trên các trang, mỗi trang thể hiện hai câu, mỗi câu có 4 phương án lựa chọn, học viên lựa chọn phương án nào thì tích vào một trong 4 câu hỏi đó. Để chuyển qua các câu khác học viên click chuột vào số câu được hiển thị phía trên, khi chuyển qua các trang kết quả của các câu đã làm đã được ghi lại, khi quay lại các trang đã làm nó vẫn thể hiện các câu đã chọn. Thời gian được đếm giật lùi được thể hiện phía trên. Nếu học viên làm xong mà chưa hết thời gian thì có thể thoát ra và máy sẽ tự động ghi kết quả. Trường hợp chưa làm xong mà hết thời gian thì máy sẽ tự động ghi và thoát.
4.7. In đề thi
Khi cần thiết ta có thể in ra đề thi theo dạng dưới đây
Hình 7
4.8. In danh sách kết quả thi
Hình 8
Sau khi lựa chọn máy sẽ đưa ra kết quả bảng điểm dưới đây
Hình 9
Phụ Lục
Module chương trình tạo bộ câu hỏi ngẫu nhiên theo tỉ lệ phần trăm các chương
Dim m1() As cauhoi
Dim m2() As cauhoi
Dim m3() As cauhoi
Dim m4() As cauhoi
Dim m5() As cauhoi
Dim m6() As cauhoi
Dim m7() As cauhoi
Dim m8() As cauhoi
Dim m9() As cauhoi
Dim m10() As cauhoi
Dim m11() As cauhoi
Dim m12() As cauhoi
Dim m13() As cauhoi
Dim m14() As cauhoi
Dim m15() As cauhoi
Dim m16() As cauhoi
Dim g(15) As Integer
Dim tong() As Long
Dim phantram(15) As Integer
Dim i As Integer
Dim xuly As Integer
Dim dem As Long
Private Sub cmdtao_Click()
On Error GoTo ends
datade.Recordset.MoveLast
dem = datade.Recordset.RecordCount
If dem 0 Then
If MsgBox("Các đề cũ còn bạn có muốn xoá không?, nếu không muốn xoá, hay nhập số thứ tự của đề để khỏi trùng nhau", vbYesNo + 32, "Thông báo") = vbYes Then
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
datade.Recordset.Delete
datade.Recordset.MoveNext
Loop
dem = 0
End If
End If
dem = 0
prg.Max = CInt(Text1.Text) - CInt(txtsobode.Text) + 1
Label1.Caption = "Đang tạo...."
xuly = 0
Call taobongaunhien(CInt(txtsobode.Text), CInt(Text1.Text), CInt(txtpt.Text), 5)
Label1.Caption = "Kết thúc"
Exit Sub
ends:
dem = 0
prg.Max = CInt(Text1.Text) - CInt(txtsobode.Text) + 1
Label1.Caption = "Đang tạo...."
xuly = 0
Call taobongaunhien(CInt(txtsobode.Text), CInt(Text1.Text), CInt(txtpt.Text), 5)
Label1.Caption = "Kết thúc"
End Sub
Private Sub cmdtrove_Click()
Unload Me
End Sub
Private Sub cmdxem_Click()
frmhienthide.Show
End Sub
Private Sub Text1_LostFocus()
If Trim(Text1.Text) = Empty Then
Text1.Text = str(CInt(txtsobode.Text) + 1)
End If
End Sub
Private Sub txtpt_LostFocus()
If Trim(txtpt.Text) = Empty Then
txtpt.Text = "20"
End If
If CInt(txtpt.Text) Mod 2 0 Then
txtpt.Text = str(CInt(txtpt.Text) + 1)
End If
End Sub
Private Sub txtsobode_LostFocus()
If Trim(txtsobode.Text) = Empty Then
txtsobode.Text = "1"
End If
End Sub
Private Sub txtsocau_Change()
End Sub
'Private Sub txtsocau_LostFocus()
' If Trim(txtsocau.Text) = Empty Then
' txtsocau.Text = "5"
' End If
'End Sub
Private Sub UpDown1_DownClick()
On Error GoTo ends
If CInt(Text1.Text) > (CInt(txtsobode.Text) + 1) Then
Text1.Text = str(CInt(Text1.Text) - 1)
End If
Exit Sub
ends:
Text1.Text = str(CInt(txtsobode.Text) + 1)
End Sub
Private Sub UpDown1_UpClick()
On Error GoTo ends
If (CInt(Text1.Text) - CInt(txtsobode.Text)) < 60 Then
Text1.Text = str(CInt(Text1.Text) + 1)
End If
Exit Sub
ends:
str (CInt(txtsobode.Text) + 1)
End Sub
Private Sub Form_Load()
' Set bode.txt = txtsobode
' Set cau.txt = txtsocau
' Set pt.txt = txtpt
Me.Height = 3740
Me.Width = 5130
End Sub
Private Sub UpDown3_DownClick()
On Error GoTo ends
If CInt(txtsocau.Text) > 1 Then
txtsocau.Text = str(CInt(txtsocau.Text) - 1)
End If
Exit Sub
ends:
txtsocau.Text = "5"
End Sub
Private Sub UpDown3_UpClick()
On Error GoTo ends
If CInt(txtsocau.Text) < 20 Then
txtsocau.Text = str(CInt(txtsocau.Text) + 1)
End If
Exit Sub
ends:
txtsocau.Text = "5"
End Sub
Private Sub UpDown5_DownClick()
On Error GoTo ends
If CInt(txtsobode.Text) > 1 Then
txtsobode.Text = str(CInt(txtsobode.Text) - 1)
End If
Exit Sub
ends:
txtsobode.Text = "1"
End Sub
Private Sub UpDown5_UpClick()
On Error GoTo ends
If CInt(txtsobode.Text) < 100 Then
txtsobode.Text = str(CInt(txtsobode.Text) + 1)
If CInt(Text1.Text) <= CInt(txtsobode.Text) Then
Text1.Text = str(CInt(txtsobode.Text) + 1)
End If
End If
Exit Sub
ends:
txtsobode.Text = "1"
End Sub
Private Sub UpDown6_DownClick()
On Error GoTo ends:
If CInt(txtpt.Text) > 11 Then
txtpt.Text = str(CInt(txtpt.Text) - 2)
End If
Exit Sub
ends:
txtpt.Text = "20"
End Sub
Private Sub UpDown6_UpClick()
On Error GoTo ends
If CInt(txtpt.Text) < 39 Then
txtpt.Text = str(CInt(txtpt.Text) + 2)
End If
Exit Sub
ends:
txtpt.Text = "20"
End Sub
Private Sub taobongaunhien(Y As Integer, z As Integer, socau As Integer, phantram1 As Integer)
Dim i As Long
Dim n As Integer
Dim tam As Integer
Dim kt01 As Boolean
Dim tam1 As Long
''''''''''''''''''''''''''''''''''''''''''''''''''''
'On Error Resume Next
databien.Recordset.MoveFirst
For i = 0 To 15
If databien.Recordset.Fields(i).Value 0 Then
g(i) = databien.Recordset.Fields(i).Value
End If
Next i
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
For i = 0 To 15
If g(i) 0 Then
phantram(i) = Round(((g(i) / 100) * socau), 1)
End If
Next i
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Call laygiatri
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Randomize
'''''''''''
For i = Y To z
If phantram(0) 0 Then
n = 1
Do While n <= phantram(0)
tam1 = 0
tam = UBound(m1) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m1(tam).ch) And tam > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m1(tam).ch
datade.Recordset![pa1] = m1(tam).pa1
datade.Recordset![pa2] = m1(tam).pa2
datade.Recordset![pa3] = m1(tam).pa3
datade.Recordset![pa4] = m1(tam).pa4
datade.Recordset![pa đúng] = m1(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(1) 0 Then
n = 1
Do While n <= phantram(1)
tam1 = 0
tam = UBound(m2) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m2(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m2(tam).ch
datade.Recordset![pa1] = m2(tam).pa1
datade.Recordset![pa2] = m2(tam).pa2
datade.Recordset![pa3] = m2(tam).pa3
datade.Recordset![pa4] = m2(tam).pa4
datade.Recordset![pa đúng] = m2(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(2) 0 Then
n = 1
Do While n <= phantram(2)
tam1 = 0
tam = UBound(m3) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m3(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m3(tam).ch
datade.Recordset![pa1] = m3(tam).pa1
datade.Recordset![pa2] = m3(tam).pa2
datade.Recordset![pa3] = m3(tam).pa3
datade.Recordset![pa4] = m3(tam).pa4
datade.Recordset![pa đúng] = m3(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(3) 0 Then
n = 1
Do While n <= phantram(3)
tam1 = 0
tam = UBound(m4) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m4(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m4(tam).ch
datade.Recordset![pa1] = m4(tam).pa1
datade.Recordset![pa2] = m4(tam).pa2
datade.Recordset![pa3] = m4(tam).pa3
datade.Recordset![pa4] = m4(tam).pa4
datade.Recordset![pa đúng] = m4(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(4) 0 Then
n = 1
Do While n <= phantram(4)
tam1 = 0
tam = UBound(m5) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m5(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m5(tam).ch
datade.Recordset![pa1] = m5(tam).pa1
datade.Recordset![pa2] = m5(tam).pa2
datade.Recordset![pa3] = m5(tam).pa3
datade.Recordset![pa4] = m5(tam).pa4
datade.Recordset![pa đúng] = m5(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(5) 0 Then
n = 1
Do While n <= phantram(5)
tam1 = 0
tam = UBound(m6) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m6(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m6(tam).ch
datade.Recordset![pa1] = m6(tam).pa1
datade.Recordset![pa2] = m6(tam).pa2
datade.Recordset![pa3] = m6(tam).pa3
datade.Recordset![pa4] = m6(tam).pa4
datade.Recordset![pa đúng] = m6(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(6) 0 Then
n = 1
Do While n <= phantram(6)
tam1 = 0
tam = UBound(m7) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m7(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m7(tam).ch
datade.Recordset![pa1] = m7(tam).pa1
datade.Recordset![pa2] = m7(tam).pa2
datade.Recordset![pa3] = m7(tam).pa3
datade.Recordset![pa4] = m7(tam).pa4
datade.Recordset![pa đúng] = m7(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(7) 0 Then
n = 1
Do While n <= phantram(7)
tam1 = 0
tam = UBound(m8) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m8(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m8(tam).ch
datade.Recordset![pa1] = m8(tam).pa1
datade.Recordset![pa2] = m8(tam).pa2
datade.Recordset![pa3] = m8(tam).pa3
datade.Recordset![pa4] = m8(tam).pa4
datade.Recordset![pa đúng] = m8(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(8) 0 Then
n = 1
Do While n <= phantram(8)
tam1 = 0
tam = UBound(m9) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m9(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m9(tam).ch
datade.Recordset![pa1] = m9(tam).pa1
datade.Recordset![pa2] = m9(tam).pa2
datade.Recordset![pa3] = m9(tam).pa3
datade.Recordset![pa4] = m9(tam).pa4
datade.Recordset![pa đúng] = m9(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(9) 0 Then
n = 1
Do While n <= phantram(9)
tam1 = 0
tam = UBound(m10) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m10(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m10(tam).ch
datade.Recordset![pa1] = m10(tam).pa1
datade.Recordset![pa2] = m10(tam).pa2
datade.Recordset![pa3] = m10(tam).pa3
datade.Recordset![pa4] = m10(tam).pa4
datade.Recordset![pa đúng] = m10(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(10) 0 Then
n = 1
Do While n <= phantram(10)
tam1 = 0
tam = UBound(m11) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m11(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m11(tam).ch
datade.Recordset![pa1] = m11(tam).pa1
datade.Recordset![pa2] = m11(tam).pa2
datade.Recordset![pa3] = m11(tam).pa3
datade.Recordset![pa4] = m11(tam).pa4
datade.Recordset![pa đúng] = m11(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(11) 0 Then
n = 1
Do While n <= phantram(11)
tam1 = 0
tam = UBound(m12) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m12(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m12(tam).ch
datade.Recordset![pa1] = m12(tam).pa1
datade.Recordset![pa2] = m12(tam).pa2
datade.Recordset![pa3] = m12(tam).pa3
datade.Recordset![pa4] = m12(tam).pa4
datade.Recordset![pa đúng] = m12(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(12) 0 Then
n = 1
Do While n <= phantram(12)
tam1 = 0
tam = UBound(m13) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m13(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m13(tam).ch
datade.Recordset![pa1] = m13(tam).pa1
datade.Recordset![pa2] = m13(tam).pa2
datade.Recordset![pa3] = m13(tam).pa3
datade.Recordset![pa4] = m13(tam).pa4
datade.Recordset![pa đúng] = m13(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(13) 0 Then
n = 1
Do While n <= phantram(13)
tam1 = 0
tam = UBound(m14) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m14(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m14(tam).ch
datade.Recordset![pa1] = m14(tam).pa1
datade.Recordset![pa2] = m14(tam).pa2
datade.Recordset![pa3] = m14(tam).pa3
datade.Recordset![pa4] = m14(tam).pa4
datade.Recordset![pa đúng] = m14(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(14) 0 Then
n = 1
Do While n <= phantram(14)
tam1 = 0
tam = UBound(m15) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m15(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m15(tam).ch
datade.Recordset![pa1] = m15(tam).pa1
datade.Recordset![pa2] = m15(tam).pa2
datade.Recordset![pa3] = m15(tam).pa3
datade.Recordset![pa4] = m15(tam).pa4
datade.Recordset![pa đúng] = m15(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If phantram(15) 0 Then
n = 1
Do While n <= phantram(15)
tam1 = 0
tam = UBound(m16) * Rnd()
kt01 = False
If n > 1 Then
datade.Refresh
datade.Recordset.MoveFirst
Do While Not datade.Recordset.EOF
tam1 = tam1 + 1
If Trim(datade.Recordset![cau_hoi]) = Trim(m16(tam).ch) And tam1 > dem Then
kt01 = True
Exit Do
End If
datade.Recordset.MoveNext
Loop
End If
If kt01 = False Then
datade.Recordset.AddNew
datade.Recordset![sobode] = i
datade.Recordset![cau_hoi] = m16(tam).ch
datade.Recordset![pa1] = m16(tam).pa1
datade.Recordset![pa2] = m16(tam).pa2
datade.Recordset![pa3] = m16(tam).pa3
datade.Recordset![pa4] = m16(tam).pa4
datade.Recordset![pa đúng] = m16(tam).pad
datade.Recordset.Update
n = n + 1
End If
Loop
End If
dem = dem + socau '''''''''''''
xuly = xuly + 1
prg.Value = xuly
Next i
End Sub
Private Sub laygiatri()
Dim k As Integer
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(0) 0 Then
k = 0
Data1.Recordset.MoveLast
ReDim m1(Data1.Recordset.RecordCount - 1)
Data1.Recordset.MoveFirst
Do While Not Data1.Recordset.EOF
m1(k).ch = Data1.Recordset![cau_hoi]
m1(k).pa1 = Data1.Recordset![pa1]
m1(k).pa2 = Data1.Recordset![pa2]
m1(k).pa3 = Data1.Recordset![pa3]
m1(k).pa4 = Data1.Recordset![pa4]
m1(k).pad = Data1.Recordset![pa đúng]
k = k + 1
Data1.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(1) 0 Then
k = 0
Data2.Recordset.MoveLast
ReDim m2(Data2.Recordset.RecordCount - 1)
Data2.Recordset.MoveFirst
Do While Not Data2.Recordset.EOF
m2(k).ch = Data2.Recordset![cau_hoi]
m2(k).pa1 = Data2.Recordset![pa1]
m2(k).pa2 = Data2.Recordset![pa2]
m2(k).pa3 = Data2.Recordset![pa3]
m2(k).pa4 = Data2.Recordset![pa4]
m2(k).pad = Data2.Recordset![pa đúng]
k = k + 1
Data2.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(2) 0 Then
k = 0
Data3.Recordset.MoveLast
ReDim m3(Data3.Recordset.RecordCount - 1)
Data3.Recordset.MoveFirst
Do While Not Data3.Recordset.EOF
m3(k).ch = Data3.Recordset![cau_hoi]
m3(k).pa1 = Data3.Recordset![pa1]
m3(k).pa2 = Data3.Recordset![pa2]
m3(k).pa3 = Data3.Recordset![pa3]
m3(k).pa4 = Data3.Recordset![pa4]
m3(k).pad = Data3.Recordset![pa đúng]
k = k + 1
Data3.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(3) 0 Then
k = 0
Data4.Recordset.MoveLast
ReDim m4(Data4.Recordset.RecordCount - 1)
Data4.Recordset.MoveFirst
Do While Not Data4.Recordset.EOF
m4(k).ch = Data4.Recordset![cau_hoi]
m4(k).pa1 = Data4.Recordset![pa1]
m4(k).pa2 = Data4.Recordset![pa2]
m4(k).pa3 = Data4.Recordset![pa3]
m4(k).pa4 = Data4.Recordset![pa4]
m4(k).pad = Data4.Recordset![pa đúng]
k = k + 1
Data4.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(4) 0 Then
k = 0
Data5.Recordset.MoveLast
ReDim m5(Data5.Recordset.RecordCount - 1)
Data5.Recordset.MoveFirst
Do While Not Data5.Recordset.EOF
m5(k).ch = Data5.Recordset![cau_hoi]
m5(k).pa1 = Data5.Recordset![pa1]
m5(k).pa2 = Data5.Recordset![pa2]
m5(k).pa3 = Data5.Recordset![pa3]
m5(k).pa4 = Data5.Recordset![pa4]
m5(k).pad = Data5.Recordset![pa đúng]
k = k + 1
Data5.Recordset.MoveNext
Loop
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(5) 0 Then
k = 0
Data6.Recordset.MoveLast
ReDim m6(Data6.Recordset.RecordCount - 1)
Data6.Recordset.MoveFirst
Do While Not Data6.Recordset.EOF
m6(k).ch = Data6.Recordset![cau_hoi]
m6(k).pa1 = Data6.Recordset![pa1]
m6(k).pa2 = Data6.Recordset![pa2]
m6(k).pa3 = Data6.Recordset![pa3]
m6(k).pa4 = Data6.Recordset![pa4]
m6(k).pad = Data6.Recordset![pa đúng]
k = k + 1
Data6.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(6) 0 Then
k = 0
Data7.Recordset.MoveLast
ReDim m7(Data7.Recordset.RecordCount - 1)
Data7.Recordset.MoveFirst
Do While Not Data7.Recordset.EOF
m7(k).ch = Data7.Recordset![cau_hoi]
m7(k).pa1 = Data7.Recordset![pa1]
m7(k).pa2 = Data7.Recordset![pa2]
m7(k).pa3 = Data7.Recordset![pa3]
m7(k).pa4 = Data7.Recordset![pa4]
m7(k).pad = Data7.Recordset![pa đúng]
k = k + 1
Data7.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(7) 0 Then
k = 0
Data8.Recordset.MoveLast
ReDim m8(Data8.Recordset.RecordCount - 1)
Data8.Recordset.MoveFirst
Do While Not Data8.Recordset.EOF
m8(k).ch = Data8.Recordset![cau_hoi]
m8(k).pa1 = Data8.Recordset![pa1]
m8(k).pa2 = Data8.Recordset![pa2]
m8(k).pa3 = Data8.Recordset![pa3]
m8(k).pa4 = Data8.Recordset![pa4]
m8(k).pad = Data8.Recordset![pa đúng]
k = k + 1
Data8.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(8) 0 Then
k = 0
Data9.Recordset.MoveLast
ReDim m9(Data9.Recordset.RecordCount - 1)
Data9.Recordset.MoveFirst
Do While Not Data9.Recordset.EOF
m9(k).ch = Data9.Recordset![cau_hoi]
m9(k).pa1 = Data9.Recordset![pa1]
m9(k).pa2 = Data9.Recordset![pa2]
m9(k).pa3 = Data9.Recordset![pa3]
m9(k).pa4 = Data9.Recordset![pa4]
m9(k).pad = Data9.Recordset![pa đúng]
k = k + 1
Data9.Recordset.MoveNext
Loop
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(9) 0 Then
k = 0
Data10.Recordset.MoveLast
ReDim m10(Data10.Recordset.RecordCount - 1)
Data10.Recordset.MoveFirst
Do While Not Data10.Recordset.EOF
m10(k).ch = Data10.Recordset![cau_hoi]
m10(k).pa1 = Data10.Recordset![pa1]
m10(k).pa2 = Data10.Recordset![pa2]
m10(k).pa3 = Data10.Recordset![pa3]
m10(k).pa4 = Data10.Recordset![pa4]
m10(k).pad = Data10.Recordset![pa đúng]
k = k + 1
Data10.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(10) 0 Then
k = 0
Data11.Recordset.MoveLast
ReDim m11(Data11.Recordset.RecordCount - 1)
Data11.Recordset.MoveFirst
Do While Not Data11.Recordset.EOF
m11(k).ch = Data11.Recordset![cau_hoi]
m11(k).pa1 = Data11.Recordset![pa1]
m11(k).pa2 = Data11.Recordset![pa2]
m11(k).pa3 = Data11.Recordset![pa3]
m11(k).pa4 = Data11.Recordset![pa4]
m11(k).pad = Data11.Recordset![pa đúng]
k = k + 1
Data11.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(11) 0 Then
k = 0
Data12.Recordset.MoveLast
ReDim m10(Data12.Recordset.RecordCount - 1)
Data12.Recordset.MoveFirst
Do While Not Data12.Recordset.EOF
m12(k).ch = Data12.Recordset![cau_hoi]
m12(k).pa1 = Data12.Recordset![pa1]
m12(k).pa2 = Data12.Recordset![pa2]
m12(k).pa3 = Data12.Recordset![pa3]
m12(k).pa4 = Data12.Recordset![pa4]
m12(k).pad = Data12.Recordset![pa đúng]
k = k + 1
Data12.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(12) 0 Then
k = 0
Data13.Recordset.MoveLast
ReDim m13(Data13.Recordset.RecordCount - 1)
Data13.Recordset.MoveFirst
Do While Not Data13.Recordset.EOF
m13(k).ch = Data13.Recordset![cau_hoi]
m13(k).pa1 = Data13.Recordset![pa1]
m13(k).pa2 = Data13.Recordset![pa2]
m13(k).pa3 = Data13.Recordset![pa3]
m13(k).pa4 = Data13.Recordset![pa4]
m13(k).pad = Data13.Recordset![pa đúng]
k = k + 1
Data13.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(13) 0 Then
k = 0
Data14.Recordset.MoveLast
ReDim m14(Data14.Recordset.RecordCount - 1)
Data14.Recordset.MoveFirst
Do While Not Data10.Recordset.EOF
m14(k).ch = Data14.Recordset![cau_hoi]
m14(k).pa1 = Data14.Recordset![pa1]
m14(k).pa2 = Data14.Recordset![pa2]
m14(k).pa3 = Data14.Recordset![pa3]
m14(k).pa4 = Data14.Recordset![pa4]
m14(k).pad = Data14.Recordset![pa đúng]
k = k + 1
Data14.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(14) 0 Then
k = 0
Data15.Recordset.MoveLast
ReDim m15(Data15.Recordset.RecordCount - 1)
Data15.Recordset.MoveFirst
Do While Not Data10.Recordset.EOF
m15(k).ch = Data15.Recordset![cau_hoi]
m15(k).pa1 = Data15.Recordset![pa1]
m15(k).pa2 = Data15.Recordset![pa2]
m15(k).pa3 = Data15.Recordset![pa3]
m15(k).pa4 = Data15.Recordset![pa4]
m15(k).pad = Data15.Recordset![pa đúng]
k = k + 1
Data15.Recordset.MoveNext
Loop
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If g(15) 0 Then
k = 0
Data16.Recordset.MoveLast
ReDim m16(Data16.Recordset.RecordCount - 1)
Data16.Recordset.MoveFirst
Do While Not Data16.Recordset.EOF
m16(k).ch = Data16.Recordset![cau_hoi]
m16(k).pa1 = Data16.Recordset![pa1]
m16(k).pa2 = Data16.Recordset![pa2]
m16(k).pa3 = Data16.Recordset![pa3]
m16(k).pa4 = Data16.Recordset![pa4]
m16(k).pad = Data16.Recordset![pa đúng]
k = k + 1
Data16.Recordset.MoveNext
Loop
End If
End If
End Sub
Kết luận
Sau một thời gian nỗ lực thiết kế và hoàn thiện hệ thống chương trình, đề tài "Xây dựng chương trình thi trắc nghiệm môn Tin học Đại cương cho các Trường Trung Học Quân Sự" đã được hoàn thành. Qua quá trình áp dụng thử nghiệm trong thực tế, hệ thống đã đạt được một số kết quả nhất định sau:
+ Hệ thống đã tin học hoá phần lớn các khâu trong kỳ thi trắc nghiệm Tin học Đại cương tổ chức theo chương, phần và hết môn. Các quá trình từ việc tổ chức thi, ra đề thi, thu bài thi và chấm điểm đã được chương trình xử lý một cách nhanh chóng, chính xác.
+ Giao diện của chương trình được thiết kế bằng một hệ thống FORM thao tác tương tự trong WINDOWS, rất thân thiện với người dùng. Giúp cho người chưa thành thạo về tin học cũng sử dụng chương trình một cách dễ dàng.
Tuy vậy do trình độ kiến thức còn hạn chế, thời gian xây dựng chương trình lại không nhiều, nên hệ thống chương trình còn nhiều sai sót và chưa được hoàn chỉnh. Em rất mong được sự chỉ bảo của thầy cô và các bạn để hệ thống chương trình trong tương lai sẽ được hoàn thiện hơn.
Định hướng phát triển chương trình trong tương lai:
Trong thời gian tới, hệ thống chương trình sẽ cho phép cùng một lúc, có thể tiến hành nhiều môn thi trắc nghiệm, với nhiều dạng đề thi khác nhau, áp dụng cho các loại học viên thi. Đồng thời các dạng câu hỏi trắc nghiệm sẽ phong phú hơn, không chỉ có một loại câu hỏi dạng nhiều phương án trả lời như trong bài khoá đã đề cập.
Tài liệu tham khảo
Giáo trình Tin Học Đại Cương dành cho các trường Quân Sự - Nguyễn Văn Xuất – Lê Xuân Đình
Cơ sở dữ liệu - Đỗ Trung Tuấn - NXB Giáo dục 1998.
Lý thuyết cơ sở dữ liệu – TS Nguyễn Bá Tường.
Phân tích và thiết kế hệ thống - Đào Thanh Tĩnh - Giáo trình Học viện Kỹ thuật Quân sự.
Quản trị dữ liệu với Access 97 - Nhà xuất bản Thống kê.
Microsoft Visual Basic - TS Nguyễn Hữu Mộng - Khoa Công nghệ Thông tin - Học viện Kỹ thuật Quân sự.
Trắc nghiệm và đo lường đánh giá thành quả học tập - Dương Thiệu Tốn - Bộ Giáo dục và Đào tạo 1995.
Những cơ sở kỹ thuật trắc nghiệm - Lâm Quang Thiệp - Vụ Đại học năm 1994.
Tham khảo trên Internet của các Trường Đại học.
Các file đính kèm theo tài liệu này:
- 28802.doc