1. Mục đích, yêu cầu
• Biết khái niệm biến, hằng;
• Hiểu cách khai báo, sử dụng biến, hằng;
• Biết vai trò của biến trong lập trình;
2. Những điểm cần lu ý và gợi ý dạy học
Đây là bài tơng đối khó đối với HS. Cần lu ý nhấn mạnh một số điểm sau: Biến là đại lợng để lu trữ dữ liệu, có thể thay đổi giá trị của biến tại bất kì vị trí nào trong chơng trình. Muốn sử dụng biến thì phải khai báo, khi khai báo biến phải khai báo kiểu dữ liệu mà biến sẽ lu trữ. Biến chỉ có thể lu trữ đợc dữ liệu có kiểu thuộc kiểu của biến. Ngời lập trình tự đặt tên cho biến theo quy tắc của ngôn ngữ lập trình đang sử dụng. Có thể gán giá trị cho biến và tính toán với biến.
Hằng có khai báo là đại lợng để lu trữ dữ liệu cố định. Không đợc phép thay đổi giá trị của hằng trong chơng trình.
Bài này hoàn toàn có thể đợc tiến hành dạy học theo đúng trình tự nh trong SGK. Tuy nhiên, dới đây xin giới thiệu một cách tiến hành dạy học khác để GV tham khảo.
Vào đầu bài học GV có thể yêu cầu HS viết một chơng trình tính diện tích hình tròn có bán kính r = 2. Do HS đã đợc thực hành về viết biểu thức trong Pascal nên HS sẽ dễ dàng làm đợc bài này.
Begin
Write('Dien tich hinh troncoban kinh r=2 la: ', 3.14*2*2); readln;
end.
Với cách viết nh trên, nếu muốn tính diện tích của một hình tròn khác thì lại phải vào chơng trình để sửa lại. Nh vậy sẽ rất mất thời gian, đó là cha kể ngời sử dụng phải biết lập trình, hiểu chơng trình thì mới vào sửa chơng trình đợc. Việc đòi hỏi ngời sử dụng phải biết lập trình, sửa đợc chơng trình là không thực tế.
GV đa ra yêu cầu là cần viết một chơng trình cho phép ngời sử dụng nhập từ bàn phím bán kính của hình tròn, sau đó tính toán diện tích và hiển thị kết quả ra màn hình.
Nói chung HS cha đa ra đợc phơng án để giải quyết vấn đề này. GV cần đa ra một chơng trình thực hiện điều này để các em quan sát.
Var
R: Integer;
Begin
Write('Nhap ban kinh hinh tron R=: '); Readln(R); Write('Dien tich hinh tron la: ', 3.14*R*R); readln;
end.
Nếu dạy với máy tính, GV có thể cho chạy thử chơng trình này để HS quan sát sẽ hiệu quả hơn.
Dựa trên chơng trình này GV giới thiệu về biến nhớ, cách khai báo biến và sử dụng lệnh read() hoặc readln() để nhập giá trị biến từ bàn phím, cụ thể có thể giới thiệu nh sau:
Trong chơng trình đã sử dụng một công cụ hỗ trợ lập trình của PASCAL là biến nhớ R.
Var R: Integer;
là lệnh khai báo biến nhớ. Khi chạy chơng trình, đến lệnh này PASCAL dành một phần bộ nhớ và đặt tên cho phần bộ nhớ này là R - gọi tắt là ô nhớ R. Có thể hình
dung ban đầu ô nhớ R này cha chứa giá trị (nói đúng hơn là chứa một giá trị nào đó - tuỳ thuộc vào ngôn ngữ lập trình, nhng đây cha phải là thời điểm phù hợp để nói về chi tiết này với HS). Về cú pháp khai báo biến chỉ cần lu ý tên biến do ngời lập trình đặt (tuân thủ theo qui tắc đặt têncủa ngôn ngữ lập trình) và kiểu dữ liệu của biến. Chi tiết hơn về khai báo tên sẽ đợc đề cập trong bài thực hành 3.
Readln(R);
là lệnh dùng để nhập giá trị cho biến R từ bàn phím. Gặp lệnh này chơng trình sẽ dừng lại và yêu cầu ngời sử dụng nhập giá trị từ bàn phím. Khi ngời sử dụng nhập một số, ví dụ số 3, rồi nhấn Enter, thì chơng trình sẽ "mang" số 3 này "đặt" vào ô nhớ R. Trong lập trình việc này đợc gọi là gán giá trị 3 cho biến R. Đến đây, biến R có giá trị bằng 3.
Với câu lệnh Write('Dien tich hinh tron la: ', 3.14*R*R);
điểm cần giải thích ở câu lệnh này đối với HS là biểu thức 3.14*R*R. Vì R đã đợc khai báo là biến và đã đợc gán giá trị bằng 3 nên khi tính toán biểu thức này, Pascal thay tên biến R bằng giá trị là 3 đang đợc lu ở ô nhớ R, nghĩa là tính 3.14*3*3. Biểu thức này tính diện tích hình tròn với bán kính là 3 vừa đợc nhập từ bàn phím.
Khi thực hiện chơng trình, ngời sử dụng có thể nhập giá trị bán kính bất kì (chính xác thì phải là số nguyên bất kì, nhng GV cha cần giải thích chính xác, đầy đủ ở đây). Điều đó có nghĩa là ô nhớ R có thể nhận các giá trị khác nhau phụ thuộc vào ngời sử dụng. Đây là đặc điểm quan trọng của biến: Giá trị của biến có thể
thay đổi.
Lu ý rằng cách trình bày nh trên chỉ giúp dẫn dắt học sinh đến khái niệm về biến. Sau này, trong quá trình giới thiệu các nội dung tiếp theo và các bài thực hành, giáo viên cần nhấn mạnh để học sinh hiểu rõ: mục tiêu của việc sử dụng biến không phải là tránh hoặc giảm đơn giản công việc chỉnh sửa chơng trình mà mục tiêu hàng đầu là lu trữ các giá trị trung gian (đợc nhập vào hay đợc tính toán) cho các hoạt động xử lí dữ liệu về sau và tên biến giúp chơng trình nhận biết chính xác dữ liệu đợc lu ở đâu trong bộ nhớ. Nhiều thao tác xử lí dữ liệu không thể thực hiện đợc nếu không sử dụng biến. SGK đã trình bày rất rõ ý này.
Đến đây nhấn mạnh cho HS rằng cần khai báo biến, kiểu của biến trớc. Có thể gán giá trị cho biến và sử dụng biến trong tính toán. Giá trị của biến có thể thay đổi.
Sau đó GV có thể đa ra chơng trình dới đây:
Var
R: Integer;S: Real; S: Real;
Const
So_PI = 3.14;
Begin
Write('Nhap ban kinh hinh tron R=: '); Readln(R); S:= So_PI*R*R;
Write('Dien tich hinh tron la: ', S); readln
end.
So với chơng trình trớc, điểm khác biệt của chơng trình này là khai báo hằng số So_PI, sử dụng hằng số So_PI để tính diện tích hình tròn trong biểu thức
So_PI*R*R. Cần nhấn mạnh cho HS về cách khai báo hằng và đặc điểm của hằng
số là giá trị đợc xác định ngay từ khi khai báo và không thay đổi giá trị. Thực hiện đến lệnh này PASCAL dành một ô nhớ với tên là So_PI và gán giá trị cho ô nhớ này là 3.14. Tơng tự nh với biến R, trong biểu thức So_PI*R*R, khi tính toán Pascal sẽ thay hằng số So_PI bằng giá trị 3.14 đợc lu trong ô nhớ So_PI.
Câu lệnh S:= So_PI*R*R đợc sử dụng để giải thích cho HS về lệnh gán. HS đã biết cách khai báo biến R, cách gán giá trị cho biến R thông qua lệnh Readln().
Cách gán giá trị cho biến S ở đây là dùng lệnh gán, kí hiệu là :=. Gặp lệnh này, Pascal sẽ tính giá trị của biểu thức ở bên phải phép gán và gán giá trị này cho biến ở bên trái dấu gán. Cụ thể, Pascal sẽ tính toán biểu thức So_PI*R*R ở bên phải dấu :=, sau đó mang giá trị vừa tính đợc đặt vào ô nhớ S. Cần lu ý HS đây không có nghĩa nh dấu bằng trong toán học.
Lu ý, trong TP đã đinh nghĩa sẵn hàm Pi để cho giá trị của số π, vì vậy thực chất chơng trình trên có thể không cần khai hằng số So_PI. Tuy nhiên, tại thời điểm này giáo viên không đề cập đến điều này để tránh gây phức tạp vấn đề.
Có thể dựa vào sự khác nhau giữa hai khai báo biến trong chơng trình này để giới thiệu cho HS cần thiết phải có sự phù hợp giữa kiểu của biến với kiểu dữ liệu. Cụ thể, biến R đợc khai báo với kiểu integer thì khi nhập bán kính ngời dùng chỉ đợc phép nhập các giá trị nguyên. Nếu dạy cùng với máy tính, máy chiếu GV có thể cho HS quan sát trực quan tình huống báo lỗi khi nhập bán kính là số thực.
Có thể yêu cầu HS giải thích tại sao lại khai báo S là kiểu thực, nếu khai báo là kiểu nguyên có đợc không? Qua câu hỏi này HS cần nhận thấy đợc S phải có kiểu là số thực bởi vì So_PI là số thực, nên kết quả của biểu thức So_PI*R*R là số thực.
Về vấn đề hợp kiểu của biến với giá trị gán cho biến, ở đây chỉ cần HS biết đợc nếu biến kiểu nguyên thì chỉ có thể đợc gán giá trị nguyên, nếu biến có kiểu thực thì có thể đợc gán giá trị thực. Không nên giới thiệu, phân tích sâu, chi tiết những tình huống ngoại lệ hoặc sự biến đổi kiểu dữ liệu ở đây.
Các chơng trình ví dụ trên đây còn có thể đợc sử dụng để giới thiệu cho HS về việc kết hợp giữa lệnh write(), writeln() và read(), readln() để tạo giao diện nhập, xuất dữ liệu.
Để chuẩn bị cho bài thực hành 3, GV có thể ra bài tập để học sinh tập khai báo biến trong Pascal, cụ thể nh: khai báo biến để lu giữ tuổi của một ngời; khai báo biến để lu giữ tên ngời, khai báo biến để lu cân nặng, chiều cao ngời. HS cần giải thích đợc việc lựa chọn kiểu dữ liệu phù hợp.
Cuối bài học này, cần khái quát cho HS biết biến, hằng là những đại lợng có trong mọi ngôn ngữ lập trình. Trên đây là những ví dụ đợc viết trong ngôn ngữ Pascal.
Lu ý: Việc sử dụng biến đã giúp cải tiến chơng trình ban đầu để cho phép ngời
sử dụng có thể tính diện tích hình tròn với bán kính nhập từ bàn phím. Điều đó đã góp phần lí giải ý nghĩa, lợi ích của biến trong chơng trình. Tuy nhiên, ví dụ trên lại cha làm rõ ý nghĩa của hằng trong chơng trình.
Thử hình dung, nếu trong chơng trình trên sử dụng So_PI nhiều lần, tức là nếu có nhiều biểu thức dùng đến So_PI nh tính diện tích, tính chu vi của nhiều hình tròn chẳng hạn. Trong trờng hợp không sử dụng hằng thì ở tất cả các biểu thức cần dùng số Pi đều phải viết giá trị số là 3.14. Giả sử sau đó muốn tính toán với độ chính xác cao hơn, chẳng hạn với số Pi là 3.1416, thì ngời lập trình phải tìm tất cả các chỗ mà số Pi đã đợc viết là 3.14 để thay bằng 3.1416. Nh vậy sẽ mất thời gian và dễ nhầm lẫn.
Nhng nếu chơng trình sử dụng hằng So_PI, đợc khai báo ban đầu là Const So_PI = 3.14; và sau đó trong các công thức có sử dụng đến số Pi, thay vì phải viết là 3.14 ngời lập trình dùng hằng So_PI thay thế vào đó. Vì vậy, nếu muốn thay đổi giá trị của số Pi trong toàn bộ chơng trình từ 3.14 sang 3.14.16 thì ngời lập trình chỉ cần tiến hành một chỉnh sửa duy nhất câu lệnh khai báo ở đầu chơng trình thành So_PI = 3.1416;, không cần phải chỉnh sửa các biểu thức trong chơng trình. Khi đó tất cả các biểu thức dùng hằng So_PI trong chơng trình đều đợc tính toán với số Pi có giá trị mới là 3.1416.
Tình huống này là ví dụ làm rõ một trong những lợi ích và ý nghĩa của hằng trong lập trình.
Nếu khả năng tiếp thu của HS tốt và còn thời gian, sau khi đã hoàn thành bài học, căn cứ vào giải thích ý nghĩa của hằng ở trên, giáo viên có thể lấy một chơng trình minh hoạ ý nghĩa, lợi ích của hằng cho HS. Phần giải thích về ý nghĩa, lợi ích của hằng không bắt buộc phải giới thiệu cho HS.
3. Hớng dẫn trả lời câu hỏi và bài tập
Bài 1. Xét về mặt lập trình, biến đại lợng đợc dùng để lu trữ dữ liệu và dữ liệu đợc biến lu trữ có thể thay đổi trong khi thực hiện chơng trình. Xét về mặt lu trữ dữ liệu, có thể xem biến là "tên" của một vùng nhớ đợc dành sẵn để lu dữ liệu trong suốt quá trình thực hiện chơng trình.
Gán giá trị cho một biến về thực chất là lu dữ liệu tơng ứng vào vùng nhớ đ- ợc đặt tên và dành riêng cho biến. Việc thực hiện các tính toán và xử lí với biến có nghĩa là thực hiện tính toán và xử lí với dữ liệu đợc gán đó.
Giả sử X đợc khai báo là biến với kiểu dữ liệu số nguyên và X đợc gán dữ liệu là số 5. Sau khi khai báo, chơng trình sẽ dành riêng một vùng nhớ
nào đó cho biến X, và khi gán 5 cho X thì vùng nhớ đó lu dữ liệu 5. Lệnh ghi
X ra màn hình có nghĩa là ghi số 5 ra màn hình.
Lu ý đối với giáo viên. Khi một vùng nhớ đợc khai báo để lu dữ liệu
làm giá trị của một biến, vùng nhớ đó sẽ không đợc phép sử dụng vào mục đích khác. Do vậy, một trong những kĩ năng lập trình là sử dụng càng ít biến càng tốt, nhất là trong những trờng hợp việc sử dụng bộ nhớ bị hạn chế. Nh- ng với công nghệ hiện nay, bộ nhớ máy tính đã có dung lợng rất lớn nên vấn đề hạn chế sử dụng biến trong chơng trình đã không còn là vấn đề cấp thiết.
Bài 2. Việc khai báo biến gồm: Khai báo tên biến và khai báo kiểu dữ liệu của biến.
Khi khai báo biến, ngoài việc tên biến đợc đa vào danh sách các đối tợng quản lí, máy tính (thông qua chơng trình dịch) sẽ xác định kiểu của biến và dành một vùng nhớ có độ lớn thích hợp với phạm vi kiểu của biến để lu giá trị của biến. Ví dụ, cũng để lu các giá trị là số nguyên, khi khai báo biến kiểu byte, máy tính chỉ dành vùng nhớ có độ lớn 1 byte, nhng khi khai báo biến kiểu nguyên, máy tính sẽ dành vùng nhớ có độ lớn 2 byte, hoặc vùng nhớ 6 byte đợc dành cho biến đợc khai báo với kiểu số thực,... Nhờ thế việc sử dụng bộ nhớ sẽ hiệu quả hơn. Ngoài ra máy tính sẽ biết áp dụng các phép toán thích hợp đối với giá trị của biến.
Bài 3. Đáp án: a) Hợp lệ; b) Không hợp lệ; c) Hợp lệ; d) Không hợp lệ.
Bài 4. Mặc dù đều cùng phải khai báo trớc khi có thể sử dụng trong chơng trình, sự khác nhau giữa biến và hằng là ở chỗ giá trị của hằng không thay đổi trong suốt quá trình thực hiện chơng trình, còn giá trị của biến thì có thể thay đổi đợc tại từng thời điểm thực hiện chơng trình.
Bài 5. Không thể gán lại giá trị 3.1415 cho Pi trong phần thân chơng trình vì giá trị của hằng không thay đổi trong suốt quá trình thực hiện chơng trình.
Bài 6. a) Hợp lệ; b) Không hợp lệ vì tên biến không hợp lệ; c) Không hợp lệ vì
hằng phải đợc cho giá trị khi khai báo; c) Không hợp lệ vì hằng phải đợc cho giá trị khi khai báo; d) Không hợp lệ vì không đợc gán giá trị cho biến khi khai báo (cách gán giá trị cho biến cũng không đúng cú pháp).
Bài 7. Các lỗi trong chơng trình: (1) Thừa dấu bằng ở dòng 1 (chỉ cần dấu hai chấm); (2) Thừa dấu hai chấm ở dòng 2 (với hằng chỉ cần dấu bằng); (3) Thiếu dấu chấm phẩy ở dòng 4; (4) Khai báo kiểu dữ liệu của biến b không phù hợp: Khi chia hai số nguyên, kết quả luôn luôn là số thực, cho dù có chia hết hay không. Do đó cần phải khai báo biến b là biến có kiểu dữ liệu số thực.
Bài 8. Cách khai báo hợp lí:
a) Các biến a và h là kiểu số nguyên; biến S: kiểu số thực.
b) Cả bốn biến a, b, c và d là các kiểu số nguyên.
Bài 9. Cần sử dụng các biến sau đây với mỗi học sinh: một biến kiểu xâu để lu tên, ví dụ Hoa, Mai,..., một biến kiểu số nguyên để lu điểm, ví dụ
Diem_Hoa, Diem_Mai; ngoài ra cần một biến Trungbinhlà biến kiểu số thực
Bài 10. Chơng trình Pascal có thể nh sau đây:
uses crt;
var r: integer; C,S: real;
begin
clrscr;
write('Nhap ban kinh r = '); readln(r); C:=2*Pi*r;
S:=Pi*r*r;
writeln('Chu vi duong tron bang ',C:8:2); writeln('Dien tich hinh tron bang ',S:8:2);
end.