1. Câu Lệnh Rẽ Nhánh
Cú pháp 1: IF <điều_kiện> THEN <công_việc>;
Trong đó
- <điều_kiện> là một biểu thức logic (trả về trị true hoặc false).
- Nếu <điều_kiện> là true, <công_việc> sẽ được thực hiện, ngược lại <công_việc> không thực hiện.
Lưu đồ thực hiện:
Ví dụ : Giải phương trình bậc 2 : ax2 + bx + c = 0. (a<>0)
var a, b, c,delta, x1, x2:real;
begin
readln(a,b,c);
delta:=b*b-4*a*c;
if delta<0 then
writeln(‘phuong trinh vo nghiem’);
if delta=0 then
writeln(‘phuong trinh co nghiem kep x1= x2= ‘,-b/(2*a):6:2);
if delta>0 then
begin
x1:=(-b+sqrt(delta))/(2*a);
x2:=(-b-sqrt(delta))/(2*a);
writeln(‘x1=’,x1:6:2);
writeln(‘x2=’,x2:6:2);
end;
readln;
end.
- Chú ý : Phần công việc cần thực hiện sau then và sau else trong cấu trúc if chỉ bao gồm 1 lệnh. Nếu công việc cần thực hiện bao gồm từ 2 lệnh trở lên, thì phải dùng cặp từ khóa begin và end để nhóm các lệnh đó lại thành 1 lệnh phức.
Cú pháp 2 : IF <điều_kiện> THEN <công_việc_1> ELSE <công_việc_2>;
Nếu <điều_kiện> nhận giá trị true thì <công_việc_1> được thực hiện ngược lại thì <công_việc_2> sẽ được thực hiện
Lưu đồ thực hiện :
- Chú ý: trước else không dùng dấu chấm phẩy.
Ví dụ : Nhập vào 2 số nguyên a, b. Tìm số lớn nhất trong 2 số.
Var a, b, max : integer;
Begin
readln(a,b);
if a>b then max:=a
else max:=b;
writeln(‘so lon nhat la ‘,max);
End.
- Có thể kết hợp nhiều cấu trúc if…then… và if…then…else…lại với nhau.
Ví dụ : Nhập vào 1 tháng (từ 1 đến 12), cho biết số ngày của tháng.
Var thang, so_ngay : byte;
Begin
Write(‘Nhap vao 1 thang’);
Read(thang);
If ( thang 2) then so_ngay:= 28;
Else
If (thang =1) or( thang=3) or (thang=5) or (thang=7) or (thang=8) or (thang=10) or (thang=12) then
so_ngay:= 31
Else so_ngay:=30;
Write(‘So ngay cua thang ’, thang, ‘la:’, so_ngay);
End.
2. Cấu trúc CASE … OF
Tuy if…then…else… đủ để thực hiện hầu như bất kỳ cấu trúc có nhiều lựa chọn nào, nhưng trong một số trường hợp, cấu trúc case…of… tiện lợi và làm chương trình trở nên rõ ràng, dễ đọc hơn. Ta sẽ xem xét cấu trúc này dưới đây.
Cú pháp:
CASE <biểu_thức> OF
Danh_ sách_hằng_1 : <công_việc_1>;
Danh_ sách_ hằng_2 : <công_việc_2>;
….
Danh_ sách_ hằng_n : <công_việc_n>;
ELSE
<công_việc_0>;
END;
Trong đó
- <biểu_thức> có thể nhận giá trị kiểu nguyên, kiểu logic, hay kiểu kí tự, nhưng không thể là kiểu số thực.
- Danh_ sách_ hằng_i là một hay nhiều giá trị có thể của biểu thức.
- Đầu tiên, <biểu_thức> được tính toán, nếu giá trị của nó nằm trong Danh_ sách_ hằng_i thì <công_việc_i> tương ứng với nó sẽ được thực hiện. Nếu giá trị của biểu thức không thuộc danh sách hằng từ 1 đến n đã được liệt kê thì <công_việc_0> sau từ khoá else (nếu có) sẽ được thực hiện.
Ví dụ 1: Nhập vào 1 số nguyên a, cho biết a là số chẵn hay lẻ.
Var a:integer;
Begin
Write(‘Nhap vao so nguyen a:’);
Readln(a);
If a<0 then write(‘khong hop le’)
Else
case (a mod 2) of
0 : write(a,’ la so chan’);
1 : write(a,’ la so le’);
end;
End.
Ví dụ 2: Nhập vào 1 tháng (từ 1 đến 12), cho biết số ngày của tháng.
var thang,so_ngay:byte;
begin
readln(a);
case thang of
1, 3, 5, 7, 8, 10,12:so_ngay:=31;
4, 6, 9, 11:so_ngay:=30;
2:so_ngay:=28;
end;
writeln(‘so ngay la : ‘ ,so_ngay);
readln;
end.
3. Câu lệnh lặp
3.1. Vòng lặp xác định: Có hai dạng sau:
Dạng tiến
FOR <biến đếm>:=<giá trị đầu> TO <giá trị cuối> DO <công việc>;
- Chú ý: <biến_đếm>, <gt_đầu>, <gt_cuối> là dữ liệu thuộc kiểu đếm được.
Ví dụ 1: Xuất 5 lần dòng chữ sau lên màn hình: Hello Turbo Pascal
uses crt;
var I:byte;
Begin
For I:=1 to 5 do
Writeln(‘Hello Turbo Pascal’);
Readln;
End.
Ví dụ 2: Xuất ra màn hình các số từ 1 đến 100, mỗi dòng 10 số.
uses crt;
var I:byte;
Begin
For I:=1 to 100 do
Begin
Write(i:3);
If (I mod 10=0) then Writeln;
End;
Readln;
End.
- Có thể kết hợp các cấu trúc lặp for với nhau hay với các cấu trúc rẽ nhánh đã học : if…then…else…, case…of…
Dạng lùi
FOR <biến đếm>:=<giá trị Max> DOWNTO <giá trị Min> DO <Công vệc>;
Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:
- Không nên tuỳ tiện thay đổi giá trị của biến đếm bên trong vòng lặp FOR vì làm như vậy có thể sẽ không kiểm soát được biến đếm.
- Giá trị Max và Min trong câu lệnh FOR sẽ được xác định ngay khi vào đầu vòng lặp. Do đó cho dù trong vòng lặp ta có thay đổi giá trị của nó thì số lần lặp cũng không thay đổi.
Ví dụ 1: Tính tổng S= 1 + 2 +. . . + n. với n là số nguyên dương nhập từ bàn phím
uses crt;
var i,n,s:integer;
begin
clrscr;
readln(n);
s:=0;
for i:=n downto 1 do
s:=s+i;
writeln(‘tong la ‘,s);
readln;
end.
Ví dụ 2 : In ra màn hình các ký tự chữ cái theo thứ tự đảo ngược:
uses crt;
var I:char;
Begin
For I:=’z’ downto ‘a’ do
Write(I : 3);
End.
3.2. Vòng lặp không xác định
3.2.1 Cấu trúc WHILE:
Cú pháp : WHILE <điều_kiện> DO <công_việc>;
Hoạt động : Đầu tiên <điều_kiện> được kiểm tra. Nếu <điều_kiện> đúng (TRUE) thì <công_việc> được thực hiện, sau đó quay lại kiểm tra <điều_kiện>, vòng lặp cứ như thế cho đến khi nào <điều_kiện> sai (FALSE) thì vòng lặp kết thúc.
- Chú ý:
- Trong <công_việc> phải có lệnh để làm cho <điều_kiện> thay đổi giá trị, nếu không vòng lặp không kết thúc.
- Vòng lặp while kiểm tra <điều_kiện> trước nên <công_việc> có thể không được thực hiện lần nào.
Ví dụ: Lặp lại việc nhập vào hai số nguyên a,b từ bàn phím cho đến khi nào gặp hai số mà tích của chúng là số chẵn thì dừng lại. Xuất kết quả a, b, a*b lên màn hình.
Uses crt;
Var a, b : integer;
Begin
Clrscr;
Write(‘Nhap vao 2 so a,b :’);
Readln(a,b);
While (a*b mod 2 =1) do
Begin
Write(‘Nhap lai 2 so a,b :’);
Readln(a,b);
End;
Write(‘Ket qua la : a =’, a, ‘b=’,b, ‘tich=’, a*b);
Readln;
End.
3.2.2 Cấu trúc REPEAT … UNTIL…
Cú pháp:
REPEAT
<công_việc>;
UNTIL <điều_kiện>;
- Hoạt động : Đầu tiên, <công_việc> được thực hiện và sau đó <điều_kiện> được kiểm tra. Nếu <điều_kiện> có giá trị sai (FALSE) thì vòng lặp được tiếp tục thực hiện, và cứ như thế cho đến khi nào <điều_kiện> có giá trị đúng (TRUE) thì vòng lặp kết thúc.
Ví dụ: Lặp lại việc nhập vào hai số nguyên a,b từ bàn phím cho đến khi nào gặp hai số mà tích của chúng là số chẵn thì dừng lại. Xuất kết quả a, b, a*b lên màn hình.
Var a,b:integer;
Begin
Repeat
Write(‘Nhap vao 2 so a,b :’);
Readln(a,b);
Until (a*b mod 2 =0);
Write(‘Ket qua la : a =’, a, ‘b=’,b, ‘tich=’, a*b);
Readln;
End.
- Chú ý:
- Trong <công_việc> phải có lệnh để làm cho <điều_kiện> thay đổi giá trị, nếu không vòng lặp không kết thúc.
- Vòng lặp Repeat…until…thực hiện <công_việc> trước, nên <công_việc> luôn được thực hiện ít nhất 1 lần.
Ví dụ : Tính tổng các số từ 1 đến N, với N là số nguyên được nhập từ bàn phím
- Trường hợp 1 : dùng cấu trúc FOR
Var i,n, tong : integer;
Begin
Write(‘Nhap vao so nguyen N’);
Readln(n);
tong:=0;
For i:=1 to n do
tong :=tong+i;
Write(‘Tong la : ’, tong:5);
Readln;
End.
- Trường hợp 2: dùng cấu trúc WHILE
Var i,n, tong : integer;
Begin
Write(‘Nhap vao so nguyen N’);
Readln(n);
tong:=0;
while(i<=n)
begin
tong :=tong+i;
i:=i+1;
end;
Write(‘Tong la : ’, tong:5);
Readln;
End.
- Trường hợp 3 : dùng cấu trúc REPEAT…UNTIL…
Var i,n, tong : integer;
Begin
Write(‘Nhap vao so nguyen N’);
Readln(n);
tong:=0;
Repeat
tong :=tong+i;
i:=i+1;
Until (i>n);
Write(‘Tong la : ’, tong:5);
Readln;
End.
BÀI TẬP MẪU
Bài tập 1: Viết chương trình nhập vào một số nguyên và kiểm tra xem số vừa nhập là số chẵn hay số lẻ.
Uses crt;
Var x:integer;
Begin
Write(‘Nhap vao mot so nguyen : ‘); Readln(x);
If x MOD 2=0 Then
Writeln(‘So vua nhap vao la so chan’)
Else
Writeln(‘So vua nhap vao la so le’);
Readln;
End.
Bài tập 2: Viết chương trình giải phương trình bậc nhất ax+b=0
Uses Crt;
Var a,b,x : real;
Begin
Write(‘a = ‘); Readln(a);
Write(‘b = ‘); Readln(b);
If a = 0 Then { Nếu a bằng 0 }
If b = 0 Then { Trường hợp a = 0 và b = 0 }
Writeln(‘Phuong trinh co vo so nghiem’)
Else { Trường hợp a=0 và b ¹ 0 }
Writeln(‘Phuong trinh vo nghiem’)
Else { Trường hợp a ¹ 0 }
Begin
x:= -b/a;
Writeln(‘Phuong trinh co nghiem la :’,x:0:2);
End;
Readln;
End.
Bài tập 3: Viết chương trình nhập vào tuổi của một người và cho biết người đó là thiếu niên, thanh niên, trung niên hay lão niên. Biết rằng: nếu tuổi nhỏ hơn 18 là thiếu niên, từ 18 đến 39 là thanh niên, từ 40 đến 60 là trung niên và lớn hơn 60 là lão niên.
Uses crt;
Var tuoi:Byte;
Begin
Write(Nhap vao tuoi cua mot nguoi:’); Readln(tuoi);
Case tuoi Of
1..17: Writeln(Nguoi nay la thieu nien’);
18..39: Writeln(Nguoi nay la thanh nien’);
40..60: Writeln(Nguoi nay la trung nien’);
Else Writeln(Nguoi nay la lao nien’);
End;
Readln;
End.
BÀI TẬP TỰ GIẢI
Bài tập 1: Viết chương trình giải phương trình bậc hai: ax2 + bx + c = 0, a>0.
Gợi ý:
– Tính Delta=b*b-4*a*c.
– Biện luận:
Delta<0: Phương trình vô nghiệm.
Delta=0: Phương trình có nghiệm kép: x = -b/(2*a).
Delta>0: Phương trình có 2 nghiệm phân biệt: x1,2 = (-b±SQRT(Delta))/(2*a).
Bài tập 2: Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì xuống dòng.
Gợi ý:
Cho biến i chạy từ 1 –> 100. In ra màn hình i và kiểm tra: nếu i MOD 10=0 thì WRITELN.
Bài tập 3: Viết chương trình in ra màn hình bảng cữu chương.
Gợi ý:
Dùng 2 vòng lặp FOR lồng nhau: i là số bảng cữu chương (2…9), j là số thứ tự trong từng bảng cữu chương (1…10).
For i:=2 To 9 Do
For j:=1 To 10 Do Writeln(i,’x’,j,’=’,i*j);
Bài tập 4: Viết chương trình tính các tổng sau:
S0 = n! = 1*2*…*n {n giai thừa}
S1 = 1 + 1/2 + … + 1/n
S2 = 1 + 1/2! + … + 1/n!
S3 = 1 + x + x2/2! + x3/3! + … + xn/n!
S4 = 1 – x + x2/2! – x3/3! + … + (-1)nxn/n!
S5 = 1 + sin(x) + sin2(x) + … + sinn(x).
Bài tập 5: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình tổng của các số vừa được nhập vào.
Ý tưởng:
Dùng phương pháp cộng dồn. Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ i, ta nhập vào số nguyên X và đồng thời cộng dồn X vào biến S.
Bài tập 3.6: Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào.
Ý tưởng:
Bài toán này không biết chính xác số lần lặp nên ta không thể dùng vòng lặp FOR. Vì phải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N=0? Do đó ta nên dùng vòng lặp REPEAT.
Bài tập 6: Viết chương trình nhập vào số nguyên N. In ra màn hình tất cả các ước số của N.
Ý tưởng:
Cho biến i chạy từ 1 tới N. Nếu N MOD i=0 thì viết i ra màn hình.
Bài tập 7: Viết chương trình tìm USCLN và BSCNN của 2 số a, b được nhập vào từ bàn phím.
Ý tưởng:
– Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng. Lúc đó: USCLN=a.
– BSCNN(a,b) = a*b DIV USCLN(a,b).
Bài tập 8: Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó có phải là số nguyên tố hay không.
Ý tưởng:
N là số nguyên tố nếu N không có ước số nào từ 2 –> N div 2. Từ định nghĩa này ta đưa ra giải thuật:
– Đếm số ước số của N từ 2 –> N div 2 lưu vào biến d.
– Nếu d=0 thì N là số nguyên tố.