Luồng điều khiển(Control Flow)
TS. Bùi Ngọc ThăngBM KHMT- Khoa CNTT
Nội dungCấu trúc điều khiển rẽ nhánh
Toán tử if Toán tử if-else Toán tử switch
Cấu trúc chu trình ( vòng lặp):Toán tử for Toán tử while Toán tử do … while
Nhảy không điều kiện: Toán tử goto
09/12/16
Câu lệnh và khối lệnhTrong C mỗi câu lệnh có thể viết trên một
hoặc nhiều dòng và được kết thúc bằng dấu chấm phẩy.
Khối lệnh là một dãy các câu lệnh đặt trong các dấu các dấu {}.Không được đặt dấu chấm phẩy sau dấu ngoặc
nhọn kết thúc khối.Khi khối lệnh chỉ gồm một câu lệnh thì có thể bỏ
dấu ngoặc nhọn đầu và cuối → câu lệnh là trường hợp riêng của khối lệnh
09/12/16
Toán tử if Toán tử if cho phép lựa chọn một trong hai nhánh
tùy thuộc vào sự bằng không (==0) hay khác không của một biểu thức, nó có 2 cách viết: Dạng 1:if (biểu thức)
khối lệnh 1
Sự hoạt động của toán tử if dạng 1: Trước tiên máy sẽ xác định giá trị của biểu thức.
Nếu biểu thức đúng (có giá trị khác không), máy sẽ thực hiện khối lệnh 1 và sau đó thực hiện các lệnh tiếp theo.
Nếu biểu thức sai thì máy bỏ qua khối lệnh 1 mà chuyển đến các lệnh viết sau nó.
09/12/16
Toán tử if (tiếp) Dạng 2:if (biểu thức)
khối lệnh 1;
else
khối lệnh 2;
Sự hoạt động của toán tử if dạng 2: Trước tiên máy sẽ xác định giá trị của biểu thức
Nếu biểu thức đúng (có giá trị khác không), máy sẽ thực hiện khối lệnh 1 và sau đó nhảy tới các lệnh viết sau khối lệnh 2.
Nếu biểu thức sai (có giá trị bằng 0) thì máy sẽ thực hiện khối lệnh 2 và sau đó thực hiện các lệnh viết sau nó.
09/12/16
Ví dụ về toán tử if
Ví dụ 1: int x;
printf(“Nhap vao gia tri “);
scanf(“x = %i”, &x);
if (x){
printf( “ x khac 0”);
}else{
printf(“x bang 0”);
}
Vi du 2: Tìm max và min của 2 số thực a, b được nhập từ bàn phím.
09/12/16
Kiểu viết mã (style of code)Cách viết chương trình có cấu trúc: Như các bạn thấy từ các ví dụ về
mã chương trình, sự thụt vào là rất là quan trọng trong việc đọc và hiểu mã chương trình đồng thời tránh nhầm lẫn.
Các câu lệnh và khối lệnh nằm trong một toán tử điều khiển thì viết tụt vào bên phải
Mỗi ‘{‘ và ‘}’ được thụt vào để thích hợp với khối lệnhCác câu lệnh và khối lệnh cùng cấp thì viết trên cùng một cột (thẳng
cột)
09/12/16
Kiểu 1 Kiểu 2
if(x) { statement; }
if (x){ statement; }
Sự lồng nhau của toán tử if
Khi sử dụng 2 hay nhiều toán tử if lồng nhau:if (expression1)
if (expression2)
if (expression3)
statement1
else
statement2
Chú ý: else cuối cùng sẽ được gắn với if không có else gần nhất trước đó.
09/12/16
Tránh nhầm lẫnTa nên sử dụng khối lệnh (sử dụng ngoặc “{“ và “}”) để tránh
nhầm lẫn:if (expression1){if (expression2){ if (expression3){ statement1
} }else {
statement2 }}
Kiểu lập trình tốt là luôn phải sử dụng khối lệnh để cho chương trình rõ ràng, dễ hiểu.
09/12/16
Toán tử else-if
Khi muốn thực hiện một trong n quyết định ta có thể sử dụng toán tử if dạng sau:
if (biểu thức 1)
khối lệnh 1; else if (biểu thức 2) {
khối lệnh 2; ...
else if (biểu thức n-1) khối lệnh (n-1);
else khối lệnh n;
Chỉ một trong n khối lệnh được thực hiện
Nếu biểu thức i là biểu thức đầu tiên khác 0 (i = 1, …, n-1)thì câu lệnh i được thực hiện.
Nếu cả (n-1)biểu thức đều có giá trị bằng 0 thì câu lệnh n được thực hiện.
09/12/16
Ví dụGiả sử để theo dõi trình độ học vấn ta của cán bộ ta có
bảng mã sau:Mã Trình độ
1 Sơ cấp
2 Trung cấp
3 Đại học
4 Cao học
5 Tiến sỹ
Viết chương trình từ mã (mã được nhấp từ bàn phím) suy ra trình độ học vấn tương ứng với mã.
09/12/16
Ví dụ int ma; printf(“Nhap vao ma =“); scanf(“%i “, &ma); if (ma == 1) {
printf(“So cap”); } else if (ma == 2) {
printf(“Trung cap”); } else if (ma ==3) {
printf(“Dai hoc”); } else if (ma == 4) {
printf(“Cao hoc”); } else if (ma == 5){
printf(“Tien sy”); } else {
printf(“Ban nhap sai!”); }
09/12/16
Biểu thức điều kiệnBiểu thức điều kiện có cú pháp như sau:
expr1? expr2 : expr3Cách sử dụng:
09/12/16
if (x < a){ z = x; } else{ z = a; }
Tương đương:
z = (x < a)? x : a;
Dấu “=“ hoặc “==“Chú khác nhau giữa = và ==
x = y; // gán giá trị y vào biến x if (x == y)… // kiểm tra xem x và y có bằng nhau?
Trong C, phép gán trong biểu thức logic được đánh giá bởi giá trị được gán: if (a = 10) … luôn luôn đúng if (a = 0) … luôn luôn sai if (a = b) … tương đương với if ( (a=b) != 0) …
Cẩn thận “=“ và “==“
09/12/16
Toán tử switchCấu trúc lựa chọn cho phép lựa chọn một trong nhiều trường
hợp. Trong C, đó là câu lệnh switch. Cú pháp: switch (<Biểu thức>) {
case giá trị 1: Khối lệnh thực hiện công việc 1; break; …
case giá trị n: Khối lệnh thực hiện công việc n; break;
[default : Khối lệnh thực hiện công việc mặc định; break;]
}
09/12/16
Toán tử switch (tiếp)Tính giá trị của biểu thức trước. Nếu giá trị của biểu thức bằng giá trị 1 thì thực hiện
công việc 1 rồi thoát. Nếu giá trị của biểu thức khác giá trị 1 thì so sánh với
giá trị 2, nếu bằng giá trị 2 thì thực hiện công việc 2 rồi thoát.
Cứ như thế, so sánh tới giá trị n. Nếu tất cả các phép so sánh trên đều sai thì thực hiện công
việc mặc định của trường hợp default.
09/12/16
Toán tử switch (tiếp)Biểu thức trong switch() phải có kết quả là giá
trị kiểu số nguyên (int, char, long, …). Các giá trị sau case cũng phải là kiểu hằng số
nguyên. Không bắt buộc phải có default.break được sử dụng bắt buộc để thoát ngay
khỏi toán tử switch trong case <giá trị n> được thực hiện.
09/12/16
Ví dụ về switchVí dụ: số ngày trong tháng switch (month) { case 2: length = ( year%4 == 0 && (year%100!=0 || year%400==0))? 29: 28;
break; case 4: case 6: case 9: case 11: length = 30; break; default: length = 31; break; }
09/12/16
Tổ chức chu trình (cấu trúc vòng lặp)Cấu trúc vòng lặp cho phép lặp lại nhiều lần 1 công
việc (được thể hiện bằng 1 câu lệnh hay 1 khối lệnh) nào đó cho đến khi thỏa mãn 1 điều kiện cụ thể.
C có 3 cấu trúc điều khiển cho cấu trúc vòng lặp: Toán tử while: không hoặc nhiều lần Toán tử do .. while: một hoặc nhiều lần Toán tử for: không hoặc nhiều lần với sự khởi tạo và
cập nhật.
09/12/16
Toán tử forLệnh for cho phép lặp lại công việc cho đến khi điều kiện sai. Cú
pháp lệnh for:for (Biểu thức 1; biểu thức 2; biểu thức 3)
<Khối lệnh>Bước 1: Tính giá trị của biểu thức 1. Bước 2: Tính giá trị của biểu thức 2. Nếu:
Nếu giá trị của biểu thức 2 là sai (==0): thoát khỏi câu lệnh for, thực hiện các lệnh sau lệnh for.
Nếu giá trị của biểu thức 2 là đúng (!=0): <Khối lệnh> được thực hiện. Bước 3: Tính giá trị của biểu thức 3 và quay lại Bước 2
09/12/16
Toán tử for (tiếp)Khi biểu thức 2 vắng mặt thì nó được coi là luôn luôn đúng.Biểu thức 1: thông thường là một phép gán để khởi tạo giá trị
ban đầu cho biến điều kiện. Biểu thức 2: là một biểu thức kiểm tra điều kiện đúng sai để
dừng vòng lặp. Biểu thức 3: thông thường là một phép gán để thay đổi giá trị
của biến điều kiện. Trong mỗi biểu thức có thể có nhiều biểu thức con. Các biểu
thức con được phân biệt bởi dấu phẩy.
09/12/16
Ví dụ về for int n, i, factorial;
printf(“n = “);
scanf(“%i “, &n);
for (i = 1, factorial = 1; i <=n; i++){
factorial = factorial * i;
}
printf(“%d ! = %d\n”, n, factorial);
09/12/16
Toán tử whileVòng lặp while giống như vòng lặp for, dùng để lặp lại một
công việc nào đó cho đến khi điều kiện sai. Cú pháp:while (Biểu thức điều kiện)
<Khối lệnh> Kiểm tra Biểu thức điều kiện trước. Nếu:
Biểu thức điều kiện sai (== 0) thì thoát khỏi lệnh while, chuyển tới lệnh tiếp theo.
Biểu thức điều kiện đúng ( != 0) thì thực hiện <khối lệnh> rồi quay lại kiểm tra biểu thức điều kiện.
09/12/16
Toán tử while (tiếp)Chú ý:
Lệnh while gồm có biểu thức điều kiện và thân vòng lặp (khối lệnh thực hiện công việc)
Vòng lặp dừng lại khi nào điều kiện sai. Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay
đổi điều kiện.
09/12/16
Ví dụ về whileTính tổng các số nguyên dương từ 1 đến 50: int tong, dem; tong = 0;
dem = 1;
while (dem <= 50){
tong = tong + dem;
dem = dem + 1;
}
09/12/16
Toán tử do … whileVòng lặp do … while giống như vòng lặp for, while, dùng để lặp lại
một công việc nào đó khi điều kiện còn đúng. Cú pháp:do
<Khối lệnh>
while (<Biểu thức điều kiện>)
Trước tiên công việc được thực hiện trước, sau đó mới kiểm tra Biểu thức điều kiện. Nếu:Biểu thức điều kiện là sai (==0) thì thoát khỏi lệnh do …while.Biểu thức điều kiện còn đúng (!= 0) thì thực hiện <Khối lệnh>
rồi quay lại kiểm tra biểu thức điều kiện tiếp.
09/12/16
Toán tử do … whileChú ý:
Lệnh do…while thực hiện <khối lệnh> ít nhất 1 lần. Vòng lặp dừng lại khi điều kiện sai. Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay
đổi điều kiện.
09/12/16
Câu lệnh break và continue
Câu lệnh break cho phép ra khỏi for, while, do while và switch. Khi có nhiều chu trình lồng nhau, câu lệnh break sẽ đưa
máy ra khỏi chu trình (hoặc switch) bên trong nhất chứa nó.Trái với câu lệnh break (dùng để ra khỏi chu trình), câu
lệnh continue dùng để bắt đầu một vòng mới của chu trình bên trong nhất chứa nó.
Lệnh continue chỉ áp dụng cho chu trình, không áp dụng cho switch.
09/12/16
Ví dụ về do … while#include <stdio.h> #include<conio.h> int main () {
unsigned int n,i,tong; printf("\n Nhap vao so nguyen duong n:"); scanf("%d",&n); tong=0; i=1; do { tong+=i;
i++; } while (i<=n); printf("\n Tong tu 1 den %d =%d ",n,tong); getch(); return 0;
}
09/12/16
Tài liệu tham khảo[PVA] Chương 5[K&R] Chapter 3.
09/12/16
Bài tập1) Viết chương trình tìm ước số chung lớn nhất của 2
số nguyên dương.2) Viết chương trình tính tổng các chữ số của số
nguyên dương n (n được nhập từ bàn phím).3) Viết chương trình giải phương trình bậc 2: ax2 + bx
+ c = 0 bằng if và switch (a, b, c nhập từ bàn phím).
09/12/16