Cú pháp: Var tên biến: kiểu dữ liệu ; - Sau từ khoá VAR có thể viết nhiều khai báo biến liên tiếp nhau, cách nhau dấu chấm phẩy.. Nhận thấy rằng các thμnh phần của biểu thức có thể lμ m
Trang 1Chương 3 Các khai báo vμ câu lệnh đơn giản
1 Khai báo hằng và biến
Một nguyên tắc chung khi viết một chương trình Pascal lμ mọi thứ đều
phải được khai báo (vμ xây dựng) trước khi sử dụng Vì lẽ đó mμ ngay sau
tên chương trình lμ phần khai báo, rồi sau đó mới lμ thân chương trình
Như đã nêu trong phần giới thiệu cấu trúc một chương trình Pascal,
phần khai báo phải theo đúng trình tự dưới đây Phần nμo không cần đến thì
bỏ qua
1- Khai báo các thư viện chương trình mẫu sẽ dùng đến trong chương trình
Cú pháp: Từ khoá User, sau đó lμ danh sách các Unit
2- Khai báo các hằng
Cú pháp: Từ khoá Const, sau đó lμ danh sách khai báo hằng
3- Khai báo các kiểu
Cú pháp: Từ khoá Type, sau đó lμ danh sách các khai báo kiểu
4- Khai báo các biến
Cú pháp: Từ khoá Var, sau đó lμ danh sách các khai báo biến
5- Phần các chương trình con
Từ khoá Procedure để khai báo thủ tục
Từ khoá Function để khai báo hμm
Dưới đây sẽ trình bμy về khai báo hằng vμ khai báo biến Cách thực
hiện các khai báo khác sẽ được giới thiệu sau, khi bμn đến các chủ đề có liên
quan
Để tiện trình bμy các quy định về cú pháp ta quy ước rằng ngoμi các từ
khoá, tên chuẩn của Turbo Pascal lμ phần khung phải giữ nguyên (được in
đậm), những thμnh phần được nhấn mạnh bằng kiểu chữ nghiêng lμ các thμnh
phần mμ người xây dựng chương trình cần phải bổ xung thêm vμo
1.1 Khai báo hằng
1.1.1 Hằng lμ gì
Hằng lμ đại lượng nhận một giá trị xác định vμ không thay đổi trong
Trang 2Có thể viết nhiều khai báo hằng liên tiếp nhau
Ví dụ: const
maxSize = 50 ; tieuDe = 'Cong hoa xa hoi chu nghia Viet nam' ; sigma = 0.1/ (2*pi) ;
laiXuat = 0.05 ;
Tại sao nên khai báo hằng
Một câu hỏi tự nhiên đặt ra lμ, tại sao nên dùng khai báo giá trị hằng thay cho việc viết trực tiếp giá trị ấy tại những nơi cần đến nó Sử dụng khai báo hằng sẽ có hai ưu điểm sau đây:
- Chương trình rõ rμng, dễ hiểu hơn Các tên hằng maxSize, sigma,
laiXuat trong các ví dụ trên rõ rμng lμ dễ hiểu, dễ nhớ hơn lμ các con số khô
khan mμ chúng thay thế
- Chương trình dễ chỉnh sửa hơn Ví dụ nếu sau nμy cần tăng kích thước lớn nhất cho phép lên 100 chứ không phải lμ 50 thì chỉ cần sửa duy nhất một chỗ lμ dòng khai báo Nếu lãi xuất được điều chỉnh lại lμ 0.04 thì cũng không phải sửa lại hết toμn bộ các công thức liên quan mμ chỉ cần sửa ở dòng khai báo mức lãi xuất lμ đủ
1.2 Khai báo biến
Biến lμ gì
Biến lμ các đại lượng mμ gía trị có thể biến đổi trong chương trình Biến lμ cái dùng để chứa các dữ liệu phục vụ cho quá trình tính toán, xử lí trong chương trình Nó có thể chứa dữ liệu đầu vμo, kết quả trung gian hay kết quả cuối cùng của quá trình xử lí
Mỗi biến chứa dữ liệu thuộc một kiểu dữ liệu nhất định
Trang 3Khai báo biến lμ đăng kí tên của biến kèm với kiểu dữ liệu của nó
Các biến khác nhau không được trùng tên nhau Trình biên dịch sẽ dμnh cho mỗi biến một vùng nhớ xác định, đủ để chứa dữ liệu kiểu tương ứng Vùng nhớ nμy rộng hay hẹp (dμi, ngắn) đến đâu lμ do kiểu dữ liệu của biến quyết
định
1.2.2 Cú pháp vμ ví dụ
Cú pháp: Var tên biến: kiểu dữ liệu ;
- Sau từ khoá VAR có thể viết nhiều khai báo biến liên tiếp nhau, cách nhau dấu chấm phẩy
- Có thể khai báo đồng thời nhiều biến cùng kiểu Thay cho một tên
biến lμ danh sách các tên biến cách nhau dấu phẩy
- Có thể vừa khai báo vừa gán giá trị khởi đầu cho biến, viết dấu bằng, theo sau lμ một giá trị trực tiếp
Ví dụ: VAR
x,y,z: real ; GoPhim, Chon: char;
TimThay: boolean = true ; Dem: integer = 0 ;
2 Biểu thức trong ngôn ngữ Pascal
2.1 Biêủ thức là gì
Ta đã quen với khái niệm biểu thức toán học
Ví dụ các biểu thức số học
2 π R 10.34 + sin 2x
2 π R / (10.34 + sin 2x)
vμ các biểu thức lôgic
Δ ≠ 0 (Δ ≠ 0) AND (a = 0)
Nhận thấy rằng các thμnh phần của biểu thức có thể lμ một giá trị trực
tiếp như 2, 10.34, có thể lμ một hằng như số Pi, có thể lμ biến như x, có thể
lμ hμm như sin2x hoặc cũng có thể lμ một biểu thức khác
Trang 4toán hạng có thể lμ một giá trị trực tiếp, một hằng, một biến, một hμm hoặc một biểu thức khác
Vì toán hạng có thể lμ một biểu thức khác, nếu kết hợp nhiều biểu thức bằng các dấu phép toán ta lại có biểu thức mới Bằng cách nμy ta có thể xây dựng các biểu thức ngμy cμng lớn vμ phức tạp
Việc thực hiện các phép toán để nhận đ−ợc kết quả cuối cùng gọi lμ tính giá trị của biểu thức
Ví dụ, các biểu thức số học ở trên có thể đ−ợc viết lại trong Pascal nh− sau
Kiểu của kết quả
đổi dấu - Nguyên, thực Giống toán hạng Một ngôi
Nhân * Nguyên, thực Giống toán hạng Chia
Chia bỏ d−
Chia lấy d−
/ DIV MOD
Nguyên, thực Nguyên Nguyên
Thực Nguyên Nguyên Nhân
Cộng Trừ
+
-
Nguyên hoặc thực
Giống toán hạng Cộng
So sánh = <>
< <=
> >=
Cùng kiểu logic
Trang 52.3 Viết đúng biểu thức
Lưu ý:
1- Không được bỏ qua dấu phép nhân “ * ” giữa hai thừa số Biểu thức
toán học 2x, trong Pascal phải viết đầy đủ lμ 2*x
2- Dấu phép chia lμ kí hiệu gạch xiên “/ ” Ví dụ 1 / (2* Pi) Không
dùng dấu hai chấm Không dùng cách viết tử số vμ mẫu số trên hai dòng
khác nhau
3- Nếu dãy liền nhau nhiều phép toán có cùng thứ tự ưu tiên thì thực
hiện từ trái sang phải
4- Để thay đổi thứ tự ưu tiên, dùng cặp dấu ngoặc đơn “( , )” Một cặp
dấu ngoặc đơn sẽ xác định một biểu thức con, như một toán hạng tham gia
cấu thμnh biểu thức lớn hơn chứa nó
Để thể hiện đúng vμ rõ rμng một biểu thức phức tạp cần phải sử dụng
Turbo Pascal lμ một ngôn ngữ lập trình cấu trúc Ngoμi những câu lệnh
đơn thực hiện một công việc xác định, có những câu lệnh cho phép phối hợp
tổ chức nhiều công việc theo một quy tắc nhất định Đó gọi lμ các câu lệnh
tạo cấu trúc điều khiển hay ngắn gọn lμ các lệnh cấu trúc
Ta có sơ đồ phân loại các câu lệnh như sau
1 - Câu Lệnh đơn giản:
-Lệnh gán :=
-Lệnh xuất write -Lệnh nhập read -Các lệnh khác: goto, halt, exit
2- Câu lệnh cấu trúc
-Lệnh ghép begin - end -Lệnh lựa chọn if, case -Lệnh lặp for, repeat, while
Dưới đây sẽ trình bμy các câu lệnh đơn giản
Trang 63.1 Lệnh gán
Gán giá trị cho một biến
Ngôn ngữ Pascal quy định dấu phép gán lμ dấu hai chấm, tiếp theo lμ dấu bằng “:=”, đọc lμ “gán bằng”
- Phép gán phải tương thích về kiểu dữ liệu, nghĩa lμ biến ở vế trái phải
có kiểu giống như giá trị của biểu thức ở vế phải
- Phép gán chấp nhận một số chuyển đổi kiểu "tự nhiên" Ví dụ, có thể gán một giá trị nguyên cho biến thực
Đề phòng: nhầm lẫn viết dấu phép gán chỉ có dấu bằng, thiếu dấu hai
chấm Dấu bằng “=” lμ dấu của phép “so sánh bằng nhau”
Write( biểu thức1 , biểu thức2 , , biểu thức n ) ; (2)
Writeln( biểu thức1 , biểu thức2 , , biểu thức n ); (3)
Trang 7Dạng (1): bắt đầu từ vị trí con chạy, in ra mμn hình giá trị của biểu thức theo quy cách mặc định đối với kiểu dữ liệu của biểu thức đó In xong
con chạy dừng tại vị trí cuối cùng
Dạng (2): bắt đầu từ vị trí con chạy, in ra mμn hình lần lượt các giá trị
của các biểu thức 1 đến biểu thức n, nối tiếp liền nhau Giá trị của từng biểu thức được in ra theo quy cách mặc định đối với từng kiểu dữ liệu In xong con chạy dừng tại vị trí cuối cùng
Như vậy, thực chất câu lệnh dạng 2 lμ viết gọn của n câu lệnh dạng 1 liền nhau
Dạng (3): tác dụng như dạng (1) nhưng in xong thì thêm một dấu
xuống dòng, con chạy dừng tại cột đầu tiên của dòng dưới
Dạng (4): chỉ in ra một dấu xuống dòng tức lμ con chạy xuống cột đầu dòng dưới
3.3 Quy cách mặc định in ra các kiểu dữ liệu
Tóm lại quy cách mặc định in ra của từng kiểu dữ liệu lμ:
- Số nguyên: có bao nhiêu chữ số thì in ra đúng bấy nhiêu
- Số thực: in ra dưới dạng dấu phẩy động, theo trình tự như sau: dấu +/-, một chữ số phần nguyên (luôn khác 0), dấu chấm thập phân, 10 chữ số phần
lẻ (thêm số 0 vμo bên phải nếu cần), chữ E, dấu của phần mũ, hai chữ số giá trị của phần mũ
- Kí tự: chiếm đúng một vị trí Nếu lμ kí tự điều khiển thì thực hiện hμnh vi tương ứng
- Xâu kí tự: in ra đúng như nội dung, nhưng loại bỏ các dấu cách thừa bên phải
Trang 8ChuVi:= 2* (Dai + Rong);
DienTich:= Dai * Rong ;
Writeln(' Chu vi la = ' , ChuVi );
Writeln(' Dien tich la = ' , DienTich);
End.
3.4 Lệnh in ra có kèm quy cách
Để bố trí mμn hình kết quả đẹp đẽ vμ dễ đọc hơn, ta cần sắp xếp các mục in ra sao cho đúng vị trí, dóng thẳng hμng, cột
Turbo Pascal cung cấp các lệnh in ra có quy cách Nguyên tắc chung lμ:
- ấn định số vị trí dμnh để in ra giá trị của một biểu thức bằng cách
thêm vμo sau biểu thức dấu hai chấm vμ số vị trí n đã ấn định
Trang 9Cú pháp:
Write( biểu thức: n);
Phần “: n” thêm vμo sau biểu thức gọi lμ phần định dạng in ra
- Riêng với số thực, có thể in ra dưới dạng biểu diễn thập phân thông thường bằng cách chỉ rõ số vị trí dμnh cho toμn bộ con số lμ n vμ số vị trí dμnh cho phần lẻ lμ m
Write (ch:12); a
Tóm lại, nếu có ấn định quy cách máy sẽ dμnh số vị trí để in ra giá trị của biểu thức, căn lề từ bên phải, bỏ trống số vị trí thừa bên trái, cắt cụt (lμm sai giá trị !) nếu thiếu chỗ
Trang 10Read( biến 1 , biến 2 , , biến n) ; (2)
Readln( biến 1 , biến 2 , , biến n ); (3)
Thực hiện
Khi nhập dữ liệu từ bμn phím thì mỗi mục dữ liệu lμ một giá trị trực
tiếp Các câu lệnh trên sẽ gán các giá trị trực tiếp đọc được cho biến tương
ứng
Dạng (1): khi gặp lệnh nμy máy sẽ đọc từ bμn phím một mục dữ liệu,
chuyển thμnh một giá trị trực tiếp của kiểu dữ liệu của biến vμ gán cho biến
Dạng (2): khi gặp lệnh nμy máy sẽ đọc từ bμn phím n mục dữ liệu lμ
n giá trị trực tiếp vμ gán lần lượt cho n biến theo đúng trình tự Đây lμ viết
gọn của n câu lệnh dạng 1
Dạng (3): như dạng (2), sau đó tìm đọc thêm 1 dấu xuống dòng Con chạy dừng sau dấu xuống dòng
Dạng (4): Tìm đọc một dấu xuống dòng Sau câu lệnh nμy, con chạy ở
đầu dòng tiếp theo Câu lệnh nμy thường dùng để tạm dừng chương trình, đợi
gõ phím Enter Người sử dụng chương trình có thì giờ xem các thông báo,
kết quả trung gian, kết quả cuối cùng khi thực thi chương trình
Quy cách đọc dữ liệu vμo
1- Chỉ có thể nhập từ bμn phím các kiểu dữ liệu: số nguyên, số thực, kí
tự vμ xâu kí tự Không thể nhập từ bμn phím dữ liệu kiểu logic
2- Phải đảm bảo gõ vμo tương ứng số mục dữ liệu vμ đúng kiểu dữ liệu
Dữ liệu được gõ vμo phải lμ một giá trị trực tiếp hợp lệ Một giá trị số thực
phải viết dưới dạng thập phân với dấu chấm thập phân Giá trị kiểu kí tự vμ
xâu kí tự không có cặp dấu nháy đơn bao quanh
Để hiểu rõ hμnh vi của thủ tục Read khi đọc nhiều mục dữ liệu liên
tiếp cần nắm vững dấu hiệu phân cách giữa các mục dữ liệu
1- Các mục dữ liệu kiểu số (số nguyên, số thực) được phân cách nhau bằng một (hoặc vμi) dấu cách, hoặc dấu Tab, hoặc dấu xuống dòng Enter
2- Mục dữ liệu kiểu kí tự không có dấu phân cách phía trước vμ phía sau Nghĩa lμ với kiểu kí tự máy đọc đúng một kí tự tiếp theo kể từ vị trí hiện tại, kể cả đó lμ kí tự khoảng trống
3- Với kiểu xâu kí tự String[n] thì phân cách bằng độ dμi cực đại n trong khai báo biến Máy sẽ đọc vμo đúng n kí tự, kể cả các kí tự khoảng
Trang 11trống Dãy kí tự xếp liền nhau sẽ được ngắt đúng theo độ dμi n của từng
biến xâu kí tự tương ứng
Do đó, khi đọc vμo nhiều mục dữ liệu cần lưu ý sử dụng dấu phân cách
cho đúng Máy chỉ đọc vμ phải đọc đúng n mục dữ liệu, sau đó thực hiện câu lệnh tiếp theo Nếu chưa đủ n mục dữ liệu thì máy vẫn chờ đọc tiếp
Nếu gõ nhiều hơn thì các mục sau lμ thừa
3.6.4 Các ví dụ minh hoạ
Giả sử m, n lμ biến nguyên, x lμ biến thực
AB12CD34 Hanoi <Enter>
thì sẽ có s1:= AB12C s2:= D34 Ha, s3:= noi
3: Minh hoạ cách sử dụng các thủ tục Readln
thì máy sẽ đọc vμ gán được m:=1, n:=2 sau đó sẽ xuống dòng Máy sẽ chờ
để nhận tiếp giá trị cho x do câu lệnh sau chưa nhận được dữ liệu vμo Để
nhập đúng cần sửa lại thμnh
read(m,n); readln(x);
Trang 124 Một số hàm, thủ tục trình bày màn hình
Nhắc lại rằng mμn hình ở chế độ văn bản được chia bởi các cột vμ các
dòng thμnh các ô hình chữ nhật (thông thường có 80 cột vμ 25 dòng, tức lμ
2000 ô chữ nhật) Mỗi ô có thể hiển thị một kí tự trong bảng mã ASCII
Để trỏ đến một ô nμo đó, ta dùng cặp 2 số nguyên x,y gọi lμ tọa độ mμn hình (x:= 1 80, y:=1 25)
Turbo Pascal cung cấp một số hμm, thủ tục phục vụ việc trình bμy mμn hình ở chế độ văn bản Đây lμ một thư viện mẫu các chương trình con gọi lμ
unit CRT - Catot Ray Tube
Để sử dụng các hμm, thủ tục đó phải khai báo sẽ sử dụng unit CRT tại
GotoXY(x,y) : Di chuyển con chạy đến toạ độ (x,y)
Clreol: clear to end of line - xoá các kí tự từ vị trí con chạy đến cuối dòng
Sau đó, con chạy dừng tại vị trí trước khi thực hiện thủ tục nμy
Delline: Xoá toμn bộ dòng có con chạy Sau đó, con chạy dừng tại vị trí trước
khi thực hiện thủ tục nμy
WhereX: hμm cho biết con chạy đang ở cột nμo
WhereY: hμm cho biết con chạy đang ở dòng nμo
Windows (x1,y1,x2,y2): thiết lập một khung vô hình của cửa sổ hiển thị mới
Góc trên trái lμ (x1,y1) góc dưới phải lμ (x2,y2) Từ lúc nμy trở đi, mμn hình coi như thu nhỏ lại trong hình chữ nhật nμy Toạ độ x=1, y=1 sẽ
trùng với góc trên-trái của mμn hình thu nhỏ Tóm lại, các toạ độ được tính lại như sau
Xmới = Xcũ - x1 + 1
Ymới = Ycũ - y1 + 1
Câu hỏi vμ bμi tập
1 Những đại lượng nμo nên khai báo lμ hằng trong một chương trình Pascal Khai báo hằng có lợi gì so với viết trực tiếp giá trị của chúng
Trang 132 Các câu lệnh sau đây thực hiện việc gì
Writeln(' Cho 2 so '); Readln(M,N);
I:= M mod (990 - maxI);
I:= (maxI - 990) div M; X:= M/y; I:= PI * M;
X:= PI div y;
X:= M div N;
I:= (maxI - 990) mod M;
I:= M mod 0;
I:= M mod (maxI - 990);
4 Trình bμy kết quả thực hiện các lệnh sau
6 Giả sử dùng thủ tục Readln (a,b) để đọc vμo 2 số từ bμn phím Phải gõ
phím nμo sau khi gõ xong số thứ nhất ? sau khi gõ xong số thứ hai ? Nếu
đọc vμo hai biến kiểu kí tự a,b thì có gì thay đổi không
7 Giả sử dùng thủ tục Read để đọc vμo nhiều mục dữ liệu từ bμn phím
Điều gì sẽ xảy ra nếu ta gõ thừa, gõ thiếu so với số mục cần thiết
thực hμnh
Hãy viết chương trình thực hiện các công việc sau:
1 Giải phương trình bậc nhất ax + b = 0
2 Giải hệ phương trình tuyến tính cấp 2: ax+ by = e , cx + dy = f, giả thiet
rằng hệ duy nhất nghiệm
3 Lãi xuất tiết kiệm hμng tháng lμ k= 1% Tính số tiền có được sau 12 tháng nếu số gửi ban đầu lμ x
Trang 145 Cho số đo độ dμi 3 cạnh của một tam giác lμ a,b,c Tính diện tích tam
giác
6 Cho 3 đIểm A(x 1 , y 1 ), B( x 2 , y 2 ) vμ C(x 3 ,y 3 ) tạo thμnh một tam giác
Tính chu vi, diện tích của tam giác
Trang 15Chương 4 Các cấu trúc điều khiển
Pascal lμ một ngôn ngữ lập trình có cấu trúc Một ngôn ngữ lập trình
cấu trúc có các câu lệnh tạo cấu trúc điều khiển Những câu lệnh cấu trúc nμy
cho phép kết hợp - hay "cấu trúc" - nhiều câu lệnh thμnh một đơn vị thống
nhất, liên quan chặt chẽ với nhau
Những câu lệnh có cấu trúc lμm cho chương trình trong sáng dễ hiểu,
đễ theo dõi hơn
Có 3 loại cấu trúc điều khiển: tuần tự, rẽ nhánh, vòng lặp
1 Câu lệnh ghép
Có thể nhóm nhiều câu lệnh khác nhau thμnh một khối, dùng 2 từ
khoá Begin, End
Các lệnh bên trong vẫn được thực hiện tuần tự từ câu lệnh 1 đến câu
lệnh n như thông thường, không có gì thay đổi Tuy nhiên câu lệnh ghép có
tác dụng để nhóm nhiều lệnh lại thμnh một câu lệnh duy nhất để phù hợp với
cú pháp của các cấu trúc điều khiển sau nμy
2 Câu lệnh IF
Câu lệnh If để thực hiện một cấu trúc rẽ nhánh, lựa chọn một trong hai
trường hợp: nếu thoả mãn một điều kiện nμo đó thì tiến hμnh lμm việc 1, nếu