24/08/2016

Kỹ thuật lập trình

Tuần 2 - Điều khiển chọn

Giáo viên: Hà Đại Dương duonghd@mta.edu.vn

24/08/2016 1

Bài trước …

• Thuật toán được thiết kế dựa trên ba cấu trúc logic về thứ tự thực hiện câu lệnh sau đây: – Tuần tự (Sequential): Các công việc (lệnh) được

thực hiện một cách tuần tự, công việc này nối tiếp công việc kia (từ trên xuống dưới).

– Lựa chọn (Selection) : Lựa chọn một công việc (lệnh)

để thực hiện căn cứ vào một điều kiện nào đó. – Lặp (Repeating): Thực hiện lặp lại một công việc

(lệnh) không hoặc nhiều lần căn cứ vào một điều kiện nào đó.

1

24/08/2016 2

24/08/2016

Nội dung

1. Tuần tự (Sequential) 2. Lệnh if .. else … 3. Lệnh switch 4. Bài tập

24/08/2016 3

Tuần tự (Sequential)

2

24/08/2016 4

24/08/2016

Trên/dưới

• Chương trình

24/08/2016 5

Trước/sau

• Chương trình

3

24/08/2016 6

24/08/2016

Khối lệnh

• Các lệnh nằm giữa cặp dấu { } • Ví dụ

24/08/2016 7

Khối lệnh lồng nhau

• Ví dụ

4

24/08/2016 8

24/08/2016

Khai báo biến

• Trong 1 khối lệnh có thể khai báo biến, ví dụ

• Phạm vi tác động của biến: Trong khối lệnh và

các khối con của nó.

24/08/2016 9

Khai báo biến trùng tên

• Với khai báo biến như ví dụ sau:

• Khối lệnh cha khai báo 4 biến: a, b, c, d • Khối lệnh con khai báo a, b trùng với khối cha • Biến a, b của khối lệnh cha ảnh hưởng thế nào

đến biến a, b của khối lệnh con ???

5

24/08/2016 10

24/08/2016

Điều khiển chọn (Selection)

24/08/2016 11

Yêu cầu xử lý đặt ra

• Lựa chọn 1 trong 2 khả năng.

Ví dụ: Giải phương trình bậc nhất a.x + b = 0 Lựa chọn 1: a 0 -> nghiệm x = -b/a; Lựa chọn 2: a=0 -> vô nghiệm/vô số nghiệm.

• Lựa chọn 1 trong nhiều khả năng:

Ví dụ: Hiển thị thời khóa biểu theo ngày T Lựa chọn 1: T=T2 -> Lịch ngày thứ 2 … Lựa chọn 8: T=CN -> Lịch ngày chủ nhật

6

24/08/2016 12

24/08/2016

Lệnh if ... else …

24/08/2016 13

Ý nghĩa, cú pháp

• Ý nghĩa: Cho phép lựa chọn 1 trong hai khả

năng

• Cú pháp: or

• Trong đó

– if, else: từ khóa – BTLG: là 1 biểu thức logic (cho giá trị đúng hoặc sai)

7

24/08/2016 14

24/08/2016

Dạng 1

• Nếu BTLG có giá trị là đúng (1) thì các lệnh Lệnh 1, Lệnh 2 … được thực hiện

• Và nếu BTLG có giá trị sai (0)

thì không có công việc nào được thực hiện

24/08/2016 15

Dạng 2

• Nếu BTLG có giá trị là đúng (1) thì các lệnh Lệnh 1_1, Lệnh 1_2 … được thực hiện

• Và nếu BTLG có giá trị sai (0)

thì các lệnh Lệnh 2_1, Lệnh 2_2 … được thực hiện

8

24/08/2016 16

24/08/2016

Ví dụ 1

• Số a0 có nghịc đảo là 1/a. Viết chương trình nhập vào số a, in số nghịch đảo của nó ra màn hình.

24/08/2016 17

Ví dụ 2

• Tìm số lớn nhất trong 3 số a, b, c. Yêu cầu: – Trình bày thuật toán (Bài tập trong tuần 1). – Viết chương trình (10 phút)

9

24/08/2016 18

24/08/2016

Ví dụ 3

• In số ngày của tháng trong năm (dương lịch), ví dụ nhập vào tháng 8 thì in ra là 31 (ngày).

• Biết rằng:

– Tháng 1,3,5,7,8,10,12 có 31 ngày – Tháng 4,6,9,11 có 30 ngày – Tháng 2 có 28 hoặc 29 ngày. – Viết chương trình(10 phút)

24/08/2016 19

10

24/08/2016 20

24/08/2016

Ví dụ 4

• Giải hệ bậc nhất

a.x + b.y - c = 0 d.x + e.y - f = 0

– Trình bày thuật toán (Bài tập trong tuần 1). – Viết chương trình (10 phút)

24/08/2016 21

Một số lưu ý …

• Sau if và else nên dùng khối lệnh để tránh

nhầm lẫn. Ví dụ xét đoạn lệnh sau:

so1 = -1, so2 = 2, so3 = 3 a = ???

so1 = 1, so2 = 2, so3 = 3 a = ???

Khi không rõ ràng, mệnh đề else được hiểu là đi với if gần nhất.

11

24/08/2016 22

24/08/2016

Một số lưu ý …

• Sau if và else nên dùng khối lệnh để tránh

nhầm lẫn. Muốn else là của if thứ nhất ta nên dùng khối lệnh như sau:

24/08/2016 23

Một số lưu ý …

• Sai lỗi cú pháp

• Sai lỗi logic

12

24/08/2016 24

