Sáng kiến kinh nghiệm Một số kinh nghiệm khi dạy lập trình Pascal

doc 23 trang sk11 18/07/2024 870
Bạn đang xem 20 trang mẫu của tài liệu "Sáng kiến kinh nghiệm Một số kinh nghiệm khi dạy lập trình Pascal", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

Tóm tắt nội dung tài liệu: Sáng kiến kinh nghiệm Một số kinh nghiệm khi dạy lập trình Pascal

Sáng kiến kinh nghiệm Một số kinh nghiệm khi dạy lập trình Pascal
 BÁO CÁO KẾT QUẢ
 NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN
 1. Lời giới thiệu
 Ngày nay Công nghệ thông tin (CNTT) thúc đẩy mạnh mẽ cuộc đổi mới trong 
giáo dục, tạo ra công nghệ giáo dục (Educational Technology) với nhiều thành tựu 
rực rỡ. CNTT làm thay đổi nội dung, hình thức và phương pháp dạy học một cách 
phong phú. Trong thời đại thông tin bùng nổ ngày nay, việc lập được các chương 
trình tự hoạt động cho máy tính, máy gia dụng là cần thiết. Và để làm được việc 
đó cần có một quá trình nghiên cứu, học tập về ngôn ngữ lập trình lâu dài, qua đó 
nhà lập trình có thể chọn một ngôn ngữ lập trình thích hợp. 
 Tin học là một môn học mới ở các trường phổ thông nên học sinh còn nhiều 
bỡ ngỡ khi tiếp cận với môn học này. Nội dung tin học lập trình lớp 11 là một nội 
dung 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à học sinh mới được tiếp xúc lần đầu. 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 giải 
trong tin học. 
 Tuy nhiên mọi thứ điề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. 
 Trong quá trình 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 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 sai 
chắ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 
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 sinh vẫ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ánViết chương trình
 Ví dụ: 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ình bà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.
 Giữ 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.
 7.1.1.2. Bài tập về đọc hiểu chương trình 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.
 Chương trình trên cho đáp số lúc đúng, lúc sai tuỳ thuộc vào a,b,c. Hãy giải 
thích tại sao và sửa lại cho đúng.
 Ta thực hiện chương trình trên với 2 bộ input sau đây:
 - a=3,b=4,c=5
 a B c a< a<
 b c
 3 4 5 T 
 (3<4)
 4
 Vậy số lớn nhất là 4 Kết quả sai
 - a=5,b=4,c=7
 a B c a< a<
 b c
 5 4 7 F T 
 (5<4) (5<7)
 7
 Vậy số lớn nhất là 7 Kết quả đúng
 Chươ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: 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áo 
biế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ộc 
kiểu string; j có thể thuộc kiểu real,
 7.1.1.5. Trình bày thuật toán, yêu cầu học sinh viết chương trình theo đúng 
 thuật toá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ủa 
ngườ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 đã được 
trao đổi. Khả năng hiểu được nhanh ý tưởng của người khác cũng chính là yêu cầ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ủa 
ngườ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ết 
tinh 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; 
 sai thì đến bước 8. Tuy nhiên bài toán trên ngoài cách giải trên ta có thể sử dụng thuật toán khác 
để giải. Thuật toán như sau:
 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.
 7.1.1.6. 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ếu só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:
 I:=1; dem:=0;
 While i<=length(xau) do
 Begin
 If (xau[i]>= ‘0’) and (xau[i]<= ‘9’) then
 Begin
 xauM:= ‘’;
 while (xau[i]>= ‘0’) and (xau[i]<= ‘9’) do
 begin
 xauM:=xauM+xau[i];
 i:=i+1;
 end;
 dem:=dem+1; (Một số có n chữ số trong một hệ đếm nào đó được gọi là đối xứng nếu chữ 
số thứ 1 giống với chữ số thứ n, chữ số thứ 2 giống với chữ số thứ n - 1, ... ). 
 Sau đó cảnh sát nhận được thêm thông tin: số biển số là một số nguyên tố. 
Cảnh sát dựa vào dự đoán của một chuyên gia tin học đưa ra sau khi phân tích các 
nguồn tin và xác định tập các số có thể là số của biển số: biển số nếu viết trong hệ 
nhị phân cũng là một số đối xứng. Nhờ vậy mà cảnh sát đã bắt đúng đối tượng. 
Hãy cho biết các số mà chuyên gia tin học đã xác định mà số biển xe mà ông ta đã 
dự đoán đúng.
 Ý tưởng:
 Có thể có nhiều cách giải khác nhau nhưng tất cả đều cần phải giải quyết các 
vấn đề:
 - Kiểm tra xem một số có là số nguyên tố hay không?
 - Tìm dạng biểu diễn nhị phân của một số.
 - Kiểm tra một số có là đối xứng không?
 - Chọn các số đối xứng (trong hệ thập phân) thích hợp để kiểm tra.
 Chương trình:
 PROGRAM BienSo;
 Uses crt;
 Var m,i,j,k,n,l:integer;
 a,b: array[1..14] of integer;
 Procedure ChuyenMa(i:integer);
 Begin
 i:=0;
 while i0 do
 begin
 i:=i+1;
 a[i]:=i mod 2; BEGIN
 clrscr;
 b[1]:=1; b[2]:=3;
 b[3]:=7; b[4]:=9;
 for m:=1 to 4 do
 for k:=0 to 9 do
 begin
 n:=101*b[m] + 10*k;
 if ngto(n) then
 begin
 chuyenma(n);
 if doixung then
 begin
 write('Bien so can tim: ',n:5,' Ma nhi phan la ');
 for j:=1 to l do write(a[j]:2);
 writeln;
 end
 else
 writeln('So ngto doi xung nhung ma nhi phan khong doi xung 
',n:5);
 end;
 end;
 END.
 7.1.2.2. Quan hệ 
 Có N người mang tên tương ứng là 1, 2, ..., N và tình trạng quen biết của N 
người này được cho bởi mảng đối xứng A[1..N,1..N] trong đó A[i,j] = A[j,i] = 1 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ặp 
rỗng không làm việc gì cả.
 3. 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;
 Begin
 Write(‘nhap day so:’);
 For i:=1 to 7 do
 Begin
 Write(‘a[’ ,i, ‘]’);
 Readln(a[i]);
 End;
 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ết 
quả khi thực hiện chương trình sẽ bị sai lệch. Khi thực hiện từng bước chương 
trì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 đếm 
i=2. Để khắc phục lỗi này, chỉ cần chú ý các vòng lặp lồng nhau phải sử dụng 
biến điều khiển khác nhau.
 6. 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.
 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ên họ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ộ.
 Function GT(n:integer):Longint;
 Var i:integer;
 Begin
 For i:=2 to n do GT:=GT*i;
 End;
 Trong thân hàm đã sử dụng tên hàm làm biến cục bộ nên khi biên dịch sẽ báo 
lỗi gọi hàm nhưng thiếu tham số do chương trình hiểu GT:=GT*i là lời gọi đệ qui.
 Để 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. Không hiểu nguyên tắc làm tròn số đối với số thực.
 3 1 1 1
 Trong toán học: 
 2 2 2 2
 Tuy 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!’) else 
write(‘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ên nhâ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:

File đính kèm:

  • docsang_kien_kinh_nghiem_mot_so_kinh_nghiem_khi_day_lap_trinh_p.doc