Sunday, December 19, 2010

Bài 6 Các kiểu dữ liệu đơn giản


6.1. KHÁI NIỆM VỀ KIỂU DỮ LIỆU
        Chức năng của máy điện toán là xử lý các thông tin. Các thông tin được nhập và lưu trữ trong bộ nhớ của máy dưới các dạng khác nhau: có thể là số, là chữ, có thể là hình ảnh, âm thanh,.v.v. mà thuật ngữ tin học gọi chung là dữ liệu. Tính đa dạng của dữ liệu đòi hỏi phải tổ chức và phân phối bộ nhớ thích hợp để lưu trữ và xử lý tốt các dữ liệu. Ngôn ngữ thảo chương chia các dữ liệu thành từng nhóm riêng trên đó xây dựng một số phép toán tạo nên các kiểu dữ liệu khác nhau, mỗi kiểu dữ liệu là một tập hợp các gía trị mà một biến thuộc kiểu đó có thể nhận. Khi một biến được khai báo thuộc kiểu dữ liệu nào thì máy sẽ dành cho biến đó một dung lượng thích hợp trong bộ nhớ để có thể lưu trữ các gía trị thuộc kiểu dữ liệu đó.
        Các kiểu dữ liệu trong ngôn ngữ Pascal được chia ra thành hai loại chính: loại đơn giản và loại có cấu trúc.
        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 gía trị False, True với quy ước False < True.
        Các kiểu dữ liệu có cấu trúc đượ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 .
        Các kiểu dữ liệu đơn giản gồm có: kiểu nguyên, kiểu 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 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 gía trị, nhưng cũng có thể xem là một mảng các gía 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.
        Các kiểu dữ liệu đơn giản còn được phân thành hai loại: đếm được (Ordinal type) và không đếm được. Kiểu thực thuộc loại không đếm được, các gía trị của nó dày đặc. Tất cả các kiểu dữ liệu đơn giản còn lại : nguyên, ký tự, lô gic, liệt kê và đoạn con đều thuộc loại đếm được (còn gọi là rời rạc).
        Dưới đây sẽ lần lượt trình bày kỹ về 4 kiểu dữ liệu đơn giản chuẩn và thông dụng: kiểu nguyên, kiểu thực, kiểu logic, kiểu ký tự . Kiểu chuỗi được giới thiệu để có thể sử dụng ngay ở mức đơn giản.
 
6.2. KIỂU SỐ NGUYÊN
6.2.1. Các kiểu số nguyên :
Tên kiểu Phạm vi gía 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 6.1
        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. Bảng 6.1 liệt kê chi tiết về tên gọi, phạm vi gía trị và độ dài tính theo đơn vị byte của từng kiểu nguyên.
        Các biến nguyên chỉ có thể nhận các gía trị là các số nguyên nằm trong phạm vi gía 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". Ví dụ, cho khai báo :
Var
i : Byte;
N : Integer;
thì các lệnh đưới đây là đúng:
i:= 200;
N:= -1500;
còn các lệnh dưới đây là bị lỗi :
i:= -5;
N:= 50000;
Ðặc biệt 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".
        Chú ý:
Các số nguyên hệ thập lục phân (hệ 16) được biểu diễn bằng cách viết thêm dấu $ ở trước số, ví dụ ba số dưới đây :
$A , $FF và $10
là các số nguyên viết trong hệ 16. Chúng có gía trị tương ứng trong hệ 10 là:
          10 , 255 và 16
6.2.2. Các phép toán số học trên 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 *, ví dụ 4*2 cho kết qủa là 8.
Phép chia : ký hiệu bằng dấu / , ví dụ 6/4 cho kết qủa là 1.5.
Phép chia lấy phần nguyên : ký hiệu bằng từ khóa DIV.
Phép lấy phần dư nguyên của phép chia: ký hiệu bằng từ khóa MOD.
   Ví dụ: 15 DIV 6 cho kết qủa là 2.
             15 MOD 6 cho kết qủa là 3.
   Các phép toán trên đều cho kết qủa là các số nguyên, trừ ra phép chia ( / ) luôn cho kết qủa 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ó gía 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 tiên
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ụ: 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 :
      bullet2.gif (917 bytes) Ví dụ 6.1: 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 VIDU61;
{ Ðổi tiền }
Var
N, st5, st2, st1, sodu : LongInt;
Begin
Write(‘ Nhap so tien : ’); Readln(N);
st5 := N div 5;
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.
        Chạy<VD61.EXE>
        Chép  tập tin nguồn <VD61.PAS>
