0

Pascal: Chủ đề 5 – Rẽ nhánh và lặp

I. CẤU TRÚC RẼ NHÁNH

1. Câu lệnh if – then

a) Dạng thiếu

if <điều kiện> then <Câu lệnh1>;

Lưu đồ câu lệnh If…Then…

Nếu điều kiện đúng thì thực hiện <câu lệnh 1>; rồi thực hiện câu lệnh kế tiếp (…)

+ “Nếu Delta<0 thì phương trình vô nghiệm” + “Nếu i chia cho 2 dư không thì i là số chẵn”+ if delta<0 then write(‘Phuong trinhvo nghiem’); + if i mod 2 =0 then write(‘i la so chan’);

@Ví dụ: Cho biết kết quả của đoạn CT sau:                        

a:=10; IF a mod 2 = 0 THEN   Write(‘ Chan – Lenh trong IF’); Write(‘ Lenh ngoài IF’);

@ Kết quả hiện ra màn hình:

Chan – Lenh trong IF Lenh ngoai IF

b) Dạng đủ

if <điều kiện> then <Câu lệnh1> Else <Câu lệnh2>;…

Lưu đồ câu lệnh If…Then…Else…

Nếu điều kiện đúng thì thực hiện <câu lệnh1>, ngoài ra thực hiện <câu lệnh2>; …

@Ví dụ:

 “Nếu Delta<0 thì phương trình vô nghiệm, ngoài ra phương trình có nghiệm thực” if delta<0 then write(‘Phuong trinhvo nghiem’) else write(‘Phuong trinh co nghiem thuc’);

@Ví dụ: Cho biết kết quả của đoạn CT sau:                                     @ Kết quả hiện ra màn hình:

  • Với a:=11; với a:=10;;                                                   – Với a=11
IF a mod 2 = 0 THEN   Writeln(‘ Chan – Lenh trong IF’) ELSE   Writeln(‘ Le – Lenh trong IF’) Write(‘ Lenh ngoài IF’);
Le – Lenh trong IF Lenh ngoai IF

      – Với a=10

Chan – Lenh trong IF Lenh ngoai IF

3. Câu lệnh ghép

Begin

[<Các câu lệnh>];

End;

4. Một số ví dụ

Readln(a,b); If a<>0 Then Write(‘PT co nghiem x=’,-b/a) Else    If b=0 Then Write(‘PT vo so nghiem’)    Else Write(‘PT vo so nghiem’);

Ví dụ 1: Tìm nghiêm thực của phương trình: ax+b=0.

B1: Nhập hệ số a,b.

B2: Nếu a<>0 thì Tb phương trình có nghiệm x=-b/a. Kết thúc.

B3: Nếu b=0 thì Tb phương trình có vô số nghiệm. Kết thúc.

B4: Tb phương trình vô nghiệm. Kết thúc.

Ví dụ 2: Tính DT hình tròn bán kính R nhập từ bàn phím (Đk: R>0)

B1: Nhập hệ số R.

B2: Nếu R>0 thì

       B2.1: S:=3.14*R*R;

       B2.2: Tb kết quả S, Kết thúc.

B3: Nếu R<=0 thì Tb nhập sai bán kính R.

II. CẤU TRÚC LẶP

1. Lặp

(!) Ý nghĩa của việc phải dùng cấu trúc lặp trong lập trình.

– Khi cần thực hiện các công việc lặp đi lặp lại, nếu không có cấu trúc lặp thì việc mô tả thuật toán và viết chương trình bất tiện, nhàm chán.

Vd: Cộng dồn các giá trị một số lần hữu hạn. (thực tế cuộc sống: quyên góp tiền…); Cần nhập thông tin cho rất nhiều đối tượng; Tìm UCLN của 2 số nguyên dương.

Bài toán: Tính tổng: S=1+2+3+4+…+100

2. Lặp với số lần biết trước và câu lệnh for-do

* Dạng lặp tiến: For…Do

Cp: For <biến đếm>:=<giá trị đầu> To <giá trị cuối> Do <câu lệnh>;

– Biến đếm là biến có kiểu đếm được.; – Giá trị đầu<= giá trị cuối.

– Câu lệnh (đơn, ghép..) sau từ khoá do sẽ được thực hiện lần lượt từ biến đếm bằng giá trị đầu đến khi biến đếm bằng giá trị cuối.

– Không vì biến đếm trong lệnh For-do tự động thay đổi giá trị.

Ví dụ 1: Tính S=1+2+3+…+100;

S:=0; For i:=1 to 100 do  S:=S+i; Write(‘Tong la:’,S);

Ví dụ 2: Tính S=1+2+3+…+N; N nguyên dương nhập từ bàn phím.

Program Tinh_tong; Var I,N:byte; S:Longint; Begin      Write(‘Nhap N=’); Readln(N);      For i:=1 to N do           S:=S+i;      Write(‘Tong la S=’,S); Readln; End.

B1: Nhập N nguyên dương.

B2: Khởi tạo S←0.

B3: Cho ià1 đến N làm: S←S+i;

B4: Xuất tổng: S, kết thúc.

Ví dụ 3: Tính tổng các số lẻ từ 1 đến N (N nguyên dương bât kỳ nhập từ bàn phím).

Program Tinh_tong_le; Var I,N:byte; S:Longint; Begin   Write(‘Nhap N=’); Readln(N);   For i:=1 to N do     If I mod 2<>0 Then S:=S+i;   Write(‘Tong la S=’,S); Readln; End.

