intTypePromotion=1
ADSENSE

Sáng kiến kinh nghiệm THPT: 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

Chia sẻ: _ _ | Ngày: | Loại File: PDF | Số trang:24

11
lượt xem
2
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Mục đích nghiên cứu sáng kiến "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" nhằm tạo ra nguồn tài liệu tham khảo cho giáo viên giảng dạy bộ môn tin học về phương pháp tạo test để kiểm thử chương trình; Góp phần nâng cao kết quả kết quả học tập và dạy học của giáo viên và học sinh; 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.

Chủ đề:
Lưu

Nội dung Text: Sáng kiến kinh nghiệm THPT: 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

  1. SỞ GD & ĐT NGHỆ AN TRƯỜNG THPT CỜ ĐỎ -----*******----- SÁNG KIẾN KINH NGHIỆM §Ò tµi: 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 Bé m«n: Tin häc Người viết: Hoàng Thanh Hà Chu Thị Quỳnh Nga Tổ chuyên môn: Toán tin Năm thực hiện: 2022 Số điện thoại: 0983 807 246 – 0373 697 113 Năm học: 2021 - 2022 Gi¸o viªn: Phan ThÞ Dung
  2. MỤC LỤC PHẦN I: ĐẶT VẤN ĐỀ ............................................................................................... 1 I. Lý do chọn đề tài ..................................................................................................... 1 II. Mục tiêu và điểm mới của đề tài ........................................................................... 1 III. Đối tượng nghiên cứu và ứng dụng ...................................................................... 1 IV. Phương pháp nghiên cứu...................................................................................... 2 V. Ý nghĩa và đóng góp của đề tài ............................................................................. 2 PHẦN II: NỘI DUNG NGHIÊN CỨU....................................................................... 3 I. Cơ sở khoa học ........................................................................................................ 3 II. Giải pháp ................................................................................................................ 3 1. Sinh mảng số nguyên ngẫu nhiên ....................................................................... 3 2. Sinh mảng tỉ lệ 1:1.............................................................................................. 5 3. Sinh mảng tỉ lệ 1:K ............................................................................................. 9 4. Sinh ngẫu nhiên theo khoảng ........................................................................... 12 5. Sinh ngẫu nhiên tăng ........................................................................................ 12 6. Sinh hoán vị ngẫu nhiên ................................................................................... 13 7. Sinh ngẫu nhiên đều ......................................................................................... 14 8. Sinh ngẫu nhiên tệp cấp số cộng ...................................................................... 16 9. Sinh ngẫu nhiên mảng đối xứng ....................................................................... 17 10. Sinh số độ cao H ............................................................................................. 18 III. Nhận xét kết quả sau khi thực hiện đề tài .......................................................... 19 1. Về năng lực làm bài.......................................................................................... 19 2. Thực nghiệm sư phạm ...................................................................................... 19 3. Đánh giá kết quả thực nghiệm sư phạm ........................................................... 19 PHẦN III. KẾT LUẬN .............................................................................................. 21 I. Về mặt lý thuyết và thực tiễn: ............................................................................... 21 II. Phạm vi áp dụng, hạn chế, hướng phát triển và kiến nghị: ................................. 21 Tài liệu tham khảo: ................................................................................................... 22 2
  3. PHẦN I: ĐẶT VẤN ĐỀ I. Lý do chọn đề tài Khi ta vừa đọc nội dung yêu cầu của một bài toán trong tin học, một thuật giải lập tức nảy sinh trong đầu; giải thuật đó thường được gọi là giải thuật tự nhiên và chúng ta bắt tay vào viết chương trình cho bài toán đó với ngôn ngữ lập trình mà chúng ta đã lựa chọn. Kết quả thu được khi chạy chương trình với những bộ dữ liệu đơn giản mà chúng ta tự suy nghĩ để test hoặc sử dụng các bộ test ví dụ. Tuy nhiên, kết quả này chỉ là tương đối là đúng hoặc sai. Để đánh giá giải thuật sử dụng đã đáp ứng yêu cầu của bài toán hay chưa hoặc là lỗi giải thuật hay kém hiệu quả theo nghĩa chương trình đòi hỏi quá nhiều bộ nhớ, chạy quá lâu hay sai kết quả thì chúng ta cần có những bộ test chuẩn đủ lớn để kiểm tra chương trình. Để góp phần vào việc đánh giá chương trình cài đặt với những bộ dữ liệu đủ lớn chúng tôi “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” đó là lý do chúng tôi chọn đề tài này. II. Mục tiêu và điểm mới của đề tài 1. Mục tiêu của đề tài - Tạo ra nguồn tài liệu tham khảo cho giáo viên giảng dạy bộ môn tin học về phương pháp tạo test để kiểm thử chương trình; - Góp phần nâng cao kết quả kết quả học tập và dạy học của giáo viên và học sinh; - 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. 2. Đ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. III. Đối tượng nghiên cứu và ứng dụng 1. Đố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ề 1
  4. 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. 2. Ứ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. IV. 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 ̣ng 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. V. Ý 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. 2
  5. PHẦN II: NỘI DUNG NGHIÊN CỨU I. Cơ sở khoa học 1. 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. 2. 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); II. 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: 1. Sinh mảng số nguyên ngẫu nhiên 1.1. 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. 3
  6. Chương trình: 1.2. 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. 4
  7. Chương trình: 1.3. 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. 2. Sinh mảng tỉ lệ 1:1 2.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ẽ 5
  8. 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: 6
  9. 2.2. 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.
  10. 8
  11. 3. Sinh mảng tỉ lệ 1:K 3.1. 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: 9
  12. 3.2. 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
  13. Chương trình: 11
  14. 4. Sinh ngẫu nhiên theo khoảng 4.1. 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
  15. Chương trình: 6. Sinh hoán vị ngẫu nhiên 6.1. 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: 13
  16. 7. Sinh ngẫu nhiên đều 7.1. 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: 14
  17. 15
  18. 8. Sinh ngẫu nhiên tệp cấp số cộng 8.1. 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: 16
  19. 9. Sinh ngẫu nhiên mảng đối xứng 9.1. 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
  20. 10. Sinh số độ cao H 10.1. 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: 18
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2