Xây dựng chức năng tính điểm và mức kỹ năng

Một phần của tài liệu (LUẬN văn THẠC sĩ) xây dựng phần mềm hỗ trợ dạy và học ngôn ngữ lập trình pascal cho học sinh trung học phổ thông (Trang 41 - 50)

Chương 3. XÂY DỰNG HỆ THỐNG GIẢI QUYẾT BÀI TOÁN

3.2. Xây dựng phần mềm

3.2.5. Xây dựng chức năng tính điểm và mức kỹ năng

Quy trình chung của hệ thống được thực hiện như sau: Người sử dụng đăng nhập vào hệ thống và hoàn thành mã Pascal theo yêu cầu của chương trình, khi chức năng biên dịch được sử dụng, hệ thống sẽ lấy mã Pascal lưu thành file, hệ thống sẽ sử dụng file này để biên dịch sau đó phân tích kết quả biên dịch như sau:

Biên dịch trả về kết quả đúng: Hệ thống sẽ phân tích mã Pascal và kiểm thử chương trình, nếu đạt sẽ xác nhận việc ghi điểm cho người dùng và mở khóa sang bài tiếp theo, nếu chưa đạt người dùng cần nhập lại mã Pascal, biên dịch trả về kết quả sai:

Người dùng cần nhập lại mã Pascal

Chức năng tính điểm và đánh giá kỹ năng của người học được mô tả theo sơ đồ như trong hình sau:

Hình 3.11. Hệ thống đánh giá chương trình của người học

Quy trình phân tích mã Pascal diễn ra phụ thuộc theo từng dạng bài của hệ thống đưa ra, với mỗi dạng bài tập sẽ sử dụng một phương pháp phân tích khác nhau, ở đây hệ thống đưa ra hoàn thiện với 3 dạng thử nghiệm như sau:

Dạng bài 1: Đưa ra màn hình dòng thông báo bất kỳ

Quy trình kiểm thử: Sử dụng phương pháp Kiểm thử hàm chức năng (Kiểm thử hộp đen)

Bước 1: Biên dịch mã Pascal, thành công Lấy mã Pascal do học viên viết:

Lưu thành tệp *.pas

Thực thi biên dịch

Hiển thị kết quả biên dịch

Bước 2: Chạy kết quả chương trình, lấy dữ liệu output đầu ra

Chạy chương trình của học viên nếu biên dịch thành công và lấy kết quả của chương trình (output).

Bước 3: So sánh output với chuỗi đáp án của bài toán trong cơ sở dữ liệu

Hàm result() sẽ làm nhiệm vụ so sánh đầu ra của chương trình với đáp án của bài toán. Với bài toàn dạng 1, nhiệm vụ so sánh được thực hiện bằng câu lệnh như sau:

Nếu đầu ra chương trình của học viên đạt yêu cầu, học viên sẽ nhận được thông báo, được cộng điểm (ngay bên phải cạnh tài khoản của học viên trên thanh ở đầu trang web) và cho phép thực hành bài tiếp theo.

Dạng bài 2: Nhập một chuỗi bất kỳ, đưa ra màn hình chuỗi vừa nhập

Quy trình kiểm thử: Tôi sử dụng phương pháp phân tích cấu trúc hay còn gọi là kiểm thử hộp trắng tĩnh trong đó tôi có áp dụng biểu thức chính quy để kiểm tra mã nguồn người học viết đúng với yêu cầu, tôi thực hiện theo trình tự như sau:

Bước 1: Tìm dòng lệnh khai báo biến kiểu string

Biểu thức chính quy để phân tích dòng lệnh khai báo biến kiểu String trong mã của người học:

Biểu thức trên có nghĩa là: Tìm một chuỗi không phân biệt hoa thường, bắt đầu bằng “var”, tiếp theo một hoặc là nhiểu khoảng trắng (( ){1,}), tiếp theo là một chuỗi tên biến bao gồm các kí tự và chữ số, tên biến ít nhất nhất có độ dài là 1tiếp theo là khoảng trắng hoặc không có khoảng trắng, tiếp theo là dấu “:”, tiếp theo là có hoặc không có khoảng trắng, tiếp theo là kiểu “string”, tiếp theo là có hoặc không có khoảng trắng, kết thúc là dấu “;”

Bước 2: Lấy tên biến được khai báo

Tên biến kiểu string mà người học khai báo được lấy ra nhờ sử dụng biểu thức quy tắc và các hàm xử lý chuỗi. Tên biến lấy ra được lưu trong biến $var_name

Bước 3: Tìm dòng lệnh Readln với biến được khai báo

Hàm preg_match giúp tìm dòng mã nhập biến với tên được tìm thấy ở bước 2.

Bước 4: Tìm lệnh Writeln với tên biến được khai báo

Hàm preg_match giúp tìm dòng mã hiển thị ra dòng “Hello” với giá trị của biến được nhập ở bước 3.

Nếu học viên đạt được các kiểm tra ở Bước 2, 3, 4 thì chương trình sẽ thông báo thành công , cộng điểm bài học cho học viên và cho phép thực hành bài tiếp theo.

