A-MỘT SỐ KINH NGHIỆM

Một phần của tài liệu Bồi dưỡng GV dạy Tin học tự chọn lớp 8 (Trang 68 - 90)

XI. HƯỚNG DẪN KIỂM TRA, ĐÁNH GIÁ 1 Mục tiờu

A-MỘT SỐ KINH NGHIỆM

I-Hướng dẫn học sinh trỡnh bày và nộp bài thi

1-Tạo thư mục chứa bài thi

- Khởi động NC

- Tạo thư mục THI trong ổ đĩa C

- Tạo trong thư mục THI một file TP.BAT, cú nội dung là đường dẫn đến TURBO.EXE. Thụng thường là C:\TP\BIN\TURBO.EXE

Việc làm này nhằm mục đớch tạo một thư mục chứa file bài làm của học sinh để học sinh trỏnh việc chộp nhầm file bài làm

Để khởi động Turbo, chỉ cần đưa con trỏ đến TP.bat và Enter. Khi tạo một file chương trỡnh, file đú sẽ nằm trong thư mục THI được tạo ra ở trờn

- Cần phải tỏch riờng thao tỏc tạo kiểu dữ liệu và khai bỏo biến - Nếu cú sử dụng kiểu dữ liệu file, phải đặt tờn file trong phần const - Nếu xuất dữ liệu ra file, kết thỳc chương trỡnh khụng được đặt readln; - Đầu chương trỡnh cần cú dẫn biờn dịch {$R+,B+}

- Cần lưu file ngay từ đầu, sau đú lưu tiếp trong quỏ trỡnh làm bài. Mục đớch là trỏnh mất chương trrỡnh khi mất điện giữa chừng

- Làm từng nào biờn dịch từng đú, nhằm dễ dàng phỏt hiện lỗi chớnh tả của chương trỡnh

3-Sao chộp bài và nộp bài

- Mở khúa đĩa mềm. Đặt đĩa vào ổ đĩa. Thực hiện sao chộp - Lấy đĩa ra và khúa đĩa. Nộp đĩa cho giỏm thị

- Chờ giỏm thị in bài

- Kiểm tra bài làm trờn giấy xem đỳng bài làm của mỡnh khụng - Ký xỏc nhận và nhờ một học sinh khỏc ký xỏc nhận

Mục đớch của việc khúa đĩa trước khi nộp bài nhằm trỏnh việc giỏm thị lỡ tay bấm phớm làm sai chương trỡnh.

Mục đớch của ký xỏc nhận nhằm khẳng định tờ giấy in bài làm là đỳng của mỡnh và trỏnh xảy ra tiờu cực giữa thớ sinh dự thi và giỏm thị cú thể đổi bài.

4-Cỏc bước để hoàn thành một chương trỡnh

Phương phỏp tổng quỏt để giải bài toỏn tin học là một hệ thống cỏc bước cú tớnh ổn định nhằm giỳp người học cú thể tỡm ra thuật giải, biễu diễn được dữ liệu và từ đú viết được chương trỡnh.

Phương phỏp tổng quỏt để giải bài toỏn tin học bao gồm cỏc bước sau:

a- Xỏc định bài toỏn

Mọi bài toỏn trong Tin học đều cú thể diễn đạt theo một sơ đồ chung A B

A: gọi là INPUT (thụng tin vào) B: gọi là OUTPUT (thụng tin ra)

: gọi là chương trỡnh được tạo từ cỏc cõu lệnh cơ bản của mỏy cho phộp biến A thành B.

Xỏc định thụng tin vào: Hai số tự nhiờn a, b

Xỏc định thụng tin ra: Số tự nhiờn d thoả món d là ước của a và d là ước của b và d là lớn nhất trong tập ước chung đú.

Xỏc định cỏc thao tỏc chế biến thụng tin:

Xõy dựng một tập hữu hạn cỏc phộp tớnh cho phộp tớnh được d từ a và b

b-Tỡm cấu trỳc dữ liệu biễu diễn bài toỏn

Việc lựa chon CTDL tuỳ thuộc vào vấn đề phải giải quyết. Sau đú là chọn cỏch biểu diễn thụng tin. Việc này tuỳ thuộc vào cỏc thao tỏc thực hiện trờn kiểu dữ liệu.

Cỏc lưu ý khi chọn cấu trỳc dữ liệu

+ CTDL phải biểu diễn được đầy đủ cỏc thụng tin nhập và xuất của bài toỏn.

