Hyutars
Mario & Luigi
Bài 1.7: Làm việc với hằng số (Constants)
Hằng số là một giá trị không thay đổi mà tên của nó do bạn đặt. Hằng số rất hữu dụng nếu bạn có một giá trị không thay đổi và nó xuất hiện thường xuyên trong chương trình của bạn. Ví dụ, nếu bạn viết trò chơi bắn máy bay, mỗi kẻ địch có giá trị điểm là 150, bạn nên đặt một hằng số tên ALIEN_POINTS có giá trị là 150. Sau đó, bất cứ khi nào bạn cần giá trị đó, bạn có thể dùng ALIEN_POINTS thay cho giá trị 150.
Hằng số có hai lợi ích. Thứ nhất, nó làm cho chương trình trong sáng dễ đọc hơn. Ngay khi bạn thấy ALIEN_POINTS, bạn đã biết nó có ý nghĩa gì. Nếu bạn bất chợt nhìn vào một đoạn mã và thấy số 150, bạn có thể sẽ không biết giá trị đó đề cập đến cái gì. Lợi ích thứ hai, dùng tên hằng như vậy sẽ rất thuận tiện khi bạn muốn thay đổi giá trị của nó. Ví dụ nhé, chẳng hạn bạn muốn thử nghiệm trò chơi của mình và bạn quyết định tăng giá trị của kẻ địch (hyutars: alien = người ngoài hành tinh, dịch kẻ địch cũng được ^^) lên 250. Với hằng số, tất cả những gì bạn phải làm chỉ là thay đổi dòng khởi tạo ALIEN_POINTS thành 250. Nếu không dùng hằng số, bạn sẽ phải tìm và thay đổi từng số 150 thành 250, nếu đoạn mã của bạn khoảng 1000 dòng thì … chậc chậc >_< …
Giới thiệu chương trình Game Stats 3.0:
Chương trình Game Stats 3.0 dùng hằng số thay cho giá trị. Đầu tiên chương trình tính điểm của người chơi, và sau đó nó tính mức phí cho việc nâng cấp bộ phận nào đó trong một game chiến thuật. Hình 1.8 cho thấy kết quả:
Hình 1.8: Mỗi phép tính đều có sự tham gia của hằng số, nó làm cho đoạn code rõ ràng hơn.
Dùng Hằng số:
Tôi định nghĩa hằng số, ALIEN_POINTS, để nó nhận giá trị của một kẻ địch:
Tôi dùng keyword const để định nghĩa hằng số. Bây giờ tôi có thể dùng ALIEN_POINTS như một số nguyên bình thường. Bạn có thể để ý thấy, tên tôi chọn cho hằng số toàn là chữ hoa. Đó là một thói quen, nhưng rất phổ biến. Tên được đặt toàn bằng kí tự hoa nói với lập trình viên khác rằng: nó là một hằng số.
Tiếp theo tôi dùng hằng số trong dòng này:
Tôi tính điểm của người chơi bằng cách nhân số kẻ địch đã tiêu diệt với giá trị điểm của một kẻ địch. Dùng hằng số ở đây giúp cho dòng mã khá rõ ràng.
Bẫy: Bạn không thể dùng phép gán một giá trị mới cho một hằng số. Nếu bạn thử, lỗi sẽ phát sinh.
Dùng Enumerations (Bảng liệt kê):
Enumeration là tập hợp của các hằng số kiểu unsigned int, gọi là enumerator (Phần tử liệt kê). Thường thì enumerator liên quan với nhau và có một thứ tự nhất định. Sau đây là một ví dụ của enumeration:
Nó định nghĩa một enumeration tên difficulty. Mặc định, giá trị của enumerator đầu tiên là 0 và các giá trị sau tăng lên 1. Ở dòng code trên, NOVICE là 0, EASY là 1, NORMAL là 2, HARD là 3, và UNBEATABLE là 4. Để định nghĩa một enumeration, dùng keyword enum, sau đó là tên của nó, tiếp theo là danh sách các enumerator giữa hai dấu { }.
Tiếp theo tôi tạo một biến, kiểu của nó là enumeration tôi đã tạo.
Biến myDifficulty được đặt là EASY (có giá trị = 1). myDifficulty thuộc kiểu difficulty, cho nên nó chỉ có thể giữ một trong các giá trị mà bạn đã định nghĩa trong enumeration. Nó có nghĩa là, myDifficulty chỉ có thể được gán các giá trị NOVICE, EASY, NORMAL, HARD, UNBEATABLE, 0, 1, 2, 3, hay 4.
Tiếp theo tôi định nghĩa một enumeration khác:
Dòng code này định nghĩa enumeration ship, nó đề cập đến 4 loại ship (tàu) trong game chiến thuật. Trong nó, tôi gán các giá trị kiểu nguyên cho một số enumerator. Các chữ số là giá trị Resource Point (tài nguyên) của mỗi ship. Bạn có thể gán giá trị cho enumerator nếu bạn muốn. Bất kì enumerator nào không được gán giá trị sẽ nhận giá trị của enumerator đứng trước nó cộng thêm 1. Vì tôi không gán giá trị cho BOMBER, nó sẽ mang giá trị 26.
Tiếp theo tôi định nghĩa một biến kiểu enumeration:
Sau đó tôi mô tả cách thức dùng enumerator trong tính toán số học:
Code trên có chức năng tính mức phí để nâng cấp từ BOMBER lên CRUISE. Phép tính này tương đương 50 – 26 = 24.
Hằng số là một giá trị không thay đổi mà tên của nó do bạn đặt. Hằng số rất hữu dụng nếu bạn có một giá trị không thay đổi và nó xuất hiện thường xuyên trong chương trình của bạn. Ví dụ, nếu bạn viết trò chơi bắn máy bay, mỗi kẻ địch có giá trị điểm là 150, bạn nên đặt một hằng số tên ALIEN_POINTS có giá trị là 150. Sau đó, bất cứ khi nào bạn cần giá trị đó, bạn có thể dùng ALIEN_POINTS thay cho giá trị 150.
Hằng số có hai lợi ích. Thứ nhất, nó làm cho chương trình trong sáng dễ đọc hơn. Ngay khi bạn thấy ALIEN_POINTS, bạn đã biết nó có ý nghĩa gì. Nếu bạn bất chợt nhìn vào một đoạn mã và thấy số 150, bạn có thể sẽ không biết giá trị đó đề cập đến cái gì. Lợi ích thứ hai, dùng tên hằng như vậy sẽ rất thuận tiện khi bạn muốn thay đổi giá trị của nó. Ví dụ nhé, chẳng hạn bạn muốn thử nghiệm trò chơi của mình và bạn quyết định tăng giá trị của kẻ địch (hyutars: alien = người ngoài hành tinh, dịch kẻ địch cũng được ^^) lên 250. Với hằng số, tất cả những gì bạn phải làm chỉ là thay đổi dòng khởi tạo ALIEN_POINTS thành 250. Nếu không dùng hằng số, bạn sẽ phải tìm và thay đổi từng số 150 thành 250, nếu đoạn mã của bạn khoảng 1000 dòng thì … chậc chậc >_< …
Giới thiệu chương trình Game Stats 3.0:
Chương trình Game Stats 3.0 dùng hằng số thay cho giá trị. Đầu tiên chương trình tính điểm của người chơi, và sau đó nó tính mức phí cho việc nâng cấp bộ phận nào đó trong một game chiến thuật. Hình 1.8 cho thấy kết quả:
Hình 1.8: Mỗi phép tính đều có sự tham gia của hằng số, nó làm cho đoạn code rõ ràng hơn.
Mã:
// Game Stats 3.0
// Demonstrates constants
#include <iostream>
using namespace std;
int main()
{
const int ALIEN_POINTS = 150;
int aliensKilled = 10;
int score = aliensKilled * ALIEN_POINTS;
cout << "score: " << score << endl;
enum difficulty {NOVICE, EASY, NORMAL, HARD, UNBEATABLE};
difficulty myDifficulty = EASY;
enum ship {FIGHTER = 25, BOMBER, CRUISER = 50, DESTROYER = 100};
ship myShip = BOMBER;
cout << "\nTo upgrade my ship to a Cruiser will cost "
<< (CRUISER - myShip) << " Resource Points.\n";
return 0;
}
Dùng Hằng số:
Tôi định nghĩa hằng số, ALIEN_POINTS, để nó nhận giá trị của một kẻ địch:
Mã:
const int ALIEN_POINTS = 150;
Tôi dùng keyword const để định nghĩa hằng số. Bây giờ tôi có thể dùng ALIEN_POINTS như một số nguyên bình thường. Bạn có thể để ý thấy, tên tôi chọn cho hằng số toàn là chữ hoa. Đó là một thói quen, nhưng rất phổ biến. Tên được đặt toàn bằng kí tự hoa nói với lập trình viên khác rằng: nó là một hằng số.
Tiếp theo tôi dùng hằng số trong dòng này:
Mã:
int score = aliensKilled * ALIEN_POINTS;
Tôi tính điểm của người chơi bằng cách nhân số kẻ địch đã tiêu diệt với giá trị điểm của một kẻ địch. Dùng hằng số ở đây giúp cho dòng mã khá rõ ràng.
Bẫy: Bạn không thể dùng phép gán một giá trị mới cho một hằng số. Nếu bạn thử, lỗi sẽ phát sinh.
Dùng Enumerations (Bảng liệt kê):
Enumeration là tập hợp của các hằng số kiểu unsigned int, gọi là enumerator (Phần tử liệt kê). Thường thì enumerator liên quan với nhau và có một thứ tự nhất định. Sau đây là một ví dụ của enumeration:
Mã:
enum difficulty {NOVICE, EASY, NORMAL, HARD, UNBEATABLE};
Nó định nghĩa một enumeration tên difficulty. Mặc định, giá trị của enumerator đầu tiên là 0 và các giá trị sau tăng lên 1. Ở dòng code trên, NOVICE là 0, EASY là 1, NORMAL là 2, HARD là 3, và UNBEATABLE là 4. Để định nghĩa một enumeration, dùng keyword enum, sau đó là tên của nó, tiếp theo là danh sách các enumerator giữa hai dấu { }.
Tiếp theo tôi tạo một biến, kiểu của nó là enumeration tôi đã tạo.
Mã:
difficulty myDifficulty = EASY;
Biến myDifficulty được đặt là EASY (có giá trị = 1). myDifficulty thuộc kiểu difficulty, cho nên nó chỉ có thể giữ một trong các giá trị mà bạn đã định nghĩa trong enumeration. Nó có nghĩa là, myDifficulty chỉ có thể được gán các giá trị NOVICE, EASY, NORMAL, HARD, UNBEATABLE, 0, 1, 2, 3, hay 4.
Tiếp theo tôi định nghĩa một enumeration khác:
Mã:
enum ship {FIGHTER = 25, BOMBER, CRUISER = 50, DESTROYER = 100};
Dòng code này định nghĩa enumeration ship, nó đề cập đến 4 loại ship (tàu) trong game chiến thuật. Trong nó, tôi gán các giá trị kiểu nguyên cho một số enumerator. Các chữ số là giá trị Resource Point (tài nguyên) của mỗi ship. Bạn có thể gán giá trị cho enumerator nếu bạn muốn. Bất kì enumerator nào không được gán giá trị sẽ nhận giá trị của enumerator đứng trước nó cộng thêm 1. Vì tôi không gán giá trị cho BOMBER, nó sẽ mang giá trị 26.
Tiếp theo tôi định nghĩa một biến kiểu enumeration:
Mã:
ship myShip = BOMBER;
Sau đó tôi mô tả cách thức dùng enumerator trong tính toán số học:
Mã:
(CRUISER - myShip)
Code trên có chức năng tính mức phí để nâng cấp từ BOMBER lên CRUISE. Phép tính này tương đương 50 – 26 = 24.