Các kiểu dữ liệu đơn giản

Một phần của tài liệu Tập bài giảng tin học đại cương 2 pdf (Trang 68 - 81)

3.2. Các thành phần cơ bản

3.2.2. Các kiểu dữ liệu đơn giản

Khái niệm chung về dữ liệu và kiểu dữ liệu

- Dữ liệu (Data) là tất cả những gì được máy tính xử lý

- Kiểu dữ liệu (Data Type): là một tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận được, trên đó xác định được phép toán. Mỗi ngôn ngữ lập trình có quy định các kiểu dữ liệu để xử lý và tính toán khác nhau. Trong ngôn ngữ lập trình Pascal, một biến phải được gắn với một kiểu dữ liệu cụ thể.

Hình 10 - Sơ đồ thống kê các kiểu dữ liệu trong Pascal

- Kiểu vô hướng (Scalar Type) hay kiểu đơn giản (Simple Type) là kiểu dữ liệu gồm một tập các giá trị của nó được sắp xếp theo thứ tự tuyến tính.

Mỗi kiểu dữ liệu đơn giản là một tập các giá trị cơ sở có thứ tự. Ví dụ kiểu Integer gồm các số nguyên nằm trong phạm vi từ -32768 đến 32767 và có thứ tự tự nhiên : -32768< ... < -1 < 0 < 1 < ... < 32767, kiểu lôgic chỉ có hai giá trị False, True với quy ước False < True.

Các kiểu dữ liệu đơn giản gồm có: kiểu số nguyên, kiểu số thực, kiểu lôgic, kiểu ký tự, kiểu liệt kê và kiểu đoạn con

- Các kiểu dữ liệu có cấu trúc (Structure type) được xây dựng từ các kiểu dữ liệu đơn giản. Mỗi kiểu dữ liệu có cấu trúc là một tập các phần tử thuộc kiểu dữ liệu đơn giản được tổ chức lại theo một quy tắc nhất định.

Kiểu dữ liệu (Data Type)

Kiểu vô hướng

Kiểu cơ sở

- Kiểu logic (Boolean) - Kiểu số nguyên (Integer) - Kiểu số thực (Real) - Kiểu ký tự (Char) Kiểu vô hướng do

người lập trình định nghĩa Kiểu dữ liệu có cấu trúc - Kiểu mảng (Array) - Kiểu tập (Set) - Kiểu bản ghi (Record) - Kiểu tệp (File)

Kiểu xâu kí tự (String)

Kiểu con trỏ (Pointer Type)

69

Các kiểu dữ liệu có cấu trúc gồm có :kiểu mảng, kiểu bản ghi, kiểu tập hợp và kiểu tập tin.

- Riêng chuỗi ký tự (STRING) là một kiểu dữ liệu đặc biệt, vừa có tính đơn giản lại vừa có tính cấu trúc. Mỗi chuỗi có thể xem là một giá trị, nhưng cũng có thể xem là một mảng các giá trị kiểu ký tự. Vì vậy, việc sử dụng chuỗi cũng có hai mức khác nhau: mức đơn giản và mức có cấu trúc.

3.2.2.1. Kiểu dữ liệu logic (Boolean)

Kiểu boolean chỉ có hai giá trị là TRUE (đúng) và FALSE (sai), TRUE và FALSE là các giá trị đã được định nghĩa sẵn, không phân biệt chữ hoa hay chữ thường. Về quan hệ thứ tự thì FALSE< TRUE. Mỗi giá trị boolean chiếm một byte bộ nhớ.

Các phép toán có thể áp dụng cho các giá trị kiểu Boolean và cho kết quả cũng là kiểu Boolean:

- Phép AND (phép “và” logic)

- Phép OR (phép “hoặc” logic)

- Phép NOT (phép “phủ định” logic)

- Phép XOR (phép “hoặc triệt tiêu”)

A B NOT A A AND B A OR B A XOR B

True True False True True False

True False False False True True

False True True False True True

False False True False False False

Bảng 2 - Bảng mô tả giá trị các biểu thức logic (bảng chân lý)

Từ bảng trên ta rút ra các nhận xét :

- A and B là đúng (TRUE) khi và chỉ khi A và B đồng thời đúng (TRUE). (Do đó chỉ cần một trong hai biến A hoặc B sai (FALSE) thì A and B sẽ sai (FALSE)).