+ CTDL phải phự hợp với cỏc thao tỏc của thuật toỏn mà ta lựa chọn để giải quyết bài toỏn.

+ CTDL phải phự hợp với điều kiện cho phộp của ngụn ngữ lập trỡnh mà

MTĐT đang sử dụng.

c-Tỡm thuật toỏn

Thuật toỏn là một hệ thống chặt chẽ và rừ ràng cỏc quy tắc nhằm xỏc định một dóy cỏc thao tỏc trờn một dóy cỏc đối tượng sao cho sau một hữu hạn cỏc bước thực hiện cỏc thao tỏc, ta đạt được mục tiờu định trước.

d- Lập trỡnh

Lập trỡnh là dựng một ngụn ngữ cụ thể nào đú để diễn tả thuật toỏn, cấu trỳc dữ liệu thành cỏc cõu lệnh để mỏy tớnh cú thể thực hiện được và giải quyết đỳng bài toỏn mà người lập trỡnh mong muốn.

Phỏt triển chương trỡnh bằng cỏch tinh chế từng bước: Tinh chế từng bước là phương phỏp khoa học cú hệ thống giỳp ta phõn tớch cỏc thuật toỏn, cấu trỳc dữ liệu từ đú viết thành chương trỡnh.

e-Chạy thử, thay đổi kiểm tra chương trỡnh

Chạy thử: Một chương trỡnh đó viết chưa chắc đó chạy được trờn mỏy để cho kết quả mong muốn vỡ vậy đũi hỏi phải chạy thử chương trỡnh. Kỹ năng tỡm lỗi, sửa lỗi, điều chỉnh cũng là một kỹ năng của người lập trỡnh.

Lưu ý khi xõy dựng cỏc bộ test

Nờn khởi đầu bằng cỏc bộ test nhỏ nhưng chứa cỏc giỏ trị đặc biệt Làm nhiều bộ test nhưng đa dạng.

Phải cú cỏc bộ test cú kớch thước lớn.

Vớ dụ: Khi viết chương trỡnh giải phương trỡnh ax2 + bx + c = 0. ta phải xõy dựng cỏc bộ test như sau:

a b c

0 0 0

0 0 1

1 2 1

2 5 3

Ngoài ra, cần xõy dựng bộ test cú giỏ trị lớn như: 1 32767 32766

Lưu ý: Chương trỡnh chạy qua một số bộ test chưa hẳn là chương trỡnh đỳng.

f- Thay đổi chương trỡnh

Một chương trỡnh đó viết xong, đó chạy tốt chưa hẳn là quỏ trỡnh lập trỡnh đó kết thỳc. Ta phải sửa đổi nú theo một hướng nào đú để đỏp ứng yờu cầu mới. Phương phỏp tinh chế từng bước giỳp ta thuận lợi trong việc sửa đổi chương trỡnh.

II-Chiến lược đoạt điểm

- Phải tham gia giải hết tất cả cỏc bài của đề ra mặc dự cú thể kết quả của chương trỡnh khụng đỳng. Điều này nhằm đoạt được một ớt điểm hoặc trỏnh được điểm 0. Cần chỳ ý phải biờn dịch thành cụng.

- Tỡm những trường hợp dễ để xuất kết quả

- Đối với những bài toỏn cú trả lời là YES/NO (hoặc 1/0), nếu giải khụng được thỡ nờn xuất một giỏ trị YES (hoặc 1), khi đú cú thể gở được 1/3 số điểm của cõu.

B-MỘT SỐ CHUYấN ĐỀ

I-Đỏnh dấu phần tử được chọn

1-í tưởngchung

Kỹ thuật đỏnh dấu phần tử là một trong những kỹ thuật nhằm giỳp cho người lập trỡnh tạo được những thuật toỏn đơn giản để giải quyết vấn đề đặt ra.

Để đỏnh dấu phần tử được chọn, ta khai bỏo một mảng A gồm nhiều phần tử, với A[i]=true theo nghĩa i là phần tử được chọn, A[i]=false theo nghĩa i là phần tử khụng được chọn.

2-Ứng dụng PP đỏnh dấu trong bài toỏn sắp xếp dóy số

Sắp xếp dữ liệu đúng vai trũ rất quan trọng trong xữ lý thụng tin. ý nghĩa thực tiễn của sắp xếp là nhằm dễ dàng tỡm kiếm thụng tin cần thiết.

Bài toỏn: Cho một dóy số gồm N phần tử (1<=N<=32766). Cỏc phần tử ai của dóy là cỏc số nguyờn dương, đụi một khỏc nhau (1<=ai <=32766). Hóy sắp xếp dóy số tăng dần.

