Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
203 KB
Nội dung
MỤC LỤC Mở đầu………………………………………………………………………….1 1.1 Lý chọn đề tài………………………………………………………… 1.2 Mục đich nghiên cứu……………………………………………………….1 1.3 Đối tượng nghiên cứu………………………………………………………1 1.4 Phương pháp nghiên cứu………………………………………………… Nội dung sáng kiến kinh nghiệm…………………………………………….2 2.1 Cơ sở lí luận sáng kiến kinh nghiệm………………………………… 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm…………… 2.3 Cácgiải pháp sử dụng để giải vấn đề……………… 2.3.1 Cung cấp lý thuyết chuyên đề dãyliên tiếp… …………… 2.3.2 Viết chương trình cho tập bản…… .4 2.3.3 Làm tập thực tế để vận dụng, cải tiến, hiệu chỉnh nâng cấp chương trình ……………………………………………………………………8 2.3.4 Giao tập nhà………………………………………………… 18 2.4 Hiệu sáng kiến kinh nghiệm hoạt động giáo dục, với thân, đồng nghiệp nhà trường………………………………………………… 19 Kết luận, kiến nghị .20 Mở đầu 1.1 Lý chọn đề tài Trong chương trình Tin học lớp 11, nội dung kiến thức mảng chiều trang bị cho họcsinh bao gồm tiết lí thuyết tiêt tập tiết thực hành Vì vậy, lượng kiến thức thời lượng đó chưa đủ để họcsinh vận dụng vào giải tập liên quan đến dãyliêntiếp biểu diễn dãy mảng chiều Rènluyện tư , kỹ tác phong lập trình có vai trò đặc biệt bỗi dưỡng họcsinh giỏi môn tin học trường phổ thông Hiệu việc rènluyện tư duy, kỹ tác phong lập trình động lực giúp họcsinh nắm vững kiến thức, phát triển tư duy, hình thành kỹkỹ xảo T có khả thích ứng đứng trước vấn đề cần giảiHọcsinh thấy thuật toán trình suy luận, tư họcsinh mà phương pháp tìm thuật toán không phụ thuộc vào đặc điểm toán mà phụ thuộc tố chất tâm lý thân người xây dựng thuật toán Thực tế cho thấy có họcsinh có tố chất tốt, xong không nắm vững khái niệm dãy mà đề đưa cách thức để bước đầu xử lí toán không giảitoán Nhưng có họcsinh có tố chất khá, xong nắm vững khái niệm quy luật dãy con, thêm vào niềm đam mê môn học em hoàn toàn đạt hiệu cao giảitoánliên quan đến dãyliêntiếp Vì lí nên chọn đề tài: “Hướng dẫnhọcsinhrènluyệnkỹgiảitoándãyliên tiếp” để nghiên cứu 1.2 Mục đích nghiên cứu Nghiên cứu số vấn đề lý thuyết thực tiễn việc rènluyện cho họcsinhkỹgiảitoándãyliêntiếp nhằm bồi dưỡng lực kỹ lập trình, góp phần nâng cao chất lượng bồi dưỡng họcsinh giỏi môn Tin học trường phổ thông Hoằng Hóa 1.3 Đối tượng nghiên cứu Đối tượng nghiên cứu: kỹgiảitoándãyliêntiếp môn tin học 11 họcsinh THPT Khách thể nghiên cứu: Họcsinh thuộc đội tuyển họcsinh giỏi môn Tin học trường THPT Hoằng Hóa 1.4 Phương pháp nghiên cứu - Phương pháp nghiên cứu lý luận: Nghiên cứu tài liệu, sách báo - Phương pháp điều tra thực tiễn: Quan sát việc họchọcsinh trình khai thác tập sách giáo khoa, sách tập đề thi họcsinh giỏi - Phương pháp thực nghiệm sư phạm Trang 2 Nội dung sáng kiến kinh nghiệm 2.1 Cơ sở lí luận sáng kiến kinh nghiệm - Cơ sở tâm lý học: + Đặc điểm nhận thức họcsinh môn Tin học: Đối với khối THPT, phần lớn họcsinh coi môn Tin học môn học phụ, không quan tâm cho lắm, có vài họcsinh có hứng thú với môn Tin học Từ số lượng ỏi có hội để người giáo viên tìm họcsinh cho đội tuyển họcsinh giỏi + Tư học sinh: Thông thường họcsinh có kỹ lập trình khá, giỏi em có kiến thức Toánhọc khá, giỏi, xong điều ngược lại chưa hẳn, lý đơn giản khả vận dụng kiến thức vào để giải vấn đề giảitoán Tin học Chẳng hạn, họcgiải tập môn toán em học theo dạng 1, dạng 2… tin họctoán kết hợp nhiều toán khác Ở em họcsinh khối THPT môn lập trình Pascal em bước làm quen không trọng nên khả tư hạn chế nên việc phân tích để hiểu chất vấn đề khó 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm - Thực trạng công tác bồi dưỡng họcsinh giỏi môn Tin học Thực tế đa số họcsinh lúng túng phương pháp cho loại toán sách giáo khoa hay sách tập nhiều tập loại lại có đề thi họcsinh giỏi năm gần khiến cho họcsinh bối rối phương pháp Một số họcsinh tham khảo số code toánliên quan đến dãy mạng họcsinh khó hiểu dẫn đến có thói quen lập trình thụ động, không tự nhiên Điều làm giảm hứng thú với môn học Qua năm gần bồi dưỡng họcsinh giỏi môn Tin học nhận thấy mảng kiến thức dãyliêntiếp loại tập thú vị Do lựa chọn đề tài để nghiên cứu trình bày Bởi việc giúp em tìm cách giải cho loại tập giúp em tốt trình họcrènluyệnkỹ lập trình - Những thuận lợi khó khăn: + Thuận lợi: - Công tác bồi dưỡng họcsinh giỏi môn Tin học nhà trường quan tâm đạo sát đặc biệt có phần thưởng có tính khích lệ giáo viên họcsinh trước + Khó khăn: - Môn tin học có hội chọn họcsinh tốt - Phụ huynh họcsinh không thích cho em vào đội tuyển mon Tin học sợ ảnh hưởng đến việc học ôn thi Đại học 2.3 Cácgiải pháp sử dụng để giải vấn đề Trang 2.3.1 Cung cấp lý thuyết chuyên đề dãyliêntiếp - Đưa khái niệm dãy con: Dãydãy phần tử liên tục thuộc dãy cho trước thỏa mãn tính chất (ở ta cần hướngdẫn cho họcsinhdãy ta xét lưu dạng mảng chiều) Tuy nhiên cần lưu ý với họcsinh cần phải đọc kỹ đề đề yêu cầu xác định dãy đề đưa yêu cầu đưa dãyliên thứ tự xuất (tức không liền kề nnhau) - Để quản lý dãy ta cần: số đầu(chỉ nơi bắt đầu dãy con) độ dài dãy số đầu số cuối (chỉ nơi kết thúc dãy con) - Dãy có 1, 2, … N phần tử (tuỳ vào định nghĩa dãy yêu cầu đề bài) Nếu dãy mẹ có N phần tử ta có 2n dãy - Để duyệt qua tất dãydãy gồm n số ta dùng thuật toán vét cạn gồm vòng For sau: For i:=1 to N {1} For j:=1 to N-i+1 {2} For k:=j to i+j-1 {3} (xử lý dãy vị trí j đến vị trí i+j-1); {4} Giải thích: {1} Vòng for 1: Cho biết độ dài dãy có i phần tử; {2} Vòng for 2: Cho biết dãy vị trí j, vị trí bắt đầu dãy cuối có độ dài i n-i+1; {3} Vòng for 3: Dùng để duyệt qua phần tử dãy vị trí đầu j đến vị trí cuối i+j-1 để xử lý {4} Các thao tác xử lý là: Tính tổng dãy con; Kiểm tra tính tăng, giảm; Kiểm tra tính đối xứng; … * Nếu dãy xét cần lưu lại thì: Lưu lại độ dài, số đầu dãy Xác định lại độ dài, số đầu dãy * Nếu dãy xét không cần lưu thì: Xác định lại độ dài, số đầu dãy Khi dạy chuyên đề ta rènluyện thêm cho họcsinh cách viết sử dụng chương trình con, để chương trình tham gia vào nhiệm vụ xử lý phần xử lý {4}, ví dụ chương trình kiểm tra tính đối xứng đoạn từ j đến j+i-1, chương trình kiểm tra tính tăng, giảm đoạn con, chương trình kiểm tra xem đoạn có lập thành cấp số cộng hay không, … Trang 2.3.2 Viết chương trình cho tập Ở đưa loại tập để họcsinh hiểu cách áp dụng lý thuyết dãy cung cấp phần trên, với tập giáo viên chưa cần thiết đòi hỏi chương trình họcsinh làm phải chạy test mà cần giải vài trường hợp test nhỏ Nhưng yêu cầu đặt với họcsinh phải làm thành thạo toán có đủ kiến thức kỹ để xử lý dãy khác cách tốt Bài Cho dãy A gồm N số nguyên Viết chương trình in dãyliêntiếp gồm phần tử, phần tử, gồm N phần tử dãy cho (dãy liêntiếpdãy gồm số phần tử liêntiếpdãy cho gồm nhiều phần tử, thân dãy cho dãy có số phần tử nó) VD: N=6 Dãy A: In ra: Dc1: Dc2: Dc3: Dc4: Dc5: Dc6: Dc7: Dc8: Dc9 Dc10 Dc11 Dc12 Dc13 Dc14 Dc15 Dc16 Dc17 Dc18 Dc19 Dc20 Dc21 Với tập họcsinh cần vận dụng lý thuyết cung cấp để giải quyết, mục đích tập để họcsinh đưa thấy hình ảnh cụ thể dãydãy số cho trước Chương trình tham khảo sau: Trang CONST NMAX=100; VAR A: ARRAY[1 NMAX] OF INTEGER; N,I,J,T: INTEGER; BEGIN WRITELN('NHAP N= '); READLN(N); FOR I:=1 TO N DO BEGIN WRITE('NHAP PHAN TU THU ',I); READLN(A[I]); END; FOR I:=1 TO N DO FOR J:=1 TO N-I+1 DO {DUET CACDAYCON CO DO DAI I BAT DAU TU J} BEGIN FOR T:= J TO J+I-1 DO WRITE(A[T],' '); WRITELN; END; READLN; END Bài Cho dãy A gồm N số nguyên Viết chương trình in dãyliêntiếp gồm phần tử, phần tử, gồm N phần tử dãy cho (dãy liêntiếpdãy gồm số phần tử liêntiếpdãy cho gồm nhiều phần tử, thân dãy cho dãy có số phần tử nó) VD: N=6 Dãy A: In ra: Dc1: Dc2: Dc3: Dc4: Dc5: Dc6: Dc7: Dc8: Dc9 Dc10 Dc11 Dc12 Trang Dc13 Dc14 Dc15 Dc16 Dc17 Dc18 Dc19 Dc20 Dc21 Mục đích tập rènluyện thêm kỹ chuyển đổi câu lệnh For tiến For lùiviệc làm có lợi giáo viên đưa yêu cầu tìm dãy ngắn dài thỏa mãn điều kiện đó, họcsinh biết nên chọn câu lệnh for để tìm thấy dãy thoát không cần tìm tiếp Chương trình tham khảo sau: CONST NMAX=100; VAR A: ARRAY[1 NMAX] OF INTEGER; N,I,J,T: INTEGER; BEGIN WRITELN('NHAP N= '); READLN(N); FOR I:=1 TO N DO BEGIN WRITE('NHAP PHAN TU THU ',I); READLN(A[I]); END; FOR I:=N DOWNTO DO FOR J:=1 TO N-I+1 DO BEGIN FOR T:= J TO J+I-1 DO WRITE(A[T],' '); WRITELN; END; READLN; END Bài Cho dãy A gồm N số nguyên Viết chương trình in dãyliêntiếpdãy cho (dãy liêntiếpdãy gồm số phần tử liêntiếpdãy cho gồm nhiều phần tử, thân dãy cho dãy có số phần tử nó) VD: N=6 Trang Dãy A: 10 In ra: Dc1: 10 Dc2: 10 Dc3: 10 Dc4: 10 Dc5: 10 Dc6: 10 Với tập ta tập cho họcsinh thói quen đọc kỹ đề xem xét kỹ output toán để từ đưa điều chỉnh cách duyệt để tìm output, đề yêu cầu đưa dãy khác dãy có độ dài từ đến N đưa lần dãy phần tử thứ dãy Từ tự phân tích cách làm, họcsinh lúng túng giáo viên hướngdẫnhọcsinh để đưa nhận xét sau: - Có N lần duyệt, ta dùng biến i biến duyệt số lần, với i chạy từ đến N - Với lần duyệt i, ta in dãy từ đến N-i+1 Vậy cần có vòng for đủ để in dãy này, so với thuật toán vét cạn giới thiệu phần lý thuyết ta bỏ bớt vòng lặp thứ Chương trình tham khảo sau: CONST NMAX=100; VAR A: ARRAY[1 NMAX] OF INTEGER; N,I,J,T: INTEGER; BEGIN WRITELN('NHAP N= '); READLN(N); FOR I:=1 TO N DO BEGIN WRITE('NHAP PHAN TU THU ',I); READLN(A[I]); END; FOR I:=1 TO N DO BEGIN FOR J:=1 TO N-I+1 DO WRITE(A[J],' '); WRITELN; END; READLN; END Trang Tương tự giáo viên thay đổi cách in dãy để họcsinhrènluyện thêm kỹ năng, chẳng hạn thay đổi thành toán sau đây: Bài Cho dãy A gồm N số nguyên Viết chương trình in dãyliêntiếpdãy cho (dãy liêntiếpdãy gồm số phần tử liêntiếpdãy cho gồm nhiều phần tử, thân dãy cho dãy có số phần tử nó) VD: N=6 ;Dãy A: 10 In ra: Dc1: 10 Dc2: 10 Dc3: 10 Dc4: 10 Dc5: 10 Dc6: 10 Với họcsinh tự sửa lại chương trình tâp xong 2.3.3 Làm tập thực tế để vận dụng, cải tiến, hiệu chỉnh nâng cấp chương trình Đối với phần làm tập giáo viên đưa mức độ để họcsinhrènluyệnnâng cao kỹ lập trình: Mức độ 1: Yêu cầu họcsinh cải tiến chương trình viết Ở mức độ giáo viên nên yêu cầu họcsinh bám sát vào đặc điểm liệu, kiện mà đê yêu cầu, nhiên giáo viên chưa đặt yêu cầu phải chạy nhiều test Chỉ cần chạy đến test Mức độ 2: Hướngdẫnhọcsinh sử dụng kỹ thuật lập trình khác để nâng cấp chương trình chạy nhanh (nhiều test hơn) Ở mức độ dựa vào vào đặc điểm liệu, kiện mà đê yêu cầu, giáo viên hướngdẫn thêm họcsinhkỹ thuật khác để giúp họcsinhnâng cấp chương trình chưa phải chạy hết test Chẳng hạn kỹ thuật dùng biến định vị (lính canh), kỹ thuật trượt cửa sổ, kỹ thuật đặ cờ hiệu… Mức độ 3: Tùy vào lực tiếp thu họcsinh giáo viên hướngdẫnhọcsinh sử dụng kỹ thuật lập trình khác để xử lý test lớn toán Chẳng hạn quy hoạch động… Dưới số tập sử dụng để rènluyệnkỹ cho học sinh: Bài tập 1: Cho mảng số nguyên gồm n phần tử Tìm dãy gồm m phần tử (m≤ n ≤ 1000) cho dãy có tổng lớn (Dãy dãy phần tử liêntiếp mảng) Ví dụ: nhập vào từ bàn phím N=6 -3 -5 Trang M=4 In hình: -5 Khi làm tập này, dựa vào lý thuyết họcsinh cung cấp thuật toán vét cạn: For i:=1 to N {1} For j:=1 to N-i+1 {2} For k:=j to i+j-1 {3} (xử lý dãy vị trí j đến vị trí i+j-1); {4} họcsinh có nhận xét sau: - Vì số phần tử dãy m nên ta bỏ vòng lặp mà thay i vòng lặp m Mỗi lần xử lý dãy ta tính tổng dãy so sánh để tìm tổng lớn đồng thời lưu lại vị trí j dãy - Khi cần sử dụng vòng lặp For j:=1 to N-m+1 For k:=j to m+j-1 (xử lý dãy vị trí j đến vị trí i+j-1); Khi họcsinh viết chương trình sau: Type M1C=ARRAY[1 1000] Of Integer; Var A:M1C; n,m,i,j,k,vt:integer; S,Max:longint; Begin Write('Nhap so phan tu cua mang: n= '); Readln(n); For i:=1 To n Do Begin Write('a[',i,']='); Readln(a[i]); End; Write('Nhap so phan tu cua day con: m= '); Readln(m); Max:=0; vt:=1; For j:=1 To n-m+1 Do Begin {Tính tổng dãy thứ j} S:=0; For k:=j To j+m-1 Do S:=S+A[k]; If S>Max Then { Nếu dãy tìm có tổng lớn dãy trước} Begin Max:=S; {Thay tổng mới} vt:=j; { Thay vị trí dãy } End; Trang 10 End; Writeln('Day co tong lon nhat la:'); For i:=vt To vt+m-1 Do Write(A[i]:5); Readln; End Sau viết chương trình giáo viên yêu cầu họcsinh tự cải tiến chương trình có thể, họcsinh lúng túng giáo viên đưa nhận xét để họcsinh cải tiến chương trình Hướngdẫn cải tiến chương trình: Giống toán tìm giá trị lớn dãy số, ban đầu ta giả sử Max = A[1], ta giả sử tổng Max ban đầu tổng phần tử từ đến M, lần sau ta tìm so sánh tổng Max với dãy vị trí thứ trở đi, chương trình tham khảo sau: Type M1C=ARRAY[1 1000] Of Integer; Var A : M1C; n,m,i,j,k,vt:integer; S,Max:longint; Begin Write('Nhap so phan tu cua mang: n= '); Readln(n); For i:=1 To n Do Begin Write('a[',i,']='); Readln(a[i]); End; Write('Nhap so phan tu cua day con: m= '); Readln(m); vt:=1; {Vị trí phần tử dãy con} {Giả sử m phần tử mảng A dãy có tổng lớn nhất} Max:=0; For i:=1 To m Do Max:=Max+A[i]; {Tìm dãy khác} For j:=2 To n-m+1 Do Begin {Tính tổng dãy thứ j} S:=0; For k:=j To j+m-1 Do S:=S+A[k]; If S>Max Then { Nếu dãy tìm có tổng lớn dãy trước thì} Begin Max:=S; { Thay tổng } vt:=j; { Thay vị trí dãy } End; End; Writeln('Day co tong lon nhat la:'); Trang 11 For i:=vt To vt+m-1 Do Write(A[i]:5); Readln; End Khi chương trình chạy vài test giáo viên yêu cầu họcsinh sửa lại chương trình để thực việc đọc liệu từ tệp ghi kết tệp, chạy chương trình với N=1000 Bài tập 2: Chia hết Cho dãy gồm N số nguyên dương A 1, A2, , AN Hãy lấy K số liêntiếp để tổng chúng chia hết cho N với K bé Dữ liệu: Đọc vào từ file văn DAY.INP: • Dòng đầu ghi N • Dòng tiếp ghi số A1, A2, , AN Kết quả: ghi file văn DAY.OUT gồm dòng ghi giá trị K số số hạng lấy Giới hạn: N Ai ≤ 32767 Ví dụ: DAY.INP DAY.OUT 24 12214 Khi làm tập với thuật toán vét cạn để đưa dãy cung cấp, họcsinh viết chương trình mức độ chưa xác sau: program Bt2; Type m1c = array[1 10000] of integer; Var a:m1c; i, j, t,n, kmax,jmax:integer; tong:longint; thay:boolean; f1,f2:text; BEGIN Assign(f1,'DAY.INP'); Reset(f1); readln(f1,n); for i:= to n Read(f1,a[i]); Close(f1); Assign(f2,'DAY.OUT'); Rewrite(f2); {xu ly} for i:=1 to N for j:=1 to N- i+1 begin tong:=0; for t:=j to j+i-1 Trang 12 tong:=tong+a[t]; if tong mod n =0 then begin kmax:=i; jmax:=j; end; end; Write(f2,kmax, ' ', jmax); Close(f2); END Chương trình đưa dãy có tổng chia hết cho N dãy ngắn (k nhỏ nhất) Do giáo viên phải hướngdẫnhọcsinh thêm kỹ thuật đặt cờ hiệu để thoát vòng For tìm thấy dãy đầu tiên, ngắn thõa mãn có tổng chia hết cho N Chương trình tham khảo sau: program Bt2; Type m1c = array[1 10000] of integer; Var a:m1c; i, j, t,n, kmax,jmax:integer; tong:longint; thay:boolean; f1,f2:text; BEGIN Assign(f1,'DAY.INP'); Reset(f1); readln(f1,n); for i:= to n Read(f1,a[i]); Close(f1); Assign(f2,'DAY.OUT'); Rewrite(f2); for i:=1 to N begin thay:=false; for j:=1 to N- i+1 begin tong:=0; for t:=j to j+i-1 tong:=tong+a[t]; if tong mod n =0 then begin kmax:=i; jmax:=j; thay:=true; end; if thay then break; end; if thay then break; end; Write(f2,kmax, ' ', jmax); Close(f2); END Trang 13 Với đề không cho giới hạn N nên giáo viên chưa cần yêu cầu chương trình họcsinh phải chạy nhiều test Bài tập 3: Đoạn Cho dãy số nguyên a1, a2, , aN (|ai| < 109, N < 105) Một tập hợp khác rỗng số hạng liêntiếp {ai, ai+1, , ak} (i ≤ k) gọi đoạn dãy Với đoạn ta tính tổng tất số hạng Yêu cầu: Tìm giá trị lớn số tổng đoạn dãy cho Dữ liệu vào: cho file SUBSEQ.INP: Dòng đầu chứa số N, dòng thứ i N dòng chứa số Dữ liệu ra: Ghi file SUBSEQ.OUT số nguyên giá trị tổng đoạn lớn tìm Ví dụ: SUBSEQ.INP SUBSEQ.OUT -2 (Giải thích: -1 đoạn tổng lớn là: -1 – + = 8) -2 (60% số test có N < 3000) (Trích đề thi Họcsinh giỏi tỉnh Ninh bình 2010-20111 Vòng 1) Khi làm này, vận dụng thuật toán vét cạn để duyệt dãyhọcsinh viết chương trình sau: Type m1c = array[1 100000] of longint; Var a:m1c; i, j, t,n :longint; tong,kq:int64; f1,f2:text; BEGIN Assign(f1,'SUBSEQ.INP'); Reset(f1); readln(f1,n); for i:= to n Readln(f1,a[i]); Close(f1); Assign(f2,'SUBSEQ.OUT'); Rewrite(f2); {xu ly} kq:=-200000000000000000; for i:=1 to N for j:=1 to N- i+1 Trang 14 begin tong:=0; for t:=j to j+i-1 tong:=tong+a[t]; if tong > kq then kq:=tong; end; Write(f2,kq); Close(f2); END Tuy nhiên gáo viên cần cho họcsinh chạy vài test sau thử chạy test lớn (theo đề N