Bài học cùng chủ đề
Báo cáo học liệu
Mua học liệu
Mua học liệu:
-
Số dư ví của bạn: 0 coin - 0 Xu
-
Nếu mua học liệu này bạn sẽ bị trừ: 0 coin\Xu
Để nhận Coin\Xu, bạn có thể:
I. Lý thuyết SVIP
Nội dung này do giáo viên tự biên soạn.
3. Kiểu dữ liệu, hằng, biến và biểu thức.
3.1. Kiểu dữ liệu cơ bản
Dùng để mô tả thông tin đầu vào, đầu ra và tính toán kết quả trung gian được thực hiện trực tiếp bởi ngôn ngữ lập trình đại diện cho các đơn vị lưu trữ cơ bản trong hệ thống. Bao gồm các loại sau:
· Kiểu kí tự - Character types: Mô tả các kí tự đơn như ‘A’, ‘$’, ‘9’ ... Mỗi kí tự chiếm ít nhất một byte.
· Kiểu số nguyên - Numerical integer types: Có thể biểu diễn các giá trị như 5, 178, 1024 ... và tồn tại ở nhiều tên với kích thước khác nhau 1, 2 hoặc 4 byte ... thuộc số nguyên không dấu (unsigned) và có dấu (signed)
· Kiểu số thực - Floating-point types: Là các giá trị số thực như 123.456, 0.001 ... và cũng tồn tại với nhiều tên và kích thước khác nhau.
· Kiểu logic - Boolean type: Với tên bool thể hiện được hai trạng thái true (đúng) hoặc false (sai).
· Kiểu xâu tí tự - string: Lưu trữ một dãy các kí tự viết liên tiếp và đặt trong dấu “...” như “hello world!”, “Ngon ngu lap trinh C++”.
Với mỗi kiểu dữ liệu ta cần quan tâm đến các yếu tố sau đây:
- Tên kiểu dữ liệu đó.
- Miền (phạm vi) giá trị của kiểu dữ liệu đó.
- Yêu cầu về bộ nhớ để biểu diễn một giá trị thuộc kiểu(tính bằng Byte)
- Các thao tác đối với giá trị của kiểu đó. Các thao tác có hai loại:
- Các phép toán đối với các giá trị thuộc kiểu
- Các hàm và thủ tục chuẩn
Bảng một số tên kiểu dữ liệu cơ bản
Tên kiểu | Bytes | Tên khác | Phạm vi |
int | 4 | Signed | –2,147,483,648 to 2,147,483,647 |
unsigned int | 4 | Unsigned | 0 to 4,294,967,295 |
__int8 | 1 | Char | –128 to 127 |
unsigned __int8 | 1 | unsigned char | 0 to 255 |
__int16 | 2 | short, short int | –32,768 to 32,767 |
unsigned __int16 | 2 | unsigned short | 0 to 65,535 |
__int32 | 4 | signed, int | –2,147,483,648 to 2,147,483,647 |
unsigned __int32 | 4 | Unsigned | 0 to 4,294,967,295 |
__int64 | 8 | long long | –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
unsigned __int64 | 8 | unsigned long long | 0 to 18,446,744,073,709,551,615 |
bool | 1 | None | false or true |
char | 1 | None | –128 to 127 by default |
signed char | 1 | None | –128 to 127 |
unsigned char | 1 | None | 0 to 255 |
short | 2 | short int | –32,768 to 32,767 |
unsigned short | 2 | unsigned short int | 0 to 65,535 |
long | 4 | long int | –2,147,483,648 to 2,147,483,647 |
unsigned long | 4 | unsigned long int | 0 to 4,294,967,295 |
long long | 8 | none | –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
unsigned long long | 8 | none | 0 to 18,446,744,073,709,551,615 |
float | 4 | None | 3.4E +/- 38 (7 digits) |
double | 8 | None | 1.7E +/- 308 (15 digits) |
long double |
| None | Same as double |
wchar_t | 2 | __wchar_t | 0 to 65,535 |
string |
|
|
|
* Một số kiểu dữ liệu cơ bản hay dùng:
- Kiểu ký tự (char) : Một giá trị kiểu char chiếm 1 byte (8 bit) và biểu diễn được một ký tự thông qua bảng mã ASCII. Ví dụ :
Ký tự | Mã ASCII | Ký tự | Mã ASCII |
0 | 048 | A | 065 |
1 | 049 | B | 066 |
2 | 050 | a | 097 |
Dấu cách | 032 | b | 098 |
Có hai kiểu dữ liệu char : kiểu signed char và unsigned char.
Kiểu | Phạm vi biểu diễn | Số ký tự | Kích thước |
Char ( Signed char ) | -128 đến 127 | 256 | 1 byte |
Unsigned char | 0 đến 255 | 256 | 1 byte |
Ví dụ sau minh hoạ sự khác nhau giữa hai kiểu dữ liệu trên : Xét đoạn chương trình sau :
char ch1; unsigned char ch2; ...... ch1=200; ch2=200; | Khi đó thực chất : ch1=-56; ch2=200;
|
Nhưng cả ch1 và ch2 đều biểu diễn cùng một ký tự có mã 200.
- Kiểu nguyên :
Trong C++ cho phép sử dụng số nguyên kiểu int, số nguyên dài kiểu long và số nguyên không dấu kiểu unsigned. Kích cỡ và phạm vi biểu diễn của chúng được chỉ ra trong bảng dưới đây :
Kiểu | Phạm vi biểu diễn | Kích thước |
int | -32768 đến 32767 hoặc -231 đến 231-1 | 2 byte, 4 byte |
unsigned int | 0 đến 65535 | 2 byte |
long | -2147483648 đến 2147483647 | 4 byte |
unsigned long | 0 đến 4294967295 | 4 byte |
long long | -264 đến 264-1 | 8 byte |
Chú ý : Kiểu ký tự cũng có thể xem là một dạng của kiểu nguyên.
- Kiểu dấu phảy động :
Trong C cho phép sử dụng ba loại dữ liệu dấu phảy động, đó là float, double và long double. Kích cỡ và phạm vi biểu diễn của chúng được chỉ ra trong bảng dưới đây :
Kiểu | Phạm vi biểu diễn | Số chữ số có nghĩa | Kích thước |
float | 3.4E-38 đến 3.4E+38 | 7 đến 8 | 4 byte |
double | 1.7E-308 đến 1.7E+308 | 15 đến 16 | 8 byte |
long double | 3.4E-4932 đến 1.1E4932 | 17 đến 18 | 10 byte |
Giải thích :
Máy tính có thể lưu trữ được các số kiểu float có giá trị tuyệt đối từ 3.4E-38 đến 3.4E+38. Các số có giá trị tuyệt đối nhỏ hơn 3.4E-38 được xem bằng 0. Phạm vi biểu diễn của số double được hiểu theo nghĩa tương tự.
* Một số hàm xử lí số trong thư viện cmath:
- abs(x): trả về giá trị tuyệt đối của số x.
- pow(x, y) : hàm mũ, trả lại giá trị x lũy thừa y (xy).
- exp(x) : hàm mũ, trả lại giá trị e mũ x (ex).
- log(x), log10(x) : trả lại lôgarit cơ số e và lôgarit thập phân của x (lnx, logx).
- sqrt(x) : trả lại căn bậc 2 của x.
- Hàm ceil(x): làm tròn lên, x là số thực. Trả về số thực có giá trị bằng số nguyên nhỏ nhất lớn hơn hoặc bằng x. ceil(2.4) = 3; ceil(-2.8)=-2…
- Hàm floor(x): làm tròn xuống, x là số thực: Trả về số thực có giá trị bằng số nguyên lớn nhất nhỏ hơn hoặc bằng x. floor(2.4)=2, floor(-2.8)=-3
- Hàm round(x): làm tròn vê số nguyên gần nhất. round(2.4)=2, round(2.6)=3.
- atof(s_number) : trả lại số thực ứng với số viết dưới dạng xâu kí tự s_number.
* Hàm xử lý ký tự trong thư viện ctype:
- Hàm isdigits(c): là true nếu c là chữ số từ ‘0’..’9’
- Hàm isalpha(c): là true nếu c là ký tự thuộc ‘A’ .. ‘Z’ hoặc ‘a’ .. ‘z’
- Hàm islower(c): là true nếu c là ký tự in thường
- Hàm isupper(c): là true nếu c là ký tự in HOA
3.2. Hằng
Hằng là đại lượng có giá trị thuộc một kiểu dữ liệu nhất định, giá trị của hằng không thể thay đổi trong thời chạy chương trình (thời gian tồn tại của nó). Gồm các loại hằng sau:
- Hằng không tên: là các giá trị cụ thể như: 3, 8, 9.5 hoắc ‘A’ …
- Hằng (chuẩn) mang tên: được NTLT quy định sẵn như INT_MAX, INT_MIN, __INT64_MAX, RAND_MAX… và được viết IN HOA. Người sử dụng phải khai báo thư viện khi muốn sử dụng các hằng có sãn.
- Hằng do người lập trình tự định nghĩa (khai báo):
Cú pháp: #define <tên_hằng> <giá trị>;
Hoặc: const <kiểu_dữ_liệu> <tên_hằng> = <giá_trị>;
Hoặc: const <tên_hằng> = <giá_trị>;
Ví dụ:
#define MAXN 10000; //hằng MAXN nhận giá trị là 10000
const float X = 4; // hằng X kiểu thực, có giá trị là 4.0
const D = 7; // hằng D kiểu int, giá trị là 7
const char * S = “C++”;// S là hằng con trỏ, trỏ tới xâu “C++”
Chú ý: Các hằng số trong C++ được ngầm hiểu là hệ 10, nhưng ta có thể viết các hằng trong hệ 16 hoặc 8 bằng cú pháp, giá trị số hệ 16 được bắt đầu bằng 0x, ví dụ như 0x24, 0xA, các số hệ 8 bắt đầu bởi số 0, ví dụ 025, 057.
Một số hằng cụ thể:
· Hằng nguyên
Các giá trị thuộc kiểu short, int, unsigned, long … : 100, 3456…
Cách viết trên là thể hiện của số nguyên trong hệ thập phân, ngoài ra chúng còn được viết dưới các hệ đếm khác như hệ cơ số 8 hoặc hệ cơ số 16. Một số nguyên trong cơ số 8 luôn được viết với số 0 ở đầu, tương tự với cơ số 16 phải viết với 0x ở đầu. Ví dụ số 65(10) trong cơ số 8 là 101(8) và trong cơ số 16 là 41(16), do đó 3 cách viết 65, 0101, 0x41 là như nhau, cùng biểu diễn giá trị 65(10).
· Hằng thực
Một số thực dạng kiểu float hoặc double: -7.0, 3.1416, 25e3, 314e-2, ...
- Dạng dấu phảy tĩnh: 3.0, -7.0, 3.14, …
- Dạng dấu phảy động: 25e3 (=25x1000), 314e-2 (=3.14)...
Tổng quát: Me±K = M x 10±K
· Hằng kí tự
Gồm các ký tự trong bảng mã ASCII, cách viết thông dụng là đặt giữa 2 dấu nháy đơn như: 'A', '3', ' ' (dấu cách) ... hoặc sử dụng trực tiếp giá trị số của chúng trong bảng mã là 65, 51 và 32... Trường hợp viết dưới dạng hệ 8 hoặc hệ 16 theo mẫu sau:
- '\kkk': không quá 3 chữ số trong hệ 8. Ví dụ '\11' biểu diễn kí tự có mã 9.
- '\xkk': không quá 2 chữ số trong hệ 16. Ví dụ '\x1B' biểu diễn kí tự có mã 27.
Tóm lại, một kí tự có thể có nhiều cách viết, chẳng hạn 'A' có giá trị là 65 (hệ 10) hoặc 101 (hệ 8) hoặc 41 (hệ 16), do đó kí tự 'A' có thể viết bởi một trong các dạng sau:
65, 0101, 0x41 hoặc 'A' , '\101' , '\x41'
Tương tự, dấu kết thúc xâu có giá trị 0 nên có thể viết bởi 0 hoặc '\0' hoặc '\x0', trong các cách này cách viết '\0' được dùng thông dụng nhất.
- Một số hằng ký tự thông dụng khác
Đối với một số hằng kí tự thường dùng nhưng không có mặt chữ tương ứng, hoặc các kí tự được dành riêng với nhiệm vụ khác, khi đó thay vì phải nhớ giá trị của chúng ta có thể viết theo qui ước sau:
'\n' | : | biểu thị kí tự xuống dòng (cũng tương đương với endl) |
'\t' | : | kí tự tab |
'\a' | : | kí tự chuông (tức thay vì in kí tự, loa sẽ phát ra một tiếng 'bíp') |
'\r' | : | xuống dòng |
'\f' | : | kéo trang |
'\\' | : | dấu \ |
'\?' | : | dấu chấm hỏi ? |
'\'' | : | dấu nháy đơn ' |
'\"' | : | dấu nháy kép " |
Ví dụ: cout << "Hôm nay trời \t nắng \a \a \a \n" ;
· Hằng xâu kí tự
Là dãy kí tự bất kỳ đặt giữa cặp dấu nháy kép. Ví dụ: "Lớp K43*", "12A4", "A", "<>", "" là các hằng xâu kí tự, trong đó "" là xâu không chứa kí tự nào, các xâu "<>", "A" chứa 1 kí tự ... Số các kí tự giữa 2 dấu nháy kép được gọi là độ dài của xâu. Ví dụ xâu "" có độ dài 0, xâu "<>" hoặc "A" có độ dài 1 còn xâu "Lớp K43*" có độ dài 8.
Chú ý phân biệt giữa 2 cách viết 'A' và "A", tuy chúng cùng biểu diễn chữ cái A nhưng chương trình sẽ hiểu 'A' là một kí tự còn "A" là một xâu kí tự (do vậy chúng được bố trí khác nhau trong bộ nhớ cũng như cách sử dụng chúng là khác nhau).
Tóm lại một giá trị có thể được viết dưới nhiều kiểu dữ liệu khác nhau và do đó cách sử dụng chúng cũng khác nhau. Ví dụ liên quan đến khái niệm 3 đơn vị có thể có các cách viết sau tuy nhiên chúng hoàn toàn khác nhau:
- 3: số nguyên 3 đơn vị - 3L: số nguyên dài 3 đơn vị - 3.0: số thực 3 đơn vị | - '3': chữ số 3 -"3":xâu chứa kí tự duy nhất là 3
|
2.3. Biến (variables)
Biến là đại lượng mang giá trị, có thể thay đổi khi thực hiện chương trình. Khi khai báo, máy tính cấp cho mỗi biến một vùng nhớ tương ứng với kích thước tên kiểu dữ liệu. Biến phải được khai báo trước khi sử dụng và có thể khai báo ngay tại vị trí bắt đầu dùng (không nhất thiết phải khai báo tại đầu mỗi hàm).
Cách khai báo (declaring variables):
Cách 1: khái báo thường.
Tên_Kiểu_dữ_liệu <biến1>, <biến2>, …;
Cách 2: khái báo và khởi tạo giá trị đầu.
C1: Tên_Kiểu_dữ_liệu biến1=<giá trị 1>, biến2=<giá trị 2>, …;
C1: Tên_Kiểu_dữ_liệu biến1(<giá trị 1>), biến2(<giá trị 2>), …;
Ví dụ a:
long a,b; // hai biến a và b kiểu long
int n=10; //khai báo và khởi tạo biến n=10
int i = 2, j , k = n + 5; // khai báo i và khởi tạo bằng 2, k bằng 15
float eps = 1.0e-6 ; // khai báo biến thực epsilon khởi tạo bằng 10-6
char c = 'Z'; // khai báo biến kí tự c và khởi tạo bằng 'Z'
char d[100] = "Tin học";
Ví dụ b:
#include <iostream>
using namespace std;
int main () {
// declaring variables (khai báo biến):
int a, b;
int result;
// process:
a = 5;
b = 2;
a = a + 1;
result = a - b;
// outout the result:
cout << result;
// terminate the program:
return 0;
}
Chú ý:
- Cần đặt tên biến sao cho gợi nhớ đến ý nghĩ của biến đó.
- Không đặt tên biến quá ngắn hay quá dài.
- Tùy theo giá trị lớn nhất và nhỏ nhất của biến mà lựa chọn tên kiểu dữ liệu phù hợp để tiết kiệm bộ nhớ máy tính. Những chương trình lớn thực sự cần thiết điều này. Ví dụ để lưu giá trị điểm 15 phút của học sinh, ta thấy rằng điểm là các số nguyên trong [0..10] thì chọn tên short int(2byte) sẽ hợp lý hơn tên kiểu int(4 byte).
- Mỗi biến được cấp phát một vùng nhớ gồm một số byte liên tiếp. Số hiệu của byte đầu chính là địa chỉ của biến. Địa chỉ của biến sẽ được sử dụng trong một số hàm ta sẽ nghiên cứu sau này. Để lấy địa chỉ của một biến ta sử dụng phép toán :
& tên biến (&a hay &x...)
Bạn có thể đăng câu hỏi về bài học này ở đây