Luồng điều khiển (Control Flow) -...

31
Luồng điều khiển (Control Flow) TS. Bùi Ngọc Thăng BM KHMT- Khoa CNTT

Transcript of Luồng điều khiển (Control Flow) -...

Page 1: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

Luồng điều khiển(Control Flow)

TS. Bùi Ngọc ThăngBM KHMT- Khoa CNTT

Page 2: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 3: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 4: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 5: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 6: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 7: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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; }

Page 8: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 9: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 10: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 11: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 12: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 13: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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;

Page 14: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 15: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 16: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 17: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 18: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 19: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 20: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 21: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 22: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 23: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 24: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 25: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 26: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 27: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 28: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 29: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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

Page 30: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

Tài liệu tham khảo[PVA] Chương 5[K&R] Chapter 3.

09/12/16

Page 31: Luồng điều khiển (Control Flow) - uet.vnu.edu.vnuet.vnu.edu.vn/~tqlong/2016thcs4/slide4_controlFlow.pdfKiểu viết mã (style of code) Cách viết chương trình có cấu

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