LẬP TRÌNH VỚI CẤU TRÚC ĐIỀU KIỆN

LÊ ĐỨC LONG-NGÔ QUỐC VIỆT 2011

Nội dung trình bày

1. Mục tiêu 2. Công dụng của cấu trúc điều kiện 3. Toán tử so sánh, toán tử logic, biểu thức logic 4. Câu lệnh, khối lệnh 5. Phân loại cấu trúc điều kiện 6. Cấu trúc rẻ nhánh 7. Cấu trúc chọn

Ngô Quốc Việt-Lập trình Cơ bản-2011 2

Mục tiêu bài giảng

Sinh viên sẽ sẽ hiểu và vận dụng được các kiến thức kĩ năng cơ bản sau:

 Ý nghĩa lệnh, khối lệnh.  Cú pháp, ý nghĩa, cách sử dụng lệnh if,

lệnh

switch.

 Một số bài toán sử dụng lệnh if, switch thông qua

các ví dụ.

 So sánh, đánh giá một số bài toán sử dụng lệnh if

hoặc switch.

 Cách sử dụng các cấu trúc lồng nhau

Ngô Quốc Việt-Lập trình Cơ bản-2011 3

Định nghĩa

 Lện điều khiển và quyết định cho phép thay đổi

luồng thực hiện của chương trình

 Các lệnh rẽ nhánh làm cho chỉ một đoạn mã được thực hiện hay không tuy thuộc vào mệnh đề điều kiện.  Ví dụ:

 Nếu nước sôi thì tắt bếp (hành động tắt bếp chỉ xảy ra

khi nước sôi)

 Nếu điểm thi >= 5 thì thông báo đậu ngược lại thông

báo rớt

 Trong hầu hết ngôn ngữ sẽ dùng lệnh “if”.

Ngô Quốc Việt-Lập trình Cơ bản-2011 4

Câu lệnh, khối lệnh  Mỗi câu lệnh thực hiện một chức năng nào đó (như

lệnh gán, lệnh xuất dữ liệu, nhập dữ liệu)

 Các câu lệnh đều được ngăn cách với nhau bởi 1 kí

hiệu nào đó

 Trong Pascal và C, các câu lệnh được ngăn cách

với nhau bằng dấu chấm phẩy (;)

 Khối lệnh là tập các câu lệnh được sắp xếp thứ tự.  Khối lệnh được xem tương đương với 1 câu lệnh riêng

lẻ

 Trong Pascal, khối lệnh được bao bọc với từ khóa

begin và end.

 Trong C, khối lệnh được bao bọc bởi dấu ngoặc { }

Ngô Quốc Việt-Lập trình Cơ bản-2011 5

Câu lệnh, khối lệnh

 Ví dụ

{ //dau khoi

// viết thụt vô 1 tab so với cặp { } a = 5; // viết thụt vô 1 tab so với cặp { } b = 6; printf("Tong %d + %d = %d", a, b, a+b);

} //cuoi khoi

Lưu ý: nếu thiếu một trong hai dấu { } của mỗi

khối lệnh, sẽ khó khăn khi tìm lỗi compile.

Ngô Quốc Việt-Lập trình Cơ bản-2011 6

Lệnh if

 Dạng tổng quát

Đúng

if(<điều kiện>)

Điều kiện

“lệnh hay khối lệnh”;

Sai

Lệnh / Khối lệnh

 Nếu <điều kiện> là true (khác zero) thì “lệnh hay khối lệnh” được thực hiện.

 Nếu <điều kiện> là false (bằng zero) thì “lệnh hay khối lệnh” không được thực hiện.

 Ví dụ

if(iDegree >= 100)

printf”Nuoc da soi\n”);

Không đặt dấu “;” sau lệnh “if”

Ngô Quốc Việt-Lập trình Cơ bản-2011 7

Các toán tử so sánh

 Dùng trong <điều kiện> của lệnh if.

Phép toán

Trong Pascal

Trong C

Nhỏ hơn

<

<

Lớn hơn

>

>

So sánh bằng

=

==

Khác nhau

<>

!=

Nhỏ hơn hoặc bằng

<=

<=

Lớn hơn hoặc bằng

>=

>=

Phép not

not

!

Phép and

and

&&

Phép or

or

||

Ngô Quốc Việt-Lập trình Cơ bản-2011 8

