Các câu lệnh có cấu trúc

0
1606

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 beginend để 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ố.


This site uses Akismet to reduce spam. Learn how your comment data is processed.