Hồ Bảo Tín Wiki
Vào thế giới

🧠 Tư duy lập trình

Biến trong lập trình là gì: hình dung như chiếc hộp có dán nhãn

8 phút đọc · cập nhật

Trong bài
  1. Vì sao chương trình cần biến
  2. Ba việc làm với một chiếc hộp
  3. Dấu bằng trong lập trình không giống dấu bằng trong toán
  4. Hộp đựng số, hộp đựng chữ
  5. Đặt tên hộp cho dễ hiểu
  6. Bài toán đổi hai cốc nước
  7. Biến đếm và biến cộng dồn
  8. Thử làm: chạy một chương trình bằng hộp giấy

Trong lập trình, biến giống một chiếc hộp có dán nhãn: nhãn là tên của biến, thứ đựng bên trong là giá trị của nó. Chương trình có thể bỏ giá trị vào hộp, mở ra xem, hoặc thay bằng giá trị mới bất cứ lúc nào. Bảng tỉ số trên sân bóng, đồng hồ đếm ngược ở ngã tư, con số "còn 12 chỗ trống" trước cửa bãi gửi xe đều hoạt động y như một biến.

Vì sao chương trình cần biến

Hãy nghĩ tới người ghi tỉ số một trận bóng đá ở sân trường. Họ cần nhớ hai con số: số bàn của đội áo xanh và số bàn của đội áo đỏ. Hai con số này thay đổi trong trận, mỗi lần có bàn thắng lại tăng thêm một. Nếu không có chỗ nào ghi lại, sau vài bàn sẽ chẳng ai nhớ chính xác.

Chương trình máy tính cũng phải nhớ rất nhiều thứ: người dùng đã gõ gì, đang ở trang nào, còn bao nhiêu giây, đã đếm tới đâu. Mỗi thứ cần nhớ được cất vào một biến. Không có biến, chương trình chỉ làm được những việc cố định từ đầu tới cuối, không phản ứng được với bất cứ điều gì thay đổi.

Ba việc làm với một chiếc hộp

ViệcVới chiếc hộpVới bảng tỉ số
Tạo biếnLấy một hộp trống, dán nhãn "áo xanh"Kẻ một ô trên bảng, ghi tên đội
Gán giá trịBỏ vào hộp tấm thẻ ghi số 0Đầu trận ghi 0
Đọc giá trịMở hộp ra xem thẻ đang ghi gì, rồi để nguyênKhán giả nhìn bảng
Thay giá trịLấy thẻ cũ ra, bỏ thẻ mới vàoCó bàn thắng, xoá 0 ghi 1

Một điều quan trọng: mỗi hộp chỉ đựng một tấm thẻ tại một thời điểm. Khi bỏ thẻ mới vào, thẻ cũ mất. Bảng tỉ số chuyển từ 1 sang 2 thì con số 1 không còn ở đâu cả. Muốn giữ lại giá trị cũ, phải cất nó sang một hộp khác trước.

Còn đọc giá trị thì không làm mất gì: mở hộp xem bao nhiêu lần, thẻ vẫn nằm đó.

Dấu bằng trong lập trình không giống dấu bằng trong toán

Đây là chỗ nhiều bạn bối rối khi mới học. Ở nhiều ngôn ngữ lập trình, người ta viết:

ao_xanh = ao_xanh + 1

Trong toán học, câu này vô lý: không có số nào bằng chính nó cộng một. Nhưng trong lập trình, dấu "=" ở đây không có nghĩa là "bằng", mà là "bỏ vào hộp". Câu trên đọc thành: "Mở hộp ao_xanh xem đang có số mấy, cộng thêm 1, rồi bỏ kết quả vào lại hộp ao_xanh." Nếu trước đó hộp ghi 2 thì giờ ghi 3.

Vì dễ nhầm như vậy, một số ngôn ngữ và nhiều sách dạy lập trình viết phép gán bằng mũi tên: ao_xanh ← ao_xanh + 1. Mũi tên cho thấy rõ giá trị chảy từ bên phải vào hộp bên trái.

