~X.XXXXXXXXXXe ± XX (nếu là số dơng) - X.XXXXXXXXXXe ± XX (nếu là số âm)
10 4
17
ở đây ta dùng ký hiệu ~ để chỉ một ký tự trắng.
Ví dụ:, cho x, y, là hai biến thực và gán x : = 100/4 ; y : = -9/300; thì hai lệnh sau:
Writeln (‘ x = ‘, x); Writeln (‘y= ‘, y);
Sẽ in lên màn hình. x = 2.5000000000 E + 01 y = -3.0000000000 E - 02 7.2.2. In có định dạng a. In số thực có định dạng In các số thực theo cách trên rất khó đọc. Vì thế các số thực thờng đợc in có định dạng, giống nh cách viết số thông thờng, bằng lệnh:
Writeln (biểuthức : n : k);
ở đây n và k là các số tự nhiên, ấn định dùng n cột để in giá trị của biểu thức, trong đó có k cột dành cho phần thập phân. Nếu số cần in có ít hơn n chữ số thì nó sẽ đợc in dồn về bên phải và thêm các ký tự trắng ở bên trái cho đủ n cột.
Ví dụ: cho x, y các biến kiểu thực và; x : = 100/4 ; y = - 123.4824. Hai lệnh sau: Writeln(‘ x = ‘, x : 6:2); Writeln(‘ y = ‘, y : 10:3); Sẽ in lên màn hình. x = 25.00 (trớc số 2 có 1 ký tự trắng). y = -123.482 (trớc dấu có 2 ký tự trắng).
Nếu n nhỏ hơn chiều dài của số cần in thì số sẽ đợc in ra với đầy đủ các chữ số trong phần nguyên. Ví dụ, khi thực hiện các lệnh sau:
X := 12345. 675 ; Writeln (‘x= ’, x: 0:2); Trên màn hình sẽ hiện: x = 12345.68
ở đây máy đã làm tròn số khi bỏ số lẻ cuối cùng.
b. In kiểu nguyên, ký tự, chuỗi và lôgic có định dạng.
Writeln(biểuthức : n);
Trong đó n là số nguyên ấn định số cột dùng để in giá trị của biểu thức. Nếu n lớn hơn độ dài của giá trị cần in thì giá trị sẽ đợc in dồn về bên phải, và thêm các khoảng trắng ở bên trái cho đủ n cột. Nếu n nhỏ hơn độ dài của giá trị cần in thì giá trị sẽ đợc in nguyên văn. Ví dụ.
Lệnh Write (5+40:4); in ra: 45 (có 2 ký tự trắng trớc số 45) Lệnh Write (5+40:1); in ra: 45 (in nguyên văn giá trị 45)
Lệnh Write(‘Pascal’ : 9); in ra Pascal (có 3 ký tự trắng trớc chữ Pascal).
Lệnh Write(‘Pascal’ : 2); in ra Pascal (in nguyên văn). Lệnh Write(‘*’ : 3); in ra * (có 2 ký tự trắng trớc dấu *). Các chú ý:
- Nhóm ba lệnh: Write(x); Write(y); Write(j); chỉ có tác dụng nh một lệnh: Write (x, y, j);
- Nhóm ba lệnh; Write(x), Write(y); Writeln(j) chỉ có tác dụng nh một lệnh. Writeln (x, y, j);
- Lệnh: Writeln; không in gì cả, chỉ đơn giản là đa con trỏ xuống dòng dới.
Một ví dụ:
Dới đây là chơng trình cho phép nhận họ tên, mã số của một sinh viên, rồi in họ tên, mã số của sinh viên đó trong một cái khung vẽ bằng các dấu sao *, nh hình dới chẳng hạn .
******************* * Nguyen Van Tuan * * Ma so: 1972508 * ******************* Chơng trình cụ thể nh sau: PROGRAM VIDU9; Uses CRT; Var Ten: String[18];
Maso: String[11]; Begin
CLRSCR;
Write (‘Nhap ho va ten:’); Readln(ten); Write (‘Nhap ma so sv:’); Readln(maso); Writeln;
Writeln (‘*****************’ ); { in 22 dấu *} Writeln (‘*’, ten:19, ‘ *’ : 2 );
{in 1 dấu *, in tên chiếm 19 cột, in tiếp dấu * chiếm 2 cột}. Writeln (‘* Maso: ‘, Maso: 12, ‘ *’: 2);
{in * maso, in maso chiếm 12 cột, in tiếp dấu * chiếm 2 cột} Writeln (‘*****************’ ); {in 22 dấu *}
Readln; End. 8. Câu lệnh rẽ nhánh 8.1. Câu lệnh IF 8.1.1. Dạng 1 IF Điềukiện THEN lệnhP;
Điềukiện là một biểu thức lôgic cho kết quả TRUE (đúng) hay FALSE (sai).
LệnhP có thể là một lệnh đơn giản hoặc một lệnh có cấu trúc. Nếu LệnhP là một lệnh ghép, tức là gồm nhiều lệnh, thì nhớ là các lệnh này phải đợc đặt trong khối: begin và end.
Sơ đồ của lệnh if dạng 1
ý nghĩa: Tuỳ theo Điềukiện là đúng hay sai mà quyết định có làm LệnhP hay không
Nếu điều kiện là đúng thì làm LệnhP rồi chuyển sang lệnh kế tiếp ở phía dới. Nếu điều kiện là sai thì không làm LệnhP mà chuyển ngay sang lệnh kế tiếp. Sơ đồ cú pháp của lệnh IF đợc vẽ trong hình trên.
Ví dụ: Nhập vào hai số a và b, tìm và in lên màn hình số lớn nhất của hai số đó.
Ta dùng một biến phụ đặt tên là Max để chứa giá trị lớn nhất phải tìm. Thuận toán gồm hai bớc:
Bớc 1: Gán số thứ nhất vào Max, tức là: Max:= a;
Bớc 2: kiểm tra nếu Max nhỏ hơn số thứ tự thì gán số thứ hai vào Max:
If max < b then Max : = b;
Bớc 3: In giá trị Max lên màn hình.
Giải thích: sau bớc 1, biến Max có giá trị bằng a. Sang bớc 2. Có thể xảy ra hai tình huống.
- Hoặc là Max < b, tức b là số lớn nhất, khi đó giá trị lớn nhất b đợc gởi vào biến max.
- Hoặc là Max >= b, tức giá trị của Max là lớn nhất rồi nên không phải làm gì nữa Chơng trình cụ thể nh sau: PROGRAM VIDU10; Đ kiện Lệnh P Lệnh kế tiếp sai
{Tim Max của hai so} Var a, b, max: Real; Begin Write(‘Nhap a va b:’); Readln(a,b); Max:=a ;
If max < b then max : = b;
Writeln(‘ so lon nhat la: ‘ , max : 6: 2); Readln;
End. Nhận xét;
- Việc tìm số nhỏ nhất của hai số a, b cũng tơng tự, ta dùng biến phụ Min chứa giá trị nhỏ nhất, và thực hiện các lệnh sau:
Min:= a;
If Min > b then Min: = b;
- Có thể mở rộng thuật toán trên để tìm số lớn nhất trong ba số hoặc nhiều hơn. Đầu tiên ta tìm số lớn nhất của hai số a và b, ký hiệu là Max, sau đó tìm số lớn nhất của hai số Max và c, cũng vẫn ký hiệu là Max. Dới đây là các lệnh chính để tìm số lớn nhất trong ba số a, b, c
Max:= a;
If Max <b then Max := b; {Max là số lớn nhất của a và b} If Max <c then Max : = c; (Max là số lớn nhất của a, b và c)
Ví dụ 2: Nhập vào họ tên và điểm trung bình (DTB) của một sinh viên. Hãy phân loại sinh viên theo DTB nh sau:
Loại: Là kém nếu DTB < 5, Là Tbình nếu 5 ≤ DTB < 7. Là khá nếu 7 ≤ DTB < 9. Là giỏi nếu DTB ≥ 9
Trong chơng trình, ta dùng một biến phụ đặt tên là loại để lu trữ phân loại của sinh viên. Vì có bốn loại cần lu trữ là các chuỗi “Kem” “Tbinh”, “Kha”, “Gioi”, nên biến loại phải có kiểu dữ liệu là kiểu chuỗi.
PROGRAM VIDU11; {Phan loai sinh vien} Var
Ho_ten : String[18]; DTB: Real;
Loai: String[18]; Begin
Write (‘Nhap ho va ten: ’); Readln (Ho_ten);
Write(‘Nhap diem trung binh: ’); Readln(DTB);
{Phân loại theo DTB}
if DTB < 5 then loai := ‘kem’;
if (DTB >=5) and (DTB <7) then loai : = ‘Tbinh’: if (DTB >=7) and (DTB <9) then loai : = ‘Kha’: if (DTB >=9) then loai : = ‘Gioi’;
Writeln(Ho_ten, #32, DTB : 4: 1, # 32,loai); Readln; End. 8.1.2. Dạng 2. If điềukiện THEN LệnhP Else LệnhQ:
Chú ý: trớc từ khoá Else không có dấu chấm phẩy.
LệnhP và LệnhQ có thể là một lệnh ghép, tức là gồm nhiều lệnh đợc đặt trong khối begin và end.
ý nghĩa của lệnh: Tuỳ theo điềukiện là đúng hay sai mà quyết định làm một trong hai lệnh: LệnhP hoặc LệnhQ.
Nếu điềukiện là đúng thì làm LệnhP, không làm LệnhQ, mà chuyển ngay sang thực hiện lệnh kế tiếp ở sau LệnhQ.
Ngợc lại, nếu điều kiện sai thì không làm LệnhP mà làm LệnhQ rồi chuyển sang lệnh kế tiếp ở sau LệnhQ.
Đ Sơ đồ lệnh IF dạng 2 Ví dụ 4: Để tìm số lớn nhất của hai số a và b dùng lệnh: if a < b then Max:= b Else Max: = a;
Chơng trình dới đây sẽ nhập vào hai số a và b, tìm và in số nhỏ nhất và số lớn nhất của chúng:
PROGRAM VIDU13;
{Tim so lon nhat va so nho nhat cua hai so} Var
a,b max, min: Real;
Đ kiện
Lệnh P
Lệnh kế tiếp
sai
Begin Write(‘Nhap a va b: ’); Readln(a,b); If a<b then Begin Max:= b; Min:= a; End
Else {trớc else không có dấu;} Begin
Max:= a; Min:= b; End;
Writeln(‘ so lon nhat la: ‘, Max : 6:2); Writeln(‘ so nho nhat la: ‘, Min: 6:2); Readln;
End.
8.1.2. Câu lệnh IF lồng nhau
Trong câu lệnh IF, nếu LệnhP hoặc LệnhQ, hoặc cả hai, lại là câu lệnh IF thì ta có cấu trúc IF lồng nhau. Chẳng hạn dới đây là hai câu
lệnh IF ELSE lồng nhau: IF điềukiện THEN IF điềukiện2 then LệnhP Else LệnhQ Else LệnhR;
Ví dụ 5: Nhập vào họ tên một chủ hộ, chỉ số điện kế tháng trớc (chiso1 ) và chỉ số điện kế tháng này (chiso2), tính tiền điện tháng này cho hộ, biết rằng:
Mỗi kw trong 60 kw đầu tiên có đơn giá là 5đ. Từ kw thứ 61 đến kw thứ 160 có đơn giá 8đ. Từ kw thứ 161 trở lên có đơn giá 10đ.
Ví dụ, ông A có chỉ số điện tháng trớc là chiso1 = 1020 và chỉ số điện tháng này là chiso2 = 1070, lợng điện tiêu thụ tính ra là ldtt = 1070 - 1020 = 50, do lợng điện tiêu thụ < 60 nên số tiền sẽ là:
Tien = 50*5 = 250đ.
Nếu chiso2 = 1150 thì Ldtt = 1150-1020 = 130, do lợng điện tiêu thụ vợt quá 60 kw nhng cha vợt quá 160 kw nên tiền điện đợc tính là;
Tien = 60*5 (130-60) *8 = 860đ.
Nếu chiso2 = 1234, thì Ldtt = 1234 - 1020 = 214, do lợng điện tiêu thụ vợt quá 160 kw nên tiền điện sẽ là:
Tien = 60*5 + 100*8 + (214-160) *10 = 300+800+54 *10 = 1640đ.
Chơng trình đợc viết nh sau: PROGRAM VIDU14;
{Tính tiền điện} Var
Ho_ten: String[18];
Chiso1, chiso2, Ldtt, Tien; Real; Begin
Write(‘Nhap ho va ten: ’); Readln(Ho_ten);
Write(‘ Nhap chi so thang truoc, chi so thang nay: ’); Readln (chiso1,chiso2) ; Ldtt : = Chiso2 - chiso1; If Ldtt <= 60 then tien: = Ldtt*5 Else If Ldtt <= 160 then tien : = 60*5 + (Ldtt-60) *8 Else Tien := 60*5 + 100 *8 (Ldtt-160) *10; Writeln(‘Ho va ten la’, Ho_ten);
Writeln (‘tiền phải trả là’, Tien : 10:2); Readln;
End.
Chú ý: trong câu lệnh IF lồng nhau, cách xác định từ khoá ELSE nào đi với từ khoá IF nào nh sau: xét ngợc từ dới lên, ELSE luôn đi với IF gần nhất ở trên nó mà cha có ELSE để bắt cắp.
8.2. Câu lệnh Case
Trong một số trờng hợp, khi phải lựa chọn một việc trong nhiều việc thì các cấu trúc IF lồng nhau tỏ ra rắc rối, khó viết, khó kiểm tra tính đúng đắn của nó. Việc dùng cấu trúc case có thể khắc phục đợc nhợc điểm này.
Lệnh Case có hai dạng, chúng chỉ khác nhau ở một điểm là trong dạng 2 có ELSE LệnhQ, còn trong dạng 1 thì không.
Case biểuthức OF Hằng1: LệnhP1; Hằng2: LệnhP2; ... Hằngk: LệnhPk; End; Dạng 1 Case biểuthức OF Hằng1: LệnhP1; Hằng2: LệnhP2; ... Hằngk: LệnhPk; Else LệnhQ; End; Dạng 2 Chú ý là lệnh case phải kết thúc bằng end; Các yêu cầu:
- Kiểu dữ liệu của biểu thức chỉ có thể là nguyên, ký tự, lôgic, hoặc kiểu liệt kê hay kiểu khoảng con (sẽ trình bày sau). Xin nhân mạnh rằng: biểu thức không đợc là kiểu thực hay kiểu chuỗi, và đây chính là hạn chế của lệnh case so với lệnh IF.
- Các hằng1, hằng2, ...hằngk phải có kiểu dữ liệu phù hợp với kiểu dữ liệu của biểu thức.
ý nghĩa: Tuỳ theo giá trị của biểu thức bằng hằng nào trong các hằng1, hằng2, ... hằngk mà quyết định thực hiện lệnh nào trong các LệnhP1, LệnhP2, ...LệnhPk.
Cách thức thực hiện của lệnh case nh sau: Bớc 1: Tính toán giá trị của biểu thức. Bớc 2: So sánh và lựa chọn:
- Nếu giá trị của biểuthức = hằng1 thì thực hiện LệnhP1, rồi chuyển sang lệnh kế tiếp sau End, ngợc lại.
- Nếu giá trị của biểuthức = hằng2 thì thực hiện LệnhP2, rồi chuyển sang lệnh kế tiếp sau End, ngợc lại.
- v.v...
- Nếu giá trị của biểuthức = hằngk thì thực hiện LệnhPk, rồi chuyển sang lệnh kế tiếp sau End, ngợc lại.
a. Chuyển ngay sang lệnh kế tiếp sau end (nếu là dạng 1).
b. Thực hiện LệnhQ, rồi chuyển sang lệnh kế tiếp sau End (nếu là dạng 2).
Dới đây là các sơ đồ của lệnh case vẽ cho trờng hợp k = 3. Trong hình vẽ, ta ký hiệu: H1, H2, H3 là hằng1, hằng2, hằng3. P1, P2, P3, Q là lệnh1, lệnh2, lệnh3 và lệnhQ. Sơ đồ G=H1 G=H2 G=H3 P1 P2 P3 Sai Sai Đúng ĐúngĐúng Đúng Sai
lệnh kế tiếp
Sơ đồ lệnh CASE (dạng 1)
lệnh kế tiếp
Sơ đồ câu lệnh CASE (dang 2) G=H1 G=H2 G=H3 P1 P2 P3 Sai Sai Đúng ĐúngĐúng Đúng Sai Q
Ví dụ 8: Nhập vào họ tên và năm sinh của ngời cho biết ngời này thuộc lứa tuổi nào; sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên hay ngời lớn tuổi, biết rằng:
Sơ sinh có tuổi từ 0 đến 1; nhi đồng: có tuổi từ 2 đến 9; thiếu niên có tuổi từ 10 đến 15; thanh niên có tuổi từ 16 đến 32; trung niên có tuổi từ 33 đến 50, ngời lớn tuổi có tuổi trên 50.
Chơng trình đợc viết nh sau: PROGRAM VIDU17;
Var
Ho_ten : String[20];
Namsinh, Namnay, tuoi: Integer; Phanloai : String[14];
Begin
Write (‘ Nhap Ho va ten’); Readln(Ho_ten);
Write (‘ Nhap nam sinh va nam nay: ‘); Readln (namsinh, namnay);
Tuoi:= Namnay - Namsinh;
If tuoi < 0 then Writeln (‘ Nhap sai’) Else
Begin Case tuoi of
0,1 : Phanloai := ‘ so sinh’; 2..9 : Phanloai := ‘ nhi dong’; 10..15 : Phanloai := ‘ thieu nien’; 16..32 : Phanloai : = ‘ thanh nien’; 33..50 : Phanloai : = ‘ trung nien’; else
End; {hết case}
Writeln(Ho_ten,#32, tuoi, #32 , phanloai); End;
Readln; End.
Trong ví trị này, lệnh case dựa vào tuổi để xác định lứa tuổi, kết quả lu vào biến phân loai. Đóng vai trò hằng1 là hai số 0 và 1 viết cách nhau bởi dấu phẩy, và dòng.
0,1: Phanloai:= ‘So sinh’;
có nghĩa là khi tuổi bằng 0 hoặc bằng 1 thì thực hiện lệnh gán; 0.1 : Phanloai : = ‘So sinh’;
Đóng vai trò hằng2 là tất cả các số nguyên trong phạm vi từ 2 đến 9, và dòng.
2..9: Phanloai:=’nhi dong’;
có nghĩa là khi tuổi bằng một trong các số nguyên từ 2 đến 9 thì thực hiện lệnh gán; Phanloai := ‘nhi dong’;
Ví dụ 9: Một xí nghiệp tính tiền thởng hàng tháng cho công nhân theo công thức. Tiền thởng = Hệ số *200
Trong đó Hệ số đợc tính dựa vào kết quả bình chọn phân loại ld (loại A, B hay C) và nơi làm việc (cơ sở 1 hay cơ sở 2) của mỗi ngời trong tháng, cụ thể nh sau:
Loại Cơ sở 1 Cơ sở 2
A B C 2.0 1.5 1.0 2.5 1.8 1.0
Ví dụ nếu ông X đợc xếp loại A và làm việc ở cơ sở 1 thì có hệ số thởng là 2.0, nên tiền thởng là 2.0 *200= 400.
Viết chơng trình nhập họ tên, phân loại lao động và nơi làm việc của một công nhân, tính tiền thởng cho ngời đó.
PROGRAM VIDU20;
Var Ho_ten : String [20]; Loai: Char; Coso: Byte Heso,thuong: Real; Begin
Write (‘Nhap Ho va ten: ’); Readln (Ho_ten);
Write (‘Nhap co so lam viec (1,2): ‘); Readln(coso);
Write(‘Nhap phan loai lao dong (A, B,C) : ‘); Readln(loai); Case loai of ‘A’, ‘a’ : Case coso of 1: Heso : = 2.0; 2: Heso : = 2.5; End; ‘B’,‘b’: Case coso of 1: Heso := 1.5; 2: Heso := 2.8; End; ‘C’,‘c’: Heso : = 1.0; End; {hết Case} Thuong:= Heso *200;
Writeln (Ho_ten,thuong 8:2); Readln;
End.
Chú ý: Lệnh case có thể thay bằng các lệnh IF. Ví dụ lệnh case trong chơng trình trên có thể thay bằng ba lệnh if sau:
If (loai = ‘A’) or (Loai = ‘a’ )then
If coso = 1 then heso := 2.0 else heso := 2.5; If (loai = ‘B’) or (Loai = ‘b’ )then
If coso = 1 then heso : = 1.5 else heso : = 1.8; If (loai = ‘C’) or (Loai = ‘c’ )then heso : = 1.0;
Tuy nhiên không phải lệnh If nào cũng thay bằng lệnh. Case đợc vì cú pháp của lệnh Case yêu cầu biểu thức có kiểu nguyên hay ký tự, không đợc là kiểu thực hay chuỗi.
Việc sử dụng lệnh Case trong nhiều trờng hợp có tác dụng làm rõ ràng và nổi bật bố cục của một đoạn chơng trình, từ đó dễ đọc, dễ hiểu hơn.
9. Câu lệnh lặp for
9.1. Dạng 1
Cú pháp:
For biến := m1 TO m2 DO lệnhP; Yêu cầu:
Biến phải có kiểu dữ liệu là nguyên, ký tự hay lôgic. m1, m2, là các biểu thức có cùng kiểu dữ liệu với biến.
LệnhP có thể là một lệnh đơn giản, lệnh có cấu trúc, hoặc là một lệnh ghép có nhiều lệnh đặt trong khối begin và end.
Cách thức hoạt động của For. Bớc 1: gán giá trị biến := m1
Bớc 2: nếu biến ≤ m2 thì làm lệnhP, rồi sang bớc 3;
Nếu biến > m2 thì không làm lệnhP mà chuyển sang lệnh kế tiếp ở phía dới.
Bớc 3: Tăng giá trị của biến; biến: = Succ (biến); Quay lại bớc 2
Tóm lại, lệnhP sẽ đợc làm đi làm lại, bắt đầu khi biến = m1 và kết thúc khi biến = m2 + 1; cả thảy là m2 -m1 + 1 lần. Vì thế, ngời ta gọi For là vòng lặp có số lần lặp đã biết trớc. b ≤ m2 P b: = Succ(b) sai b: =m1 đúng
Ví dụ 1: Bài toán tính tổng;
Hãy tính tổng: S = 12 + 22 + 32 + ... +102
Thuật toán:
Bớc 0: gán S = 0; {gán giá trị ban đầu cho S} Bớc 1: gán S = S + 1*1; {đợc S = 12 }
Bớc 2: gán S = S + 2*2; {đợc S = 12 + 22} Bớc 3: gán S = S + 3*3; {S = 12 + 22 + 32}. v.v...
Bớc 10: gán S : = S + 10*10 (đợc S = 12 + 22 + 32...10 2).
Quá trình từ bớc 1 đến bớc 10 đợc gọi là phép cộng dồn vào biến