Ta thường sử dụng thuật giải sắp xếp đơn giản để giải quyết bài toỏn này như sau:

For i:=1 to N-1 do For j:=i+1 to N do If a[i]<a[j] then Begin t:=a[i]; a[i]:=a[j] a[j]:=t; End;

Chương trỡnh biểu diễn của thuật toỏn:

const fi='sap1.inp'; fo='sap1.out';

type mmc=array[1..32766] of integer; var f:text; i,j,n,t:integer; a:^mmc; ti:longint; begin ti:=meml[0:$46c]; new(a); assign(f,fi);reset(f); readln(f,n);

close(f);

for i:=1 to n-1 do for j:=i+1 to n do

if a^[i]>a^[j] then begin

t:=a^[i]; a^[i]:=a^[j]; a^[j]:=t; end;

assign(f,fo);rewrite(f); writeln(f,n);

for i:=1 to n do write(f,a^[i],' '); close(f);

dispose(a);

writeln('Thoi gian thu hien ',(meml[0:$46c]- ti)/18.21:8:5);

readln; end.

Khi N bộ, thuật toỏn trờn là chấp nhận được. Tuy nhiờn, trong nhiều trường hợp N lớn, chẳng hạn N=32766 phần tử, khi đú độ phức tạp của thuật toỏn là O(N2) mỏy sẽ thực hiện trong rất nhiều thời gian mới sắp xếp được dóy số. (với N=20000, thời gian thực hiện khoảng 14 giõy)

Để giải quyết được bài toỏn này khi N lớn trong một khoảng thời gian rất nhỏ, ta sử dụng kỹ thuật đỏnh dấu phần tử.

Ta cần chỳ ý đến một giả thiết quan trọng trong bài toỏn đặt ra là “cỏc phần tử đụi một khỏc nhau”, nghĩa là trong dóy khụng cú phần tử nào trựng nhau. Đối với bài toỏn sắp xếp cú phần tử trựng nhau ta khụng thể sử dụng phương phỏp này.

Phương phỏp: Dữ liệu:

Sử dụng một mảng A gồm 32766 phần tử, cỏc phần tử cú kiểu boolean.

ý nghĩa:

A[i]=true cú nghĩa i là phần tử cú trong dóy, A[i]=false cú nghĩa i là phần tử

Thuật toỏn:

+Khởi động mọi giỏ trị của A[] là False {Giống như giả sử ban đầu mọi phần tử đều khụng thuộc dóy số}

+Đọc từng phần tử của dóy số, giả sử số thứ j của dóy là X, ta đỏnh dấu phần tử A[X]=true {Xỏc nhận số X thuộc dóy số}. Thực hiện đỏnh dấu cho đến khi đọc hết dóy số. Khi đú ta thu được một mảng A[] trong đú A[i]=true tại cỏc chỉ số i cú giỏ trị bằng giỏ trị cỏc phần tử trong dóy số.

+Duyệt từ đầu mảng đến cuối mảng, nếu vị trớ vào cú giỏ trị True thỡ ta xuất chỉ số đú ra. Kết quả ta được một dóy số được sắp xếp tăng dần

Chương trỡnh mẫu:

const fi='sap1.inp'; fo='sap2.out';

type mmcb=array[1..32766] of boolean; var f:text; n:word; b:mmcb; ti:longint; procedure doc; var i,x:word; begin fillchar(b,sizeof(b),false); assign(f,fi); reset(f); readln(f,n); for i:=1 to n do begin read(f,x); b[x]:=true; end; close(f); assign(f,fo); rewrite(f); writeln(f,n); for i:=1 to 32766 do

if b[i]=true then write(f,i,' '); end; begin ti:=meml[0:$46c]; doc; writeln('TG=',(meml[0:$46c]-ti)/18.21:8:4); readln; end. Nhận xột:

Khi N=20000 chương trỡnh thực hiện trong 0.05giõy. Chương trỡnh này chạy

nhanh gấp 280 lần so với chương trỡnh đó viết theo thuật toỏn đơn giản trờn. Rừ ràng, kỹ thuật đỏnh dấu phần tử cú ý nghĩa rất quan trọng trong việc giảm thời gian thực hiện chương trỡnh.

3-Ứng dụng PP đỏnh dấu trong bài toỏn lọc dữ liệu

