SKKN Sử dụng phương pháp sinh test để kiểm thử chương trình lập trình, trong dạy học và bồi dưỡng học sinh THPT

Cơ sở lý luận

Để kiểm tra tính đúng đắn của thuật toán, chương trình và cũng như các kỹ thuật trong lập trình thì chúng ta cần phải có các bộ test đủ lớn, rồi thông qua các phần mềm chấm bài tự động như “Chương trình chấm bài tự động Themis” của TS Lê Minh Hoàng để đánh giá, chấm điểm.

Việc kiểm tra đánh giá được chương trình mình viết đã đạt đến mức độ nào về mặt tối ưu về thuật toán, cần kiểm thử chương trình bằng bộ test đủ lớn mang tính ngẫu nhiên mà vẫn đảm bảo độ chính xác cao.

Cơ sở thực tiễn (thực trạng)

Trong thực tế trên mạng internet đã có một số phần mềm tiện ích miễn phí để sinh test tự động như “Tiện ích sinh test tự động cho phần mềm chấm điểm tự động Themis” của thầy giáo Nguyễn Tô Sơn. Tuy nhiên theo bản thân tôi tìm hiểu để sử dụng phần mềm tiện ích này chúng ta cần phải có code chuẩn. Từ thực trạng này tôi đưa ra giải pháp tạo ra những bộ test đủ lớn mang tính ngẫu nhiên mà khi chưa có hoặc không cần chương trình mẫu (code chuẩn);

 

docx 24 trang Nhật Nam 03/10/2024 320
Bạn đang xem 20 trang mẫu của tài liệu "SKKN Sử dụng phương pháp sinh test để kiểm thử chương trình lập trình, trong dạy học và bồi dưỡng học sinh THPT", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: SKKN Sử dụng phương pháp sinh test để kiểm thử chương trình lập trình, trong dạy học và bồi dưỡng học sinh THPT

