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