Lọc dữ liệu là một vấn đề cú ý nghĩa to lớn trong xử lý thụng tin. ý nghĩa thực tiễn của lọc dữ liệu là nhằm loại bỏ cỏc dữ liệu dư thừa, khụng cần thiết, từ đú dễ dàng thu được thụng tin cần tỡm.

Bài toỏn: Cho một dóy số gồm N phần tử (1<=N<=32766), trong đú cỏc phần tử cú kiểu nguyờn nằm trong [1..32766]. Hóy trớch ra từ dóy số trờn một tập con gồm nhiều phần tử nhất sao cho cỏc phần tử đụi một khỏc nhau.

Ta thường giải quyết bài toỏn trờn theo thuật toỏn đơn giản như sau: + Dựng một mảng B[] để lưu cỏc giỏ trị tỡm được

+ Đọc từng phần tử của dóy số đó cho, giả sử số đọc được là X. Kiểm tra xem X đó cú trong B[] hay chưa.

+ Nếu chưa cú trong B[] thỡ đặt vào cuối cựng của B[]

Khi N bộ, thuật toỏn trờn cú thể chấp nhận được. Tuy nhiờn, trong nhiều trường hợp N rất lớn, chẳng hạn N=32766 phần tử, khi đú độ phức tạp của thuật toỏn là O(N2) mỏy sẽ thực hiện trong rất nhiều thời gian để lấy từng phần tử trong dóy để so sỏnh với cỏc phần tử trong tập B[].

Để giải quyết được bài toỏn này khi N lớn trong một khoảng thời gian rất nhỏ, ta sử dụng kỹ thuật đỏnh dấu phần tử.

Phương phỏp: Dữ liệu:

Sử dụng một mảng B gồm 32766 phần tử, cỏc phần tử cú kiểu boolean.

ý nghĩa:

B[i]=true cú nghĩa i là phần tử ta sẽ chọn, B[i]=false cú nghĩa i là phần tử ta khụng chọn.

Thuật toỏn:

+ Khởi động mọi giỏ trị của B[] là False {Giống như giả sử ban đầu ta chưa chọn phần tử nào cả}

+ Đọc từng phần tử của dóy số, giả sử số thứ j của dóy là X, ta đỏnh dấu phần tử B[X]=true {Xỏc nhận số X được chọn}. Thực hiện đỏnh dấu cho đến khi đọc hết dóy số. Khi đú ta thu được một mảng B[] trong đú B[i]=true tại cỏc chỉ số i mà ớt nhất i xuất hiện một lần trong dóy đó cho

+ Duyệt từ đầu mảng đến cuối mảng B[], nếu vị trớ nào cú giỏ trị True thỡ ta xuất chỉ số đú ra. Kết quả ta được một tập cỏc phần tử cần tỡm.

Chương trỡnh mẫu: const fi='tc.in1'; fo='tc.ou4'; nn=60000; var n,a:word; f:text; k:array[1..nn] of boolean; procedure doctep; var i:word; begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do begin read(f,a); k[a]:=true; end;

close(f); end; procedure xulivaxuat; var i,d:word; begin assign(f,fo); rewrite(f); d:=0; for i:=1 to nn do if k[i]=true then d:=d+1; writeln(f,d); for i:=1 to nn do

if k[i]=true then write(f,' ',i); close(f); end; BEGIN doctep; xulivaxuat; END.

Nhận xột: Chương trỡnh này chạy nhanh gấp khoảng 300 lần so với chương trỡnh đó viết theo thuật toỏn đơn giản trờn.

4-Ứng dụng PP đỏnh dấu trong bài toỏn tỡm giao của hai tập hợp

Xỏc định giao của hai tập hợp là một bài toỏn quan trọng trong toỏn học. Trong thực tiễn, phộp giao nhằm giỳp ta xỏc định được nhúm thụng tin chung nhất

của nhiều nhúm thụng tin.

Bài toỏn:

Cho 2 tệp văn bản TEP1.INP và TEP2.INP chứa N số tự nhiờn trong khoảng 1..M cú thể trựng nhau. Hóy tạo TEP3.OUT chứa cỏc số cú mặt trong cả hai tệp TEP1.INP và TEP2.INP sao cho cỏc số đụi một khỏc nhau.

DLV DLR

Dũng 1: Số N (1<=N<=32766) Dũng 2: N số ai (1<=ai<=M<=32766)

Dũng 1 chứa cỏc số tỡm được

TEP1.INP TEP2.INP TEP3.OUT 7 5 7 1 3 5 2 7 6 3 5 1 2 1 19 1 3 2 5

Ta thường giải quyết bài toỏn trờn theo thuật toỏn đơn giản như sau: + Dựng mảng A[] để lưu cỏc số trong tệp 1