Biến trong lập trình cũng khác ẩn số x trong bài toán tìm x. Ẩn số trong toán là một con số cố định mà ta chưa biết. Biến trong lập trình là một chỗ chứa mà giá trị có thể thay đổi nhiều lần khi chương trình chạy.

Hộp đựng số, hộp đựng chữ

Không phải hộp nào cũng đựng cùng một loại thứ. Người lập trình gọi đó là kiểu dữ liệu. Những kiểu hay gặp:

  • Số: số người trong lớp, nhiệt độ, số giây còn lại.
  • Chữ: tên một người, một câu chào, địa chỉ.
  • Đúng hoặc sai: cửa đã khoá chưa, đèn có đang bật không. Kiểu này đi đôi với câu lệnh nếu–thì.
  • Danh sách: một hộp lớn chia thành nhiều ngăn đánh số, ví dụ danh sách tên cả lớp.

Kiểu dữ liệu quan trọng vì cùng một phép làm có thể cho kết quả khác nhau. Số 3 cộng số 4 được 7. Nhưng nếu "3" và "4" là chữ, nhiều ngôn ngữ lập trình sẽ ghép chúng lại thành "34", giống như ghép hai mảnh giấy viết chữ. Máy không tự đoán ý ta, nên phải nói rõ hộp nào đựng số, hộp nào đựng chữ.

Đặt tên hộp cho dễ hiểu

Thử tưởng tượng một căn bếp có ba mươi lọ gia vị, nhãn ghi "lọ 1", "lọ 2", "lọ 3"… Nấu ăn sẽ rất vất vả. Biến cũng vậy. Tên a, b, x1 thì gõ nhanh nhưng đọc lại sau một tuần sẽ không nhớ là gì. Tên so_cho_trong, giay_con_lai, ten_ban dài hơn một chút nhưng đọc là hiểu.

Lập trình viên có câu nói đùa rằng một trong những việc khó nhất của nghề này là đặt tên. Đùa mà thật: một cái tên tốt giúp người khác, và chính mình sau này, đọc chương trình như đọc một đoạn văn.

Ngôn ngữ lập trình thường có vài luật đặt tên: không có dấu cách (nên dùng gạch dưới hoặc viết liền), không bắt đầu bằng chữ số, và ở nhiều ngôn ngữ thì chữ hoa với chữ thường được coi là khác nhau.

Bài toán đổi hai cốc nước

Có hai cốc: cốc A đựng nước cam, cốc B đựng sữa. Làm sao để cốc A đựng sữa, cốc B đựng nước cam? Không thể đổ cam sang B ngay, vì B đang đầy sữa, đổ vào là lẫn hết.

Cách làm: lấy thêm một cốc rỗng C.

  1. Đổ nước cam từ A sang C. Giờ A rỗng.
  2. Đổ sữa từ B sang A. Giờ B rỗng.
  3. Đổ nước cam từ C sang B.

Đổi giá trị của hai biến cũng y như vậy. Nếu viết "A ← B" rồi "B ← A", cả hai sẽ cùng chứa giá trị của B, vì giá trị cũ của A đã mất ở bước đầu. Phải có một biến tạm để giữ giá trị cũ. Đây là một trong những bài tập đầu tiên mà hầu hết người học lập trình đều gặp, và cũng là lỗi mà hầu hết đều mắc ít nhất một lần.

Biến đếm và biến cộng dồn

Hai cách dùng biến phổ biến nhất đi cùng với vòng lặp:

Biến đếm

Người bảo vệ đứng ở cổng bảo tàng cầm một chiếc máy đếm bấm tay. Mỗi khi có một người đi qua, bấm một cái, con số tăng thêm 1. Cuối ngày đọc số là biết có bao nhiêu khách. Con số trên máy chính là một biến đếm: bắt đầu từ 0, mỗi lần một sự việc xảy ra thì cộng 1.

Biến cộng dồn