Dạng bài 3: Toán tử số học sử dụng một biến, câu lệnh điều kiện, vòng lặp Với dạng bài này học viên cần hiểu biết căn bản về Hàm (Function) trong Pascal để có thể tùy biến và hoàn thiện bài toán về toán tử. Học viên căn cứ vào các thông báo trong khu vực kiểm thử để xác định toán tử sẽ dùng cho bài toán này.

Khi học viên tới bài toán này, chương trình sẽ cho một đoạn mã mẫu với cấu trúc đầy đủ một Hàm trong Pascal, học viên sẽ chỉ việc hoàn chỉnh mã bên trong hàm này hoặc có thể đổi tên hàm nếu muốn.

Quy trình kiểm thử: Tôi sử dụng phương pháp kiểm thử hàm/chức năng (Kiểm thử hộp đen)

Bước 1: Lấy mã pascal của người dùng

Bước 2: Chương trình tự động hoàn chỉnh mã Pascal của học viên về dạng đầy đủ thành phần cấu trúc chương trình của một chương trình Pascal.

Cách xử lý mã của người học được thực hiện như sau:

Bước 3 : Chương trình tự động tạo ra mã lệnh mẫu, dùng để thực thi các ca kiểm thử (test-case).

Mã lệnh mẫu dùng để tạo ra các chương trình chạy kiểm thử chỉ là một cái khung, không dùng để biên dịch được. Với mỗi ca kiểm thử, biến đầu vào (input) sẽ được thay thế cho #NUM để có một chương trình Pascal hoàn chỉnh với ca kiểm thử đó. Mã lệnh mẫu này được lưu vào tệp tin riêng để sử dụng mỗi khi chạy kiểm thử.

Hàm xử lý mã lệnh người học viết được thực hiện như sau:

Bước 4: Lưu tệp tin chương trình chứa mã do học viên viết và tệp tin chứa mã lệnh mẫu có được ở Bước 3.

$check = write_src_file($filename, $code);

write_src_file($testfilename, $code2test);

Hình 3.12. Thư mục lưu bài tập của học viên.

Tệp chương trình chứa mã học viên viết có tên theo mẫu <tài khoản>_exer_<chỉ số của bài tập>.pas, tệp tin chưa mã mẫu để chạy test-case có tên theo mẫu <tài khoản>_exer_<chỉ số của bài tập>_4test.pas

Bước 5: Biên dịch chương trình Pascal hoàn chỉnh chứa mã do học viên viết

$res = shell_exec('fpc temp/'.$filename) . '';

Bước 6: Nếu biên dịch thất bại sẽ thông báo lỗi để học viên điều chỉnh mã của mình. Nếu biên dịch thành công học viên sẽ được phép thực thi kiểm thử để kiểm tra mã mình viết đã chính xác chưa.

Hàm result() sẽ thực thi việc kiểm thử:

result($exerid, $filename, $code, $output)

Với bài toán dạng 3 này hàm result() sẽ làm hai việc:

Việc 1: Lấy các ca kiểm thử (test-case)

$cases = get_testcases($exerid);

Hàm get_testcases() sẽ căn cứ vào chỉ số của bài tập để sinh ngẫu nhiên các đầu vào và tính các đầu ra kỳ vọng (expected) tùy theo bài toán. Các đầu ra kỳ vọng sẽ được lưu vào mảng và trả về cho biến $cases.

Mảng này có cấu trúc:

a. Key: đầu vào sinh ngẫu nhiên (biến x) b. Value: đầu ra kỳ vọng (expected)

Việc 2: Hàm run_tests() sẽ kiểm tra mã Pascal của người học với tham số đầu vào được tạo ra ở trên.

Hàm này có mã lệnh như sau:

Hàm run_tests() sẽ lấy kết quả của mỗi lần kiểm thử đưa vào mảng $result[$key], căn cứ vào kết quả trong mảng này hàm show_testing_result() sẽ hiển thị kết quả kiểm thử cho học viên thấy.

Trước hết hệ thống sẽ đọc tệp chứa mã Pascal để kiểm thử <tài khoản>_exer_<chỉ số bài tập>_4test.pas, sau đó duyệt các test-case để lấy đầu vào được sinh ngẫu nhiên (biến x) thay thế cho #NUM trong mã Pascal, sau đó hệ thống sẽ gọi lệnh biên dịch và thực thi nó trong hàm test_result().

Học viên căn cứ vào bảng kết quả đầu vào, đầu ra thực tế và kỳ vọng để điều chỉnh mã của mình sau đó thực hiện lại việc biên dịch và chạy kiểm thử.

Nếu tất cả các ca kiểm thử đều đạt, chương trình sẽ cộng điểm và cho phép học viên làm bài tiếp theo.

Một phần của tài liệu (LUẬN văn THẠC sĩ) xây dựng phần mềm hỗ trợ dạy và học ngôn ngữ lập trình pascal cho học sinh trung học phổ thông (Trang 41 - 50)

Tải bản đầy đủ (PDF)

(72 trang)