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ự

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.

doc70 trang | Chia sẻ: aloso | Lượt xem: 1881 | Lượt tải: 1download
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:

  • doc28802.doc
Tài liệu liên quan