- A or B là sai (FALSE) khi và chỉ khi A và B đồng thời sai (FALSE). (Do đó chỉ cần một trong hai biến A hoặc B đúng (TRUE) thì A or B sẽ đúng (TRUE)).

- A xor B là đúng khi và chỉ khi A khác B.

70

Thứ tự thực hiện các phép toán lôgic là như sau: NOT tính trước, kế đến AND, sau cùng là OR, XOR.

Ví dụ, sau khi thực hiện lệnh:

A:=Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1); thì giá trị của A= FALSE, thật vậy :

Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1) = TRUE or TRUE and FALSE xor TRUE

= TRUE or FALSE xor TRUE = TRUE xor TRUE

= FALSE

Biến chỉ nhận giá trị là TRUE hoặc FALSE gọi là biến kiểu lôgic. Khi khai báo biến kiểu lôgic ta dùng từ khóa Boolean, ví dụ :

Var A, B : Boolean;

Trong chương trình ta có thể gán : A:= true;

B:=2*2 < 3;

Giá trị của biến B sẽ là False vì biểu thức 2*2< 3 là sai.

- Về thứ tự tính toán, các phép so sánh thì ngang cấp nhau và được tính sau tất cả các phép toán khác. Ví dụ tính biểu thức :

5+7 div 2 < -7 mod 3 + 5*2 = 5 + 3 < -1 + 10

= 8< 9 = TRUE

Do đó, khi trong một biểu thức mà có các phép toán lôgic xen kẽ với các biểu thức so sánh thì các biểu thức so sánh phải để trong ngoặc đơn.

Chẳng hạn, biểu thức sau là sai quy cách: N > 0 and N<10. Cần sửa biểu thức thành: (N > 0) and (N<10).

Các biểu thức quan hệ (so sánh) sau luôn luôn cho kết quả là Boolean:

71

KÍ HIỆU

PHÉP TOÁN Ý NGHĨA KIỂU KẾT QUẢ

< > So sánh khác nhau Boolean

= So sánh bằng nhau Boolean

>= So sánh lớn hơn hoặc bằng Boolean

<= So sánh nhỏ hơn hoặc bằng Boolean

> So sánh lớn hơn Boolean

< So sánh nhỏ hơn Boolean

Bảng 3 - Bảng mô tả các phép toán so sánh

Chú ý: hai vế của biểu thức so sánh phải cùng kiểu nhau (trừ kiểu số thực và kiểu số nguyên) và chúng có thể là các kiểu Real, Integer, Boolean, Char hoặc kiểu dữ liệu vô hướng do người sử dụng định nghĩa.

3.2.2.2. Kiểu số nguyên (Integer)

Kiểu số nguyên được máy tính định nghĩa sẵn với từ khóa Integer. Một giá trị kiểu số nguyên là một phần tử của tập hợp các số nguyên mà ta có thể biểu diễn được trên máy tính. Thông thường, các số nguyên được biểu diễn bằng 2 Byte nên phạm vi của nó từ -32768 (= -215) đến 32767 (=215 – 1).

Các số nguyên được viết bằng các dãy chữ số 0, 1, 2, 3, …, 9 với chữ đầu có thể là có dấu dương + hoặc dấu âm -, hoặc không dấu.

Tên kiểu Phạm vi giá trị Số byte

ShortInt -128 .. 127 1

Byte 0..255 1

Integer -32768 .. 32767 2

Word 0 .. 65535 2

LongInt -2147483648 .. 2147483647 4

Bảng 4 - Bảng danh mục các kiểu dữ liệu số nguyên

Ngoài kiểu Integer là thông dụng nhất, các số nguyên còn được chia ra thành 4 kiểu nữa đó là: Byte, Word, ShortInt và LongInt.

Các biến nguyên chỉ có thể nhận các giá trị là các số nguyên nằm trong phạm vi giá trị của biến đó. Khi gán cho một biến một số nguyên nằm ngoài phạm vi của biến thì máy sẽ báo lỗi: "Const out of range".

Var

i : Byte; N : Integer;

72

Các lệnh đưới đây là đúng:

i:= 200; N:= -1500;

Các lệnh dưới đây là bị lỗi :

i:= -5; N:= 50000;

Chú ý:

