Phát triển chương trình bằng cách tinh chế từng bước Một bài toán ta có thể đưa ra nhiều cách giải khác nhau, song là một giáo viên thì chúng ta cần giúp học sinh viết chương trình làm s[r]
(1)Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” A Đặt vấn đề Lý Hiện nước ta các nước trên giới cạnh tranh ngành công nghệ chế tạo máy các sản phần phần mềm giúp ích cho người trên lĩnh vực Vậy làm nào để làm điều đó : nhờ vào ngành công nghệ thông tin Ngày xa xưa người không biết đọc, không biết viết đó là nỗi khỗ vô cùng, còn ngày người không biết sử dụng máy vi tính thì coi là không biết đọc, không biết viết Vậy biết sử dụng máy vi tính chúng ta làm gì hay ngồi chơi điện tử, các trò giải trí, soạn thảo các bài văn mà thôi ? Là giáo viên tin học các mục tiêu đưa tin học vào trường học là nhằm giúp học sinh không biết soạn thảo mà còn phải có khả phân tích, tổng hợp, trừu tượng hoá, khái quát hoá vấn đề và đặc biệt là phát triển tư duy, sáng tạo Những năm qua môn tin học THCS chưa có sách giáo khoa cụ thể hướng dẫn cho học sinh cách phân tích lập trình Vì học sinh chưa có tính độc lập sáng tạo mà phải nhờ vào giáo viên nhiều Nhưng năm đã có sách giáo khoa hướng dẫn cho học sinh cụ thể qui trình lập trình nào.Vì mà tôi hướng cho học sinh lớp cách để trở thành nhà lập trình thì cần phải nắm bước nào? Cơ sở thực tiễn Trong quá trình dạy tôi nhận thấy các em học sinh Mới đầu các em sợ thấy giải bài toán ngoài thì đơn giản và vòng vài giây có thể nhẩm kết Còn lập trình bài toán đó mà phải làm đến hàng chục phút mà lại có thể cho kết sai Song tâm huyết mình và yêu thích học sinh Nhất là năm nghành giáo dục có phát động phong trào giải toán trên mạng Điều đó đã thúc đẩy tôi nhiều việc dạy học là làm đưa cho các em đam mê và phát triển tài học sinh việc đào tạo nhân tài cho đất nước Ngôn ngữ lập trình PASCAL là phần mềm có cấu trúc và nhiều độc giả quan tâm và chính đó có nhiều sách nhiều tác giả viết Song với thân tôi lựa chọn viết đề tài này là muốn đưa “ các bước giải bài toán cho lớp bài toán trên máy vi tính” sử dụng ngôn ngữ lập trình pascal B- Giải các vấn đề Phương pháp giải các bài toán tin học không dùng để giải bài toán cụ thể mà còn giải lớp các bài toán cụ thể thuộc cùng loại Bài toán cấu tạo từ hai yếu tố bản: Thông tin vào (Input) và thông Lop8.net Giáo viên: Nông Hồng Thuý (2) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” tin (Output) Phương pháp tổng quát để giải bài toán máy vi tính dựa trên ngôn ngữ pascal thì cần các bước : Xác định các bài toán Tìm thuật toán Viết chương trình Chạy thử, sửa đổi chương trình I- Xác định bài toán Khái niệm bài toán Trong quá trình học người học sinh hay cá nhân nào luôn phải liên tục giải các bài toán Trong sống là chuỗi các bài toán mà ta phải đối đầu giải không chút đơn giản mà nhiều lúc phải mình Song học sinh lớp chương trình học toán các đến giải phương trình bậc là cao Nên việc đưa các lớp bài toán vào giải cho các em còn phần nào bị hạn chế Nhưng bài toán nào thì chúng ta đọc đề xác định nó : A->B Trong đó:- A là giải thiết : điều kiện ban đầu cái đã cho bắt đầu giải bài toán - B là kết luận: Mục tiêu cần đạt hay cái phải tìm, phải làm kết thúc bài toán - Là suy luận: giải pháp cần xác định hay chuối thao tác thực từ A đến B Bài toán trên máy vi tính Bài toán trên máy mang đầy đủ các tính chất bài toán tổng quát trên, nó lại diễn đạt theo các khác - A: là đưa thông tin vào (Input ) - B: là đưa thông tin ra( Output) - : là chương trình tạo từ các lệnh máy tính cho phép biến đổi từ A đến B Một số ví dụ Ví dụ 1: Tính diện tích hình chữ nhật Ta cần xác định cho bài toán: + Thông tin vào: Chiều dài là cạnh a, chiều rộng là cạnh b + Thông tin ra: Kết diện tích đưa a,b vào + Các thông tin cần chế biến thông tin như: - Lần lượt đưa a,b vào ( cho a=3,b=4) - áp dụng công thức tính diện tích hình chữ nhật: a*b Lop8.net Giáo viên: Nông Hồng Thuý (3) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” - Kết in là 12 Ví dụ 2: Cho số tự nhiên a, b Tìm ước số chung lớn chúng Các bước các định bài toán: + 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 a và d là ước b d là số lớn tập các ước chung a, b + Xác định các thao tác chế biến thông tin Xây dựng hữu hạn các thao tác cho phép tính d từ a và b Nhập a =16 b= 24 -> d =8 Ví dụ 3: Tìm tất các số nguyên tố các số nguyên N nhập vào từ bàn phím: + Xác định thông tin vào:Nhập số nguyên N +Xácđịnh thông tin ra: Các số nguyên tố ( chia hết cho nó và số 1) II- Tìm thuật toán Thuật toán là quá trình gồm dãy hữu hạn các thao tác đơn giản xếp theo trình tự xác định cho theo đó từ Input bài toán tìm Output bài toán Một bài toán ta có cách thể thuật toán: Các bước xác định lời, lập sơ đồ khối, ngôn ngữ trình, dùng ngôn ngữ lập trình (Pascal) Ví dụ: Tìm ước số chung lớn số nguyên dương a,b ta có thể giải các cách trên Cách 1: Các bước xác định bài toán lời: - Bước 1: Nhập số nguyên dương là a,b - Bước 2: So sánh giá trị a và b Nếu a b thì sang bước 3, ngược lại a khác b thì sang bước - Bước 3: Tìm ước số chung là a và kết thúc chương trình - Bước 4: Nếu a lớn b thì ước số chung lớn là a và quay trở lại bước Ngược lại ước số chung là b và quay trở lại bước Cách 2: Giải bài toán sơ đồ - Có hình thoi thể các thao tác so sánh - Hình chữ nhật thể các phép tính toán, các câu lệnh - Hình ôvan thể bắt đầu và kết thúc - Các mũi tên quy định trình tự các thao tác Lop8.net Giáo viên: Nông Hồng Thuý (4) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” Begin a, b a=b đúng UCLN là a sai Đúng END Sai a<>b b:= b - a a:= b - a Cách 3: Dùng ngôn ngữ trình Bắt đầu Nhập a, b While a khác b IF a>b then thay a :=a -b Else thay b:=b-a; Kết thúc in USCLN (a,b) Cách 4: Viết chương trình hoàn chỉnh (dùng ngôn ngữ pascal) PROGRAM USCLN; USES CRT; VAR a,b, :integer; BEGIN CLRSCR; WRITE('nhap gia tri m,n=');READLN(a,b); Giáo viên: Nông Hồng Thuý Lop8.net (5) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” WHILE m<>n DO IF a>b THEN a:=a –b else b:=b-a; WRITELN('uoc so chung lon nhat cua so’,a:5); READLN END III- Viết chương trình Lập trình là dùng ngôn ngữ máy vi tính cụ thể nào (ngôn ngữ Pascal) để diễn tả thuật toán, cấu trúc liệu thành câu lệnh để máy tính có thể thực và giải đúng bài toán mà người lập trình mong muốn Kỹ lập trình - Rèn luyện cho học sinh kỹ cài đặt thành công các thuật toán ngôn ngữ lập trình - Đã gọi là kỹ thì có thể có thông qua rèn luyện tích cực - Kinh nghiệm cho thấy thuật toán cài đặt vụng về, lộn xộn thì chạy trên máy tính có thể cho kết qủa tồi tệ Phát triển chương trình cách tinh chế bước Một bài toán ta có thể đưa nhiều cách giải khác nhau, song là giáo viên thì chúng ta cần giúp học sinh viết chương trình làm người xem nhìn vào có thể dễ hiểu bài toán đó là gì ? Do đó việc tinh chỉnh các bước cho bài toán máy tính 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 và cấu trúc liệu từ đó thành chương trình Muốn lập trình giỏi không phải cần nắm ngôn ngữ lập trình là đủ Mà vấn đề cốt yếu là biết phương pháp phát triển để chuyển các ý tưởng thành chương trình hoàn chỉnh Phương pháp tinh chế bước Một chương trình bắt đầu viết lời tự nhiên(tiếng việt) thể phân tích tổng thể người lập trình thể bước sau các câu lệnh phân tích chi tiết hơn, lời khác tương ứng với phân tích công việc thành các việc nhỏ chi tiết dễ hiểu và chỉnh xác Song ngôn ngữ lập rình pascal người lập trình có thể đưa phương pháp tinh chỉnh bước là thể tư giải vấn đề bài toán từ trên xuống đó các bước là hướng ngôn ngữ lập trình làm cho bài toán đa đợc phương pháp lập trình tối ưu, sáng sửa Lop8.net Giáo viên: Nông Hồng Thuý (6) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” Ví dụ Tìm tất các số nguyên tố các số nguyên N nhập vào từ bàn phím a Tinh chế lần - Lấy tập NT= [ ] (để chứa các số nguyên tố tìm đợc) S = [2, N] (tập các số cần xét ) - Tìm số đầu tiên S đa vào NT - Loại bỏ khỏi S các bội số số nguyên tố vừa tìm - Số đầu tiên còn lại S là số nguyên tố Tiếp tục quá trình S=[] - Xuất NT b Tinh chế lần Bắt đầu NT: = [ ] S = [2, N] Repeat Tìm số đầu tiên S NT:= NT+ [S0] Loại khỏi S các bội số S0 Until S=[ ]; Xuất NT; Kết thúc; c Tinh chế lấn ( chương trình hoàn chỉnh) Program nguyen_to; Const N=100; Type nguyen=1 N; var NT, S:set of nguyen; s0,I:integer; begin NT:=[]; S:=[2 N];S0:=2; repeat while not (S0 in S) S0:=S0+1; NT:=NT+[S0];I:=S0; While I<=N Begin s:=S-[i];I:=I+S0; Lop8.net Giáo viên: Nông Hồng Thuý (7) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” End; until S=[]; for I:= to n If I in Nt then Write(I:4); readln end d Tinh chế lần Rõ ràng cấu trúc liệu tập hợp Set of nguyen dễ hiểu cồng kềnh và làm máy chạy chậm chạp, ta có thể dùng mảng Boolean linh hoạt sau: Program nguyen_to; Const N=100; var a:array[1 N] of boolean; i,j:integer; begin a[1]:=false; for i:=2 to N a[i]:=true; for i:= to N div for j:= to N div i a[i*j]:=false; for i:= to N if a[i] then write(i:3); readln end e Tinh chế lần Trong ngôn ngữ pascal dùng mảng boolean thì ta bị giới hạn N<10000 Để có thể chạy với số lớn ta không dùng mảng , tập hợp mà dùng sau: Program nguyen_to; uses crt; var i,j,k,n:integer; begin repeat write('nhap n=');readln(n); until n>= 2; for i:= to n begin k:=0; Lop8.net Giáo viên: Nông Hồng Thuý (8) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” for j:= to trunc(sqrt(i)) if i mod j=0 then k:= 1; if k=0 then write(i:3); end; readln end Vậy đó là kỹ lập trình người lập trình có thể tinh chỉnh chương trình bước làm đưa phương án tối ưu cho ngwời xem dễ tiếp thu chiếm nhớ máy tính càng ít các tốt IV- Chạy Thử , thay đổi, kiểm tra chương trình Chạy thử Một chương trình đã viết xong chưa đã chạy trên máy vi tính kết mong muốn Ví dụ: Tìm số lớn số a,b,c nguyên dương nhập vào từ bàn phím Lần 1: Program tim_so; uses crt; var a,b,c:integer; begin clrscr; write('nhap so=');readln(a,b,c); if a<b then a:=b else if a<c then a:=c; write('so lon nhat la ',a); readln End Với chương trình này chạy song đáp số có lúc đúng, có lúc sai tuỳ thuộc vào lúc nhập giá trị a,b,c{ ta nhập thứ tự a=5,b=7,c=9 Thì cho ta kết số lớn là Vậy thì sai hoàn toàn} Do đó người lập trình cần phải biết cách tìm lỗi Sữa lỗi, điều chỉnh viết lại chương trình là kỹ quan trọng người lập trình Vậy với dụ trên để kết luôn đúng thì ta có thể viết lại chương trình Lần 2: Program tim_so; uses crt; var a,b,c,t:integer; begin clrscr; Lop8.net Giáo viên: Nông Hồng Thuý (9) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” write('nhap so=');readln(a,b,c); t:=a; if t<b then t:=b; if t<c then t:=c; write('so lon nhat la ',t); readln End Nếu nhập: Lần nhập A B C Kết 7 9 9 Phân loại lỗi và cách sửa lỗi - Lỗi thuật toán: Điều chỉnh lại thuật toán, thêm vị trí có thể, loại bỏ thuật toán sai, tìm thuật toán khác nghĩa làm lại từ đầu n Ví dụ: viết chương trình tính tổng S= (n nhập vào từ bàn phím) Học sinh viết chương trình khai báo biến S thuộc kiểu liệu nguyên thì chương trình không thực phép toán tính tổng Do để thực phép toán thì khai báo biến S là thuộc kiểu liệu thực - Lỗi trình tự: Phải xem lại thuật toán, phân tích lại từ trên xuống để đặt lại cho đúng với thuật toán Ví dụ:Viết chương trình giải phương trình bậc ax+b=0 với a,b nhập vào từ bàn phím program ptb1; var a,b:real; begin write('nhap cac he so=');readln(a,b); if a<>0 then writeln('moi so deu la nghiem'); else if b=0 then writeln('phuong trinh co nghiem',-b/a:4:2) else Giáo viên: Nông Hồng Thuý Lop8.net (10) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” writeln('phuong trinh vo nghiem') readln end Với chương trình trên hoàn toàn có thể chạy song kết không đúng nhập liệu a, b vào Do ta phải xếp lại thuật toán kết đúng yêu cầu : program ptb1; var a,b:real; begin write('nhap cac he so=');readln(a,b); if a<>0 then if b=0 then writeln('phuong trinh vo nghiem') else writeln('phuong trinh co nghiem',-b/a:4:2) else writeln('moi so deu la nghiem'); readln end - Lỗi cú pháp: viết lại cho đúng cú pháp ngôn ngữ lập trình mà mình sử dụng Ví dụ : Lỗi sau câu lệnh ta không sử dụng dấu chấm phẩy, hay kết thúc chương trình không có dấu chấm, hay từ khoá DOWNTO ta viết DOWN TO thì không có nghĩa Kiểm tra Có nhiều chương trình khó kiểm tra tình đúng đắn , là chương trình tìm kiếm lời giải tối ưu Vì chúng chưa biết kết qủa nào là đúng Vì việc tìm lỗi là khó khăn.Trong quá trình chạy thử chương trình ta cần lưu ý: - Nếu khởi đầu chương trình(test ) nhỏ các giá trị đặc biệt (đây là dễ bị lỗi nhất) - Làm nhiều các test phải đa dạng tránh lặp lặp lại các test tương tự - Nên kết thúc các test có kích thước lớn để kiểm tra tính chịu đựng chương trình Thay đổi chương trình Một chương trình đã viết xong, đã chạy thử tốt , giải đúng bài toán mà ta mong muốn chưa có nghĩa là quá trình lập trình đã xong Mà ngư10 Lop8.net Giáo viên: Nông Hồng Thuý (11) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” ời lập trình muốn nó đây ta có thể sửa đổi nó theo hướng khác mà nó có thể đáp ứng yêu cầu Như phần tinh chế chương trình là quan trọng cho việc sửa chữa chương trình cũ sang chương trình Ví dụ: - Nhập số a,b,c kiểm tra xem số đó có thể là độ dài các cạnh tam giác hay không Từ đó ta có thể chuyển nó sang dạng là các cạnh đó thoã mãn tam giác cân, hay là tính diện tích tam giác đó - Tính tổng cho N số nguyên đầu tiên nhập vào từ bàn phím Từ đó ta có thể triển khai tính giai thừa, tìm số nguyên tố, độ dài dãy số đó, tính trung bình cộng cho dãy số…… - Nhập vào mảng dãy số từ bàn phím Từ đó ta có thể tìm giá trị lớn, nhỏ mảng, trung bình độ dài mảng, điểm học sinh… Vậy là người lập trình bạn cần nắm các tiêu chuẩn chương trình từ giúp bài toán có kết tốt - Tính tin cậy: Có giải thuật đúng - Tính uyển chuyển: Chương trình có thể sửa đổi - Tính sáng: dễ đọc, dễ hiểu - Tính hữu hiệu: chạy chương trình nhanh và tốn ít dung lượng nhớ không gian và thời gian Tóm lại: Quá trình xây dựng chương trình là chuỗi các bước tinh chế bước phân nhiều công việc để từ đó đưa phương pháp tối ưu Song người lập trình cần rèn luyện để có ý thức các định liên quan và biết khảo sát nghiêm túc từ bỏ các lời giải chúng đúng Mà cần phải cân nhắc phương tiện lời giải theo tiêu chuẩn C- Kết thúc vấn đề Để đưa phương pháp tối ưu cho bài toán không đơn giản Bởi bài toán chúng ta có thể đưa nhiều phương pháp giải khác Song lập trình người giải không sử dụng đúng cách giải thì bài toán lại ngược lại là cho các kết khác Điều đó chứng tỏ cho thấy người lập trình cần phải nắm các bước giải bài toán lập trình Bài toán cho kết sai là nhiều nguyên nhân mà tôi đã trình bày phần trước như: + Chọn kiểu liệu sai + Viết kết in dạng có quy cách và không quy cách + Phép gán sai ví dụ bài toán tính tổng ban đầu ta phải gán S:=0; gán S:= 1; thì cho kết sai Hay Bài toán tính tích thì phép gán phải ngược trở lại ban đầu S:=1; 11 Lop8.net Giáo viên: Nông Hồng Thuý (12) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” Vậy để giải bài toán trên máy tính điện tử sử dụng ngôn ngữ lập trình pascal nói chung và lớp nói riêng Để nâng cao chất lượng dạy học tin các trường phổ thông thì là giáo viên tin học tôi muốn nói chúng ta không dạy lý thuyết suông mà cần phải biết kết hợp thực hành Để từ đó học sinh nhận thấy ưu điểm việc học chương trình này có lợi điểm nào Tóm lại đây là chương trình học khá mẻ, các bài toán đưa để xây dựng chương trình chưa có gì lạ phức tạp Bởi có nhiều bài hay thì học sinh lớp chưa học đến Cho nên giáo viên cần phải nắm các phương pháp để truyền đạt Đồng thời phối hợp chương trình toán đã học đến phần nào để từ đó đưa các ví dụ, bài tập để học sinh có thể nắm lý thuyết thực hành trên máy tính dễ tiếp thu Để từ đó các em rút ưu điểm các chương trình này so với cách tính tay chỗ nào Bản thân tôi mong muốn góp phần nhỏ bé mình vào nghiệp giáo dục Bởi đây là môn học khá mẻ với tất các học sinh THCS Tóm lại các bước giải bài toán cho lớp các bài toán trên máy vi tính tôi đưa còn nhiều thiếu sót Mong nhận góp ý các thầy cô giáo cùng bạn bè để hoàn thiện hơn./ Tôi xin chân thành cảm ơn ! B?n ph? ,ngày tháng12 năm 2010 Người viết Nụng H?ng Thuý 12 Lop8.net Giáo viên: Nông Hồng Thuý (13) Trường THCS Bản Phố“Các bước giải bài toán cho lớp bài toán trên máy vi tính” 13 Lop8.net Giáo viên: Nông Hồng Thuý (14)