6.2.3. Các phép toán so sánh :
      Ngôn ngữ Pascal có sáu phép toán so sánh được liệt kê trong bảng 6.2 .
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 6.2
Kết qủa của các biểu thức so sánh là một gía trị lôgic Ðúng (TRUE) hoặc Sai (FALSE). Ví dụ:
        Biểu thức 5*2=10 cho kết qủa là TRUE.
        Biểu thức 5+2 <> 7 cho kết qủa là FALSE.
        Biểu thức 6 div 2 > 10 div 3 cho kết qủa là FALSE.
  6.2.4. Các phép toán lôgic trên số nguyên :
     Các phép tính NOT, AND, OR, XOR xử lý các bít nhị phân được xác định như sau ( bảng 6.3 ):
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.3
       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
  6.2.5. Các phép dịch chuyển số học SHR và SHL :
        N SHR k : dịch các bít của số nguyên N sang phải đi k bít.
        N SHL k : dịch các bít của số nguyên N sang trái đi k bít.
Có thể chứng minh được :
        N SHR k = N div 2k
        N SHL k = N * 2k
Ví dụ:
        120 shr 4 = 7, vì :
        120 shr 4 = 120 div 24 = 120 div 16 = 7.
        120 shl 3 = 960, vì :
        120 shl 3 = 120 * 23 = 120 * 8 = 960.
Hai phép toán SHR và SHL được dùng khi muốn tăng tốc độ tính toán trên các số nguyên.

  6.2.6. 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ề gía trị logic là TRUE nếu k lẻ, là FALSE nếu k chẵn.
    Ví dụ:
        Odd(15) = True
        Odd(4) = False.
Ví dụ 6.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ữ le? 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.
Chép tập tin nguồn <VD62.PAS>
  6.2.7. Các thủ tục có đố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);
    thì gía 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);
thì gía 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);

6.3. KIỂU SỐ THỰC
6.3.1 Kiểu Real và các kiểu mở rộng :
     Kiểu Real là kiểu số thực thông dụng nhất dùng để biểu diễn các số thực x có trị tuyệt đối ? x? nằm trong khoảng từ 2.9*10-39 đến 1.7*10+38. Nếu ? x? > 1.7*10+38 thì không biểu diễn x trong máy được, còn nếu ? x? < 2.9*10-39 thì x được coi là bằng 0.
    Có hai cách biểu diễn các số thực:
         Cách 1: Viết bình thường, trong đó dấu phẩy thập phân được thay bằng dấu chấm thập phân.
             Ví dụ:    45.0 -256.45 +122.08
        Cách 2: Viết số dưới dạng khoa học :
            1.257E+01 (có gía trị = 1.257*101 = 12.57 )
            1257.0E-02 (có gía 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.
        Số viết theo cách 1 còn gọi là số có dấu chấm thập phân cố định, số viết theo cách 2 còn gọi là số có dấu chấm thập phân di động hay số dạng khoa học (Scientific).
        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 va?Comp. Bảng 6.4 nêu chi tiết về phạm vi gía 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 gía 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 6.4
        bullet2.gif (917 bytes) Chú y? : Turbo Pascal thường chỉ làm việc với một kiểu Real. Muốn dùng 4 kiểu thực còn lại, phải chuyển sang mode 8087 bằ?g cách viết chỉ thị {$N+} ở ngay đầu chương trình.
       
  6.3.2. Các phép toán trên số thực :
        Có 4 phép toán số học là nhân (*), chia (/), cộng (+) và trừ (-). Khi một trong các số hạng tham gia tính toán là kiểu thực thì kết qủa của phép toán cũng là một số thực.
        Phép toán DIV, MOD không dùng cho các số thực.
      Ví dụ: với hai biến x, y kiểu thực thì lệnh sau là bị lỗi vì biểu thức vế phải không hợp lệ:
                y:= x mod 10 ;
          Các phép toán so sánh (= , <> , < , <= , > , >= ) cũng dùng được cho các số hạng là thực hay nguyên.        
  6.3.3. Các hàm có đối số nguyên hoặc 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 qủa 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 qủa cùng kiểu với đối số. Ví dụ:
            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 gía trị trả về?luôn luôn là kiểu thực:
        Hàm SQRT(x): tính , (x ? 0)
        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): tính sinx, cosx và arctgx.
        Hàm INT(x) : cho số thực bằng phần nguyên của x. Ví dụ :
                Int(12.55) = 12.0
                Int(1+10/3)=4.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 qủa 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
                Round(-2.98) = -3
        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 gía 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).
    Ví dụ 6.3: Viết chương trình nhập số thực x bất kỳ, tính và in các gía trị y và z lên màn hình theo công thức:
               
               
            Trong Pascal không có hàm tính trực tiếp 2x và Log4(x), nên ta phải chuyển qua hàm ex và Ln(x) như sau:
                , và
    Chương trình cụ thể như sau:
