23
Cấu trúc điều Cấu trúc điều khiển khiển

2 Cau Truc Dieu Khien

  • Upload
    cuong

  • View
    2.609

  • Download
    5

Embed Size (px)

Citation preview

Page 1: 2 Cau Truc Dieu Khien

Cấu trúc điều Cấu trúc điều khiểnkhiển

Page 2: 2 Cau Truc Dieu Khien

Cấu trúc điều khiểnCấu trúc điều khiển

Lệnh rẽ nhánh: Lệnh rẽ nhánh: ifif – – elseelse Lệnh rẽ nhiều nhánh: Lệnh rẽ nhiều nhánh: switchswitch Vòng lặp: Vòng lặp: whilewhile, , dodo whilewhile, , forfor Các từ khóa: Các từ khóa: break break và và continuecontinue

Page 3: 2 Cau Truc Dieu Khien

Lệnh rẽ nhánh Lệnh rẽ nhánh ififCú phápCú pháp::

if if ((điều kiệnđiều kiện))

SS;; Điều kiệnĐiều kiện: biểu thức cho kết quả : biểu thức cho kết quả SỐSỐ; phải ; phải

được đặt giữa cặp ngoặc đơn ()được đặt giữa cặp ngoặc đơn () SS phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh, các phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh, các

lệnh phải được đặt giữa cặp ngoặc nhọn {} – lệnh phải được đặt giữa cặp ngoặc nhọn {} – khối lệnhkhối lệnh..

scanf("%i %i", &a, &b);max = a;if(b > max)

max = b;printf(“So lon la: %i\n“, max);

scanf("%i %i", &a, &b);max = a;if(b > max)

max = b;printf(“So lon la: %i\n“, max);

điềđiều u

kiệkiệnnSS

00

00

Page 4: 2 Cau Truc Dieu Khien

Lưu ýLưu ý Nếu đặt dấu chấm phẩy (;) ở ngay sau biểu thức điều kiện Nếu đặt dấu chấm phẩy (;) ở ngay sau biểu thức điều kiện

thì lệnh S của if xem như “thì lệnh S của if xem như “KHÔNG LÀM GÌKHÔNG LÀM GÌ””