Các toán tử logic

 Dùng kết hợp trong <điều kiện> của lệnh if để tạo

thành biểu thức logic.

Phép toán

Kí hiệu trong Pascal

Ký hiệu trong C

Phép and

and

&&

Phép or

or

||

Phép not

not

!

 Ví dụ:

if(fDiemTrungBinh >=8 && sRenluyenDaoduc ==“kha”)

printf(“Sinh vien dat loai gioi\n”);

Ngô Quốc Việt-Lập trình Cơ bản-2011 9

Kết hợp với logical operators

(count <= 100) && (ch1 != ‘*’ ) (balance < 1000.0) || (status == 'R') (answer < 0) || ((answer > 5.0) && (answer <= 10.0)) !((pay >= 1000.0) && (status == ‘s'))

*, / , %, +, - <, <=, >, >=

trên 1 hàng thì thứ tự từ trái  phải

== , != && , ||

count <= 100 && ch1 != ‘*’ balance < 1000.0 || status == 'R’ answer < 0 || answer > 5.0 && answer <= 10.0 !(pay >= 1000.0 && status == ‘s’)

10

Conditional Operator ? :

Những phép toán điều kiện đơn giản có thể được thực hiện bằng toán tử điều kiện - conditional operator (? :). Biểu thức sử dụng conditional operator gọi là một biểu thức điều kiện - conditional expression.

expression 1

? expression 2 : expression 3

(i < 0) ? 0 : 100

If

it

if

the value of

is evaluated first. i

is true The expression (i < 0) (i.e., less than 0), the entire is conditional expression takes on the value 0. Otherwise (if the value of i is not less than 0),the entire conditional expression takes on the value 100.

min = ( f < g) ? f : g

This statement causes the value of the smaller of f and g to be assigned to min.

Ngô Quốc Việt-Lập trình Cơ bản-2011 11

Lệnh esle

 Dạng tổng quát

Đúng

Sai

if(<điều kiện>)

Điều kiện

“lệnh hay khối lệnh”;

else

Lệnh / Khối lệnh

Lệnh / Khối lệnh

“lệnh hay khối lệnh”;

 Ví dụ

if(iDegree >= 100)

printf”Nuoc da soi\n”);

else

printf”Nuoc chua soi\n”);

Không đặt dấu “;” sau lệnh “else”

Ngô Quốc Việt-Lập trình Cơ bản-2011 12

Ví dụ lệnh if … esle

#include "stdio.h" #include "conio.h" void main() {

int x; printf("Nhap 1 so nguyen:"); scanf("%d",&x); if((x%2)== 0)

printf("Day la so chan\n");

else

printf("Day la so le\n");

getch();

}

Ngô Quốc Việt-Lập trình Cơ bản-2011 13

Bài tập tại lớp

10

-5

4

Viết chương trình nhập vào 4 số nguyên và tìm số lớn nhất trong 4 số đã nhập. Ví dụ: Nhập: 7 Xuất: 10

1. Xác định bài toán

Input (I), Output (O)

2. Phân tích bài toán

Ý tưởng chính:

Thành phần dữ liệu, thành phần xử lý

3. Thiết kế chương trình

Đơn vị dữ liệu, đơn vị xử lý, lưu đồ

4. Cài đặt

Chương trình chính

5. Thử nghiệm

Bộ dữ liệu thử nghiệm

Giả sử số đầu tiên là lớn nhất (max). Gán số đầu tiên là max. So sánh số lớn nhất lần lượt với 3 số còn lại. Với mỗi số nếu số đó lớn hơn max thì gán max cho số đó.

14

Các lệnh “if” lồng nhau

 Xét ví dụ

if(count < 10)

{

if( (count % 4) == 2)

//lệnh if #1 //lệnh if #2 cout << "Condition:White\n";

else

cout << "Condition:Tan\n";

}

 Hỏi: lệnh else thuộc về “if” nào.  Hỏi: đoạn mã nguồn trên “đẹp” không ?  Đừng viết giống đoạn mã trên.

Ngô Quốc Việt-Lập trình Cơ bản-2011 15

Các lệnh “if” lồng nhau

Đúng

Sai

Điều kiện 1

Sai

Lệnh / Khối lệnh

Điều kiện 2

Đúng

Lệnh / Khối lệnh

Lệnh / Khối lệnh