+ Dựng mảng B[] để lưu cỏc số trong tệp 2

+ Lấy từng phần tử Xi trong A[], so sỏnh với lần lượt từng phần tử Yj trong B[]. Nếu Xi cú trong B[] thỡ đem Xi đặt vào mảng C[].

+ Lấy từng phần tử Yj trong B[], so sỏnh với lần lượt từng phần tử Zk trong C[]. Nếu Yj cú trong C[] thỡ đem Yj đặt vào mảng D[].

+ Xuất mảng D, ta thu được tập giao của hai tệp.

Khi N bộ, thuật toỏn trờn cú thể chấp nhận được. Tuy nhiờn, trong nhiều trường hợp N rất lớn, chẳng hạn N=32766 phần tử, khi đú độ phức tạp của thuật toỏn là O(2N2) mỏy sẽ thực hiện trong rất nhiều thời gian để lấy từng phần tử trong A[] để so sỏnh với cỏc phần tử trong B[].

Để giải quyết được bài toỏn này khi N lớn trong một khoảng thời gian rất nhỏ, ta sử dụng kỹ thuật đỏnh dấu phần tử như sau:

Phương phỏp: Dữ liệu:

Sử dụng hai mảng A và B gồm 32766 phần tử, cỏc phần tử cú kiểu boolean.

ý nghĩa:

A[i]=true cú nghĩa i là phần tử thuộc tệp 1, A[i]=false cú nghĩa i là phần tử khụng thuộc tệp 1.

B[i]=true cú nghĩa i là phần tử thuộc tệp 2, B[i]=false cú nghĩa i là phần tử khụng thuộc tệp 2.

Thuật toỏn:

+ Khởi động mọi giỏ trị của A[] và B[] là False

+ Đọc từng phần tử của tệp 1, giả sử số đọc được của dóy là X, ta đỏnh dấu phần tử A[X]=true {Xỏc nhận số X thuộc tệp 1}. Thực hiện đọc và đỏnh dấu cho đến khi đọc hết tệp 1.

Khi đú ta thu được một mảng A[] trong đú A[i]=true tại cỏc chỉ số i mà ớt nhất i xuất hiện một lần trong tệp 1.

+ Đọc từng phần tử của tệp 2, giả sử số đọc được của dóy là Y, ta đỏnh dấu phần tử B[Y]=true {Xỏc nhận số Y thuộc tệp 2}. Thực hiện đọc và đỏnh dấu cho đến khi đọc hết tệp 2.

Khi đú ta thu được một mảng B[] trong đú B[i]=true tại cỏc chỉ số i mà ớt nhất i xuất hiện một lần trong tệp 2.

+ Duyệt từ đầu mảng đến cuối mảng A[] B[], nếu tại vị trớ nào mà A[i] và B[i] cú giỏ trị True thỡ ta xuất chỉ số đú ra. Kết quả ta được một tập cỏc phần tử cần tỡm.

Chương trỡnh mẫu:

const f1='tep1.inp'; f2='tep2.inp'; f3='tep3.out';

type mmc=array[1..32767] of boolean; var n,i,j,a:longint; k:mmc; f,fi:text; procedure doctep; begin assign(f,f1); reset(f); readln(f,n); for i:=1 to n do begin read(f,a); k[a]:=true; end; close(f); end; procedure xulivaxuat; begin assign(fi,f3); rewrite(fi); assign(f,f2); reset(f);

readln(f,n); for i:=1 to n do begin read(f,a); if k[a]=true then begin write(fi,' ',a); k[a]:=false; end; end; close(f); close(fi); end; BEGIN doctep; xulivaxuat; end.

Nhận xột: Chương trỡnh này chạy nhanh gấp 400 lần so với chương trỡnh đó viết theo thuật toỏn đơn giản trờn.

II-Số nguyờn tố

1-Khỏi niệm về số nguyờn tố

Để đơn giản và dễ nhớ, ta cú thể hiểu: Số nguyờn tố là số tự nhiờn lớn hơn 1 và chỉ cú hai ước số là 1 và chớnh nú.

Chẳng hạn: Số 5 là số nguyờn tố. Số 9 khụng phải là số nguyờn tố

2-Một số bài toỏn liờn quan đến số nguyờn tố

Bài 1: Viết chương trỡnh nhập một số nguyờn dương X

Một phần của tài liệu Bồi dưỡng GV dạy Tin học tự chọn lớp 8 (Trang 68 - 90)