Không thể gán một số thực cho một biến nguyên. Câu lệnh sau là sai :

N:= 12.5 ;

Khi gặp tình huống này, máy sẽ báo lỗi "Type mismatch".

* Các phép tính số học đối với số nguyên

- Phép cộng và trừ : ký hiệu + và - như thường lệ.

- Phép nhân: ký hiệu bằng dấu * chứ không phải là dấu chấm hay dấu x. Ví dụ 4*2 cho kết quả là 8.

- Phép chia lấy kết quả là số thực ký hiệu bằng dấu /, ví dụ 6/4 cho kết quả là 1.5.

- Phép chia lấy phần nguyên được thực hiện với từ khóa DIV.

- Phép lấy phần dư của 2 số nguyên được thực hiện với từ khóa MOD.

Ví dụ: 15 DIV 6 cho kết quả là 2. 15 MOD 6 cho kết quả là 3.

Các phép toán trên đều cho kết quả là các số nguyên, trừ ra phép chia (/) luôn cho kết quả là một số thực. Vì thế nếu N là một biến nguyên, mà gán N:= 20/5; thì máy sẽ báo lỗi, bởi vế phải có giá trị kiểu thực (=4.0) mặc dù phần lẻ bằng không.

Nhận xét : số nguyên N là chẵn nếu N mod 2 = 0 (tức N chia hết cho 2), ngược lại, là lẻ nếu N mod 2 <> 0 (dấu <> trong Pascal có nghĩa là khác nhau ). * Thứ tự thực hiện các phép toán cũng giống như thường lệ:

- Các biểu thức trong (...) được tính trước

73

- Kế đến là *, /, div, mod - Sau cùng là +, -

Ðối với các phép toán cùng thứ tự mà đứng liền nhau thì phép toán nào đứng trước được làm trước.

Ví dụ 1: tính biểu thức sau :

15 mod (2 +4) * 20 div (10 div 4) + 40 mod ( 5* 3) =15 mod 6 * 20 div 2 + 40 mod 15

= 3 * 20 div 2 + 10 = 60 div 2 + 10 = 30 + 10 = 40

Ví dụ sau đây là một ứng dụng của các phép toán div, mod :

Ví dụ 2: Nhập một số tiền N đồng, đổi ra xem được bao nhiêu tờ 5 đồng, bao nhiêu tờ 2 đồng, bao nhiêu tờ 1 đồng sao cho tổng số tờ là ít nhất. Ví dụ N=43đ = 8 tờ 5đ + 1 tờ 2đ + 1 tờ 1đ.

Cách tính như sau :

Số tờ 5 đ = 43 div 5 = 8 Số tiền dư = 43 mod 5 = 3

Số tờ 2 đ = Số tiền dư div 2 = 3 div 2 =1 Số tờ 1 đ = Số tiền dư mod 2 = 3 mod 2 = 1 Dưới đây là chương trình cụ thể :

PROGRAM VIDU1;{ Ðổi tiền } Var

N, st5, st2, st1, sodu : LongInt; Begin

Write(‘ Nhap so tien : ’); Readln(N); st5 := N div 5;

74

Sodu := N mod 5; { tính phần dư } st2 := Sodu div 2;

st1 := Sodu mod 2;

Writeln(‘ KET QUA DOI TIEN LA: ’ ) ; Writeln(‘ So to 5đ= ‘, st5); Writeln(‘ So to 2đ= ‘, st2); Writeln(‘ So to 1đ=‘, st1); Readln; End. * Các phép so sánh Ký hiệu Ý nghĩa Ví dụ = bằng nhau x=y <> khác nhau x<>y < nhỏ hơn x<y

<= nhỏ hơn hoặc bằng x<=y

> lớn hơn x>y

>= lớn hơn hoặc bằng x>=y

Bảng 5 - Ký hiệu và ý nghĩa các phép so sánh

Kết quả của các biểu thức so sánh là một giá trị lôgic Ðúng (TRUE) hoặc Sai (FALSE). Ví dụ:

Biểu thức 5*2=10 cho kết quả là TRUE. Biểu thức 5+2 <> 7 cho kết quả là FALSE.

Biểu thức 6 div 2 > 10 div 3 cho kết quả là FALSE.

* Các phép toán logic trên kiểu số nguyên (biểu diễn cho 1 bit)