Đi chợ với mẹ, bạn cầm một tờ giấy ghi tổng tiền. Bắt đầu là 0. Mua rau 15 nghìn, tổng thành 15. Mua cá 60 nghìn, tổng thành 75. Mua trái cây 40 nghìn, tổng thành 115. Mỗi món mới, lấy tổng cũ cộng thêm giá món đó. Đây là biến cộng dồn, cách máy tính tính tổng tiền trong giỏ hàng hay tổng quãng đường đã chạy.

Thử làm: chạy một chương trình bằng hộp giấy

Cần ba chiếc hộp hoặc cốc giấy, giấy nhớ, bút, một xấp thẻ giấy nhỏ. Dán nhãn ba hộp: keo, so_ban, moi_ban. Một bạn đọc từng dòng, một bạn làm "máy tính": viết số lên thẻ, bỏ vào hộp, mỗi lần thay giá trị thì rút thẻ cũ ra và bỏ đi.

  1. keo ← 0
  2. Lặp lại 4 lần: keo ← keo + 3
  3. keo ← keo − 2
  4. so_ban ← 5
  5. moi_ban ← keo chia cho so_ban

Trước khi làm, mỗi người đoán thầm hộp moi_ban cuối cùng ghi số mấy. Sau đó chạy thật, từng dòng một. Kết quả: sau dòng 2, keo là 12; sau dòng 3 là 10; dòng 5 cho moi_ban là 2. Mỗi bạn được 2 chiếc kẹo.

Để theo dõi dễ hơn, kẻ một bảng trên giấy: mỗi cột là một hộp, mỗi hàng là một dòng lệnh, ghi giá trị của các hộp sau khi chạy dòng đó. Người lập trình gọi đây là bảng theo dõi, và họ vẫn dùng nó khi gỡ lỗi những đoạn chương trình khó.

Thử thách thêm: đổi dòng 3 thành "keo ← keo − 3" thì chuyện gì xảy ra ở dòng 5? Chia không đều thì nên làm gì với số kẹo còn dư? Câu hỏi ấy dẫn sang câu lệnh nếu–thì.

Câu hỏi thường gặp

Biến trong lập trình là gì?

Biến là một chỗ trong bộ nhớ máy tính có tên gọi, dùng để cất một giá trị như con số, chữ hay đúng–sai. Chương trình có thể đọc giá trị đó và thay bằng giá trị mới khi cần. Có thể hình dung biến như một chiếc hộp dán nhãn, mỗi lúc chỉ đựng một thứ.

Biến trong lập trình khác biến trong toán thế nào?

Trong toán, chữ x thường là một ẩn số cố định cần tìm. Trong lập trình, biến là chỗ chứa mà giá trị có thể thay đổi nhiều lần khi chương trình chạy. Vì thế câu "x = x + 1" vô lý trong toán nhưng hoàn toàn bình thường trong lập trình.

Phép gán là gì?

Phép gán là câu lệnh đặt một giá trị vào biến. Ở nhiều ngôn ngữ, phép gán được viết bằng dấu bằng, nhưng phải hiểu là "bỏ vào hộp" chứ không phải "bằng nhau". Khi gán giá trị mới, giá trị cũ trong biến bị thay thế.

Vì sao đổi giá trị hai biến cần biến thứ ba?

Vì khi gán giá trị mới cho một biến, giá trị cũ của nó mất đi. Nếu gán A bằng B trước, giá trị ban đầu của A không còn để đưa sang B. Biến tạm giữ hộ giá trị cũ, giống chiếc cốc rỗng khi đổi nước cam và sữa giữa hai cốc.

Kiểu dữ liệu là gì?

Kiểu dữ liệu cho biết một biến đựng loại giá trị nào, chẳng hạn số, chữ, đúng–sai hay danh sách. Cùng một phép làm có thể cho kết quả khác nhau theo kiểu: cộng hai số 3 và 4 được 7, còn ghép hai chữ "3" và "4" được "34".

biến trong lập trìnhphép gánkiểu dữ liệubiến đếmbiến cộng dồnbiến tạmđặt tên biếnbảng theo dõihọc lập trình cơ bản

Đọc tiếp