PROGRAM VIDU63;
Var
        x, y, z : Real;
Begin
        Write(‘Nhap x: ‘); Readln(x);
        y:= ( sqrt (x*x+1) + sin(x)*sin(x) ) / ( 3*exp(2*x) + 1 );
        z:= exp( x*Ln(2) ) + Ln(abs(x)+1) / Ln(4);
        Writeln(‘y= ‘, y:10:3 );
        Writeln(‘z= ‘, z:10:3 );
        Readln;
End.
        Chạy<VD63.EXE>.
        Chép tập tin nguồn <VD63.pas>
        Khi chạy chương trình, nếu nhập x =0 thì kết qủa y=0.250 và z=1.000.
 
6.4. KIỂU KÝ TỰ (CHAR)
     6.4.1. Ký tự và biến kiểu ký tự:

tự
ASCII
 
tự
ASCII
tự
ASCII
 
32
 
A
65
a
97
0
48
 
B
66
b
98
1
49
 
C
67
c
99
2
50
 
D
68
d
100
3
51
 
E
69
f
101
4
52
 
F
70
e
102
5
53
 
G
71
g
103
6
54
 
H
72
h
104
7
55
 
I
73
i
105
8
56
 
J
74
j
106
9
57
 
K
75
k
107
     
L
76
l
108
     
M
77
m
109
     
N
78
n
110
     
O
79
o
111
     
P
80
p
112
     
Q
81
q
113
     
R
82
r
114
     
S
83
s
115
     
T
84
t
116
     
U
85
u
117
     
V
86
v
118
     
W
87
w
119
     
X
88
x
120
     
Y
89
y
121
     
Z
90
z
122
Bảng 6.5
        Các ký tự dùng trong máy tính điện tử được liệt kê đầy đủ trong bảng mã ASCII gồm 256 ký tự khác nhau và được đánh số thứ tự từ 0 đến 255. Số thứ tự của mỗi ký tự còn gọi là mã ASCII của ký tự đó. Biểu 6.5 liệt kê một phần của bảng mã ASCII gồm các chữ số và chữ cái kèm theo mã của chúng.
        Trong bảng 6.5, ký tự có mã bằng 32 là ký tự trắng (space).
        Tuy có 256 ký tự khác nhau song chỉ có 128 ký tự đầu tiên là hay dùng, còn lại là các ký tự mở rộng. Các ký tự có mã từ 0 đến 31 gọi là các ký tự điều khiển, không in ra được, được dùng để điều khiển các thiết bị ngoại vi, chẳng hạn ký tự có mã là 7 dùng để tạo một tiếng kêu bip, ký tự có mã là 13 dùng để chuyển con trỏ màn hình xuống đầu dòng dưới...
        Mỗi ký tự trong bảng mã ASCII gọi là một hằng ký tự, chiếm độ dài 1 byte, và khi viết trong Pascal phải được đặt trong cặp nháy đơn: ‘0’, ‘1’, ‘A’, ‘B’, ‘$’,...
        Giữa các ký tự, có một thứ tự mặc nhiên theo nguyên tắc : ký tự có mã nhỏ hơn thì nhỏ hơn. Tức là:
        Ký tự trắng < ‘0’< ‘1’< ...< ‘9’< ‘A’< ‘B’< ...’Z’< ‘a’< ‘b’< ...< ‘z’
        Biến nhận gía trị là các hằng ký tự gọi là biến kiểu ký tự, chúng được khai báo nhờ từ khóa CHAR, chẳng hạn như khai báo hai biến ch và ch1 dưới đây:
    Var
            ch, ch1: Char ;
        Khi đó có thể gán:
            ch:=‘A’;
            ch1:=‘$’;
        Ký tự ‘A’ gọi là gía trị của biến ch, còn ‘$’ là gía trị của biến ch1.
