TỔ CHỨC THỰC HIỆN TẠI ĐỊA PHƯƠNG
C. Phản biện bộ câu hỏi của người khác
II. Hiểu câu lệnh rẽ nhánh
1. Một người đã viết chương trình trên máy tính để nhập vào 2 số nguyên a, b (với b khác 0) máy thông báo xem a có chia hết cho b hay không như dưới đây.
Program Vidu;
Uses Crt ;
Var a , b : Word ; Begin
ClrScr ; Wrieln (‘ Nhap vao 2 so nguyen ‘ ); Readln (a , b ) ;
IF a mod b = 0 Then Writeln ( a , ‘ khong chia het cho
’ , b )
Else Writeln ( a , ‘ chia het cho ’ , b ) ; Readln
End.
1.1. Khi thực hiện chương trình nhập vào theo thứ tự từ trái qua phải hoặc từ trên xuống dưới 10 và 2 thì trên màn hình sẽ xuất hiện câu thông báo như thế nào?
1.2. Theo em nguyên nhân nào dẫn đến sai lầm trên với một người soạn thảo chương trình bằng máy tính.
1.3. Hãy sửa lại câu lệnh rẽ nhánh dạng đủ
IF a mod b = 0 Then Writeln ( a , ‘ khong chia het cho
’ , b )
Else Writeln ( a , ‘ chia het cho ’ , b ) ;
ở chương trình trên để xóa bỏ lỗi thuật toán mà người soạn thảo chương trình đó đã mắc phải.
Ý tưởng sư phạm
Đây là tình huống đơn giản nhưng rất hay. Nó giúp chúng ta đề cập đến được rất nhiều vấn đề về kiến thức, kĩ năng, thái độ.
Mục 1.1 là nhằm vào hoạt động nhận dạng.
HS phải sử dụng kiến thức hiểu biết về câu lệnh rẽ nhánh dạng đủ. Biệt được cú pháp và hoạt động của nó. Đâu là điều kiện, đâu là câu lệnh 1, đâu là câu lệnh 2. Cách in lên màn hình giá trị của biểu thức, văn bản thông báo trong cùng một lệnh writeln. Vì 10 mod 2 = 0 là đúng nên máy thực hiện câu lệnh sau từ khóa Then vì thế mà máy thông báo lên màn hình 10 không chia hết cho 2.
Điều đó cho HS biết: Máy chỉ phát hiện được lỗi cú pháp, không thể phát hiện lỗi thuật toán. Khi không có lỗi cú pháp thì máy thực hiện chương trình như "Thiên lôi chỉ đâu đánh đấy".Vì vậy bước kiểm thử chương trình là không thể bỏ qua. Nói cách khác máy có thông minh hay không là do người lập trình có thông minh hay không.
Mục 1.2 là thực hiện mục tiêu thái độ.
Vì soạn thảo trên máy tính nên người đó có thể đã copy lệnh Writeln ( a , ‘ chia het cho ’ , b ) ở dòng trên xuống dòng dưới sau đó lẽ ra phải thêm chữ "khong" vào dòng dưới thì họ lại sơ ý thêm vào dòng trên. Điều đó nhắc nhở HS phải tập trung khi làm việc, nhất là làm việc với máy tính.
Việc sơ ý dẫn đến sai lầm như trên là có lí do của nó. "Không ai nắm tay từ sáng đến tối". Vì vậy trước một sai lầm của ai đó thì chúng ta nên tìm hiểu nguyên nhân dẫn đến
sai lầm để phán xét cho thấu tình đạt lý. Nếu các em chấm điểm cho bạn soạn chương trình trên máy tính mà gặp trường hợp như trên thì chỉ trừ ít điểm cho sai lầm đó mà không nên cho điểm 0 vì rất nhiều chỗ của chương trình là đúng. Qua đây chúng ta muốn giáo dục nhân sinh quan cho HS.
Mục 1.3 là nhằm vào hoạt động thể hiện và nhằm vào mục tiêu thái độ.
GV khoanh vùng chỉ sửa câu lệnh rẽ nhánh dạng đủ mà không nói một cách chung chung là sửa chương trình để không mất thời gian vào những chỗ sửa không cần thiết.
Chẳng hạn sửa khai báo biến kiểu word thành kiểu integer hoặc đặt lại tên chương trình biểu đạt ý nghĩa công việc giao cho máy hay thêm phần kiểm tra b khác không.
Việc chúng ta chỉ yêu cầu hãy sửa lại câu lệnh mà không nói tìm nhiều cách sửa lại câu lệnh là có ý tưởng sư phạm như sau:
Đa số HS chỉ sửa lại hai lệnh writeln bỏ chữ "khong" ở trên, thêm chữ "khong" ở dưới là xong để có kết quả đúng như sau (chúng tôi tạm gọi đây là cách 1)
Cách 1.
IF a mod b = 0 Then Writeln ( a , ‘ chia het cho ’ , b ) Else Writeln ( a , ‘ khong chia het cho ’ , b ) ;
Sau đó họ hài lòng và thỏa mãn với công việc đã làm của mình. Họ không bận tâm xem có còn cách nào khác ít ra là công việc sửa lại nhanh hơn.
Sau đó nếu có HS đưa ra cách khác thì tốt, nếu không thì lúc này GV mới hỏi có còn cách nào khác nữa hay không?
Vì Chúng ta chỉ yêu cầu sửa câu lệnh rẽ nhánh ở chương trình trên nên HS chỉ tập trung vào 3 thành phần của câu lệnh là điều kiện, câu lệnh 1, câu kệnh 2. Cách 1 đã sửa câu lệnh 1 và câu lệnh 2. Do đó họ sẽ tập trung vào điều kiện trong câu lệnh. Chắc chắn có HS chỉ thay đổi phép toán quan hệ trong điều kiện (thay dấu = bằng dấu <>) như sau:
Cách 2
IF a mod b <> 0 Then Writeln ( a , ‘ khong chia het cho ’ , b )
Else Writeln ( a , ‘ chia het cho ’ , b ) ;
Sau đó nếu có HS đưa ra cách khác nữa thì tốt, nếu không thì lúc này GV lại hỏi có còn cách nào khác nữa hay không?
Chúng ta mong muốn có HS thay đổi biểu thức quan hệ thành biểu thức logic ở điều kiện bằng việc chỉ cần thêm phép toán logic NOT vào trước biểu thức quan hệ như sau:
Cách 3
IF Not a mod b = 0 Then Writeln ( a , ‘ khong chia het cho ’ , b )
Else Writeln ( a , ‘ chia het cho ’ , b ) ;
Như vậy cách 2 và 3 đỡ tốn công sửa hơn cách 1. Nhưng điều quan trọng hơn đáng bàn ở đây có tính triết lý, căn nguyên của sự việc là như sau:
HS chỉ dừng lại ở cách 1 là tâm lý của họ sai đâu sửa đấy. Đó cũng là cách nghĩ một chiều theo thói quen cố hữu của nhiều người. Chương trình sai ở khâu thông báo nên họ sửa thông báo là được rồi. Do không được thường xuyên nhắc nhở tìm nhiều cách giải quyết một vấn đề nên HS thường thỏa mãn với kết quả hoàn thành công việc theo yêu cầu. Họ không có thói quen phê phán, nhận xét, xem xét một sự việc dưới những góc độ khác nhau, Nếu nói câu lệnh rẽ nhánh là phản ánh qui luật nguyên nhân dẫn đến kết quả trong đời sống xã hội cũng như trong thế giới tự nhiên thì cách 1 là sửa kết quả, sửa phần ngọn. Cách 2 và cách 3 là sửa phần gốc, sửa cái nguyên nhân sinh ra cái sai, thế mới là
triệt để, là căn bản, là đi đến tận cùng gốc rễ của sự vật, sự việc.
Qua việc sửa sai như trên chúng ta đã kích hoạt được ở HS những tố chất quan trọng sau đây:
- Phương pháp tư duy, phong cách làm việc của người tìm tòi, sáng tạo, năng động.
- Không bằng lòng với kết quả hiện có, không dừng lại ở thành thích đã đạt được.
- Nhìn toàn bộ sự vật, hiện tượng rồi đi sâu vào bản chất của từng chi tiết để tìm hiểu cho cặn kẽ rồi đề ra các phương án giải quyết vấn đề.
- Không làm việc qua loa, chiếu lệ, không bỏ sót bất kì một khả năng nào có thể xảy ra.
Như vậy HS được rèn luyện kĩ năng sửa chữa chương trình.
2. Một người đã viết chương trình tìm số lớn nhất trong 3 số như sau:
Program TimMaxBaSo ; Uses Crt ;
Var a , b , c , max : Integer ; Begin
ClrScr ; Wrieln (‘ Nhap vao 3 so nguyen ‘ ); Readln (a , b , c ) ;
Max := a ;
IF max < b Then max := b
Else IF max < c Then max := c ;
Writeln ( ‘ So lon nhat la ‘, max );
Readln End.
2.1. Tìm chỗ sai và giải thích tại sao sai trong chương trình tìm số lớn nhất trong 3 số ở trên, cho 3 số cụ thể để minh họa.
2.2. Hãy sửa lại đoạn chương trình IF max < b Then max := b
Else IF max < c Then max := c ;
của chương trình trên để có được tính đúng đắn của chương trình.
Ý tưởng sư phạm
(i) Khắc sâu hoạt động của lệnh rẽ nhánh dạng đủ bao giờ cũng có một câu lệnh được thực hiện và chỉ một mà thôi. Nếu điều kiện đúng thì thực hiện câu lệnh 1 bỏ qua câu lệnh 2, ngược lại thực hiện câu lệnh 2 bỏ qua câu lệnh 1.
(ii) Cho HS thực hiện hoạt động nhận dạng và thể hiện. Cho HS thấy khi nào thì bắt buộc phải dùng lệnh rẽ nhánh dạng khuyết.
Chúng ta chờ đợi HS sửa lại bằng việc dùng 2 lệnh rẽ nhánh dạng thiếu như sau:
IF max < b Then max := b ; IF max < c Then max := c ;
(iii) GV giúp HS khái quát phương pháp tìm max của 3 số lên phương pháp tìm max của nhiều số.
GV cho HS tập trung vào đoạn trình max := a ;
IF max < b Then max := b ; IF max < c Then max := c ;
và nói đây là đoạn trình tìm max của 3 số a, b, c, nếu bây giờ phải tìm max của 4 số a, b, c, d thì các em sẽ thêm lệnh nào? HS dễ dàng nói thêm lệnh
IF max < d Then max := d ;
GV cho HS trình bày miệng tìm max của 5 số A1, A2, A3, A4, A5.
HS buộc phải bắt đầu từ gán A1 cho max bằng lệnh max := A1 rồi sau đó tiếp tục If max < A2 Then max := A2;
If max < A3 Then max := A3;
If max < A4 Then max := A4;
If max < A5Then max := A5;
Rất có thể có HS nói max := A1;
If max < A2 Then max := A2; rồi sau đó tiếp tục tương tự cho các A3 đến A5 còn lại Từ đó GV khái quát cho HS qui trình tìm max cho N số A1, A2, …, An
Bắt đầu là gán số đầu tiên cho max, sau đó lần lượt so sánh max với các số còn lại từ số thứ hai đến số cuối cùng (thứ N) nếu max nhỏ hơn số nào đó thì gán số đó cho max.
Chú ý.(i) Qui trình tìm max của N số như trên giúp HS nhớ lại thuật toán đã được học trước đây ở trang43 và giúp HS hiểu chương trình sau này họ sẽ học ở trang 78 tìm phần tử lớn nhất của mảng 1 chiều.
(ii) Việc GV giúp HS khái quát từ cái cụ thể đến cái chung là cần thiết, chúng ta làm cho vốn kiến thức, kinh nghiệm của HS đã được trang bị trở nên dễ nhớ, dễ liên tưởng và biết cách sử dụng linh hoạt vào các tình huống cụ thể. Rèn luyện kỹ năng khái quát cho HS.