NOT AND OR XOR

NOT 1 = 0 1 AND 1=1 1 OR 1=1 1 XOR 1=0

NOT 0 = 1 1 AND 0=0 1 OR 0=1 1 XOR 0=1 0 AND 1=0 0 OR 1=1 0 XOR 1=1 0 AND 0=0 0 OR 0=0 0 XOR 0=0

Bảng 6 - Các phép toán logic biểu diễn cho 1 bit

75

Mỗi số nguyên được biểu diễn trong máy dưới dạng một dãy các bít nhị phân. Số kiểu Integer được biểu diễn bằng 16 bit. Ví dụ, số 1 và số 2 có biểu diễn trong máy lần lượt là :

0000 0000 0000 0001 0000 0000 0000 0011

Phép lấy NOT một số nguyên sẽ đảo tất cả các bít biểu diễn số nguyên đó, tức là 0 thành 1, còn 1 thành 0. Ví dụ:

NOT 1 = 1111 1111 1111 1110 NOT 2 = 1111 1111 1111 1100

Phép lấy AND, OR, XOR hai số nguyên được tiến hành bằng cách AND, OR, XOR từng cặp bít tương ứng của hai số đó, ví dụ:

1 OR 2 = 0000 0000 0000 0011= 2 1 AND 2 = 0000 0000 0000 0001= 1 * Các hàm có đối số nguyên

- Hàm PRED(k): đối số k nguyên, trả về số nguyên đứng ngay trước k, tức là k-1.

Ví dụ: Pred (5) = 4, Pred (-6) = -7.

- Hàm SUCC(k): đối số k nguyên, trả về số nguyên đứng ngay sau k, tức là k+1.

Ví dụ: Succ (5) = 6, Succ (-6) = -5.

Nhận xét :

Lệnh k:=k+1; tương đương với lệnh k:=Succ(k); Lệnh k:=k-1; tương đương với lệnh k:=Pred(k);

- Hàm ODD(k) : đối số k nguyên, trả về giá trị logic là TRUE nếu k lẻ, là FALSE nếu k chẵn.

Ví dụ:

Odd(15) = True Odd(4) = False.

76

Ví dụ 2.2 : Nhập số nguyên N, nếu N chẵn thì in ra chữ chẵn, nếu N lẻ thì in ra chữ lẻ, chương trình như sau :

PROGRAM VIDU62; Var

N : Integer; Begin

Write(‘Nhap so N :’); Readln(N);

If Odd(N) = TRUE then write(N, ‘ La so le’) else

write(N, ‘ La so chan’); Readln;

End.

* Các thủ tục đối với số nguyên

Có hai thủ tục khá thông dụng là:

- Thủ tục INC(k) : tăng k lên một đơn vị. Ví dụ, sau khi thực hiện các lệnh : k:=5;

Inc(k);

→ giá trị sau cùng của k là 6.

Vậy, lệnh Inc(k); tương đương với lệnh k:=k+1; hay k:=Succ(k); - Thủ tục DEC(k) : giảm k đi một đơn vị. Ví dụ, sau khi thực hiện các lệnh :

k:=5; Dec(k);

→giá trị của k sẽ là 4.

Vậy, lệnh Dec(k) ; tương đương với lệnh k:=k-1; hay k:=Pred(k); 3.2.2.3. Kiểu số thực (Real)

Tương tự như kiểu kiểu số nguyên, kiểu số thực là tập hợp các số thực có thể biểu diễn được trong máy tính và được máy tính định nghĩa sẵn với từ khóa

REAL.

* Các phép toán trong kiểu số thực

Các phép toán cộng (+), trừ (-), nhân (*), chia (/) cũng như các phép toán quan hệ (=, <>, >, <, >=, <=) đều có thể áp dụng cho các toán hạng là số thực và toán hạng là số nguyên.

Chú ý: không tồn tại các phép DIV và MOD cho kiểu số thực

77

Trong máy tính các số thực được biểu diễn dưới 2 dạng: dạng bình thường và dạng dấu phảy động.

- Dạng viết thập phân bình thường như: 3.14, 3.0, -24.123 hoặc -0.002

Viết dưới dạng thập phân dấu chấm (.) là cách viết số thực của Việt Nam, Pháp …hay dấu phẩy (,) là cách viết số thực của Mỹ, Anh.