bullet2.gif (917 bytes) Nhận xét: Từ bảng mã của các chữ cái ta suy ra:
            Mã chữ thường = Mã chữ hoa tương ứng + 32. (1)
  6.4.2. Các hàm liên quan đến ký tự :
Hàm PRED(ch): cho ký tự đứng ngay trước ký tự ch trong bảng mã. Ví dụ: Pred(‘B’)=‘A’
Hàm SUCC(ch): cho ký tự đứng ngay sau ký tự ch trong bảng mã. Ví dụ: Succ(‘A’)=‘B’.
Hàm UpCase(ch): đổi ký tự ch thành chữ hoa. Ví dụ:
        Upcase( ‘a’ ) = ‘A’, Upcase( ‘b’ ) = ‘B’, Upcase( ‘A’ ) = ‘A’ .
Hàm ORD(ch) : cho mã của ký tự ch. Ví dụ: Ord (‘A’) = 65, Ord (‘a’) = 97 .
Hàm CHR(k) : đối số k nguyên, 0? k ? 255, cho ký tự có mã bằ?g k. Ví dụ:
        Chr (65)= ‘A’ ,
        Chr (97)= ‘a’,
        Chr(32) là ký tự trắng.
    Có một số ký tự không có trên bàn phím, để viết chúng lên màn hình ta phải dùng lệnh Write và hàm CHR. Ví dụ:
        Lệnh Writeln(Chr(201)) ; in ra ký tự : +
        Lệnh Writeln(Chr(187)) ; in ra ký tự : +
        Ký tự có mã là 7 gọi là ký tự BEL (chuông), và lệnh:
        Write( Chr(7) ) ; hay Write(#7) ;
        có tác dụng phát ra một tiếng kêu bip.

Chú ý:
Turbo Pascal ( TP ) cho phép viết gọn Chr(k) thành #k nếu k là hằng số. Ví dụ, hai lệnh sau cùng in lên màn hình chữ A :
        Write(#65);
        Write(Chr(65));
Trong TP không có hàm đổi chữ hoa ra chữ thường, nhưng có thể làm việc này nhờ công thức (1) và hai hàm Ord và Chr :
        Chữ thường := Chr ( Ord(chữ hoa) + 32 )
        Ví dụ 6.4: Nhập vào một số nguyên k, 0? k ? 255, in ra ký tự có mã là k. Chương trình kết thúc khi nhập vào số 0 :
PROGRAM VIDU64 ;
Uses CRT;
Var
k : Byte;
Begin
CLRSCR;
Writeln(‘ Nhập số 0 để kết thúc :’);
Repeat
Write(‘ Nhập mã của ký tự : ‘); Readln(k);
Writeln(‘ Ký tự có mã ‘, k, ‘ là ‘ , Chr(k) );
Until k=0;
End.
Chép tập tin nguồn <VD64.PAS>
     bullet2.gif (917 bytes) Ví dụ 6.5: Nhập một ký tự, nếu là chữ hoa thì đổi ra chữ thường, nếu là chữ thường thì đổi ra chữ hoa.
PROGRAM VIDU65;
{ Ðổi chữ hoa ra thường và ngược lại}
Var
ch, ch1 : Char;
Begin
Write(‘ Nhập một ký tự :’); Readln(ch);
If (ch>=‘A’) and ( ch<=‘Z’) then ch1:=Chr( Ord (ch)+32)
else
ch1:= Upcase(ch);
Writeln(ch, ‘ đã đổi ra: ‘ , ch1);
Readln;
End.
Chép tập tin nguồn <VD65.PAS>
6.5. KIỂU LÔGIC (BOOLEAN)
        Kiểu boolean chỉ có hai gía trị là TRUE (đúng) và FALSE (sai), không phân biệt chữ hoa hay chữ thường. Về quan hệ thứ tự thì FALSE< TRUE. Mỗi gía trị boolean chiếm một byte bộ nhớ.
        Các phép toán lôgic gồm có: NOT, AND, OR và XOR. Nếu A và B là hai đại lượng lôgic thì NOT A, A and B, A or B và A xor B cũng là những đại lượng lôgic có kết qủa được cho ở bảng 6.6.

A
not A
True False
False True

A
B
A and B
A or B
A xor B
True True True True False
True False False True True
False True False True True
False False False False False

Bảng 6.6
    Cũng từ bảng này ta rút ra các nhận xét :
A and B là đúng khi và chỉ khi A và B đồng thời đúng. (Do đó chỉ cần một trong hai biến A hoặc B sai thì A and B sẽ sai).
A or B là sai khi và chỉ khi A và B đồng thời sai. (Do đó chỉ cần một trong hai biến A hoặc B đúng thì A or B sẽ đúng).
A xor B là đúng khi và chỉ khi A khác B.
       
        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ì gía 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 gía 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;
        Gía 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 đúng thành :
        (N > 0) and (N<10)
   Ví dụ 6.6:
      Nhập vào độ dài ba cạnh a,b,c của một tam giác, nếu a, b, c không phải là ba cạnh của tam giác thì   in lên màn hình câu " không phải ba cạnh của tam gíac", ngược lại, nếu đúng là ba cạnh của một tam giác thì tính chu vi và diện tích tam giác đó theo công thức Hêrông:
                img_u065_1.gif (1182 bytes), với p là nửa chu vi:
                img_u065_2.gif (1026 bytes)
        Ta biết, điều kiện để a,b,c là ba cạnh của một tam giác là mỗi cạnh phải dương và tổng hai cạnh thì lớn hơn cạnh còn lại.
        Dưới đây là chương trình cụ thể :
PROGRAM VIDU66;
{Tính diện tích và chu vi tam giác theo 3 cạnh}
Var
a, b, c, P, S : Real;
Tgiac: Boolean;
Begin
Write(‘ Nhap 3 canh cua tam giac : ‘);
Readln(a, b, c);
Tgiac:= (a>0) and (b>0) and (c>0) and
(a+b>c) and (a+c>b) and (b+c>a);
If Tgiac= FALSE then
Writeln(‘ Khong phai ba canh cua tam giac !’)
else
begin
P:=(a+b+c)/2;
S:= Sqrt( P*(P-a)*(P-b)*(P-c) );
Writeln(‘ chu vi = ‘ , 2*P:10:2);
Writeln(‘ dien tich S= ‘ , S:10:2);
end;
Readln;
End.
        Chạy<VD66.EXE>
        Chép tập tin nguồn <VD66.PAS>
        Khi chạy chương trình này, để nhập ba cạnh của tam giác, bạn gõ ba số cách nhau khoảng trắng rồi enter, chẳng hạn :
            Nhap 3 canh cua tam giac : 3 4 5
        Kết qủa chu vi= 12.00, dien tich= 6.00. Nếu nhập ba cạnh là : 2 3 6 thì máy hiện câu: "Không phải ba cạnh của tam giác ! " (vì 2+3 < 6).

 
6.6. CHUỖI KÝ TỰ (STRING)
     Một dãy ký tự đặt trong cặp nháy đơn gọi là một hằng chuỗi. Dưới đây là ba hằng chuỗi :
‘NGON NGU PASCAL’
‘Tin hoc nam 2000’
‘123456’
        Các chuỗi có thể được ghép nối với nhau nhờ phép cộng chuỗi. Khi cộng (+) hai chuỗi ta được một chuỗi duy nhất bằng cách ghép chuỗi sau vào cuối của chuỗi đầu. Ví dụ phép cộng :
           ‘Ngon ngu’ + ‘ Pascal’ cho kết qủa là ‘Ngon ngu Pascal’.
        Các chuỗi cũng so sánh được với nhau. Việc so sánh hai chuỗi được thực hiện bằng cách so sánh từng cặp ký tự tương ứng từ trái qua phải. Khi phát hiện có một cặp ký tự khác nhau thì chuỗi nào chứa ký tự nhỏ hơn sẽ nhỏ hơn, ví dụ:
           Biểu thức ‘Anh’ < ‘an’ là đúng vì ‘A’ < ‘a’
           Biểu thức ‘Thong’ > ‘Tha’ là đúng vì ‘o’ > ‘a’
        Nếu nội dung?của hai chuỗi giống nhau từ đầu đến hết chiều dài của chuỗi ngắn hơn thì chuỗi ngắn hơn là nhỏ hơn, ví dụ:
           Biểu thức ‘Tha’ < ‘Thang’ là đúng vì ‘Tha’ ngắn hơn ‘Thang’.
        Hai chuỗi bằng nhau nếu chúng dài bằng nhau và mọi cặp ký tự ở các vị trí tương ứng đều giống nhau. Ví dụ:
            Biểu thức ‘Pascal’ = ‘Pascal’ cho kết qủa là đúng
            Biểu thức ‘Pascal’ = ‘PAscal’ cho kết qủa là sai.
       Biến nhận giá trị là các hằng chuỗi gọi là biến kiểu chuỗi. Có thể khai báo hai biến chuỗi như sau:
            Var
                  Ho_ten : String[20];
                  St : String;
khi đó Ho_ten là biến chuỗi có thể chứa tối đa 20 ký tự, còn biến chuỗi St có thể chứa tối đa 255 ký tự, và ta có thể gán :
            Ho_ten := ‘Nguyen Van An’;
            St :=‘Thao chuong bang ngon ngu Pascal’;
        Chuỗi ‘Nguyen Van An’ gọi là gía trị của biến Ho_ten. Tương tự, chuỗi ‘Thao chuong bang ngon ngu Pascal’ là gía trị của biến St.
6.7. CÂU HỎI TRẮC NGHIỆM
  Câu 1: Cho khai báo biến :
   Var m, n : integer;
            x, y : Real;
    Lệnh nào sai :
      a) m := -4;
      b) n := 3.5;
      c) x := 6;
      d) y := +10.5;
Câu 2: Ðể tính gía trị , chọn cách viết nào :
      a) x := -b/2a;
      b) x := -b/2*a;
      c) ;
      d) x := -b/2/a;
Câu 3: Biểu thức : 25 div 3 + 5/2*3 có giá trị là :
      a) 8.0;
      b) 15.5;
      c) 9.5;
      d) 15.0;
Câu 4: Cho phương trình : ax2 + bx + c = 0 .
    Giả sử a? 0 và Delta:= b*b- 4*a*c > 0 . Một nghiệm của phương trình là :
      a) X:= -b + SQRT(Delta) / (2*a);
      b) X:= (-b + SQRT(Delta) ) /2*a;
      c) X:= (-b + SQRT(Delta) ) / (2*a);
      d) X:= (-b -SQR(Delta) ) /2/a;
Câu 5: Cho ch là biến có kiểu Char. Lệnh nào đúng :
      a) ch:="a"
      b) ch:=65;
      c) ch:=chr(65);
      d) ch:='abcd';
Câu 6:Biến X được khai báo là kiểu integer. Lệnh nào sai :
      a) X:= round(275/3);
      b) X:= 210 div 4;
      c) X:= SQRT(49);
      d) X:= ABS(-453);
Câu 7: Biểu thức nào sau đây có giá trị TRUE :
      a) (100 > 76) and ('B' < 'A');
      b) not (49.5 + 2 < 5) or (2 > 4 div 2);
      c) (49.5 + 2 < 5) and (2 < 4 div 2);
      d) 2*(3+5) < 18 div 4*4;
Câu 8: Khi chạy chương trình :
Var St, St1 : String;
Begin
St := '123';
St1 := '456';
Write(St + St1);
End;
Kết quả in ra là :
    a) '123456';
    b) 123456;
    c) 579;
    d) Câu a), b), c) đều sai;
Câu 9: Sau phép gán : Ch := CHR( ORD('a')- 32 ); thì giá trị của Ch là :
      a) 65;
      b) A;
      c) 'A';
      d) 'a';
Câu 10: Khi chạy chương trình :
Var
a, b, c, N : integer;
Begin
N:=546;
a:=N div 100;
b:=(N Mod 100) div 10;
c:=(N Mod 100) Mod 10;
Write(a+b+c);
End.
Kết quả in ra :
      a) 546;
      b) 5;
      c) 15;
      d) 6;

No comments:

Post a Comment