Ngô Quốc Việt-Lập trình Cơ bản-2011 16

Lệnh else if Lệnh tổng quát

if(biểu thức logic 1)

khối lệnh 1; else if(biểu thức logic 2) khối lệnh 2;

else if(biểu thức logic n-1) khối lệnh n-1

else

khối lệnh n;

Ngô Quốc Việt-Lập trình Cơ bản-2011 17

Lệnh else if

 Dạng lồng vào nhau để trong trường hợp có nhiều

lựa chọn (lớn hơn 2)  Ví dụ xét bài toán sau:  Xếp loại học lực X  X ≥ 9 : Xuất Sắc  8 ≤ X < 9 : Giỏi  7 ≤ X < 8 : Khá  6 ≤ X < 7 : Trung Bình Khá  5 ≤ X < 6 : Trung Bình  X < 5: Kém

Ngô Quốc Việt-Lập trình Cơ bản-2011 18

Lệnh else if

#include "stdio.h" #include "conio.h" void main() {

double x; printf("Nhap diem trung binh:"); scanf("%lf",&x); if( x >= 9)

printf("Ban dat loai Xuat Sac");

else if (x >= 8)

printf("Ban dat loai Gioi");

else if (x >= 7)

printf("Ban dat loai Kha");

else if (x >= 6)

printf("Ban dat loai Trung Binh Kha");

else if (x >= 5)

printf("Ban dat loai Trung Binh");

printf("Ban dat loai Kem");

else getch();

}

Ngô Quốc Việt-Lập trình Cơ bản-2011 19

Biểu thức logic

 Biểu thức là sự kết hợp hợp lệ của những phép toán thực hiện trên biến, hằng hoặc các giá trị của hàm

 Giá trị biểu thức logic chỉ có thể nhận một trong

hai giá trị true hoặc false.

 Lưu ý: trong C, giá trị biểu thức logic có thể là giá trị số. Trong trường hợp này nếu bằng 0 là false, ngược lại là true.

Ngô Quốc Việt-Lập trình Cơ bản-2011 20

Bài tập ngắn 1. Viết lưu đồ giải thuật và chương trình để nhập vào kí tự c. Kiểm tra xem nếu kí tự nhập vào là kí tự thường trong khoảng từ 'a' đến 'z' thì đổi sang chữ in hoa và in ra, ngược lại in ra thông báo "Kí tự bạn vừa nhập là: c".

2. Viết lưu đồ giải thuật và chương trình để nhập vào kí tự c. Kiểm tra xem nếu kí tự nhập vào là kí tự thường trong khoảng từ 'a' đến 'z' thì đổi sang chữ in hoa và in ra, nếu kí tự in hoa trong khoảng A đến Z thì đổi sang chữ thường và in ra, nếu kí tự là số từ 0 đến 9 thì in ra câu "Kí tự bạn vừa nhập là số …(in ra kí tự c)", còn lại không phải 3 trường hợp trên in ra thông báo "Bạn đã nhập kí tự …(in ra kí tự c)"

Ngô Quốc Việt-Lập trình Cơ bản-2011 21

Bài tập ngắn

Viết chương trình nhập vào một hàm số bậc 2, tính và xuất ra cực trị của hàm

 Ý tưởng chính Cho hàm số bậc hai f(x) = ax2+bx+c (với a ≠ 0) Cực trị M của f được xác định như sau:

xM = Nghiệm của phương trình f'(x) = 0

(xM = -b/2a)

yM = f(xM) = axM Nếu a > 0 thì M là cực tiểu Nếu a < 0 thì M là cực đại

2+bxM+c

Ngô Quốc Việt-Lập trình Cơ bản-2011 22

Bài tập tại lớp

Viết chương trình nhập năm. Sau đó xuất ra số ngày trong tháng 2 của năm đó. Tháng 2 của năm nhuận có 29 ngày, và của năm thường thì có 28 ngày. Biết rằng năm nhuận là năm chia hết cho 4 nhưng không chia hết cho 100, hoặc chia hết cho 400. Bộ dữ liệu mẫu:

Input

Output

Tháng

Số ngày trong tháng

Năm

2

2011

28

2

1900

28

2

2000

29

29

2

2004

2

29

1996

23

Cấu trúc chọn-Lệnh switch

 Lệnh switch giống cấu trúc else if, nhưng mềm