printf(“Nhap mot so nguyen: ");scanf("%i", &j);

if(j > 0);printf(“%i la so duong“, j);

printf(“Nhap mot so nguyen: ");scanf("%i", &j);

if(j > 0);printf(“%i la so duong“, j);

Nhap mot so nguyen: -6

-6 là so duong

Nhap mot so nguyen: -6

-6 là so duong

Page 5: 2 Cau Truc Dieu Khien

Lệnh rẽ nhánh Lệnh rẽ nhánh if-elseif-elseCú phápCú pháp::

if if ((điều kiệnđiều kiện))

SS;;

elseelse SSee;; Phần lệnh Phần lệnh elseelse có thể thêm vào trong câu lệnh có thể thêm vào trong câu lệnh

ifif để chỉ thị các lệnh thực hiện khi điều kiện để chỉ thị các lệnh thực hiện khi điều kiện bằng bằng 00 (FALSE). (FALSE).

scanf("%i %i", &a, &b);if(a > b)

max = a;else

max = b;printf(“So lon la: %i\n“, max);

scanf("%i %i", &a, &b);if(a > b)

max = a;else

max = b;printf(“So lon la: %i\n“, max);

điềđiều u

kiệkiệnnSS

00

00

SSee

Page 6: 2 Cau Truc Dieu Khien

Nhiều lệnh Nhiều lệnh ifif lồng nhau lồng nhauelseelse kết nốikết nối với lệnh với lệnh if if gần nhấtgần nhất

int i = 100;if(i > 0)

if(i > 1000)printf("i qua lon\n");

elseprintf("i chap nhan duoc\n");

int i = 100;if(i > 0)

if(i > 1000)printf("i qua lon\n");

elseprintf("i chap nhan duoc\n");

i chap nhan duoci chap nhan duoc

int i = -20;if(i > 0) {

if(i > 1000)printf("i qua lon\n");

}else

printf("i la so am\n");

int i = -20;if(i > 0) {

if(i > 1000)printf("i qua lon\n");

}else

printf("i la so am\n");

i la so ami la so am

Page 7: 2 Cau Truc Dieu Khien

Cấu trúc nhiều chọn lựa – Cấu trúc nhiều chọn lựa – switchswitchCú phápCú pháp::

switch switch ((biểu thứcbiểu thức)){{

casecase gt gt11: : SS11; [; [breakbreak;];]

casecase gt gt22: : SS22; [; [breakbreak;];]

......casecase gt gtnn: : SSnn; [; [breakbreak;];]

default: SSee; ;

}} Biểu thứcBiểu thức: cho kết quả : cho kết quả SỐ NGUYÊNSỐ NGUYÊN; phải được đặt giữa cặp ngoặc ; phải được đặt giữa cặp ngoặc

đơn ()đơn () SSii : dãy các lệnh. : dãy các lệnh.

Page 8: 2 Cau Truc Dieu Khien

Ví dụ lệnh Ví dụ lệnh switchswitchswitch(c) { case 'a': case 'A':

printf(“Dien tich = %.2f\n", r * r * pi);break;

case 'c': case 'C':printf(“Chu vi = %.2f\n", 2 * r * pi);break;

case 'q':printf(“Thoat\n");break;

default:printf(“Chon khong hop le\n");

}

switch(c) { case 'a': case 'A':

printf(“Dien tich = %.2f\n", r * r * pi);break;

case 'c': case 'C':printf(“Chu vi = %.2f\n", 2 * r * pi);break;

case 'q':printf(“Thoat\n");break;

default:printf(“Chon khong hop le\n");

}

Page 9: 2 Cau Truc Dieu Khien

Một số lưu ý – Một số lưu ý – switchswitch Nếu không có giá trị nào khớp, các lệnh trong phần Nếu không có giá trị nào khớp, các lệnh trong phần defaultdefault sẽ được thực thi; và nếu không có sẽ được thực thi; và nếu không có defaultdefault cũng không xảy ra lỗi.cũng không xảy ra lỗi.

Lệnh Lệnh breakbreak rất quan trọng. rất quan trọng.

float f;

switch(f) { case 2:

....

float f;

switch(f) { case 2:

....

switch(i) { case 2 * j:

....

switch(i) { case 2 * j:

....

i = 3;

switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n");}

i = 3;

switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n");}

i = 3i = 2i = 1

i = 3i = 2i = 1

Page 10: 2 Cau Truc Dieu Khien

biểu biểu thứcthức

SS11;;

break;break;

gtgt11

……

SS22;;

break;break;

SSee;;

gtgt22

defaultdefault

Cấu trúc nhiều chọn lựa – Cấu trúc nhiều chọn lựa – switchswitch

Page 11: 2 Cau Truc Dieu Khien

Ví dụ khác – Ví dụ khác – switchswitch//Doan chuong trinh doc so 0..9switch(so) {

case 0: printf(“khong\n");case 1: printf(“mot\n");case 2: printf(“hai\n");case 3: printf(“ba");case 4: printf(“bon");case 5: printf(“nam");case 6: printf(“sau");case 7: printf(“bay");case 8: printf(“tam");case 9: printf(“chin");

}

//Doan chuong trinh doc so 0..9switch(so) {

case 0: printf(“khong\n");case 1: printf(“mot\n");case 2: printf(“hai\n");case 3: printf(“ba");case 4: printf(“bon");case 5: printf(“nam");case 6: printf(“sau");case 7: printf(“bay");case 8: printf(“tam");case 9: printf(“chin");

}

Page 12: 2 Cau Truc Dieu Khien

Lệnh lặp Lệnh lặp whilewhileCú phápCú pháp:: while while ((điều điều kiệnkiện))

SS;; Điều kiệnĐiều kiện: biểu thức cho kết quả : biểu thức cho kết quả SỐSỐ; ;

phải được đặt giữa cặp ngoặc đơn ()phải được đặt giữa cặp ngoặc đơn () SS phải là 1 câu lệnh, nếu nhiều hơn 1 phải là 1 câu lệnh, nếu nhiều hơn 1

lệnh, các lệnh phải được đặt giữa cặp lệnh, các lệnh phải được đặt giữa cặp ngoặc nhọn {} – ngoặc nhọn {} – khối lệnhkhối lệnh..

int j = 5;

while(j > 0)printf("j = %i\n", j--);

int j = 5;

while(j > 0)printf("j = %i\n", j--);

j = 5j = 4j = 3j = 2j = 1

j = 5j = 4j = 3j = 2j = 1

while(j > 0) {printf("j = %i\n", j);j--;

}

while(j > 0) {printf("j = %i\n", j);j--;

}

whilewhile thực hiện lệnh S ít nhất 0 lần thực hiện lệnh S ít nhất 0 lần

điềđiều u

kiệkiệnnSS

00

00

Page 13: 2 Cau Truc Dieu Khien

Lưu ý dấu chấm phẩy Lưu ý dấu chấm phẩy ;; Dấu ‘;’ đặt ngay sau biểu thức điều kiện đồng nghĩa với lệnh Dấu ‘;’ đặt ngay sau biểu thức điều kiện đồng nghĩa với lệnh

S là rỗng.S là rỗng.

int j = 5;

while(j > 0);printf("j = %i\n", j--);

int j = 5;

while(j > 0);printf("j = %i\n", j--);

Chưong trình bị lặp không thoát được

Đôi khi người lập trình Đôi khi người lập trình cố ý sử dụng lệnh rỗngcố ý sử dụng lệnh rỗng

int c, j;

while(scanf("%i", &j) != 1)while((c = getch()) != 27)

;

int c, j;

while(scanf("%i", &j) != 1)while((c = getch()) != 27)

;

Đặt dấu ‘;’ để kết thúc while

không có S

Page 14: 2 Cau Truc Dieu Khien

Lệnh lặp Lệnh lặp do whiledo whileCú phápCú pháp::

dodo

SS;;

while while ((điều điều kiệnkiện););

Điều kiệnĐiều kiện: biểu thức cho kết quả : biểu thức cho kết quả SỐSỐ; phải ; phải được đặt giữa cặp ngoặc đơn ()được đặt giữa cặp ngoặc đơn ()

SS phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh, phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh, các lệnh phải được đặt giữa cặp ngoặc các lệnh phải được đặt giữa cặp ngoặc nhọn {} – nhọn {} – khối lệnhkhối lệnh..

điềđiều u

kiệkiệnn

SS

00

00

Page 15: 2 Cau Truc Dieu Khien

Ví dụ Ví dụ dodo whilewhile

int j = 5;

printf("start\n");do

printf("j = %i\n", j--);while(j > 0);printf("stop\n");

int j = 5;

printf("start\n");do

printf("j = %i\n", j--);while(j > 0);printf("stop\n");

startj = 5j = 4j = 3j = 2j = 1stop

startj = 5j = 4j = 3j = 2j = 1stop

Page 16: 2 Cau Truc Dieu Khien

Ví dụ Ví dụ dodo whilewhile

dodo whilewhile thực hiện lệnh S ít nhất 1 lần thực hiện lệnh S ít nhất 1 lần

int j = -10;

printf("start\n");do {

printf("j = %i\n", j);j--;

} while(j > 0);printf("stop\n");

int j = -10;

printf("start\n");do {

printf("j = %i\n", j);j--;

} while(j > 0);printf("stop\n");

startj = -10stop

startj = -10stop

Page 17: 2 Cau Truc Dieu Khien

Lệnh lặp Lệnh lặp forfor

Lệnh lặp Lệnh lặp forfor dồn hết các thành phần của vòng lặp vào trong dồn hết các thành phần của vòng lặp vào trong một câu lệnh.một câu lệnh.

Cú phápCú pháp::

for for ((khởi độngkhởi động; ; điều kiện lặpđiều kiện lặp;; điều khiển điều khiển))

SS;;

điềđiều u

kiệkiệnn00

00khởi khởi độngđộng SS

điều điều khiểnkhiển

Page 18: 2 Cau Truc Dieu Khien

Lệnh lặp Lệnh lặp for – for – Ví dụVí dụ

int j;

for(j = 5; j > 0; j--)printf("j = %i\n", j);

int j;

for(j = 5; j > 0; j--)printf("j = %i\n", j);

j = 5j = 4j = 3j = 2j = 1

j = 5j = 4j = 3j = 2j = 1

for(j = 5; j > 0; j--) {printf("j = %i ", j);printf("%s\n", ((j%2)==0)?“chan":“le");

}

for(j = 5; j > 0; j--) {printf("j = %i ", j);printf("%s\n", ((j%2)==0)?“chan":“le");

}j = 5 lej = 4 chanj = 3 lej = 2 chanj = 1 le

j = 5 lej = 4 chanj = 3 lej = 2 chanj = 1 le

Page 19: 2 Cau Truc Dieu Khien

Bước lặp trong Bước lặp trong forfor C không giới hạn độ lớn của bước lặp trong for.C không giới hạn độ lớn của bước lặp trong for.

#include <math.h>

int main(void){

double angle;

for(angle = 0.0; angle < 3.14159; angle += 0.2)printf("sine of %.1lf is %.2lf\n",

angle, sin(angle));

return 0;}

#include <math.h>

int main(void){

double angle;

for(angle = 0.0; angle < 3.14159; angle += 0.2)printf("sine of %.1lf is %.2lf\n",

angle, sin(angle));

return 0;}

Page 20: 2 Cau Truc Dieu Khien

Nói thêm về Nói thêm về forfor Phần lệnh khởi động và lệnh điều khiển có thể gồm nhiều Phần lệnh khởi động và lệnh điều khiển có thể gồm nhiều

lệnh đơn giản, các lệnh này cách nhau bởi dấu phẩy (,)lệnh đơn giản, các lệnh này cách nhau bởi dấu phẩy (,)

int i, j, k;for(i = 0, j = 5, k = -1; i < 10; i++, j++, k--)

int i, j, k;for(i = 0, j = 5, k = -1; i < 10; i++, j++, k--)

Các phần: khởi động, điều kiện lặp, điều khiển có thể không có lệnh nào.

for(; i < 10; i++, j++, k--)for(; i < 10; i++, j++, k--)

for(;i < 10;)for(;i < 10;)

for(;;)for(;;)

Dùng while sẽ hợp lý hơn

Vòng lặp không kết thúc

Page 21: 2 Cau Truc Dieu Khien

breakbreak Từ khóa Từ khóa breakbreak chỉ thị việc thoát ngay lập tức khỏi cấu chỉ thị việc thoát ngay lập tức khỏi cấu

trúc điều khiển.trúc điều khiển. Cẩn thận khi sử dụng!Cẩn thận khi sử dụng!

for(;;) {printf(“nhap một so nguyen: ");if(scanf("%i", &j) == 1)

break;printf(“khong hop le, nhap lai\n“

}printf(“j = %i\n", j);

for(;;) {printf(“nhap một so nguyen: ");if(scanf("%i", &j) == 1)

break;printf(“khong hop le, nhap lai\n“

}printf(“j = %i\n", j); nhap mot so nguyen : int

khong hop le, nhap lainhap mot so nguyen: 16j = 16

nhap mot so nguyen : intkhong hop le, nhap lainhap mot so nguyen: 16j = 16

Nếu scanf trả về 1, chương trình thoát khỏi vòng lặp for

Page 22: 2 Cau Truc Dieu Khien

continuecontinue Từ khóa Từ khóa continuecontinue chỉ thị bước nhanh đến bước lặp kế, chỉ thị bước nhanh đến bước lặp kế,

bất kể phía sau đó còn nhiều lệnh cần lặp.bất kể phía sau đó còn nhiều lệnh cần lặp. Hạn chế sử dụng!Hạn chế sử dụng!

for(j = 1; j <= 10; j++) {if(j % 3 == 0)

continue;printf("j = %i\n", j);

}

for(j = 1; j <= 10; j++) {if(j % 3 == 0)

continue;printf("j = %i\n", j);

}

j = 1j = 2j = 4j = 5j = 7j = 8j = 10

j = 1j = 2j = 4j = 5j = 7j = 8j = 10

Nếu j chia hết cho 3 thì bỏ qua lệnh in j

Page 23: 2 Cau Truc Dieu Khien

Tóm lượcTóm lược

ifif elseelse: rẽ nhánh: rẽ nhánh switchswitch rẽ nhiều nhánh với điều kiện là giá trị rẽ nhiều nhánh với điều kiện là giá trị

của biểu thức nguyêncủa biểu thức nguyên whilewhile, , dodo whilewhile, , forfor – 3 loại vòng lặp của C – 3 loại vòng lặp của C breakbreak continuecontinue