- Dạng viết số thực dấu phảy động, ví dụ như: 1.257E+01 (có giá trị = 1.257*101 = 12.57 ) 1257.0E-02 (có giá trị = 1257*10-2 = 12.57 )

Trong dạng này số gồm có hai phần, phần đứng trước E gọi là phần định trị, được viết theo cách 1, phần đứng sau E gọi là phần bậc, gồm dấu cộng hoặc trừ, tiếp đến là một số nguyên.

Ví dụ: Muốn khai báo hai biến x, y kiểu real, ta viết:

Var x, y : Real;

Ngoài kiểu Real ra, các số thực còn có 4 kiểu mở rộng nữa là Single, Double, Extended Comp. Bảng 3.2.4 nêu chi tiết về phạm vi giá trị và số byte dùng để lưu trữ trong bộ nhớ của từng kiểu số thực.

Tên kiểu Phạm vi giá trị Số byte

Real 2.9*10-39 .. 1.7*1038 6 Single 1.5*10-45 .. 3.4*1038 4 Double 5.0*10-324 .. 1.7*10308 8 Extended 3.4*10-4932 .. 1.1*104932 10 Comp -9.2*1018 .. 9.2*1018 8 Bảng 7 - Các kiểu dữ liệu số thực

* Các hàm có đối số nguyên hoặc số thực

- Hàm ABS(x): tính trị tuyệt đối của x : |x|. Kiểu dữ liệu của kết quả cùng kiểu với đối số. Nếu x nguyên thì ABS(x) cũng nguyên, nếu x là số thực thì ABS(x) cũng là số thực.

Ví dụ: Abs(5 - 8) = 3

- Hàm SQR(x): tính bình phương của x: x2. Kiểu dữ liệu của kết quả cùng kiểu với đối số. Ví dụ:

78

Sqr(4.0) = 16.0; Sqr(7 div 3) = 4

Trong các hàm dưới đây, đối số x có thể là nguyên hay thực, nhưng giá trị trả về luôn luôn là kiểu thực

- Hàm SQRT(x): tính -Hàm EXP(x) : tính ex

-Hàm LN(x): tính lnx, (x > 0)

-Các hàm SIN(x), COS(x), và ARCTAN(x): hàm tính lượng giác

-Hàm INT(x) : cho số thực bằng phần nguyên của x. Ví dụ : Int (12.55) = 12.0

-Hàm FRAC(x) : cho số thực bằng phần lẻ của x. Ví dụ : Frac (12.55) = 0.55

Hai hàm đặc biệt dưới đây cho kết quả là số nguyên:

-Hàm TRUNC(x): cho số nguyên là phần nguyên của x. Ví dụ : Trunc(12.55) = 12 ; Trunc(-2.98) = -2

-Hàm ROUND(x): cho số nguyên bằng cách làm tròn x. Ví dụ : Round(12.45) = 12

Chú ý rằng hàm Int(x) và hàm Trunc(x) cùng cho phần nguyên của x, chúng chỉ khác nhau về kiểu dữ liệu của giá trị trả về. Int(4.5)= 4.0 còn Trunc(4.5) = 4 (viết 4 thì hiểu đó là số nguyên, còn viết 4.0 thì hiểu đó là số thực).

3.2.2.4. Kiểu kí tự (Char)

Máy tính điện tử không chỉ có khả năng xử lý các dữ liệu kiểu số nguyên, số thực mà còn có khả năng xử lý các dữ liệu là chữ viết (ký tự) như khi soạn thảo văn bản…Các kí tự là tất cả các chữ viết mà ta thường dùng như các chữ cái a, b, c,….các chữ số 0, 1, 2, 3, …9, các dấu phân đoạn câu như :, ! …Kiểu kí tự được định danh trong Pascal là kiểu CHAR

Một hằng kí tự được biểu diễn bằng chữ viết đó nằm giữa hai dấu nháy “’” và “’”. Ví dụ: ‘a’,‘A’,‘z’,‘0’, ‘9’,‘*’,‘!’

Một giá trị kiểu kí tự là một phần tử của tập hợp hữu hạn các ký tự được sắp

Một phần của tài liệu Tập bài giảng tin học đại cương 2 pdf (Trang 68 - 81)