dẻo và linh động hơn nhiều so với sử dụng if .

 Cấu trúc chọn thể hiện sự tiện lợi và làm cho mã

nguồn trở nên rõ ràng và dễ đọc hơn

 Tuy nhiên, mặt hạn chế là kết quả của biểu thức

phải là giá trị hằng (có giá trị cụ thể).

 Một bài toán sử dụng lệnh switch thì cũng có thể sử dụng if, nhưng ngược lại còn tùy thuộc vào giải thuật của bài toán

 Sinh viên hãy cho ví dụ về nhận xét trên.

Ngô Quốc Việt-Lập trình Cơ bản-2011 24

Cấu trúc chọn-Lệnh switch

 Dạng lệnh

switch (biểu thức) {

case N1:

Khối lệnh 1 break;

case N2:

Khối lệnh 2 break;

case Nk:

Khối lệnh k break;

[default:

//không thuộc các trường hợp Ni;

các câu lệnh]

}

 Ni là các hằng số nguyên (int, long), kí tự. Tại sao?

Ngô Quốc Việt-Lập trình Cơ bản-2011 25

Cấu trúc chọn-Lệnh switch

#include "stdio.h" #include "conio.h" void main() {

int x; printf("Nhap ma vung:"); scanf("%d",&x); switch(x) {

case 4:

case 8:

printf("Day la ma vung cua Ha Noi"); break; printf("Day la ma vung cua TP.Ho Chi Minh"); break;

case 72: printf("Day la ma vung cua Long An");

break;

default: printf("He thong chua cap nhat");

} getch();

}

Ngô Quốc Việt-Lập trình Cơ bản-2011 26

Cấu trúc chọn-Lệnh switch

 Nhiều lựa chọn cùng một xử lý ~ điều kiện OR trong lệnh “if”

void main(void) {

int ithang; printf("Nhap vao thang: "); scanf("%d", &ithang);

switch(ithang) { case 1: case 2: case 3 : printf("Quy 1.\n");

break;

case 4: case 5: case 6: printf("Quy 2.\n");

break;

case 7: case 8: case 9: printf("Quy 3.\n");

break;

case 10: case 11: case 12: printf("Quy 4.\n");

break;

default : printf("Ban phai nhap vao so trong khoang 1..12\n"); }; getch();

}

Ngô Quốc Việt-Lập trình Cơ bản-2011 27

Cấu trúc switch lồng

 Trong khối lệnh lại có chứa lệnh switch khác.

switch(ithang) { case 1: case 2: case 3 : {

printf("Quy 1.\n"); switch(ituan) { case 1, 2: printf(“Nua thang dau.\n"); break; case 3, 4: printf(“Nua thang cuoi.\n"); break; } break;

} case 4: case 5: case 6: printf("Quy 2.\n");

break;

case 7: case 8: case 9: printf("Quy 3.\n");

break;

case 10: case 11: case 12: printf("Quy 4.\n");

break;

default : printf("Ban phai nhap vao so trong khoang 1..12\n"); };

Ngô Quốc Việt-Lập trình Cơ bản-2011 28

Các lệnh khai báo hằng

 Nhắc lại lệnh gán: gán một giá trị (hay biểu thức

cho một biến)

int answer; // A place to put our results answer = (1 + 2) * 4;

 Có thể dùng #define để khai báo hằng trong C. NHIETDOSOI

100

#define if(iDegree >= NHIETDOSOI) printf”Nuoc da soi\n”);

 Thật ra, lệnh #define được gọi là macro.

Ngô Quốc Việt-Lập trình Cơ bản-2011 29

Lệnh khai báo macro

 Dùng để đặt tên cho các biểu thức thường dùng  Ví dụ

(a < b)

#define greater(a, b) (a > b) #define lessthan(a, b) int iSo1, iSo2; cin >> iSo1 >> iSo2; if(lessthan(iSo1, iSo2) printf(“Gia tri mot lon hon gia tri hai\n”);

 Các macro nên được xác lập mở tập tin khai báo

(trong C/C++ là tập tin .h)

Ngô Quốc Việt-Lập trình Cơ bản-2011 30

Lệnh gán ảnh hưởng kiểu dữ liệu

 Cho phép chuyển kiểu dữ liệu khi dùng lệnh gán.  Sẽ làm mất dữ liệu khi chuyển từ kiểu thực sang nguyên. Từ long sang int, từ int sang short, từ short sang char.

