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

Post on 21-Oct-2019

11 views 0 download

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

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