24/08/2016

Lệnh switch

24/08/2016 25

Ý nghĩa, cú pháp

• Ý nghĩa: Lựa chọn 1 (1 số )

trong nhiều khả năng.

• Cú pháp: • Trong đó:

– switch, case, break, default:

các từ khóa

– BT: biểu thức nguyên

13

24/08/2016 26

24/08/2016

Tiến trình thực hiện

1. Tính giá trị của BT, gọi là V 2. Nếu V = Hằng_K các lệnh

Lệnh K_1, Lệnh K_2 … được thực hiện đến khi gặp break hoặc kết thúc switch

3. Nếu V  Hằng_K và có default thì các lệnh Lệnh N+1_1, Lệnh N+1_2 … được thực hiện

24/08/2016 27

Ví dụ 5

• Viết chương trình cho phép:

– Nhập vào 2 số: a, b ; – Một phép toán pt (số học: +, -, *, /); – Tính giá trị của a pt b – Ví dụ: a = 4, b = 7 và pt = ‘+’

thì a pt b = 11

14

24/08/2016 28

24/08/2016

24/08/2016 29

????

• Thay vì nhập vào:

– 2 số a, b và phép pt – rồi tính a pt b

• Có thể nhập vào biểu thức

– a pt b – Ví dụ 3 + 2 (hoặc 3*(2+5) …) – Rồi tính giá trị của biểu thức đó ???

15

24/08/2016 30

24/08/2016

Ví dụ 6

• In số ngày của tháng trong năm (dương lịch), ví dụ nhập vào tháng 8 thì in ra là 31 (ngày).

• Biết rằng:

– Tháng 1,3,5,7,8,10,12 có 31 ngày – Tháng 4,6,9,11 có 30 ngày – Tháng 2 có 28 hoặc 29 ngày. – Viết chương trình dùng switch (10 phút)

24/08/2016 31

16

24/08/2016 32

24/08/2016

Ví dụ 7

• Tên của năm âm lịch được cấu tạo từ hai thành phần là can và chi, ví dụ năm 2010 tương ứng với năm âm lịch là Canh Dần trong đó Canh là can và Dần là chi.

• Có tất cả 10 can là Giáp, Ất, Bính, Đinh, Mậu,

Kỷ, Canh, Tân, Nhâm, Quý

• Và 12 chi là Tí, Sửu, Dần, Mão, Thìn, Tỵ, Ngọ,

Mùi, Thân, Dậu, Tuất, Hợi.

24/08/2016 33

Ví dụ 7 …

• Viết chương trình cho phép nhập vào một

năm dương lịch (ví dụ 2015), hãy đưa ra tên âm lịch tương ứng của năm đó.

• Ví dụ:

– 2016 : Bính Thân – 2017: Đinh Dậu – 2018: Mậu Tuất – …

17

24/08/2016 34

24/08/2016

Ví dụ 7 …

Ý tưởng 1. … 2. … 3. …

24/08/2016 35

Một số lưu ý

• BT: kiểu nguyên • Hằng_1, Hằng_2 …

Hằng_N: kiểu nguyên

18

24/08/2016 36

24/08/2016

Một số lưu ý …

• Đoạn chương trình

Hiển thị thông báo lỗi

24/08/2016 37

Một số lưu ý …

• Khi BT có giá trị bằng Hằng_K, chương trình thực

hiện Lệnh K_1 đến khi gặp break (hoặc kết thúc lệnh switch)

• Chương trình Kết quả

19

24/08/2016 38

24/08/2016

Bài tập

24/08/2016 39

Bài tập

1. Viết chương trình tìm số lớn nhất trong 10 số. 2. Viết chương trình tính giá điện sinh hoạt theo qui tắc nêu ra trong bài tập tuần 1 khi biết số điện tiêu thụ và giá trung bình.

3. Viết chương trình cho biết tên âm lịch (dạng

can/chi) của một năm dương lịch.

20

24/08/2016 40

24/08/2016

Bài tập về nhà

1. Việc khai báo biến a, b của khối lệnh cha ảnh hưởng thế nào đến biến a, b của khối lệnh con trong ví dụ ở sile 10.

2. Nếu không có lệnh fflush(stdin); trong

chương trình của ví dụ 5 (dòng 7) chương trình hoạt động như thế nào? Tại sao?

3. Ký hiệu (float) trong câu lệnh thuong = (float) so1/so2; chương trình của ví dụ 5 (dòng 17) có ý nghĩa gì? Tại sao?

24/08/2016 41

Bài tập về nhà …

4. Viết chương trình cho phép nhập vào tháng/năm, hãy cho biết số ngày của tháng/năm đó trong năm. Biết rằng: – Tháng 2 năm không nhuận có 28 ngày, năm

nhuận có 29 ngày.

– Những năm không chia hết cho 4 hoặc những

năm chẵn thế kỷ nhưng không chia hết cho 400 là năm không nhuận, ví dụ các năm 1996, 2000 là năm nhuận; các năm 1900 hay 2002 không nhuận.

21

24/08/2016 42

24/08/2016

Bài tập về nhà …

5. Viết chương trình tính số ngày tính từ ngày

bắt đầu (NBD) đến ngày kết thúc (NKT). Ví dụ NBD = 1/8/2016 và NKT = 20/8/2016 thì số ngày tính được là 20 (NBD=1/8/1916 và NKT = 1/8/2016 thì số ngày là ????).

6. A, B, C và M là các điểm trên mặt phẳng. Viết chương trình kiểm tra xem M có nằm trong tam giác ABC hay không?

22

24/08/2016 43