Ngô Quốc Việt-Lập trình Cơ bản-2011 31

Một sốluật chuyển đổi kiểu

Khi các toán hạng có kiểu dữ liệu khác nhau, thì kết quả cuối cùng sẽ lấy theo kiểu dữ liệu có độ chính xác cao nhất (highest precision)

1. Nếu cả 2 toán hạng kiểu floating-point (số thực) mà khác nhau về precisions (e.g., float và double), thì toán hạng có lower- precision sẽ được chuyển thành precision của toán hạng kia, và kết quả là higher precision. Ví dụ, an operation between a float and a double will result in a double; a float and a long double will result in a long double; and a double and a long double will result in a long double. 2. Nếu 1 toán hạng có kiểu floating-point (e.g., float, double hay long double) và toán hạng kia có kiểu char hay int (kể cả short int hay long int), char hay int sẽ được chuyển thành floating- point và kết quả sẽ biểu diễn như vậy. Ví dụ, an operation between an int and a double will result in a double. 3. Nếu toán hạng không phải kiểu floating-point, nhưng có 1 là kiểu long int, thì toán hạng kia sẽ được chuyển thành long int và kết quả là long int. Ví dụ, an operation between a long int and an int will result in a long int. 4. Nếu toán hạng không phải kiểu floating-point hay kiểu long int, thì cả 2 toán hạng sẽ chuyển thành int (if necessary) và kết quả sẽ là int. Ví dụ, an operation between a short int and an int will result in an int.

Giả sử i có kiểu integer và giá trị là 7, f có kiểu floating-point và giá trị 5.5, c có kiểu character-có giá trị ‘w’

'0'

Expression i+f i + c i + c - (i + c) - (2 * f / 5 )

Value 12.5 126 78 123.8

Type double-precision integer integer double-precision

Notes: w có mã ASCII (decimal) là 119 and 0 có mã 48

32

Bài tập

1. Viết chương trình nhập vào 3 giá trị nguyên dương a, b, c. Kiểm tra xem a, b, c có phải là 3 cạnh của tam giác không? Nếu là 3 cạnh của tam giác thì tính diện tích của tam giác theo công thức sau

Hướng dẫn: a, b, c là 3 cạnh của tam giác phải thỏa điều kiện sau:

(a + b) > c và (a + c) > b và (b + c) > a

Ngô Quốc Việt-Lập trình Cơ bản-2011 33

Bài tập 2. Viết chương trình trò chơi One-Two-Three ra cái

gì ra cái này theo điều kiện:  Búa (B) thắng Kéo, thua Giấy.  Kéo (K) thắng Giấy, thua Búa.  Giấy (G) thắng Búa, thua Kéo.

Hướng dẫn: Dùng lệnh switch lồng nhau 3. Viết chương trình nhập vào 2 số x, y và 1 trong 4 toán tử +, -, *, /. Nếu là + thì in ra kết quả x + y, nếu là – thì in ra x – y, nếu là * thì in ra x * y, nếu là / thì in ra x / y (nếu y = 0 thì thông báo không chia được)

Ngô Quốc Việt-Lập trình Cơ bản-2011 34

Bài tập

4. Viết chương trình tính tiền điện theo yêu cầu sau

 Tiền thuê bao điện kế 10000 đồng/tháng  Định mức sử dụng điện cho mỗi hộ là: 50 KW với giá 300đ/KW .  Nếu phần vượt định mức <= 50KW thì tính giá 480đ/KW  Nếu 50KW < phần vượt định mức < 100KW thì tính giá

700đ/KW

 Nếu phần vượt định mức <= 200KW thì tính giá 900đ/KW  Các phần vượt định mức quá 200KW thì tính 1200 đồng /KW.

 Cho nhập chỉ số cũ và chỉ số mới từ bàn phím  In ra màn hình chỉ số cũ, chỉ số mới, tiền trả định mức, tiền

trả vượt định mức, tổng tiền phải trả.  Sừ dụng hai cách: lệnh if; và lệnh switch.

Ngô Quốc Việt-Lập trình Cơ bản-2011 35

Đọc và tự nghiên cứu …

36

CÁM ƠN ĐÃ THEO DÕI

LÊ ĐỨC LONG-NGÔ QUỐC VIỆT 2011