V- Chạy thử, thay đổi chơng trình:
5.4.3- Tính trong sáng:
- Chơng trình phải viết cho dễ đọc dễ hiểu.
- Chơng trình phải tạo thuận lợi cho việc bảo trì bao gồm: +Sửa sai, cải tiến, biến đổi.
- Để có một chơng trình trong sáng ta cần chú ý về :
- Các tên của biến, kiểu , chơng trình con .... phải có tính gợi nhớ, viết dới dạng cấu trúc, sử dụng nhiều chú thích.
Một chơng trình không trong sáng thờng mắc các sai lầm :
+ Các danh hiệu quá vắn tắt, các phát biểu không chọn lựa + Không tạo dạng cấu trúc
Một chơng trình nh vậy nh vậy không những sẽ khó đọc, khó hiểu khi kiểm tra mà còn có thể dẫn đến nhiều lỗi sai khó phát hiện.
5.4.4- Tính hữu hiệu :
Hữu hiệu là chạy nhanh và ít tốn bộ nhớ, có nghĩa là ít tốn không gian và thời gian.
Để có chơng trình hữu hiệu, quan trọng nhất là có một giải thuật hữu hiệu. Sau đó, cần có những khéo léo nhất định khi lập trình.
5.5- Kết luận:
Quá trình xây dựng chơng trình là một chuỗi các bớc tinh chế. ở mỗi bớc, một công việc đợc phân ra làm nhiều công việc con. Mỗi sự tinh chế cho một mô tả công việc có thể đợc đi kèm bởi một tinh chế cho mô tả của dữ liệu là cái tạo nên phơng tiện liên lạc giữa các công việc. Sự tinh chế mô tả của chơng trình và của các cấu trúc dữ liệu phải tiến hành đồng thời.
Trong quá trình tinh chế từng bớc, mỗi cách biểu diễn tự nhiên của bài toán đang xét cần đợc sử dụng càng lâu càng tốt. Hớng phát triển của sự biểu diễn trong quá trình tinh chế đợc quyết định bởi NNLT mà ta dùng. NNLT phải cho phép chúng ta diễn tả một cách tự nhiên nhất và rõ ràng nhất của các cấu trúc của chơng trình và dữ liệu. Đồng thời nó cũng phải cho phép hớng dẫn quá trình tinh chế bằng cách trình bày những đặc tính căn bản và những nguyên lý cấu trúc tự nhiên đối với máy tính mà CT chạy trên đó.
Chơng II
Nghiên cứu về các sai lầm phổ biến của HS THPT khi viết chơng trình bằng ngôn ngữ turbo pascal
2.1- Sơ l ợc vài nét về ch ơng trình Tin học THPT:
2.1.1 –Nội dung:
Trong chơng trình tin học ở trờng THPT. NNLT TP là phơng tiện để thể hiện giải thuật cho một bài toán nào đó dới dạng mà máy tính có thể thực hiện đợc. Nội dung chủ yếu là những câu lệnh cơ bản, các kiểu dữ liệu cơ sở và các CT minh hoạ. Nó đợc chia làm 2 phần :
Lớp 10 : Phần PASCAL cơ sở.
Lớp 11: Phần PASCAL nâng cao.
2.1.2- Mức độ yêu cầu:
Nếu nh trớc đây học sinh học các thao tác đơn giản nh khởi động máy, đóng máy. Làm việc với các câu lệnh trong hệ điều hành MS-DOS, soạn thảo trên BKED, VIETRES..v..v.. Thì nay các em làm quen với các thuật toán, chơng trình đợc viết trên ngôn ngữ lập trình cụ thể. Vì vậy, độ phức tạp và khó khăn sẽ tăng lên rất nhiều khi giải quyết một vấn đề gì. Hay nói cách khác là t duy trực quan phải nhờng vị trí quan trọng cho t duy logic trìu tợng và các thao tác đơn giản bằng tay gõ từ bàn phím đợc tiếp nối bởi các thao tác phân tích, tổng hợp một vấn đề nào đó.
Bên cạnh đó chơng trình của một ngôn ngữ lập trình bất kỳ bao giờ cũng đợc xây dựng theo công thức: “ Cấu trúc + Giải thuật = Chơng trình”. NNLT TP cũng không ngoại lệ, dựa vào tri thức của Toán học để lĩnh hội các tri thức Tin học là một vấn đề hết sức khó khăn đối với học sinh ở trờng THPT do tính mới mẻ, tính trìu tợng và trí tởng tợng cao của môn học. Trong khi bản thân nhiều em hiểu biết về Tin học còn rất mơ hồ chứ cha nói tới việc các em nắm vững kiến thức về Tin học nh thế nào? ở trờng THPT, các em cần nắm vững các kiến thức cơ bản sau:
+) Biết khởi động máy và thoát khỏiTP. Cách soạn thảo trong TP, cách hiểu một chơng trình TP đơn giản nh thế nào? Làm việc với môi tr- ờng TP cũng nh cách vào các bảng chọn của TP.
+) Hiểu khái niệm bằng số và biến số, biểu diễn số thực, các phép tính, câu lệnh gán. Đồng thời cách vào/ra dữ liệu.
+) Trong TP dùng bảng chữ nh thế nào? Cách dùng các từ khoá các tên chuẩn. Hằng văn bản và cách dùng đặt chú thích.
+)Khái niệm kiểu dữ liệu, tìm hiểu các kiểu nguyên, thực, ký tự, logic.
+) Cú pháp và sự hoạt động của câu lệnh rẽ nhánh, câu lệnh chọn CASE, hiểu thế nào là câu lệnh ghép?.
+) Cú pháp và sự hoạt động của câu lệnh lặp dạng WHILE, REPEAT, FOR, cách khai báo và làm việc với mảng, xâu ký tự.
+)Biết cách viết và sử dụng kiểu tập hợp, kiểu bản ghi, thủ tục và hàm. Khái niệm tệp và các thủ tục, hàm thao tác trên tệp. Các thao tác trên tệp. Các thao tác trên tệp văn bản, cách vào /ra đối với tệp văn bản.
+) Tìm hiểu kỹ các bài toán sắp xếp và tìm kiếm trên đó. Các khái niệm về đồ hoạ và các thủ tục, hàm sử dụng trong đồ hoạ.
b) Về bài tập:
Hệ thống bài tập tin học trong sách giáo khoa lớp 10, lớp 11 đợc lựa chọn nhằm mục đích củng cố kiến thức cơ bản, rèn luyện các kỹ năng, kỹ xảo khi viết chơng trình, t duy logic, khả năng trìu tợng hoá và bổ sung một số kiến thức mà trong các tiết lý thuyết ở sách giáo khoa cha đề cập đến.
Mặt khác, cần chú ý đến vấn đề “ quan trọng” trong hệ thống các bài tập. Không phải ngẫu nhiên mà tác giả đa ra chơng trình TP đơn giản đầu tiên trớc khi dạy cách viết một chơng trình TP? Mà vấn đề này cần đ- ợc đề cập và bổ sung theo từng cú pháp các câu lệnh xuyên suốt chơng trình dạy.
Cần rèn luyện cho học sinh đạt đợc những kỹ năng sau:
- Biết viết chơng trình bằng ngôn ngữ TP, cách trình bày rõ ràng, sáng sủa, cú pháp đúng, chính xác.
- Biết vận dụng các câu lệnh, cấu trúc lặp để giải quyết các bài toán cụ thể, chuyển từ ngôn ngữ thờng sang ngôn ngữ Tin học, để có thể chạy đợc trên máy.
Ngoài việc truyền thụ các kiến thức về Tin học đặc biệt là NNLT TP cho các em. Còn một yêu cầu không kém phần quan trọng đó là thông qua việc cung cấp tri thức cần rèn luyện các kỹ năng, kỹ xảo lập trình, cần chú ý phát triển năng lực trí tuệ, t duy logic, t duy thuật toán, ngôn ngữ chính xác và kỹ năng độc lập viết chơng trình. Đồng thời rèn luyện các phẩm chất t duy linh hoạt, độc lập, sáng tạo tự kiểm tra, đánh giá cho các em.
Do tính đặc thù của môn Tin học là một môn học mới, nên học sinh cha tiếp cận nhiều về mảng Tin học, do đó có nhiều em cho là học tin khó, là một môn học “cao siêu” quá nên khó tiếp cận. Mặt khác việc chuyển đổi một bài toán sang cách xây dựng thuật toán từ đó viết hoàn chỉnh một chơng trình chạy đợc trên máy, cho ra kết quả đúng còn nhiều khập khiễng, cha rõ ràng mạch lạc. Bên cạnh đó, đội ngũ giáo viên dạy tin phần lớn là cha qua đào tạo hệ đại học về chuyên tin mà thờng là cán bộ dạy môn nào đó đi học thêm rồi về dạy tin. Nên nhiều giáo viên cha chú trọng trong việc sửa chữa, phân tích nguyên nhân các sai lầm của học sinh khi lập trình bằng ngôn ngữ TURBO PASCAL.
Từ đó, chúng tôi nhận thấy rằng việc thờng xuyên phát hiện sai lầm, phân tích nguyên nhân dẫn đến các sai lầm, đồng thời đề ra những biện pháp thích hợp để ngăn ngừa, khắc phục những sai lầm đó là cần thiết góp phần nâng cao hiệu quả dạy và học Tin học đặc biệt là dạy học lập trình bằng NNLT TP ở trờng THPT.
2.2 Một số sai lầm phổ biến của HS THPT khi giải bài toán bằng ngôn ngữ lập trình PASCAL.
Trong quá trình nhận dạng, thể hiện các thuật toán và vận dụng các câu lệnh, cấu trúc của NNLT TP, học sinh gặp rất nhiều khó khăn do tính trìu tợng cao và tính mới mẻ của môn học. Không những chỉ có học sinh yếu và trung bình mắc các sai lầm khi giải bài toán trên máy tính bằng NNLT TP mà cả những học sinh có học lực khá, giỏi cũng phạm những sai lầm đáng tiếc. ở luận văn này chúng tôi không đặt nhiệm vụ là thống kê hết mọi sai lầm của học sinh khi lập trình bằng ngôn ngữ TURBO PASCAL, mà chỉ nêu lên những sai lầm xuất hiện ở tần số cao trong quá trình lập trình của những học sinh.
Ngoài việc nêu lên các lời giải sai, các tình huống gặp khó khăn của HS-THPT (ký hiệu (?)) chúng tôi rất chú trọng trong việc phân tích sai lầm của các lời giải sai đó nhằm giúp HS nhận thấy những sai lầm thiếu sót của mình khi vận dụng các kiến thức toán học vào việc lập trình chạy đợc trên máy (ký hiệu (!)). Từ đó, giúp học sinh có ý thức tự sửa chữa, tự khắc phục ngày càng hoàn thiện việc lĩnh hội các khái niệm, cú pháp, câu lệnh, các cấu trúc lập trình cũng nh vận dụng chúng để giải quyết các bài toán bằng các chơng trình cụ thể.
2.2.1 Một số lỗi th ờng gặp về cú pháp khi mới lập trình bằng ngôn ngữ TURBO PASCAL ở học sinh THPT. TURBO PASCAL ở học sinh THPT.
Chơng trình là sự diễn đạt quá trình giải bài toán bằng một ngôn ngữ để MTĐT thực hiện một cách tự động quá trình này. Chơng trình trên TP bao gồm nhiều thành phần cụ thể là các từ khoá, tên chuẩn và cú pháp và các cấu trúc lập trình đợc xếp đặt có cấu trúc có trật tự.
Vì vậy, khi mới học lập trình bằng ngôn ngữ PASCAL các em thờng hay mắc những lỗi, những thiếu sót sau:
1) Khai báo thừa, thiếu biến, sai tên biến.
2) Khai báo sai dữ liệu.
3) Lỗi chính tả.
4) Viết sai quy cách câu lệnh hoặc mô tả...
2.2.1.1: Khai báo thừa, thiếu biến,sai tên biến:
Khai báo biến là công việc phải làm đối với bất kỳ một CT, nhng công việc này không phải lúc nào cũng diễn ra nh mong muốn, có nhiều nguyên nhân gây nên việc khai báo biến có khi thiếu, có khi thừa, có khi sai tên biến, lỗi này thờng dễ phát hiện và cũng dễ sửa nhng tần số HS mắc lỗi này lại rất nhiều. Sau đây là một số ví dụ minh hoạ cụ thể.
Bài 1.1:
Một xâu ký tự có thể nén theo cách sau: một xâu con gồm n>1“ ”
kí tự giống nhau, chẳng hạn gồm n ký tự a , sẽ đ“ ” ợc ghi thành na. Ví dụ xâu aaaabbcb sẽ đ‘ ’ ợc nén thành 4a2bcb . Hãy viết ch‘ ’ ơng trình nén và giải nén các xâu ký tự. (Chú ý trong xâu đợc nén phải không đợc có chữ số, nếu không kết quả sẽ không nh ta mong muốn. Chẳng hạn xâu aaa2b’ ’
đợc nén thành 3a2b có thể sẽ bị lẫn với aaabb ).‘ ’ ‘ ’ Chơng trình minh hoạ bằng ngôn ngữ TP:
(?) 1) Program Nen_giai_xau; 2) Uses Crt; 3) Var s,s1,s2:string; 4) i,j,code:integer; 5) Begin 6) Clrscr;
7) Write(' Nhap xau s:'); Readln(s); 8) {Nen s vao s1} 9) i:=1; s1:=s[i];j:=1; 10) Repeat 11) i:=i+1; 12) If (s[i]=s[i-1]) then j:=j+1 13) Else 14) Begin 15) If j>1 then 16) Begin 17) Str(j,s2); 18) Insert(s2,s1,length(s1));
19) j:=1; 20) End; 21) s1:=s1+s[i]; 22) End;
23) Until (i>length(s));
24) Writeln(' nen s vao s1=',s1); 25) {giai nen s1 vao s2}
26) i:=0; s2:=''; s:=''; 27) Repeat
28) i:=i+1;
29) If (s1[i] in ['0'..'9']) then s:=s+s1[i] 30) Else 31) Begin 32) If s<> '' then 33) begin 34) Val(s,j,code); 35) For k:=2 to j do s2:=s2+ s1[i]; 36) s:=''; 37) end; 38) s2:=s2+s1[i]; 39) End;
40) Until (i>= length(s1));
41) Write(' giai nen s1 vao s2=',s2); 42) Readln;
43) End.
(!) : Sai lầm của học sinh trong bài trên là:
Khi dịch chơng trình con chạy sẽ dừng ở dòng 35. Với lời nhắc:
ERROR 3: Unknown Identifier, lỗi này nghĩa là: Lỗi 3: Không hiểu định danh này hay nói cách khác là tên biến này cha đợc khai báo. Lỗi này xảy ra khi các em làm bài do không đọc kỹ bài ra để dự tính cần bao nhiêu biến mà khai báo. Cho nên khi tính toán cần thì đa vào, nhng không nhớ quay lại khai báo thêm.
Để khắc phục lỗi này các em quay lại dòng 4 khai báo thêm biến k. Sau đó dịch tiếp hết lỗi TP thông báo dịch thành công.
Bài 1.2: Cho trớc số tự nhiên n. Hãy đếm số phần tử dơng của mảng A=(aij ) kích thớc n x n với:
a) aij = sin(i+j/2);
b) aij = cos(i*i+n); c) aij = sin[( i*i-j*j)/n]
Số n nhập từ bàn phím. Kết quả thể hiện trên màn hình. Chơng trình minh hoạ bằng TP:
(?) 1) Program Dem_so; 2) Uses Crt;
3) Var a,b,c:array[1..50,1..50] of real; 4) n,i,jj,d1,d2,d3,dem:integer; 5) Begin
6) Clrscr;
7) Write(' Nhap kich thuoc cua mang vuong: n='); readln(n); 8) For i:=1 to n do 9) For j:=1 to n do 10) Begin 11) Write('a[',i,',',j,']='); readln(a[i,j]); 12) end; 13) For i:=1 to n do 14) For j:=1 to n do 15) Begin 16) a[i,j]:=sin(i+j/2); 17) b[i,j]:=cos(i*i+n); 18) c[i,j]:=sin((i*i-j*j)/n); 19) end; 20) d1:=0; d2:=0; d3:=0; dem:=0; 21) For i:=1 to n do 22) For j:=1 to n do 23) begin 24) if a[i,j]>0 then d1:=d1+1; 25) if b[i,j]>0 then d2:=d2+1; 26) if c[i,j]>0 then d3:=d3+1; 27) end;
28) Writeln('a. so phan tu duong la:',d1); 29) Writeln('b. so phan tu duong la:',d2); 30) Writeln('c. so phan tu duong la:',d3); 31) Readln;
32) End.
(!) : Khi dịch chơng trình phạm phải một số sai lầm sau: Con chạy sẽ dừng ở đầu dòng 9 với lời nhắc :ERROR 3: Unknown Identifier. Nghĩa là lỗi 3: Tên cha đợc khai báo. Lỗi này xảy ra do dòng 4 khai báo với tên jj mà ở dòng 9 lại dùng tên j. Ta chuyển lên dòng 4 chữa lại jj thành j.
Chơng trình sau khi dịch hết lỗi, TP thông báo dịch thành công. Nh- ng ở đây các em đã phạm một lỗi đó là do không tìm hiểu đề kỹ càng, nên dẫn tới tình trạng khai thừa biến. Điều đó có nghĩa là máy vẫn phải cấp phát ô nhớ cho các biến này, nh thế là ta đã lãng phí bộ nhớ. Mà điều ta cần là một chơng trình chạy tốt nhng phải tiết kiệm đợc bộ nhớ. Lỗi này thờng không đợc máy phát hiện, không thông báo lỗi, để khắc phục hiện t- ợng này ta cần lu ý khi đa ra các trờng hợp khai báo thừa để các em có thể nắm vững cách tổ chức của máy tính. Và lu ý các em nên viết xong CT rồi trở lên phần khai báo các biến đó.
2.2.1.2: Lỗi chính tả:
Đây là lỗi mà các em thờng hay mắc phải, một phần do không nhớ câu lệnh cụ thể, một phần cũng có thể do khi nhập văn bản vào máy các em đã gõ sai, lỗi này xảy ra với tần số cao ở các em mới học lập trình bằng ngôn ngữ Turbo pascal. Sau đây là một số chơng trình minh hoạ cho lỗi này, nhng chỉ một số lỗi thờng gặp nhất chúng tôi đề cập đến.
Bài 2.1: Vẽ hệ trục toạ độ và đồ thị hàm số: y= x2 với đầy đủ chú thích.
Chơng trình viết bằng ngôn ngữ Turbo Pascal: (?) 1) Program Do_thi;
2) uses crt, graph;
3) const x0=320; y0=300; e=50; 4) var Gd, Gm,i,j,k:integer; 5) x,y:real;
6) s:string; 7) Begin
8) Gd:=detect; 9) initgraph(Gd,Gm,'C:\BP\BGI'); 10) line (100,y0,550,y0); 11) outextxy(450,y0*10,'x'); 12) for k:=-3 to 3 do 13) begin 14) i:= k*e+x0; 15) j:=y0; 16) str(k,s); 17) outtextxy( i-10,j+8,s); 18) bar (i-1, j-1, i+1,j+1); 19) end;
20) Line(x0,50,x0,370); 21) Outtext xy( x0-20, 50,'y'); 22) for k:=-1 to 4 do 23) begin 24) i:=x0; j:=-k*e+y0; 25) str(k,s); 26) if k<>0 then outtextxy(i-20, j,s); 27) bar(i-1,j-1,i+1,j+1); 28) end;
29) for i:=x0-2*e to x0+2*e do 30) begin
31) x:=(i-x0)/e; y:=sqr(x); 32) j:= ruond(-y *e+ y0); 33) putpixel(i,j,10); 34) end;
35) setextstyle(1,0,2);
36) outtextxy(100,400, 'do thi ham so y= sqr(x):'); 37) Readln;
38) Closegraph; 39) End.
1) Con chạy sẽ dừng ở đầu dòng 11 với lời nhắc:ERROR 3: