2 Cau Truc Dieu Khien

Preview:

Citation preview

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

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

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

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

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

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

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.

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");

}

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

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

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");

}

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

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

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

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

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

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

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

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

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

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

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

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