B1: Nhập N nguyên dương.

B2: Khởi tạo S←0.

B3: Cho ig1 đến N làm

Nếu i lẻ thì S←S+i;

B4: Xuất tổng: S, kết thúc.

Ví dụ 4: Lập chương trình tính tổng sau:

 (!) Số hạng tổng quát là:

Ví dụ 5: Lập chương trình hiện ra màn hình các kí tự từ ‘A’g’Z’.

Program Hien_kt; Var kt:Char; Begin For kt:=’A’ to ‘Z’ do  Write(kt:2); Readln; End.

3. Lặp với số lần chưa biết trước và câu lệnh While…Do

(!) Vẽ lưu đồ và giải thích hoạt động của câu lệnh While…Do?

CP: While <Điều kiện> Do

<Lệnh trong vòng lặp>;

<Lệnh ngoài vòng lặp>;

+ Điều kiện: Là biểu thức loogic.

+ Lệnh trong vòng lặp, Lệnh ngoài vòng lặp: Là câu lệnh đơn hay ghép trong Pascal.

(!) Câu lệnh ngoài vòng lặp được thực hiện khi <Điều kiện> sai.

Xét bài toán: Tìm UCLN của 2 số nguyên a và b (Thuật toán tìm UCLN theo Ơclid)

(!) Nếu hai số a, b bằng nhau thì UCLN của chúng là chính nó.

Vd: a=12; b=28 => UCLN(a,b)=??

Theo ƠClid làm như sau: g (12,28)=(12,16)=(12,4)=(8,4)=(4,4)=4

While a<>b Do
If a>b then a:=a-b Else b:=b-a;
Write(‘UCLN=’,a);

Ý tưởng

Khi a<> b thì còn làm Lặp lại:

+ Nếu a> b thay a=a-b

+ Ngược lại thay b=b-a

Đến khi a=b thì dừng và thông báo UCLN=a hoặc b.

– Nếu điều kiện sai câu lệnh ngay sau từ khóa Do không thực hiện lần.

– Nếu điều kiện luôn đúng câu lệnh ngay sau từ khóa Do được thực hiện mãi mãi.

4. Cấu trúc lặp Repeat … Until

Cp:  REPEAT  <Câu lệnh>  UNTIL  <Điều kiện>

Ý nghĩa: Đầu tiên lệnh sẽ thực hiện <Câu lệnh> sau đó mới kiểm tra <Điều kiện>. Nếu <Điều kiện> còn sai thì tiếp tục thực hiện <Câu lệnh> và sau đó kiểm tra <Điều kiện> lại. Quá trình cứ thế tiếp tục cho đến khi <Điều kiện> đúng thì kết thúc vòng lặp.

Ví dụ 1: Viết chương trình nhập vào lần lượt các số nguyên, quá trình nhập kết thúc khi nhập số nguyên là 0. Sau đó cho biết tổng các số nguyên đã nhập là bao nhiêu?

Program Tong_repeat;    
Var  x, T : Int64;
     Begin
          T := 0;
          repeat
              write(’Moi ban nhap 1 so bat ky x= :‘);
              readln(n);
              T := T + x;
          until  x = 0;
          writeln(‘Tong cac so vua nhap la : ‘, T);
          readln;
     End.

Ví dụ 2: Sử dụng câu lệnh lặp Repeat … Until để viết chương trình nhập vào số nguyên dương N, kiểm tra xem N có là số nguyên tố hay hợp số?

Program Kt_snt;
Var  n, i : integer;
     Begin
          write(‘Nhao so nguyen duong N = ‘);
          readln(n);
          i := 1;
          repeat
              i := i + 1;
          until  (n  mod  i = 0) or (i = n) ; {đến khi n chia hết cho i hoặc i=n}
          if  i = n  then  write(n, ‘  la so nguyen to!’)
          else  write(n, ‘ la hop so!’)
          readln;
     End.

Chú ý

– Trong vòng lặp phải có ít nhất 1 câu lệnh có khả năng làm thay đổi <Điều kiện> sau từ khóa UNTIL để đến 1 lúc nào đó thì <Điều kiện> trở thành đúng và vòng lặp kết thúc.

– Nếu sử dụng nhiều lệnh ta vẫn không cần đặt chúng trong cặp từ khóa BEGIN và END (lệnh ghép).

– <Câu lệnh> sẽ được thực hiện ít nhất là 1 lần, nếu <Điều kiện> đúng ngay từ đầu.

– Thường thì ta sử dụng Repeat…Until để kiểm tra dữ liệu nhập cũng như để cho chương trình có thể thực hiện nhiều lần mà không cần chạy lại chương trình.

Ví dụ 3: Viết chương trình tính n!, với n>=0 bất kỳ nhập từ bàn phím.

Program GT_repeat;
Uses crt;
Var  n, i: integer;
gt: int64; tl: char;
 Begin
          repeat
              clrscr;
              repeat
                   write(‘Nhap so nguyen duong N = ‘);
                   readln(n);
              until  n >= 0; {N nhất định phải N>=0}
              gt := 1;
              For  i := 2  to  n  Do
                   gt := gt * i;
              writeln(n , ‘ ! = ’, gt);
              write(‘Ban co muon tiep tuc khong [C/K]?’);
              readln(tl);
          until  upcase(tl) = ‘K’) ; {Người dùng nhập kí tự ‘k’ hay ‘K’, chương trình sẽ kết thúc.}
          readln;
End.

Đào Đình Ngọc

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *