Cấu trúc lựa chọn if…else …• Nếu điều kiện thỏa mãn đúng – Thực hiện khối lệnh • Nếu điều kiện không thỏa mãn sai – Thực hiện khối lệnh Kiểm tra điều kiện đúng sai... Cấu trúc
Trang 1Tin học cơ sở 4
Các Cấu Trúc Điều Khiển
Trang 2Trong Bài Giảng 02
• Biến:
– 03 thuộc tính: kiểu, tên giá trị hiện tại
– Phải khai báo trước khi sử dụng
• Hằng:
– Giống biến nhưng giá trị không được phép thay đổi
– Khởi tạo giá trị ngay khi khai báo hằng
– 02 cách khai báo hằng: #define & const (chú ý sự khác biệt)
• Quy tắc đặt tên:
– Bắt đầu bằng chữ cái, tiếp chữ cái, chữ số, gạch chân
– C phân biệt chữ thường và chữ hoa
– Không được trùng với từ khóa của C/C++
– Tên biến nên gợi nghĩa và ngắn gọn
– Hằng nên viết hoa
Trang 3Trong Bài Giảng 02
• Kiểu dữ liệu cơ bản:
– Số nguyên: char, int (miền giá trị trong limits.h)
– Số thực: double (miền giá trị trong float.h)
– Logic & void
– Chuyển đổi kiểu dữ liệu có thể mất độ chính xác Cẩn thận !!!
• Các phép toán:
– Đối với DL số (nguyên/thực): + - * / %
– Đối với DL logic: && || !
Trang 6Biểu thức logic
• Các phép toán logic
– Phép AND logic (&&)
– Phép OR logic (||)
– Phép NOT logic (!)
Trang 7Các phép toán logic
Toán tử Sử dụng Trả về true (đúng) nếu
&& TH1 &&
TH2
TH1 và TH2 cùng đúng, đánh giá TH2 có điều kiện
|| TH1 || TH2 TH1 hoặc TH2 đúng, đánh giá
TH2 có điều kiện
Trang 10– nên luôn sử dụng {} để gói đóng <cụm câu lệnh> do
•Dễ quên đóng gói {} khi chỉnh sửa, thêm/bớt câu lệnh vào <cụm câu lệnh>
•Dễ đọc & phân biệt <cụm câu lệnh> nào thuộc if
Kiểm tra điều kiện đúng
Trang 11Cấu trúc if …
if (<biểu thức logic>) {
<cụm câu lệnh>
}
• Chú ý không có kiểu boolean trong C
– Trong C: 0 được hiểu như là sai false
tất cả các giá trị khác là đúng true
• Nếu <biểu thức logic> sai thì chương trình sẽ tiếp tục chạy như thế nào?
Kiểm tra điều kiện đúng
Trang 12Ví dụ về cấu trúc if
Trang 13Cấu trúc lựa chọn if…else
sai
Trang 14Cấu trúc lựa chọn if…else …
• Nếu điều kiện thỏa mãn (<biểu thức logic> đúng)
– Thực hiện khối lệnh <cụm câu lệnh đk ĐÚNG>
• Nếu điều kiện không thỏa mãn (<biểu thức logic> sai)
– Thực hiện khối lệnh <cụm câu lệnh đk SAI>
Kiểm tra điều kiện đúng
sai
Trang 15Cấu trúc lựa chọn if…else …
• Lưu ý: Nhánh else không bắt buộc
– Không có else, trở thành if như trước
Kiểm tra điều kiện đúng
sai
Trang 16Ví dụ về cấu trúc if…else
Trang 17Cấu trúc if…else lồng nhau
• Cấu trúc if…else này trong cấu trúc if…else kia:
– Để kiểm tra nhiều trường hợp
• Một khi điều kiện thỏa mãn, các cụm lệnh khác bỏ qua
if (<biểu thức logic 1>) <cụm câu lệnh 1>
else if (<biểu thức logic 2>) <cụm câu lệnh 2>
else <cụm câu lệnh 3>
Trang 18Cấu trúc if…else lồng nhau
• Quy luật: else của if gần nhất mà chưa có else
if (<biểu thức logic 1>) <cụm câu lệnh 1>
else {
if (<biểu thức logic 2>) <cụm câu lệnh 2>
else <cụm câu lệnh 3>
}
Trang 19Ví dụ về cấu trúc if…else
Trang 20Cấu trúc if…else lồng nhau
• Có rất nhiều cách lồng cấu trúc if…else :
– Đơn giản: coi từng cấu trúc if…else như một cụm câu lệnh (hay câu lệnh đơn)
• Lưu ý: việc sử dụng {} là rất cần thiết khi làm
việc với cấu trúc if…else lồng do rất dễ mắc lỗi: – Lỗi: else của if nào?
• Không nên quá 3 lệnh if…else lồng Tại sao?
Trang 21Một vài lưu ý
– Thực hiện phép gán xong rồi kiểm tra điều kiện
•Giá trị 0 luôn sai
Trang 22Một vài lưu ý
• Biểu thức logic trong toán học:
(0 ≤ tuoi ≤ 150)
Chuyển sang ngôn ngữ lập trình
(0 <= tuoi <= 150)
Dịch & chạy không báo lỗi nhưng chạy sai !!!
• Biểu thức logic trong ngôn ngữ lập trình:
–Phải sử dụng các phép toán logic
(0 <= tuoi && tuoi <= 150)
–Lỗi thường gặp: biểu thức logic luôn sai/đúng
(0 >= tuoi && tuoi >= 150)
Trang 23Cấu trúc if…else – Bài tập
• Tìm số lớn nhất trong 3 số nhập vào từ bàn phím
Trang 24Cấu trúc switch
• Cấu trúc điều khiển rẽ nhánh khác
• Sau mỗi case phải là một hằng số
• Trường hợp default có thể có hoặc không
Trang 25Cấu trúc switch …
• Giá trị của <biểu thức> tương ứng (bằng) với <hằng số i>
của case nào thì thực hiện <cụm câu lệnh i> tương ứng– break: kết thúc câu lệnh switch
–Nếu không có break?
• Tiếp tục thực hiện các case tiếp theo cho tới khi:
Trang 26Cấu trúc switch …
–Nếu không có phần default thì không thực hiện gì
• Thứ tự của các trường hợp case không quan trọng:
–Do cấu trúc switch: đi tìm case tương ứng để thực hiện Khác với
if…else lồng nhau
Trang 27Ví dụ về cấu trúc switch
enum NGAY {T2, T3, T4, T5, T6, T7, CN};
enum NGAY ngay;
switch (ngay) {
case T2: printf(“hoc chieu”); break;
case T3: printf(“hoc sang”); break;
case T4: printf(“di lam”); break;
case T5: printf(“hoc sang va chieu”); break; case T6: printf(“hoc chieu va toi”); break; case T7: printf(“choi the thao”); break;
case CN: printf(“di sang nha ban”); break; default: break;
Trang 28Ví dụ về cấu trúc switch …
enum NGAY {T2, T3, T4, T5, T6, T7, CN};
enum NGAY ngay;
switch (ngay) {
case T2: case T3: case T5: case T6:
printf(“di hoc”); break;
Trang 29So sánh switch với if…
• Ngoài sự khác biệt về cấu trúc (hay cú pháp) cần chú ý đến sự khác biệt trong cách sử dụng
• Làm việc với một sự kiện (<biểu • Cùng lúc có thể kiểm tra nhiều sự
Trang 30Cấu trúc lặp
• 3 cấu trúc lặp trong C:
– do…while : ít nhất một lần lặp
– while : không hoặc nhiều lần lặp
– for : không hoặc nhiều lần lặp
Trang 31Cấu trúc lặp …
• Thân của các cấu trúc lặp:
Trang 32Cấu trúc do…while
– Kiểm tra điều kiện <biểu thức điều kiện>
– Nếu sai thì kết thúc cấu trúc do…while
– Nếu đúng thì lặp lai 3 bước trên
•Luôn thực hiện <cụm câu lệnh> ít nhất 1 lần
Trang 33Ví dụ cấu trúc do…while
• Yêu cầu: nhập vào một số nguyên dương (>0)
• Mã giả - pseudocode
do {
Nhập vào một số nguyên dương
} while (số nhập vào không nguyên dương);
• Mã nguồn (C)
do {
scanf(“%i”, &soND);
} while (soND <= 0);
Trang 34Cấu trúc while
while (<biểu thức điều kiện>)
{
<cụm câu lệnh>
}
• Các bước thực hiện:
– Kiểm tra điều kiện <biểu thức điều kiện>
– Nếu sai thì kết thúc câu trúc while
– Nếu đúng thực hiện <cụm câu lệnh>
– Lặp lai 3 bước trên.
Trang 35Ví dụ cấu trúc while
• Tính tổng 50 số nguyên dương đầu tiên?
Trang 36Ví dụ cấu trúc while
• Tính tổng 50 số nguyên dương đầu tiên?
• Mã giả - pseudocode:
while (số nguyên dương nhỏ hơn bằng 50)
{
Cộng số nguyên dương vào tổng
Tăng số nguyên dương lên 1
}
Lê Nguyên Khôi
Trang 37Ví dụ cấu trúc while
• Tính tổng 50 số nguyên dương đầu tiên?
Trang 38So sánh while với do…while
• Tính tổng 50 số nguyên dương đầu tiên?
Trang 39So sánh while với do…while
• Tính tổng 50 số nguyên dương đầu tiên?
Trang 40So sánh do…while với while
• Nhập vào một số nguyên dương (>0)
Trang 41Cấu trúc for
for (<khởi tạo>;<biểu thức đk>;<cập nhật>) {
<cụm câu lệnh>
}
• <khởi tạo> : khởi tạo giá trị cho các biến, chỉ
được thực hiện 1 lần khi bắt đầu cấu trúc for
• <cập nhật> : gán giá trị của biến trong lần lặp tới
• Nếu biểu thức <biểu thức đk> đúng thì thực hiện
Trang 42Cấu trúc for …
for (<khởi tạo>;<biểu thức đk>;<cập nhật>) {
<cụm câu lệnh>
}
• Các bước thực hiện trong một vòng lặp:
–Kiểm tra biểu thức <biểu thức đk>
–Nếu sai kết thúc cấu trúc lặp for
–Nếu đúng:
• Thực hiện <cụm câu lệnh>
• Cập nhật các biến
Trang 43Ví dụ cấu trúc for
• Tính tổng 50 số nguyên dương đầu tiên?
• Mã nguồn (C):
int tong, soND;
for (soND = 1, tong = 0; soND <= 50; soND++)
{
tong += soND ;
}
Trang 44So sánh for với while
for (<khởi tạo>;<biểu thức đk>;<cập nhật>) {
Trang 45Lỗi thường gặp với cấu trúc lặp
• Điều kiện lặp cần cho giá trị sai ( fasle ) tại lần lặp nào đó
– Nếu không sẽ lặp vô hạn
• Điều kiện luôn đúng (lặp vô hạn) hoặc
luôn sai (không bao giờ lặp)
• Lặp vô hạn đôi khi có chủ ý:
Trang 46Cấu trúc lặp lồng nhau
• Giống cấu trúc lựa chọn if…else , cấu trúc lặp có thể lồng nhau
for (lapNgoai=0; lapNgoai<5; lapNgoai++)
Trang 47break và continue
• break : thoát khỏi vòng lặp ngay lập tức
• continue : bỏ qua phần còn lại của thân vòng lặp và thực hiện lần lặp tiếp
• 2 lệnh này ảnh hưởng luồng tự nhiên của vòng lặp
– Hạn chế dùng
– Chỉ dùng khi thực sự cần