SKKN Sử dụng phương pháp sinh test để kiểm thử chương trình lập trình, trong dạy học và bồi dưỡng học sinh THPT
hấn trong lập trình, tìm ra được giải thuật tối ưu, đáp ứng yêu cầu bài toán.
Điểm mới của đề tài
Khác với một số phần mềm miễn phí có trên mạng internet hiện nay như “Tiện ích sinh test tự động cho phần mềm chấm điểm tự động Themis ” của thầy giáo Nguyễn Tô Sơn là khi muốn tạo test cần phải có code chuẩn. Còn đề tài của tôi đưa ra là chưa có code chuẩn.
- Tạo ra những bộ test đủ lớn mang tính ngẫu nhiên mà khi chưa có hoặc không cần chương trình mẫu (code chuẩn); qua đó giúp giáo viên, học sinh tự đánh giá các chương trình mình viết, tạo hưng phấn trong lập trình, tìm ra được giải thuật tối ưu, đáp ứng yêu cầu bài toán.
Đối tượng nghiên cứu và ứng dụng
Đối tượng nghiên cứu
Giáo viên giảng dạy môn Tin học, học sinh muốn nâng cao kỹ năng về
chuyên đề lập trình;
Học sinh được tuyển chọn chuẩn bị cho kỳ thi học sinh giỏi và tham gia các kỳ thi cao hơn.
Ứng dụng
Tạo test cho các bải toán lập trình khi chưa có bộ test và chương trình nguồn chuẩn để tạo test;
Tạo bộ test cho phần mềm chấm bài tự động Themis qua đó chỉnh sửa chương trình, đánh giá thuật toán.
Phương pháp nghiên cứu
Nghiên cứu lý luận và thực nghiệm;
Nghiên cứ u các daṇ g bài toán trong quá trình dạy học và bồi dưỡng về lập trình;
Tự đánh giá thuật toán và kỹ thuật lập trình.
Ý nghĩa và đóng góp của đề tài
Tạo test để đánh giá code khi chưa có code chuẩn để sinh test;
Phát triển tư duy lập trình;
Tối ưu trong cài đặt thuật toán;
Căn cứ để đánh giá, lựa chọn thuật toán.
PHẦN II: NỘI DUNG NGHIÊN CỨU
Cơ sở khoa học
Cơ sở lý luận
Để kiểm tra tính đúng đắn của thuật toán, chương trình và cũng như các kỹ thuật trong lập trình thì chúng ta cần phải có các bộ test đủ lớn, rồi thông qua các phần mềm chấm bài tự động như “Chương trình chấm bài tự động Themis” của TS Lê Minh Hoàng để đánh giá, chấm điểm.
Việc kiểm tra đánh giá được chương trình mình viết đã đạt đến mức độ nào về mặt tối ưu về thuật toán, cần kiểm thử chương trình bằng bộ test đủ lớn mang tính ngẫu nhiên mà vẫn đảm bảo độ chính xác cao.
Cơ sở thực tiễn (thực trạng)
Trong thực tế trên mạng internet đã có một số phần mềm tiện ích miễn phí để sinh test tự động như “Tiện ích sinh test tự động cho phần mềm chấm điểm tự động Themis” của thầy giáo Nguyễn Tô Sơn. Tuy nhiên theo bản thân tôi tìm hiểu để sử dụng phần mềm tiện ích này chúng ta cần phải có code chuẩn. Từ thực trạng này tôi đưa ra giải pháp tạo ra những bộ test đủ lớn mang tính ngẫu nhiên mà khi chưa có hoặc không cần chương trình mẫu (code chuẩn);
Giải pháp
Nội dung chính của sáng kiến trình bày 10 phương pháp sinh ngẫu nhiên và ứng dụng tạo test cho một số bài toán cụ thể từ mức độ đơn giản đến phức tạp hơn như sau:
Sinh mảng số nguyên ngẫu nhiên
Bài toán:
Sinh ngẫu nhiên N số nguyên dương cho mảng A.
Ý tưởng thuật toán:
Tạo mảng gồm N số nguyên dương, trong Pascal hàm random(k) sinh một số kiểu nguyên nằm trong đoạn từ 0 đến k-1.
Chương trình:
Ví dụ ứng dụng tạo test cho bài toán đếm các số nguyên dương:
Cho dãy gồm M (M>=N) số nguyên a1, a2, a3, ,aM. Hãy viết chương trình đếm các số nguyên dương có trong dãy trên.
Nhiệm vụ:
Sử dụng chương trình tạo ra file input trên có M số nguyên có giá trị trong phạm vi [-x;x] trong đó có N số nguyên dương trong đoạn [1;x] và N-M số không phải là số nguyên dương phạm vi [-x;0] và file output chính là N. Hay nói cách khác ta tạo một bộ test mà file Test1.input gồm M số nguyên a1, a2, a3, ,aM và file Test1.output chứa số nguyên dương N.
Chương trình:
Ví dụ ứng dụng tạo test cho bài toán chia hết
Cho dãy gồm N số nguyên dương a1, a2, a3, ,aN. Hãy lấy ra K số liên tiếp để tổng của chúng chia hết cho N với K lớn nhất.
Sinh mảng tỉ lệ 1:1
Bài toán:
Tạo dãy số nguyên a1, a2, a3, ,aN. (N>1) có tổng các phần tử trong hai đoạn bằng nhau.
Ý tưởng thuật toán:
Để tạo mảng a thành hai đoạn a[1..d] và a[d+1..N] có tổng bằng nhau, ta phải có tổng t=sum(a[1..N]) là số chẵn và tồn tại d mà tổng sum(a[1..d]=t div 2.
Chọn ngẫu nhiên một điểm cắt d trong khoảng 1..n-1 tức là random(n-2)+1.
Tiếp theo ta tạo giá trị ngẫu nhiên trong phạm vi từ (-M+1) đến (M-1) cho d phần tử đầu cho mảng a[1..d] ta sử dụng a[i]:=random(M)-Random(M), khi đó sẽ
có tổng t=sum(a[1..d]).
Ta tạo giá trị ngẫu nhiên trong phạm vi từ (0..t) cho (N-d-1) phần tử ở gần cuối cho mảng a[d+1..N-1] ta sử dụng a[i]:=random(t) và t:=t-a[i], cuối cùng a[N]:=t. Trong trường hợp vô nghiệm a[N] cũng được khởi tạo ngẫu nhiên.
Chương trình:
Ví dụ ứng dụng tạo test cho bài toán đưa ra chỉ số i chia hai đoạn có tổng bằng nhau
Bài toán cho dãy gồm N số nguyên không âm a1, a2, a3, ,aN. Đưa ra chỉ số i mà tổng các phần tử trong hai đoạn a[1..i] và a[i+1..N] có tổng bằng nhau.
Dữ liệu vào: Đọc vào từ file DAY.INP:
Dòng đầu ghi N.
Dòng tiếp theo ghi các số a1, a2, a3, ,aN. Kết quả: Ghi ra file văn bản DAY.OUT ghi số i. Giới hạn: N và các ai.<=32767
Ví dụ:
DAY.INP

DAY.OUT
5
1 2 2 1 4

3
Nhiệm vụ: Tạo bộ test input và output Test.inp gồm 2 dòng:
Dòng đầu ghi N.
Dòng tiếp theo ghi các số a1, a2, a3, ,aN. Test.out: ghi số i.
Chương trình:
Sinh mảng tỉ lệ 1:K
Bài toán:
Tạo dãy số nguyên không âm a1, a2, a3, ,aN. (N>1) có tổng các phần tử trong một đoạn gấp K lần tổng các phần tử trong đoạn kia, K nguyên dương.
Ý tưởng thuật toán:
Để tạo mảng a thành hai đoạn a[1..d] và a[d+1..N] có tổng sum(a[1..d])
=k*sum(a[d+1..N) hoặc sum(a[d+1..N)=k*sum(a[1..d]) (nghĩa là đoạn đầu bằng k đoạn cuối hoặc đoạn cuối bằng k đoạn đầu) và ta chọn ngẫu nhiên một điểm cắt d trong khoảng 1..n-1 tức là random(n-2)+1.
Tiếp theo ta tạo giá trị ngẫu nhiên trong phạm vi từ (-M+1) đến (M-1) cho d phần tử đầu cho mảng a[1..d] ta sử dụng a[i]:=random(M)-Random(M), khi đó sẽ có tổng t=sum(a[1..d]).
Chọn đoạn đầu bằng k đoạn cuối hoặc đoạn cuối bằng k đoạn đầu (có thể chọn ngẫu nhiên random(2)=0 hoặc =1, tương ứng a[d]:=a[d]+(k-1)*t hoặc t:=t*k)
Ta tạo giá trị ngẫu nhiên trong phạm vi từ (0..t-1) cho (N-d-1) phần tử ở gần cuối cho mảng a[d+1..N-1] ta sử dụng a[i]:=random(t) và t:=t-a[i], cuối cùng a[N]:=t. Trong trường hợp vô nghiệm a[N] cũng được khởi tạo ngẫu nhiên.
Chương trình:
Ví dụ ứng dụng tạo test cho bài toán:
Cho dãy số nguyên không âm a1, a2, a3, ,aN (N>1). Hãy đưa ra chỉ số i mà tổng các phần tử trong đoạn a[1..i] gấp K lần tổng các phần tử trong đoạn a[i+1..N].
Dữ liệu vào: Đọc vào từ file DAY.INP:
Dòng đầu ghi N và K
Dòng tiếp theo ghi các số a1, a2, a3, ,aN. Kết quả: Ghi ra file văn bản DAY.OUT ghi số i. Giới hạn: N và các ai<=32767
Ví dụ:
DAY.INP

DAY.OUT
6 3
13 11 1 4 2 1

2
Nhiệm vụ: Tạo bộ test input và output Test.inp gồm 2 dòng:
Dòng đầu ghi N và K.
Dòng tiếp theo ghi các số a1, a2, a3, ,aN. Test.out: ghi số i.
Chương trình:
Sinh ngẫu nhiên theo khoảng
Bài toán:
Sinh ngẫu nhiên cho mảng nguyên a, n phần tử trong khoảng (-M..M)
Ý tưởng thuật toán:
Ta xây dựng thủ tục Sinh(N,x,y) sinh ngẫu nhiên N số nguyên trong khoảng x đến y (x<y).
Chương trình:
Sinh ngẫu nhiên tăng
Bài toán:
Sinh ngẫu nhiên n phần tử được sắp xếp không giảm cho mảng nguyên a.
Ý tưởng thuật toán:
Khởi tạo phần tử đầu tiên a[1]:=random(n);
Phần tử thứ hai trở đi, có giá trị bằng phần tử đứng trước cộng thêm một phần tử ngẫu nhiên, tức là a[i]:=a[i-1] +random(n),trong đó i=2..n
Chương trình:
Sinh hoán vị ngẫu nhiên
Bài toán:
Sinh ngẫu nhiên cho mảng nguyên a một hoán vị của 1..n.
Ý tưởng thuật toán:
Xuất phát từ hoán vị đơn vị a=(1,2,,n) ta đổi chỗ a[1] với một phần tủ tùy ý (được chọn ngẫu nhiên) a[j] sẽ được một hoán vị. Ta có thể thực hiện việc đổi chỗ nhiều lần.
Chương trình:
Sinh ngẫu nhiên đều
Bài toán:
Sinh ngẫu nhiên N phần tử cho mảng nguyên A thỏa mãn điều kiện N phần tử tạo thành K đoạn liên tiếp có tổng các phần tử trong mỗi đoạn bằng nhau và bằng giá trị T cho trước.
Ý tưởng thuật toán:
Số lượng phần tử trong mỗi đoạn pt=random(N div K)+1, tức là số lượng phần tử trong mỗi đoạn không nhất thiết bằng nhau.
Chương trình:
Sinh ngẫu nhiên tệp cấp số cộng
Bài toán:
Sinh ngẫu nhiên một dãy số cấp số cộng gồm N số hạng.
Ý tưởng thuật toán:
Sinh ngẫu nhiên phần tử thứ nhất a[1] công sai d
Sinh các phần tử thứ a[i], i=2..N (For i:=2 to n do a[i]:=a[i-1]+d)
Chương trình:
Sinh ngẫu nhiên mảng đối xứng
Bài toán:
Sinh ngẫu nhiên các giá trị để ghi vào mảng hai chiều a[1..n,1..n] sao cho các phần tử đối xứng nhau qua đường chéo chính, tức là: a[i,j]=a[j,i], 1<=i,j<=N.
Ý tưởng thuật toán:
Sinh ngẫu nhiên phần tử trên đường chéo chính a[I,i], với i=1..n
Sinh các phần tử a[i,j]=a[j,i] với i,j=1..n
Chương trình:
Sinh số độ cao H
Bài toán:
Độ cao của một số tự nhiên là tổng giá trị các chữ số của số đó. Sinh toàn bộ các số tự nhiên có tối đa ba chữ số và độ cao H cho trước.
Chương trình:
Chú ý:
Bài toán trên có thể giải bằng phương pháp vét cạn dùng 3 vòng lặp for.
Phương pháp vét cạn đòi hỏi 10*10*10 lần duyệt trong khi H=10 chỉ có 63 số thỏa mãn điều kiện. Dùng phương pháp sinh ta nhận được đúng 63 số cần tìm, không phải duyệt thừa số nào.
Ví dụ ứng dụng tạo test cho bài toán:
Liệt kê các số có độ cao H
Đếm các số khác nhau có độ cao H cho trước.
III. Nhận xét kết quả sau khi thực hiện đề tài
Về năng lực làm bài
Trong quá trình ôn luyện học sinh tự đánh giá được chương trình mình viết trước khi gửi bài cho giáo viên kiểm tra, chấm điểm.
Học sinh đưa ra được nhiều cách để cải tiến thuật toán của mình hơn, để chương trình của mình có thể đạt được điểm cao hơn. Từ đó học sinh có suy nghĩ thấu đáo, đa chiều, khắc sâu về bài toán mình đã giải.
Thực nghiệm sư phạm
Chúng tôi đã tiến hành thực nghiệm trên hai đối tượng học sinh có trình độ tương đương của hai năm học khác nhau trong quá trình bồi dưỡng học sinh giỏi.
Điểm chung của học sinh thực nghiệm và học sinh đối chứng:
Có trình độ tương đương
Được học kiến thức cơ bản để bước vào giai đoạn luyện đề
Đánh giá kết quả thực nghiệm sư phạm
Học sinh thực nghiệm
(Đối tượng đã được học cách tạo test)
Học sinh đối chứng
(Đối tượng chưa được học cách tạo test)
- Khả năng đọc hiểu đề tốt hơn, bởi các em đã lấy được 

File đính kèm:

  • docxskkn_su_dung_phuong_phap_sinh_test_de_kiem_thu_chuong_trinh.docx
  • pdfHoang Thanh Ha_Chu Thi Quynh Nga_Truong THPT Co Do_Tin hoc.pdf