Chuyên đề bồi dưỡng giáo viên tin học Trung học cơ sở

19 556 0
Chuyên đề bồi dưỡng giáo viên tin học Trung học cơ sở

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chuyên đề bồi dưỡng giáo viên tin học THCS Nội dung I. Rèn luyện tư duy thuật toán cho học sinh THCS 1. Tại sao phải rèn luyện kỹ năng tìm tòi thuật toán 2. Xác định rõ INPUT và OUTPUT. 3. Mịn dần thuật toán. II. Rèn luyện phong cách lập trình tốt cho học sinh THCS . 1.Quy ước về cách đặt tên cho các định danh. 3. Phong cách viết mã nguồn 4.Tối ưu sự thực thi mã nguồn 5. Tạo các bộ thử III.Các dạng toán bồi dưỡng môn tin cho HSG THCS 1.Các bài toán số học 2.Các bài toán về mảng một chiều , hai chiều. 3. Các bài toán về xử lý xâu I. Rèn luyện tư duy thuật toán cho học sinh THCS. 1. Tại sao phải rèn luyện tư duy thuật toán cho học sinh THCS. Trong quyển sách nổi tiếng của mình về NNLT Pascal ( viết năm 1970), tác giả N.With đã viết một dòng ngay từ trang đầu: CHƯƠNG TRÌNH= THUẬT TOÁN +CẤU TRÚC DỮ LIỆU Như vậy thuật toán là phần quan trong bậc nhất để tạo nên một chương trình. Nhưng hết tiểu học, học sinh vẫn chưa được làm quen với khái niệm thuật toán. Do vậy khi học lập trình cái khó khăn ban đầu của học sinh chính là tìm thuật toán để giải bài toán đã cho. Một học sinh muốn tiến sâu, tiến xa trong tương lai phải có tư duy thuật toán tốt. 1 Bởi vậy làm quen và rèn luyện tư duy thuật toán cho học sinh mới bắt đầu học lập trình là một yêu cầu thiết yếu. Không nên vội vàng cho học sinh làm việc trên máy tính luôn khi mới bát đầu học. Có thầy giáo khi dạy tin học cho lớp chuyên tin đã bỏ ra cả học kỳ để dạy riêng thuật toán. II. Phong cách lập trình tốt. Để có một phong cách lập trình tốt ngoài việc tuân theo các quy chuẩn, còn cần phải tuân theo các quy ước. Cơ sở cho việc cài đặt một chương trình hiệu quả là: Cách trình bày rõ ràng, sáng sủa nổi bật được cấu trúc logic của chương trình. Một phần nhỏ trong lập trình là để máy tính có thể đọc được nó. Phần lớn hơn là viết các mã lệnh cho chương trình chạy được theo đúng chức năng và làm sao để con người có thể dễ đọc, dễ hiểu nó. Lợi ích của việc trình bày cẩn thận: • Thể hiện tốt cấu trúc lôgic của mã lệnh • Cải thiện khả năng đọc • Bảo đảm sự chính xác trong các thay đổi • Các lợi ích hệ quả của các lợi ích trên - Chương trình ít mắc lỗi và dễ sửa chữa khi mắc lỗi. - Tiết kiệm thời gian sửa lỗi. - Tăng khả năng làm việc theo nhóm, 1. Quy ước về cách đặt tên cho các định danh. Thông thường tùy theo ngôn ngữ và môi trường lập trình, người viết chương trình chọn cho mình một phong cách nhất quán trong việc đặt tên cho các định danh. Tuy nhiên, nên đặt sao cho thuận tiện, dễ đọc, dễ nhớ và dễ làm việc, có một số quy tắc cần quan tâm khi đặt tên như sau: a) Đặt tên cho biến. Tên biến nên thể hiện được ý nghĩa: thông thường các biến nguyên như i, j, k dùng làm biến lặp; x, y dùng làm biến lưu tọa độ… Còn những biến lưu trữ khác thì nên đặt tên gợi nhớ: Biến đếm số lần dùng “Count” hay “Sluong”; biến trọng lượng “weight” hay “Tluong”…. Nếu đặt quá ngắn ngọn như “c” cho biến đếm hay “w” cho biến trọng lượng thì sau này khi nhìn vào chương trình sẽ rất khó hiểu và dễ nhầm lẫn, nhưng cũng không nên quá dài dòng như “Demsoluong” hay “Tinhtrongluong” bởi khi dùng sẽ rườm rà, tốn thời gian viết. 2 b) Đặt tên hằng: Tất cả các ký tự đều viết hoa. Ví dụ: Const MAXN = 10000; INPUT = ‘Baitap.inp’; c) Đặt tên cho chương trình con: Tên chương trình con thường bắt đầu bằng chữ hoa. Vì chương trình con thường thực hiện một chức năng nào đó nên tên hay bắt đầu bằng động từ. Ví dụ: TimMax( ); GetNum( ); 2. Phong cách viết mã nguồn. a) Quy tắc trình bày tổng thể chương trình: - Chương trình nên tách thành nhiều đơn thể (mô _ đun), mỗi đơn thể thực hiện một công việc, càng độc lập với nhau càng tốt (chương trình con). Điều này sẽ giúp cho chương trình dễ cải tiến và khi đọc chương trình ta sẽ dễ hình dung được vấn đề đang được thực hiện. - Nên sử dụng các tham số khi truyền thông tin cho các chương trình con. Tránh sử dụng các biến toàn cục để truyền thông tin giữa các chương trình con vì như vậy sẽ làm mất đi tính độc lập giữa các chương trình con và rất khó khăn khi kiểm soát giá trị của chúng khi chương trình con thi hành. - Cách trình bày chương trình càng nhất quán càng dễ đọc, dễ hiểu. - Chương trình nên giữ được tính đơn giản, rõ ràng. - Chương trình nên thực hiện như một dòng chảy từ trên xuống: + Sau đó đến khai báo đơn vị, khai báo hằng, khai báo kiểu, khai báo biến toàn cục, khai báo chương trình con. + Không nên sử dụng Goto vì sẽ phá vỡ tính tuần tự của việc thực hiện chương trình. b) Quy tắc trình bày dòng lệnh - Mỗi câu lênh nên được đặt riêng trên một dòng để chương trình dễ đọc và dễ quan sát cách thực hiên khi dùng watch để tìm lỗi. - Sử dụng tab để canh lề chương trình (các lệnh ngang cấp thì phải tab vào như nhau): Điều này sẽ giúp chương trình rõ ràng và dễ quản lý. Ví dụ: Không nên Nên For i := 1 to n do Begin Action1; Action2; End; For i := 1 to n do Begin Action1; Action2; End; Nên viết Begin end; rồi viết lệnh vào giữa để tránh thiếu end; - Sử dụng khoảng trắng chương trinh sẽ dễ nhìn hơn: 3 Ví dụ: Khó đọc Dễ đọc If (a<c)and(c mod 2=0)then d:=a+c; If ( a < c ) and ( c mod 2 = 0 ) then d := a + c; a:=b*c a := b * c; TimMax(a,b,c); TimMax(a, b, c); - Nên định nghĩa hằng số: Điều này sẽ tránh việc các con số khó hiểu xuất hiện trong chương trình và cũng giúp người lập trình dễ kiểm soát chương trình lớn vì giá trị của hằng số khi cần thay đổi chỉ phải thay đổi một lần duy nhất ở giá trị định nghĩa. Ví dụ: Không nên Nên …………… For i := 1 to 100 do A[i] := Random(100); While i<=100 do… Const MAXN = 100; MAXNUM = 100; …… For i :=1 to MAXN do A[i] := Random(MAXNUM); While i <= MAXN do … Ở đoạn chương trình bên trái rất khó phân biệt các số 100 kia có quan hệ gì với nhau. Tuy nhiên, trong đoạn chương trình bên phải ta dễ dàng thấy được ý nghĩa của từng giá trị khi thay bằng định danh. Ngoài ra khi cần thay đổi giá trị của MAXN, MAXNUM thì chỉ cần thay một lần trong phần định nghĩa. - Các biến không nên sử dụng lại với nhiều ý nghĩa khác nhau trong cùng một hàm để tránh sự nhầm lẫn. - Viết chú thích cho chương trình: Biến, hàm khi định nghĩa nên viết chú thích ý nghĩa và chức năng rõ ràng. Đôi khi các đoạn lệnh thực thi cũng cần giải thích nếu chúng quá phức tạp. Nên viết chú thích ngắn gọn nhưng đầy đủ và dễ hiểu. Ví dụ: Var iCount : Integer; // đếm số cách thực hiện Procedure Try( i : Integer); // Tìm từ i Tuy nhiên không phải bất cứ lệnh nào cũng chú thích, việc chú thích tràn lan ngay cả với câu lệnh đơn giản không có ý nghĩa gì mà còn làm chương trình khó nhìn hơn. - Nên viết biểu thức điều kiện mang tính tự nhiên: Biểu thức nên viết dưới dạng khẳng định, việc viết dưới dạng phủ định sẽ làm khó hiểu. Ví dụ: Không nên Nên If not(a mod 5<>0) then …. If a mod 5 = 0 then …. 4 c) Qui tắc khai báo tên tệp dữ liệu dùng trong chương trình. Dùng tệp nên khai báo tên têp trước trong phần khai báo hằng: Ví du: Const fi=’BAI1.INP’; Fo=’BAI1.OUT’ ; 3. Tối ưu sự thực thi mã nguồn Mục đích của việc tối ưu mã nguồn là nâng cao tốc độ xử lý và hạn chế không gian bộ nhớ mà chương trình chiếm dụng. Thông thường có thể mâu thuẫn giữa tốc độ và không gian lưu trữ, do đó tùy theo điều kiện cụ thể mà người lập trình có sự lựa chọn thích hợp. Một số thủ thuật sau có thể giúp người lập trình hình thành nên phong cách lập trình tốt. - Lưu tạm giá trị thường sử dụng: Nếu một biểu thức tính toán được dùng nhiều lần thì nên tính kết quả một lần rồi lưu vào một biến và dùng lại. Ví dụ: Không nên Nên F:=sqrt(x*x+y*y)+(sqrt(x*x+y*y)*sqrt(x*y)-sqrt(y*y); x2 := x*x; y2 := y*y; p := sqrt(x2 + y2); F := p + (q * sqrt(x2) – sqrt(y2)); If b * b – 4 * a * c >0 then Begin x1 := (-b +sqrt( b * b – 4 * a * c)) / (2 * a); x2 := (-b – sqrt(b * b – 4 * a * c)) / (2 * a); end; Delta := b * b – 4 * a * c If delta >0 then Begin Delta:=sqrt(delta); x1 := (-b + delta) / (2 * a); x2 := (-b – delta) / (2 * a); end; - Thay thế một biểu thức bằng một biểu thức tương đương nhưng lợi về thực thi: Ví dụ: Thay thế các phép nhân chia bằng phép dịch chuyển bit vì các phép xử lý bit tốc độ nhanh hơn các phép xử lý khác. Không nên nên For i := 1 to n do s:=s*2; s shl n; 5 - Dùng số nguyên thay cho số thực: Do việc xử lý số thực chậm hơn xử lý số nguyên nên ta có thể dùng số nguyên thay cho số thực có phần lẻ nhỏ. Vì dụ: Điểm trung bình của học sinh là số thực ta có thể thay bằng số nguyên: DTB là 7.85 thì lưu số nguyên là 785, khi xuất ra thì chia cho 100. - Thoát khỏi vòng lặp khi sớm nhất: Một số trường hợp không cần thiết phải lặp hết toàn bộ mà đã đạt được mục đích thì có thể thoát khỏi vòng lặp. Ví dụ: Hạn chế sử dụng câu lệnh rẽ nhánh: Lệnh rẽ nhánh làm chậm chương trình do ngắt luồng thực thi. Ví dụ: Không nên Nên If x > y then d:=True else d:= False; d := x>y; - Tránh lãng phí bộ nhớ: Bằng cách sử dụng kiểu dữ liệu nhỏ nhất đủ để lưu trữ. Việc sử dụng tài nguyên nhiều hơn mức đòi hỏi của chương trình là một thói quen xấu mà người lập trình hay mắc phải. Hơn nữa tốc độ chương trình sẽ nhanh hơn khi sử dụng kiểu dữ liệu nhỏ hơn. - Khai báo biến cục bộ trong phạm vi gần nhất: Khai báo biến cục bộ gần với điểm sử dụng nhất. Việc khai báo ở phạm vi rộng hơn chỉ làm lãng phí và khó kiểm soát. 6 Không nên Nên bkt := true; For i := 2 to n do If n mod i = 0 then bkt := False; bkt := true; For i := 2 to n do If n mod i = 0 then Begin bkt := False; Break; End; - Giảm số lượng tham số truyền vào hàm: Việc sử dụng hàm có quá nhiều tham số được truyền vào có thể làm ảnh hưởng đến ngăn xếp dành cho việc gọi hàm. Nhất là trường hợp tham số là kiểu dữ liệu có cấu trúc. Sử dụng con trỏ hay tham chiếu trong trường hợp này để đơn giản hóa. 4) Kiểm nghiệm chương trình với các bộ test đầy đủ nhất. - Test đầu bài, - Các test đơn giản - Test các trường hợp đặc biệt. - Test lớn - Xem lại đề để không bỏ sót trường hợp. III. Các dạng toán bồi dưỡng môn tin cho HSG THCS . Nhóm các bài toán lập trình thường được phân loại theo thuật toán, theo cấu trúc dữ liệu dùng để giải. Ở bậc THPT dạng toán phong phú hơn rất nhiều do được mở rộng về CTDL song song với việc mở rộng thuật toán. Ở bậc trung THCS các bài toán thường chỉ sử dụng các vòng lặp, sử dụng các kiến thức toán như UCLN , BCNN, số nguyên tố, sự chia hết của các số nguyên,…Các dạng toán thường gặp là: • Nhóm các bài toán số học: • Nhóm các bài toán thao tác trên mảng một chiều. • Nhóm các bài toán xử lý xâu . • Các bài toán khác. 1. Các bài toán số học. Để giải các bài toán về số học giáo viên cần cho học sình ứng dụng nhuần nhuyễn các kiến thức số học ở THCS chủ yếu dựa vào 2 phép toán DIV, MOD: • Thuật toán tìm UCLN của 2 số nguyên dương: Cho 2 số nguyên dương m, n. Tìm UCLN(m,n) Học sinh thường dùng một trong 2 thuật toán Thuật toán 1: Sử dụng phép trừ liên tục cho đến khi 2 số bằng nhau: 7 + Nhập m, n + While m<>n do If m>n then m:=m-n Else n:=n-m; +UCNN:=n; Thuật toán này chạy chậm: Ví dụ với m=1000000000, n=1 phải chạy 1 tỷ phép toán. Thuật toán 2: (Đối với HSG nên hướng các em sử dụng thuật toán này) + Nhập m, n + While n <> 0 do Begin r:= m mod n m:=n; n:=r; End; +UCLN:=m Với thuật toán này khi m=1000000000, n=1, chỉ mất vài phép toán để tính được UCLN(m,n). Để tìm UCLN của dãy a1, a2,…,an, cần lập hàm: FUNCTION UCLN(a, b: longint): longint; Khi đó + d:=a1; + for i:=2 to n do Begin b:=ai; d:=UCLN(d, b);End; • Thuật toán tìm BCNN của 2 số: Ta có BCNN(m,n)= (m * n) div UCLN(m, n). Ở đây học sinh thường mắc 2 sai lầm sau : Sai lầm 1 : d :=UCLN(m, n) ; BCNN :=m*n div d ; Đúng ra phải là : BCNN :=m * n (lưu tích m.n) 8 d := UCLN(m, n) ; BCNN := BCNN div d Sai lầm 2 : BCNN(m, n, k) = m*n*k div UCLN(m, n k) Để tìm BCNN của dãy số nguyên dương a1, a2, …,an (n>=2) BCNN:=a1; d:=a1; For i:=2 to n do n do Begin b:=ai BCNN:=BCNN*b; d:=UCLN(BCNN,b); BCNN:=BCNN div d ; End ; • Kiểm tra số nguyên tố. Cho số nguyên P. Hỏi P có phải là số nguyên tố không? Nhiều học sinh lập thuật toán đếm số ước của P. Nếu số ước của P là 2 thì kết luận P là số nguyên tố. Thuật toán đó không sai nhưng chậm. FUNCTION Ngto(P:Integer): Boolean; Var NT:Boolean; I:integer; Begin NT:=P>1; For i:=2 to Trunc(Sqrt(P)) do If P mod I =0 then Begin NT:=False; Break End; Ngto:=NT; End; • Đếm số chữ số của một số, tính tổng các chữ sô 9 Bài toán : Nhập một số nguyên n. Số n có bao nhiêu chữ sô. Tính tổng các chữ số của n. +TongCS:=0; SoCS:=0; + While n<>0 do Begin Inc(SoCS); TongCS:=TongCS+ n mod 10; n := n div 10 ; End ; • Biểu diễn số tự nhiên n từ hệ đếm thập phân qua các hệ đếm khác và ngược lại Bài toán : Cho n là số nguyên dương biểu diễn trong hệ thập phân. Hãy biểu diễn n trong hệ đếm q – phân ( 1<q<10). Dùng mảng : array[0 20] of byte ; + d:=-1; + While n<>0 do Begin Inc(d); a[d]:= n mod q n:=n div q; End; { lưu dãy chữ số q- phân theo thứ tự ngược} + for i:=d downto 0 do write(a[i]); Một số bài toán số học. Bài 1. Phân tích ra thừa số nguyên tố Cho số tự nhiên n (n>1). Hãy phân tích n thành tích các thừa số nguyên tố. Ví dụ: Cho n=12 thì n=2.2.3, cho n=300 thì n=2.2.3.5.5 + Phân tích: Chỉ cần duyệt qua các ước nguyên tố từ bé đến lớn rồi ghi ra. + Thuật toán: If Ngto(n) then writeln(n) 10 [...]... Trong phần này gv cần cung cấp cho học sinh một số kỹ năng cơ bản khi thao tác trên mảng như: Tìm phần tử MAX, MIN, sắp xếp đơn giàn, kiểm tra tinh đơn điệu của dãy, tìm kiếm trên dãy… Bai1 Trong một buổi sinh hoạt câu lạc bộ Tin học của Cung thiếu nhi Hà Nội, thầy giáo ra một bài toán như sau: Từ số hạng đầu tiên của dãy số Fibonacci (là dãy số có quy luật: số hạng thứ nhất và thứ hai bằng 1, từ số hạng... số ( Đề thi HSG thành phố Hà nội) p p p Phân số q ( p, q là 2 số nguyên dương) gọi là phân số đúng nếu q . Chuyên đề bồi dưỡng giáo viên tin học THCS Nội dung I. Rèn luyện tư duy thuật toán cho học sinh THCS 1. Tại sao phải rèn luyện kỹ năng tìm. cho học sinh mới bắt đầu học lập trình là một yêu cầu thiết yếu. Không nên vội vàng cho học sinh làm việc trên máy tính luôn khi mới bát đầu học. Có thầy giáo khi dạy tin học cho lớp chuyên tin. toán số học: • Nhóm các bài toán thao tác trên mảng một chiều. • Nhóm các bài toán xử lý xâu . • Các bài toán khác. 1. Các bài toán số học. Để giải các bài toán về số học giáo viên cần cho học sình

Ngày đăng: 20/05/2015, 13:45

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan