3.2. Các thành phần cơ bản
3.2.3. Khai báo hằng, biến, kiểu, biểu thức, câu lệnh
Quá trình xử lý trong máy tính đòi hỏi mỗi giá trị phải được lưu trữ ở một ô nhớ nào đó trong bộ nhớ của máy, và ô nhớ này được đặt một cái tên để gọi. Khi đó mọi việc tính toán hay xử lý liên quan đến mỗi giá trị được thực hiện gián tiếp thông qua tên của ô nhớ chứa giá trị đó. Ví dụ, nếu số 5.72 được lưu trong ô nhớ có tên là x, thì biểu thức 5.72*2 có thể được viết là x*2. Việc dùng tên x dễ nhớ và tiện hơn nhiều so với việc dùng và nhớ số 5.72.
82
Như vậy, khi một ô nhớ được đặt tên thì tên này đồng nhất với giá trị của nó. Trong một chương trình, mỗi ô nhớ có một tên duy nhất nhưng giá trị của nó thì có thể thay đổi hoặc không. Nếu giá trị của ô nhớ có thể thay đổi được thì ô nhớ này là một biến, tên của ô nhớ là tên biến, ngược lại, nếu giá trị của ô nhớ không thể thay đổi, thì ô nhớ là một hằng, tên của ô nhớ là tên hằng.
Các biến và hằng tham gia trong chương trình đều phải được khai báo. Việc khai báo có tác dụng báo trước cho máy dành sẵn các ô nhớ thích hợp trong bộ nhớ để sẵn sàng chứa dữ liệu.
3.2.3.1. Khai báo hằng
Hằng là một đại lượng có giá trị không đổi trong chương trình. Có các loại hằng số (nguyên và thực), hằng kí tự và hằng Boolean.
Cách khai báo: Const Tên_hằng = giá_ trị_của_hằng ;
Một dòng khai báo hằng được kết thúc bằng dấu chấm phẩy (;). Tên hằng được viết theo quy tắc viết tên theo đúng quy tắc của một tên. Ví dụ :
Const
N = 10; B = TRUE; SoPi = 3.14; SoE = 2.718;
Turbo Pascal có sẵn một số hằng chuẩn cho phép sử dụng mà không phải khai báo, như : Pi, MaxInt. Hằng Pi có giá trị bằng số , còn MaxInt = 32767, là số Integer lớn nhất. Chẳng hạn, có thể dùng các lệnh sau:
Writeln(‘Dien tich hinh tron ban kinh r=5 la: ‘, Pi*5*5:8:3); Writeln(‘So Integer lon nhat = ‘, MaxInt);
3.2.3.2. Khai báo biến
Biến (variable) là đại lượng có giá trị thay đổi được trong chương trình. Tên biến của chương trình là tên của ô nhớ cât giữ giữ liệu. Khác với hằng, biến có thể thay đổi được giá trị của nó. Các biến được khai báo bằng cách đặt các tên biến vào phần khai báo biến ở đầu chương trình, sau từ khóa Var
Cách khai báo biến như sau: Var Danhsáchtênbiến : TênKiểuDữliệu ;
83
Tên biến là tự đặt, theo đúng quy tắc của một tên. Ví dụ : Var
i, j : Integer; x, y : Real;
Theo khai báo trên, ta có hai biến i và j cùng kiểu số nguyên (Integer), và hai biến x, y cùng kiểu số thực (Real).
Dấu hai chấm (:) buộc phải có để ngăn cách hai phần của khai báo biến. Dấu chấm phẩy kết thúc dòng khai báo.
Nhiều biến có cùng kiểu có thể được khai báo với nhau bằng cách viết tên các biến đặt cách nhau qua dấu phẩy (,) như các biến M23, A25, AAA
Ví dụ:
M23, A25, AAA: Real; MY_NAME: STRING [25]; Y: BOOLEAN;
X: INTEGER;
3.2.3.3. Định nghĩa kiểu dữ liệu
Chúng ta đã làm quen với khái niệm kiểu dữ liệu ở trên. Đối với các kiểu dữ liệu cơ sở (real, integer, byte, char, boolean), đã được Pascal định nghĩa sẵn nên khi khai báo biến ta có thể dùng trực tiếp các kiểu dữ liệu này ngay. Còn các kiểu dữ liệu khác phải định ra, mô tả ra một cách tường minh trong phần khai báo của chương trình sau từ khóa TYPE. Sau đó sẽ khai báo các biến thuộc kiểu dữ liệu mới mô tả. Chúng ta sẽ dần dần nghiên cứu sau này.
Ví dụ:
TYPE
Color = (Red, Green, Blue);
VAR
C : Color;
3.2.3.4. Biểu thức
Biểu thức là một công thức tính toán gồn có một hay nhiều thành phần được kết nối với nhau bởi các phép toán. Một biểu thức (expression) bao gồm: toán tử (operator) và các toán hạng (operand). Toán tử được viết ra bằng dấu phép toán.
84
Toán hạng có thể là hằng, là hàm, là biến. Các phần tử của biểu thức có thể được phân thành số hạng, thừa số, biểu thức đơn giản. Khi các phép toán trong biểu thức được thực hiện thì ta nhận được một giá trị gọi là kết quả của biểu thức. Kiểu dữ liệu của kết quả gọi là kiểu dữ liệu của biểu thức.
Ví dụ:
3* 5 div 2 + 7 mod 4 là biểu thức nguyên, có kết quả là 10 2 + sin(pi/2) là biểu thức thực, có kết quả là 3.0
Chr( ord(‘a’) - 32 ) là biểu thức ký tự, có kết quả là ‘A’
(4+2=6) and (‘B’<>‘b’) là biểu thức lôgic, có kết quả là True ‘AB’+’CD’ là biểu thức chuỗi, có kết quả là ‘ABCD’
Các thành phần trong biểu thức cần phải có kiểu dữ liệu phù hợp để cho các phép toán thực hiện được, nếu không máy sẽ báo lỗi.
Ví dụ, biểu thức sau : 5 + ‘A’ là sai vì ta không thể cộng một số nguyên với một ký tự.
Biểu thức số học là biểu thức có giá trị bằng số (integer, byte, real)
Biểu thức logic Bun (Boolean) là biểu thức có giá trị TRUE hoặc FALSE Một biểu thức chứa các toán tử quan hệ (<>, <, >, <=, >=, =) được gọi là một biểu thức Boolean đơn giản hay một biểu thức quan hệ. Các toán hạng trong biểu thức quan hệ có thể là các số nguyên, số thực, kí tự và chúng phải tương thích nhau về kiểu.
Qui tắc thực hiện biểu thức hay thứ tự ưu tiên các phép toán : - Trình tự tính từ trái qua phải với thứ tự ưu tiên như sau :
Dấu ngoặc ( ) Biểu thức trong ngoặc được ưu tiên nhất
NOT, - (dấu trừ) Các phép toán một toán hạng
*, /, DIV, MOD, AND Các phép tính loại nhân, cùng mức ưu tiên
+, -, XOR, OR Các phép tính loại cộng, cùng mức ưu tiên
=, <>,<=, >=, <, >, IN Các phép toán quan hệ, có cùng mức ưu tiên
Bảng 9 - Quy tắc thực hiện biểu thức, phép toán
Ví dụ 1.
( 50 > 20 ) AND (‘B’ < ’A’) là biểu thức Boolean
TRUE AND FALSE
FALSE
85
-Ðối với các phép toán đứng liền nhau và có cùng cấp ưu tiên, thì cái nào đứng trước được tính trước.
Ví dụ : tính biểu thức số học: A= (4+5)*2 div 7 + sin(pi/6)
A= 9 * 2 div 7 + 0.5 A= 18 div 7 + 0.5 A = 2 + 0.5 A = 2.5 3.2.3.5. Câu lệnh
Bên cạch phần mô tả dữ liệu là phần lệnh (instruction) của chương trình. Phần này xác định các công việc mà chương trình phải thực hiện để xử lý dữ liệu đã được mô tả và khai báo.
Câu lệnh là một dãy các ký tự được xây dựng theo một quy tắc nhất định (gọi là cú pháp) nhằm chỉ thị cho máy thực hiện một công việc xác định. Các câu lệnh được chia ra hai loại: câu lệnh đơn giản và câu lệnh có cấu trúc.
* Câu lệnh đơn giản: là những lệnh không chứa các lệnh khác. Đó là phép gán, lời gọi chương trình con loại Procedure, lệnh nhẩy không điều kiện Goto
Lệnh gán và lời gọi thủ tục được xếp vào loại đơn giản.
Câu lệnh đơn giản
Phép gán :=
Lời gọi Procedure
Lệnh nhẩy Goto Câu lệnh Câu lệnh có cấu trúc Câu lệnh ghép Begin … End; Các vòng lặp
For …to …do… Repeat ….until … While … do…. Câu lệnh lựa chọn If …then … else Case …of With…
Bảng 10 - Liệt kê các loại câu lệnh trong Pascal
86
Ví dụ:
k := 20; Clrscr ; Writeln(k) ;
* Câu lệnh có cấu trúc: là khối lệnh, lệnh thử và rẽ nhánh, lệnh lặp.
Lệnh hợp thành hay lệnh ghép bao gồm nhiều lệnh đơn giản và có khi có cả lệnh ghép bên trong. Các lệnh này được thực hiện qua thứ tự như đã viết bên trong lệnh ghép. Nó bắt đầu bằng từ Begin và kết thúc bằng từ End.
Mỗi câu lệnh trong Pascal được ngăn cách nhau bằng dấu chấm phẩy (;). Dấu chấm phẩy chỉ có tác dụng ngăn cách các câu lệnh, chứ không phải là dấu kết thúc câu lệnh và nó không phụ thuộc vào câu lệnh
Các lệnh rẽ nhánh và lệnh lặp được xếp vào loại có cấu trúc, chúng được xây dựng từ các lệnh đơn giản, ví dụ:
If k>=0 then Writeln(k) else Writeln( -k) ;
Hai hay nhiều lệnh đơn giản được gom lại và đặt giữa hai từ khóa BEGIN và END tạo thành một câu lệnh ghép, câu lệnh ghép cũng là lệnh có cấu trúc, ví dụ:
Begin
Write(‘ nhập k :’); Readln(k);
End;
Từ các lệnh đơn giản và các lệnh có cấu trúc đã có lại có thể xây dựng được các lệnh có cấu trúc phức tạp hơn, ví dụ:
If k>= 0 then Writeln(k) else
Begin
Writeln(‘ k âm, xin nhập lại : ‘); Readln(k);
End;
87
*Phép gán
Phép gán được dùng để gán giá trị của một biểu thức, một hằng hay biến Phép gán được ký hiệu là :=
Biến : = Biểu_thức;
Vế trái của phép gán chỉ và chỉ có thể là biến và chỉ một mà thôi. Ví dụ:
X := 6; có nghĩa là biến X nhận giá trị bằng 6; Y := TRUE; có nghĩa là Y nhận giá trị TRUE.
X := X+ 5; có nghĩa là giá trị của X sẽ bằng giá trị của X cộng thêm với 5. X là tên của một ô nhớ. X + 5 được hiểu là lấy nội dung của ô nhớ X đem cộng với 5, sau đó lại để vào ô nhớ X.
Nguyên tắc chung khi dùng phép gán thì kiểu của biến và kiểu của biểu thức ở vế phải phải giống nhau.
*Lệnh ghép
Một nhóm câu lệnh đơn giản được đặt giữa hai chữ Begin và End sẽ tạo thành một câu lệnh hợp thành hay một lệnh ghép với cấu trúc như sau :
Begin Câu lệnh 1 ; Câu lệnh 2 ; …… Câu lệnh N ; End ;
Một lệnh ghép hiểu theo một nghĩa nào đó giống như việc ta đặt cặp dấu ngoặc đơn () và một biểu thức.
Begin End Begin End Begin End Begin End
Hình 11 - Mô hình cấu trúc câu lệnh ghép
88
Mô hình chương trình có cấu trúc “khối lệnh” được xây dựng qua lệnh hợp thành Begin …End;
Cấu trúc Begin … End của câu lệnh ghép cho ta thấy rõ hơn tính có cấu trúc của ngôn ngữ Pascal: nhóm các lệnh thành từng khối. Một khối lệnh chỉ có một đầu vào (qua chữ Begin) và một đầu ra (qua chữ End).
3.2.4. Vào/ra dữ liệu
3.2.4.1. Thủ tục viết dữ liệu ra màn hình: Write và Writeln
Nhập và xuất dữ liệu là hai khâu quan trọng trong qúa trình xử lý thông tin. Hầu như chương trình nào cũng phải giải quyết vấn đề nhập, xuất dữ liệu. Có nhập được dữ liệu thì mới có dữ liệu để tính toán hay xử lý. Có dữ liệu xuất ra thì mới biết được kết quả của qúa trình xử lý trong máy.
Màn hình là một thiết bị ra thông dụng nhất hiện nay. Để viết dữ liệu ra màn hình, Pascal có 3 mẫu viết như sau:
Mẫu 1: Write (Item1, Item2,….,ItemN);
Mẫu 2: Writeln (Item1, Item2, …ItemN);
Mẫu 3: Writeln;
Trong đó: Item1, Item2,….,ItemN là các mục cần viết ra, có thể là một trong các loại như:
- Biến write (A);
- Hằng writeln (PI);
- Hàm write (sin(x));
- Biểu thức write (A*B-2+cos(x));
- Các giá trị có kiểu vô hướng chuẩn (Real, Integer, Boolean)
- Một số kiểu có cấu trúc như mảng, xâu kí tự
Sự khác nhau của 3 mẫu lệnh trên là ở vị trí con trỏ màn hình sau khi kết thúc lệnh.
Mẫu 1: sau khi viết ra các giá trị con trỏ sẽ không xuống đầu dòng tiếp theo, con trỏ sẽ được đặt ở vị trí giá trị cuối cùng
89
Mẫu 2: sau khi viết các giá trị trên cùng một dòng của màn hình, con trỏ sẽ chuyển xuống đầu dòng tiếp theo.
Mẫu 3: (không có tham số) sẽ chỉ làm một tác động đơn giản là đặt con trỏ xuống dòng tiếp theo.
Khi dùng thủ tục Write và Writeln là cách viết có qui cách và không có qui cách. Chúng ta sẽ xem xét cụ thể lệnh viết ra với từng kiểu dữ liệu.
* Viết ra kiểu số nguyên
- Cách viết không qui cách
Var I: integer Begin I:=123; Writeln(I); Writeln(-12345); End.
Kết quả sẽ in ra màn hình như sau:
Đây là cách viết không qui cách vì chúng ta không chỉ rõ qui cách viết trong thủ tục write. Các số nguyên được viết ra số chỗ đúng bằng số chữ số nó cần có. I:= 123 nghĩa là I chiếm 3 chỗ, còn (-12345) chiếm 6 chỗ kể từ vị trí bên trái kể cả dấu âm. - Cách viết có qui cách Var I: integer Begin Writeln(12345678); I:=123; Writeln(I:8);
90
Writeln(-12345:8); End.
Kết quả sẽ in ra màn hình như sau:
Như vậy có thể nói cách viết không qui cách sẽ căn lề bên trái, còn cách viết có qui cách sẽ căn lề bên phải.
*Viết ra kiểu số thực
- Cách viết không qui cách
Var R:Real; Begin R:=123.456 Writeln(R); Writeln(3.14) End.
Kết quả sẽ in ra màn hình như sau:
- Cách viết có qui cách
Sử dụng khai báo số chỗ cho cả số thực và số chỗ cho cả phần thập phân hoặc số chỗ cho cả số thực viết dưới dạng E mũ
Var R:Real; Begin Writeln(12.3456789:10:5) R:=123.456 Writeln(R:10:5); Writeln(3.14:10:5) End.
91
Kết quả sẽ in ra màn hình như sau:
* Viết ra kiểu kí tự
Với cách viết không qui cách: máy tính sẽ viết ra các ký tự một cách bình thường, nghĩa là mỗi ký tự chiếm một chỗ. Còn với cách viết có qui cách, máy tính sẽ bố trí thêm các khoảng trắng. Var Ch: Char; Begin Writeln (‘Hello’); Ch: = ‘Y’;
Writeln (Ch); (* Cách viết không qui cách *)
Writeln (Ch: 4); (* Cách viết có qui cách *)
Writeln (‘Hello’: 5);
End.
Kết quả in ra là:
* Viết ra kiểu Boolean
Kiểu Boolean sẽ được viết ra bởi các từ True hoặc False. Ta có thể quy định số chỗ để viết các từ này bằng cách có qui cách hoặc không có qui cách như sau:
Var
OK: Boolean;
Begin
OK: = 3 < 5; (* OK sẽ nhận giá trị True *)
92
Writeln (OK); (* Cách viết không qui cách *)
Writeln (OK : 7); (* Cách viết có qui cách *)
End.
Kết quả:
3.3. Cấu trúc điều khiển