I. PHẦN MỞ ĐẦU Nội dung tin học lập trình lớp 11 là một nội dung khá mới lạ đối với đa số học sinh với nhiều khái niệm, thuật ngữ, cấu trúc dữ liệu mới. Mặc dù đã được học ở chương trình lớp 8, tuy nhiên các em chưa đi sâu vào kiến thức cũng như nội dung của chương trình tin học 11. Chính vì vậy mà học sinh dễ mắc sai lầm khi lập trình giải quyết các bài toán. Nguyên nhân dẫn đến những khó khăn mà học sinh thường gặp là rất phong phú nhưng có thể thấy một số nguyên nhân chính sau đây: + Học sinh thường gặp khó khăn khi xác định bài toán. + Khó liên hệ phương pháp giải một bài toán trong toán học với thuật toán trong tin học. Tuy nhiên mọi thứ đều có điểm khởi đầu của nó, với học sinh việc học ngôn ngữ lập trình Turbo Pascal là khởi đầu cho việc tiếp cận ngôn ngữ lập trình bậc cao, qua đó giúp các em hình dung được sự ra đời, cấu tạo, hoạt đông cũng như ích lợi của các chương trình hoạt động trong máy tính, các máy tự động… Qua đó giúp các em có thêm một định hướng, một niềm đam mê về tin học, về nghề nghiệp mà các em chọn sau này. Do gặp phải những khó khăn trên nên khi lập trình giải các bài toán học sinh thường mắc rất nhiều lỗi, thậm chí có những lỗi các em mắc phải nhiều lần do không hiểu nguyên nhân xuất hiện lỗi. Tuy vậy, đối với đối tượng học sinh khá giỏi, đa phần các em rất hào hứng với việc học lập trình, cụ thể là ngôn ngữ lập trình Turbo Pascal. Do đó trong đề tài này tôi cũng trình bày thêm một số lưu ý cũng như kinh nghiệm dạy lập trình Pascal đề giúp học sinh có thể hiểu bài một cách nhanh chóng, nắm chắc kiến thức và kĩ năng lập trình Pascal và một số ví dụ mở rộng, nâng cao với đối tượng học sinh này. Xuất phát từ cơ sở trên, tôi đã chọn đề tài “Một số lỗi thường gặp khi dạy lập trình Pascal Tin học lớp 11”.
Trang 1I PHẦN MỞ ĐẦU
Nội dung tin học lập trình lớp 11 là một nội dung khá mới lạ đối với đa sốhọc sinh với nhiều khái niệm, thuật ngữ, cấu trúc dữ liệu mới Mặc dù đã đượchọc ở chương trình lớp 8, tuy nhiên các em chưa đi sâu vào kiến thức cũng nhưnội dung của chương trình tin học 11 Chính vì vậy mà học sinh dễ mắc sai lầmkhi lập trình giải quyết các bài toán Nguyên nhân dẫn đến những khó khăn màhọc sinh thường gặp là rất phong phú nhưng có thể thấy một số nguyên nhânchính sau đây:
+ Học sinh thường gặp khó khăn khi xác định bài toán
+ Khó liên hệ phương pháp giải một bài toán trong toán học với thuật toántrong tin học
Tuy nhiên mọi thứ đều có điểm khởi đầu của nó, với học sinh việc học ngônngữ lập trình Turbo Pascal là khởi đầu cho việc tiếp cận ngôn ngữ lập trình bậccao, qua đó giúp các em hình dung được sự ra đời, cấu tạo, hoạt đông cũng nhưích lợi của các chương trình hoạt động trong máy tính, các máy tự động… Qua đógiúp các em có thêm một định hướng, một niềm đam mê về tin học, về nghềnghiệp mà các em chọn sau này
Do gặp phải những khó khăn trên nên khi lập trình giải các bài toán họcsinh thường mắc rất nhiều lỗi, thậm chí có những lỗi các em mắc phải nhiều lần
do không hiểu nguyên nhân xuất hiện lỗi Tuy vậy, đối với đối tượng học sinh khágiỏi, đa phần các em rất hào hứng với việc học lập trình, cụ thể là ngôn ngữ lậptrình Turbo Pascal Do đó trong đề tài này tôi cũng trình bày thêm một số lưu ýcũng như kinh nghiệm dạy lập trình Pascal đề giúp học sinh có thể hiểu bài mộtcách nhanh chóng, nắm chắc kiến thức và kĩ năng lập trình Pascal và một số ví dụ
mở rộng, nâng cao với đối tượng học sinh này
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “Một số lỗi thường gặp khi dạylập trình Pascal Tin học lớp 11”
Trang 2II NỘI DUNG
2.1 Thời gian thực hiện:
Từ năm học 2014 – 2015 đến năm học 2016 – 2017.
2.2 Đánh giá thực trạng:
2.2.1 Kết quả đạt được:
Bảng số liệu kết quả đạt được của học sinh trường THPT khối 11 năm học
2016 - 2017 khi chưa thực hiện đề tài:
Khi thực hiện thực nghiệm qua các đối tượng học sinh đã nêu trên, đa số các
em tránh được các lỗi thường gặp khi học lập trình Pascal
Một số không ít học sinh có tiến bộ rõ rệt khi viết các chương trình có sử dụnglập trình có cấu trúc
Nâng cao việc yêu thích học tin học đối với một bộ phận học sinh và một số
em có định hướng nghề nghiệp sau này
Bảng số liệu kết quả đạt được của học sinh trường THPT khối 11 năm học2016-2017 sau khi thực hiện đề tài:
Lớp
Số học sinh khảo sát
Kết quả từ TB trở lên Trước khi thực
hiện đề tài
Sau khi thực hiện đề tài
Trang 3đề tìm kiếm tài liệu, thực hành trên máy vi tính còn hạn chế.
Sách tham khảo phục vụ cho việc dạy và học môn Tin học ở nhà trườngchưa được nhiều và phong phú Học sinh chỉ có sách giáo khoa, sách bài tập cònsách tham khảo thì hầu như rất ít em có
Đây là môn học không có trong kỳ thi THPT Quốc gia nên các em ít quantâm, đầu tư cho môn học Với tâm lí thông thường các em học sinh coi tin học làmôn phụ không quan trọng nên nhiều em chủ quan không dành đủ thời gian đểhọc nên không hiểu bài và dần bị mất căn bản Đây cũng là lí do mà nhiều em bịđiểm kém, thậm chí là thi lại, học lại bộ môn tin học mặc dù có thể các em học rấtgiỏi các môn học khác
Thời lượng dành cho môn học ít, theo phân phối chương trình của phương
án 1 thì học kỳ I là 2 tiết/ tuần, còn học kỳ II là 1 tiết/tuần
Theo thói quen của nhiều em học sinh, học môn tin là học những thao tác sửdụng như cách sử dụng internet, sử dụng hệ điều hành window, chương trình soạnthảo văn bản MS Word, chương trình soạn thảo trình diễn MS PowerPoint…Đây
là những phần học không cần đòi hỏi tư duy, mà chỉ cần học kĩ và nhớ thao tác,thực hành nhiều lần thì sẽ thành thạo
Nhưng khi học bộ môn lập trình Passal thì hầu như các em bị “choáng” vì bộmôn rất “mới”, và cách học cũng “mới” Học những thao tác và thực hành nhiềukhông còn tác dụng, học thuộc bài cũng không còn ổn nữa Lúc này các em cầnphải học cách tư duy logic, tìm thuật toán, và viết những dòng lệnh chính xác đếntừng đấu chấm, dấu phẩy
2.2.3 Nguyên nhân đạt được và nguyên nhân hạn chế:
Trang 4- Nguyên nhân đạt được:
+ Về cơ sở vật chất: Nhà trường có hai phòng máy vi tính với số lượngmáy là năm mươi máy trong đó có ba mươi máy mới, cấu hình chạy nhanh.Phòng máy lúc nào cũng được dọn vệ sinh sạch sẽ, thoáng mát nên giờ thực hànhcác em rất hứng thú Đặc biệt nhà trường có 2 máy chiếu Projector, 1 phòng dạyhọc có bảng tương tác phục vụ cho việc giảng dạy, giúp cho bài dạy sinh độnghơn thông qua hình ảnh, âm thanh, học sinh tiếp thu bài học nhanh hơn Trườngmới được xây dựng khang trang, học sinh phấn khởi học tập, cùng với sự quantâm, giúp đỡ của Ban giám hiệu Có thư viện phục vụ cho việc học tập của thầy
và trò
+ Nhờ sự nổ lực không ngừng của giáo viên cũng như học sinh
+ Giáo án có đổi mới, đặc biệt là các tiết dạy có giáo án tích hợp, các tiếtdạy học đổi mới giúp bài dạy sinh động hơn, dễ hiểu hơn, học sinh học tập tíchcực hơn, giáo viên cho học theo nhóm, học sinh có thể trao đổi và chỉ dẫn chonhau, làm cho các em có sự đoàn kết, giúp đỡ nhau nên gây hứng thú, ham thíchhọc hơn
- Nguyên nhân hạn chế:
+ Vì đây là môn phụ nên các em không quan tâm, đầu tư, sách tham khảo
ít, các em học đối phó
+ Vì môn học này không phải là môn để các em có thể chọn thi THPT
Quốc gia nên cũng có phần nào hạn chế
+ Thời lượng dành cho môn học ít, thời gian quá hạn hẹp giáo viênkhông thể phân tích mở rộng vấn đề
Trang 5III GIẢI PHÁP THỰC HIỆN
3.1 Căn cứ thực hiện: Đảng và Nhà nước ta đã nhận thấy được tầm quan trọng
của ngành Tin học và đã đưa môn học này vào nhà trường phổ thông như nhữngmôn khoa học khác bắt đầu từ năm học 2006-2007
- Chỉ thị số 55/2008/CT- BGTĐT ngày 30/9/2008 của Bộ trưởng Bộ GDĐT
về tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông tin trong ngànhgiáo dục giai đoạn 2008-2011
- Điều 28.2 của Luật giáo dục đã nêu rõ: “Phương pháp giáo dục phổ thông phải phát huy tính tích cực, tự giác, chủ động, sáng tạo của học sinh, phù hợp với đặc điểm của từng lớp học, môn học; bồi dưỡng phương pháp tự học, rèn luyện
kỹ năng vận dụng kiến thức vào thực tiễn, tác động đến tình cảm, đem lại niềm vui, hứng thú học tập cho học sinh” Như vậy, chúng ta có thể thấy định hướng
đổi mới phương pháp dạy học đã được khẳng định, không còn là vấn đề tranhluận Cốt lõi của việc đổi mới phương pháp dạy học ở trường phổ thông là giúphọc sinh hướng tới việc học tập chủ động, chống lại thói quen học tập thụ động.Với một số nội dung trong đề tài này, học sinh có thể tự học, tự rèn luyện thôngqua một số bài tập, dạng bài tập cụ thể
3.2 Nội dung, giải pháp và cách thực hiện:
3.2.1 Nội dung, phương pháp: Viết sáng kiến kinh nghiệm thường xuyên liên
tục cũng là nhiệm vụ chính của mỗi giáo viên, nhưng cần phải lựa chọn phươngpháp nghiên cứu đúng đắn và phù hợp với nhà trường trung học phổ thông Sángkiến kinh nghiệm đang trình bày của tôi dựa theo các luận cứ khoa học hướng đốitượng, cụ thể: trực tiếp qua các bài dạy, thuyết trình, quan sát, điều tra cơ bản,phân tích kết quả thực nghiệm sư phạm, v.v… phù hợp với bài học và môn học.Sau đây là một số nội dung thể hiện một số lỗi sai của học sinh thường gặp phảitrong lập trình Pascal
* Một số lỗi sai thường gặp của học sinh trong lập trình Pascal:
1) Khai báo sai miền chỉ số cho dữ liệu kiểu mảng.
Trang 6Ví dụ 1: Nhập vào một mảng số nguyên gồm các số lớn hơn 3 và nhỏ hơn
100 In mảng vừa nhập
Học sinh khai báo mảng như sau:
Var a: array[3 100] of integer;
2) Giá trị biến điều khiển vượt quá miền chỉ số của mảng.
Ví dụ 2: Nhập vào một dãy số gồm 7 phần tử và cho biết dãy vừa nhập có
tạo thành cấp số cộng không?
Học sinh lập trình giải bài toán trên như sau:
Var a: array[1 7] of integer; i,d: integer ;kt: boolean;
d:=a[2]-a[1]; kt:=true; i:=1;
while (kt) and (i<=7) do
if (a[i]-a[i-1]<>d) then kt:=false
else i:=i+1;
if kt then writeln(‘Day so tao thanh cap so cong!’)
else writeln(‘Day so khong tao thanh cap so cong!’);
readln
End.
Khi thực hiện chương trình trên, chương trình dịch không báo lỗi nhưng kếtquả khi thực hiện chương trình sẽ bị sai lệch Khi thực hiện từng bước chươngtrình ta có thể khắc phục lỗi trên bằng cách gán lại giá trị ban đầu cho biến đếmi=2
Trang 73) Dùng cùng tên biến điều khiển cho các vòng lặp for lồng nhau.
- Trước Else không có dấu chấm phẩy
- Sử dụng dấu chấm phẩy sau từ khoá do trong các câu lệnh lặp câu lệnh lặprỗng không làm việc gì cả
5) Không phân biệt được hằng xâu và biến: học sinh cần phải chú ý hằng xâu
đặt trong cặp nháy đơn còn biến thì không cần đặt trong cặp nháy đơn
6) Tràn số do kết quả tính toán vượt quá giới hạn.
Trang 8Khi thực hiện chương trình GT(8)=-25126 là sai vì thực tế 8!=40320.
Lỗi này do khai báo hàm trả về số nguyên nên miền giá trị tối đa là 32767
7) Sử dụng tên hàm làm biến cục bộ.
Do lệnh trả kết quả cho tên hàm rất giống một lệnh gán bình thường nênhọc sinh thường nhầm tên hàm là biến cục bộ Vì vậy khi viết chương trình đểtiết kiệm biến cục bộ học sinh đã sử dụng tên hàm làm biến cục bộ
Để tránh lỗi này cần lưu ý với học sinh: để trả kết quả cho hàm (không
đệ quy), tốt nhất nên tính kết quả hàm vào một biến cục bộ, trước khi kết thúc
ta mới gán tên hàm bằng giá trị biến này để trả giá trị về cho hàm
8) Chưa hiểu thứ tự ưu tiên phép toán.
Thứ tự ưu tiên các phép toán trong ngôn ngữ lập trình Pascal như sau:
Trang 9Tuy nhiên trong Pascal biểu thức sau sẽ cho kết quả sai:
If 3/sqrt(2)=1/sqrt(2)+1/sqrt(2)+1/sqrt(2) then write(‘Dung!’) elsewrite(‘sai!’);
Khi thực hiện vế trái máy tính chỉ tính sai số 1lần, còn vế phải chịu sai số
3 lần Do đó kết quả khi thực hiện là không giống nhau Đây chỉ là 1 nguyênnhân khiến cho quá trình tính toán gần đúng trên máy tính thành tính toán sai
Để tránh điều này bạn nên tuân thủ theo các qui tắc dưới đây:
- So sánh bằng nên dùng biểu thức a b
Const e=0.0001;
….
If abs(a-b)<e then write(‘Dung!’) else write(‘sai!’);
- Quá trình tối ưu tính toán biểu thức của ngôn ngữ có thể làm ảnh hưởngđến kết quả của phép toán Trong Pascal chỉ ép được qua lại các kiểu nguyên
mà không cho ép từ kiểu thực sang kiểu nguyên và ngược lại Để chuyển từkiểu thực sang kiểu nguyên ta dùng hàm Round hoặc Trunc
Trang 10có thể nêu ra một số dạng như sau: bài tập về viết thuật toán, bài tập về đọc hiểuchương trình, bài tập về sửa lỗi chương trình,…
1.1 Bài tập về viết thuật toán:
Theo định nghĩa trong sách giáo khoa Tin học 10, thuật toán là một dãyhữu hạn các thao tác được sắp xếp theo một trình tự xác định, sao cho sau khithực hiện dãy thao tác ấy từ INPUT ta nhận được OUTPUT Nói cách khác, trìnhbày thuật toán tức là chỉ ra các bước cần thực hiện để đi đến kết quả
Việc trình bày thuật toán trước khi viết chương trình là hết sức quan trọng.Thuật toán đúng thì chương trình mới có khả năng đúng, còn một thuật toán saichắc chắn là cho một chương trình sai Tuy nhiên đối với phần lớn học sinh lớp
11 thường bỏ qua bước này do tâm lý học sinh không thích các loại bài tập nhưthế
Trong nhiều trường hợp tưởng như không cần thuật toán cụ thể học sinhvẫn viết được chương trình Thực tế thuật toán đó không được viết ra nhưng đãhình thành sẵn trong đầu người viết
Với đa số học sinh hiện nay, cần phải dành một lượng thời gian thích hợp
để rèn luỵên loại bài tập này Phải làm sao cho việc viết thuật toán trở thành kĩnăng để khi các em lập trình trên máy, tuy không cần viết thuật toán ra song các
em có thể hình dung được thuật toán đó trong đầu Cần phải tạo cho các em có ýthức khi viết một chương trình Pascal là phải tuân thủ theo trình tự sau:
Bài toán Xây dựng thuật toánViết chương trình
Ví dụ 1: Có n hộp có khối lượng khác nhau và một cái cân dĩa Hãy chỉ ra
cách cân để tìm được hộp nặng nhất.Với bài toán trong thực tế như trên ta có thểphát biểu lại dưới dạng bài toán trong toán học như sau: Cho tập hợp A có sốphần tử hữu hạn Tìm phần tử lớn nhất trong tập A nói trên Khi đó ta có thể trìnhbày thuật toán như sau:
1 Nếu chỉ có 1 hộp thì đó chính là hộp nặng nhất và kết thúc
2 Nếu số hộp n>1 thì
Chọn 2 hộp bất kì và đặt lên bàn cân
Trang 11Giữ lại hộp nặng hơn và cất hộp nhẹ đi chỗ khác.
3 Nếu không còn hộp chưa được cân thì chuyển sangbước 5, ngoài ra:Chọn một hộp bất kì và để lên dĩa cân còn trống
Giữ lại hộp nặng hơn, cất hộp nhẹ sang chỗ khác
4 Trở lại bước 3
5 Hộp còn lại trên cân là hộp nặng nhất và kết thúc
1.2 Bài tập về đọc hiểu chương trình:
Loại bài tập này sẽ giúp phát triển tư duy, giúp học sinh hiểu bài, nhất là khidạy các cấu trúc lệnh Đối với dạng bài tập này, giáo viên nên hướng dẫn các emthực hiện tuần tự từng lệnh theo từng câu lệnh cụ thể
Ví dụ 2: Cho biết kết quả khi thực hiện chương trình sau:
If (i mod 2)<>0 then i:=i*3+1
Else i:=i div 2;
Writeln(i);
End;
Readln;
End.
1.3 Bài tập về sửa lỗi chương trình:
Ví dụ 3: Để tìm số lớn nhất trong 3 số a,b,c được nhập vào từ bàn phím, có
người đã viết chương trình như sau:
Trang 12If a<c then a:=c;
Write(‘So lon nhat la: ’,a);
Trang 13Chương trình trên thực hiện lúc đúng lúc sai do chương trình mới chỉ so sánh
2 số a và b thôi đã đưa ra kết luận Ta có thể sửa lại chương trình như sau:
If a<c then a:=c;
Write(‘So lon nhat la: ’,a);
Readln;
End.
1.4 Bài tập về khai báo biến:
Ví dụ 4: Trong một chương trình đã chạy tốt, khi thực hiện không có lỗi có
Trang 14Kt:=Not(n mod i=0);
X:=1.5*j+i;
End;
Hãy viết phần khai báo biến cho đoạn chương trình trên
Với dạng bài tập này, ta căn cứ vào các câu lệnh đã cho để viết phần khai báobiến cho chương trình trên như sau:
Var n,i,j: integer;
X: real;
Kt: boolean;
ok: char; ch: string;
Tuy nhiên ta cũng có nhiều cách để khai báo biến ví dụ biến ok có thể thuộckiểu string; j có thể thuộc kiểu real,…
2) Trình bày thuật toán, yêu cầu học sinh viết chương trình theo đúng thuậttoán đó:
Một bài toán có thể có nhiều cách giải khác nhau ứng với mỗi cách giải ta cómột thuật toán Để giúp học sinh có khả năng nhanh chóng nắm được ý tưởng củangười khác cần luỵên cho các em biết giải bài toán theo một thuật toán đã đượctrao đổi Khả năng hiểu được nhanh ý tưởng của người khác cũng chính là yêucầu trong hoạt động nhóm Phát triển khả năng này là phát triển một phẩm chất tưduy quí báu để các em biết hợp tác trong công việc, một trong những yêu cầu củangười lao động, sáng tạo trong thời đại mới, thời đại mà một sản phẩm là sự kếttinh lao động của nhiều người
Ví dụ 5: Lập chương trình cắt bỏ các kí tự trống thừa của một xâu cho trước.
Hãy viết chương trình theo thuật toán sau:
- Bước 1: i:=1;Tword:= ‘’;XauM:= ‘’;
- Bước 2: Kiểm tra xau[i]<> ‘ ’ nếu đúng thì đến bước 3, sai đến bước 5
- Bước 3: Tword:=Tword+xau[i]
- Bước 4: Kiểm tra i<=length(xau) Đúng thì tăng i lên 1 và quay lại bước 2; saithì đến bước 8
Trang 15- Bước 5: kiểm tra Tword<> ‘’ Đúng thì xauM:=xauM+Tword+ ‘ ’ ; gánTword= ‘’ và quay lại bước 4 Sai thì chuyển đến bước 6.
- Bước 6: Kiểm tra Tword<> ‘’ Đúng thì gán xauM:=xauM+Tword; sai thì xoá
kí tự trống ở vị trí length(xauM) của xauM
for i:=1 to length(xau) do
if xau[i]<> ‘ ’ then Tword:=Tword+xau[i];
Trang 16- Bước 1: Xoá các kí tự trong thừa ở đầu.
Sử dụng vòng lặp while: while xau[1]= ‘ ’ do delete(xau,1,1);
- Bước 2: Xoá các kí tự trống ở cuối
Sử dụng vòng lặp while:
while xau[length(xau)]= ‘ ’ do delete(xau,length(xau),1);
- bước 3: xoá các kí tự trống thừa giữa các từ
Kiểm tra 2 kí tự liền kề nhau có hơn 1 kí tự trống thì xoá kí tự trống
While pos( ‘ ’,xau)<>0 do delete(xau,pos( ‘ ’,xau),1);
Học sinh có thể viết chương trình theo thuật toán 2
3) Giải bài toán trong một trường hợp riêng, yêu cầu học sinh phát hiện thiếusót để từ đó hoàn thiện chương trình:
Ví dụ 6: Viết chương trình đếm và in ra các số trong 1 xâu đã cho.
Cho đoạn chương trình giải quyết công việc trên như sau: