Chương 3: Các cấu trúc điều khiển

1. Câu lệnh , khối lệnh trong C 2. Cấu trúc điều khiển là gì? 3. Cấu trúc điều kiện: IF. ELSE. 4. Cấu trúc rẽ nhánh: SWITCH.CASE. 5. Cấu trúc lặp: FOR, WHILE, DO.WHILE 6. Cấu trúc điều khiển GOTO

pdf30 trang | Chia sẻ: lylyngoc | Lượt xem: 1789 | Lượt tải: 4download
Bạn đang xem trước 20 trang tài liệu Chương 3: Các cấu trúc điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TIN HỌC ĐẠI CƯƠNG Lý thuyết: 6 buổi Thực hành: 8 buổi GVHD: Dương Khai Phong Email: khaiphong@gmail.com Ngôn ngữ lập trình: C NỘI DUNG CÁC BUỔI HỌC 1. Tổng quan về C (chương 1,2) 2. Các cấu trúc điều khiển trong C (chương 3) 3. Hàm và cấu trúc chương trình (chương 4) 4. Mảng, chuỗi và con trỏ (chương 5) 5. Kiểu cấu trúc, đệ qui, tập tin (chương 6,7,8) 6. Ôn tập CHƯƠNG 3: CÁC CẤU TRÚC ĐIỀU KHIỂN 1. Câu lệnh , khối lệnh trong C 2. Cấu trúc điều khiển là gì? 3. Cấu trúc điều kiện: IF.. ELSE.. 4. Cấu trúc rẽ nhánh: SWITCH..CASE.. 5. Cấu trúc lặp: FOR, WHILE, DO..WHILE 6. Cấu trúc điều khiển GOTO 1. CÂU LỆNH , KHỐI LỆNH TRONG C a. Khái niệm về câu lệnh: Mỗi câu lệnh (code) thực hiện một chức năng nào đó (như lệnh gán, xuất dữ liệu ra màn hình..). Mỗi câu lệnh có thể được viết trên một dòng hoặc nhiều dòng và được kết thúc bằng dấu chấm phẩy “;”. b. Khái niệm về khối lệnh: - Một dãy các câu lệnh được đặt trong cặp dấu ngoặc nhọn { và } thì được gọi là một khối lệnh. - Những câu lệnh của một hàm hay một cấu trúc có nhiều lệnh phải được đặt trong dấu {..}  Lưu ý: - Khi muốn ghi chú một câu lệnh ta dùng dấu : // nội dung - Khi muốn ghi chú một khối lệnh ta dùng dấu : /* nội dung */ 2. CẤU TRÚC ĐIỀU KHIỂN TRONG C a. Cấu trúc điều khiển là gì? Là cách thức cho phép thay đổi trật tự thực hiện các câu lệnh (khối lệnh) do đó máy có thể từ câu lệnh này nhảy tới thực hiện một câu lệnh trước hoặc sau nó. b. Phân loại: ĐIỀU KIỆN LẶP FOR WHILE Cấu trúc điều khiển KẾT HỢP: GOTO IF ELSE SWITCH CASE DO WHILE 3. CẤU TRÚC ĐIỀU KIỆN: IF.. ELSE a. Cấu trúc 1: if () { ; } Ý nghĩa: Nếu Biểu_thức_điều_kiện cho kết quả khác không (tức điều kiện đó là đúng) thì thực hiện khối lệnh, ngược lại không thực hiện. Ta có thể lồng các câu lệnh if vào nhau. b. Cấu trúc 2: if () { ; } else { ; } Ý nghĩa: Nếu Biểu_thức_điều_kiện cho kết quả khác không (tức điều kiện đó là đúng) thì thực hiện khối_lệnh_1, ngược lại thực hiện khối_lệnh_2. 3. CẤU TRÚC ĐIỀU KIỆN: IF.. ELSE Một số ví dụ về if: Ví dụ 1: Nếu tuổi của người nào đó trên 18 tuổi thì xuất thông báo “Bạn là thanh niên”? int tuoi; printf(“Cho biet tuoi:”); scanf (“%d”,&tuoi); if (tuoi>=18) { printf(“Ban la thanh nien”); } int tuoi; printf(“Cho biet tuoi:”); scanf (“%d”,&tuoi); if (tuoi>=18) printf(“Ban la thanh nien”); Nếu khối lệnh sau if chỉ có 1 lệnh thì ta có thể không cần dùng cặp dấu ngoặc nhọn {…} 3. CẤU TRÚC ĐIỀU KIỆN: IF.. ELSE Một số ví dụ về if: Ví dụ 2: Nếu tuổi của người nào đó trên 18 tuổi thì xuất thông báo “Bạn là thanh niên”, ngược lại “Bạn chưa đủ tuổi”? int tuoi; printf(“Cho biet tuoi:”); scanf (“%d”,&tuoi); if (tuoi>=18) { printf(“Ban la thanh nien”); } else { printf(“Ban la thanh nien”); } int tuoi; printf(“Cho biet tuoi:”); scanf (“%d”,&tuoi); if (tuoi>=18) printf(“Ban la thanh nien”); else printf(“Ban la thanh nien”); 3. CẤU TRÚC ĐIỀU KIỆN: IF.. ELSE Một số ví dụ về if: Ví dụ 3: Giải ptb1 ax+b=0 với a,b là số nguyên nhập từ bàn phím int a,b; float x; printf(“Cho biet a=”);scanf (“%d”,&a); printf(“Cho biet b=”);scanf (“%d”,&b); if (a==0) if (b==0) printf(“pt VSN”); else printf(“pt VN”); else { x=(float)a/b; printf(“pt co nghiem x=%f”,x); } 4. CẤU TRÚC RẼ NHÁNH: SWITCH..CASE Cấu trúc chung: switch () { case giá_trị_1: ; [break;] case giá_trị_2: ; [break;] case giá_trị_k: ; [break;] [default: ;] } * Lưu ý: - Kết quả của biểu thức tính toán phải là giá trị nguyên, ký tự. - Các giá trị 1,2,..,k: phải là hằng nguyên, ký tự. - Khi giá trị biểu thức khác tất cả các giá trị 1,2,..,k thì câu lệnh sau default được thực hiện. - Câu lệnh break dùng để thoát khỏi lệnh switch sau khi thực hiện xong 1 trường hợp case (nếu không có break thì các lệnh bên dưới sẽ được thực hiện mà không xét lại điều kiện). 4. CẤU TRÚC RẼ NHÁNH: SWITCH..CASE Một số ví dụ về switch: Ví dụ 1: Viết chương trình nhập vào 1 số nguyên từ 0..9 và cho biết cách đọc số đó. * Cách 1: dùng if int so; printf(“Nhap vao 1 so nguyen:”); scanf (“%d”,&so); if (so==0) printf(“khong”); if (so==1) printf(“mot”); … if (so==9) printf(“chin”); * Cách 2: dùng switch int so; printf(“Nhap vao 1 so nguyen:”); scanf (“%d”,&so); switch (so){ case 0: printf(“khong”);break; case 1: printf(“mot”);break; … case 9: printf(“chin”);break; default: printf(“Khong biet”); } 5. CẤU TRÚC LẶP: FOR, WHILE, DO..WHILE Nhận xét: khi một lệnh / khối lệnh phải thực hiện nhiều lần thì ta dùng cấu trúc lặp để tránh viết lại lệnh / khối lệnh nhiều lần. Ta có các cấu trúc lặp sau: a/ FOR:  Công dụng: cấu trúc lặp for cho biết trước số lần sẽ được lặp.  Cú pháp chung: for (giá_trị_bắt_đầu;biểu_thức_đk_dừng;bước_lặp) { ; } 5. CẤU TRÚC LẶP: Ví dụ 1: xuất các số nguyên từ 1..100 for * Cách 1: printf(“1“); printf(“2“); … printf(“100“); * Cách 2.2: int i; for (i=1;i<=100;i++) { printf(“%d “,i); } * Cách 2.3: for (int i=1;i<=100;i++) { printf(“%d “,i); } * Cách 2.1: int i; for (i=0;i<=100;i=i+1) { printf(“%d “,i); } 5. CẤU TRÚC LẶP: Ví dụ 2: xuất các số nguyên chẵn từ 0..100 for * Cách 2: int i; for (i=0;i<=100;i++) { if (i%2==0) printf(“%d “,i); } * Cách 1: int i; for (i=0;i<=100;i=i+2) { printf(“%d “,i); } Ví dụ 3: xuất các số nguyên lẻ từ 0..100 5. CẤU TRÚC LẶP: for  Cú pháp mở rộng: for (biểu thức 1;biểu_thức 2;biểu thức 3) { ; } Trong đó: Bất kỳ biểu thức 1,2,3 nào đều có thể vắng mặt nhưng phải có dấu chấm phẩy (Vd: for(i=1;++i<n;)  Hoạt động của cấu trúc lặp for:  B1: tính giá trị biểu thức 1  B2: tính giá trị biểu thức 2  B3: nếu giá trị biểu thức 2 0 thì thực hiện khối lệnh, ngược lại thoát.  B4: tính giá trị biểu thức 3 rồi quay lại B2 biểu thức 1; for (;biểu_thức 2;) { ; biểu thức 3; } 5. CẤU TRÚC LẶP: for  Các lệnh dùng kết hợp với cấu trúc lặp: (xem trang 70,71)  break: dùng để để thoát khỏi vòng lặp for ngay lặp tức.  continue: dùng để bắt đầu thực hiện một vòng lặp mới của chu trình bên trong nhất chứa nó (không thực hiện những lệnh sau nó)  Ví du: break void main() { int dem; for (dem=0;dem<5;dem++) { printf(“dem = %d”,dem); break; printf(“Thu nghiem break”); } } => KQ chỉ xuất dòng : dem = 1  Ví du: continue Viết CT xuất các số lẻ nhỏ hơn 20 trừ các số 5,11 void main() { int dem; for (dem=0;dem<=20;dem++) { if ((dem==5) || (dem==11)) continue; printf(“dem = %d”,dem); } } 5. CẤU TRÚC LẶP: Ví dụ: viết CT cho phép nhập một số nguyên trong khoảng 10, nếu nhập lớn hơn thì bắt nhập lại. => Nhận xét: chương trình có tính chất lặp đi lặp lại nhiều lần nhưng số lần lặp không xác định trước => while while int main() { int so=11; while (so>10) { printf(“Nhap mot so trong khoang 0..9: ”); scanf(“%d”,&so); } printf(“So ban da nhap chinh xac la %d”,so); } 5. CẤU TRÚC LẶP:  Cú pháp: while while while (biểu thức) { ; ; }  Nhận xét:  Nếu biểu thức còn khác 0 (hay biểu thức có giá trị true) thì còn thực hiện khối lệnh của vòng lặp. Vòng lặp while thường được sử dụng khi số lần lặp không xác định trước.  Số lần lặp tối thiểu là 0 lần 5. CẤU TRÚC LẶP: Ví dụ: viết lại CT cho phép nhập một số nguyên trong khoảng 0..9, nếu nhập ngoài khoảng này thì bắt nhập lại. do..while int main() { int so; do { printf(“Nhap mot so trong khoang 0..9: ”); scanf(“%d”,&so); } while (so>=0 && so<=9); printf(“So ban da nhap chinh xac la %d”,so); } 5. CẤU TRÚC LẶP:  Cú pháp: do .. while do .. while do { ; ; } while (biểu thức);  Nhận xét: Thực hiện khối lệnh của vòng lặp cho đến khi biểu thức có giá trị bằng 0 (hay biểu thức có giá trị false). Vòng lặp do .. while cũng thường được sử dụng khi số lần lặp không xác định trước.  Số lần lặp tối thiểu là 1 lần. 5. CẤU TRÚC LẶP: while, do..while  Các lệnh dùng kết hợp với cấu trúc lặp: (xem trang 74)  break: dùng để để thoát khỏi vòng lặp ngay lặp tức.  continue: dùng để bắt đầu thực hiện một vòng lặp mới của chu trình bên trong nhất chứa nó (không thực hiện những lệnh sau nó) Ví du: xem thêm trang 75,76 5. CẤU TRÚC ĐIỀU KHIỂN: goto  Cấu trúc điều khiển goto: là sự thể hiện giữa cấu trúc điều kiện và cấu trúc lặp, được sử dụng kết hợp với nhãn lệnh theo cú pháp sau: goto ;  Lưu ý:  Các lệnh goto và nhãn phải nằm trong cùng 1 hàm  Không cho phép dùng goto nhảy từ ngoài vào trong 1 khối lệnh nhưng ngược lại thì hợp lệ. 5. CẤU TRÚC ĐIỀU KHIỂN: goto  Ví dụ: int main(){ int s=1,a=3; goto t; ++a; t: s+=a; } Nhãn lệnh t; Lệnh goto nhảy đến nhãn lệnh t mà không thực hiện lệnh ++a PHẦN BÀI TẬP ÔN TẬP CHƯƠNG 1,2,3 Bài 1/ trang 77: cho biết kết quả thực thi CT #include “stdio.h” #include “conio.h” main() { int a,b=4; switch ((a=2)?5:2) { case 5: b+=2; default: a-b--; case 2: a--; } printf (“%d %d”,a,--b); } a = giá trị rác (-8599…) Dòng này có 3 phép toán: Phép toán: () Phép toán điều kiện: ? Phép toán gán: = => Thứ tự ưu tiên các phép toán (tr34) ( ) => = => gán a=2 ? => đây là một biểu thức hợp lệ => giá trị của biểu thức là true => nhận giá trị 5 b+=2 => b=b+2 => b=6 Do không có break nên các lệnh sau nó được thực hiện tiếp: a-b-- => b=b-1 và a-b => b=5 a-- => a=a-1 => a=1 --b=> b=b-1 => b=4 Kết quả in ra: 1 4 Bài 2/ trang 78: cho biết kết quả thực thi CT #include “stdio.h” #include “conio.h” int a=-1,b; main() { while (a>=b && --b) if (a==b) break; printf (“%d %d”,a,b); } b = 0 (do b là biến toàn cục) Biểu thức : (a>=b && --b) (-1>=0 && --b) Do vế đầu của biểu thức là false nên CT sẽ không thực hiện tiếp vế sau –b (do trong phép && (AND): 1 vế trong biểu thức có giá trị false thì toàn bộ biểu thức có giá trị false => vòng while không thực hiện Kết quả in ra: -1 0 Bài 3/ trang 79: cho biết kết quả thực thi CT #include “stdio.h” #include “conio.h” main() { int a,b=0; while (a=b++==1) if (a==b) break; else a++; printf (“%d %d”,b,a); } a = giá trị rác (-8599…) Thứ tự thực hiện (tr34) của biểu thức: (a=b++==1) như sau: -a=b++ tức gán a=b trước rồi thực hiện b=b+1 => a=0 và b=1 - Thực hiện so sánh a với 1 => biểu thức so sánh cho giá trị false => Vòng while không thực hiện lệnh nào. Kết quả in ra: 1 0 Bài 4/ trang 79: cho biết kết quả thực thi CT #include “stdio.h” #include “conio.h” main() { int i,a=0; for(i=0;i<3;i++) { if (i==2) continue; a+=i; if (i>1) break; printf(“%d ”,a); } } i = giá trị rác (-8599…) Thực hiện vòng lặp: i=0: gán a+=i => a=a+i => a=0 => Xuất: 0 i=1: gán a+=i => a=a+i => a=1 Xuất: 0 1 i=2: thực hiện lệnh continue => bỏ qua các lệnh sau nó i=3: so sánh i thoát vòng lặp Kết quả in ra: 0 1 Bài 5/ trang 80: cho biết kết quả thực thi CT #include “stdio.h” #include “conio.h” int i=0; main() { int a=2; for(;i<a;i++); printf(“%d ”,i*a); } i = 0 Thực hiện vòng lặp: i=0:không thực hiện lệnh nào i=1:không thực hiện lệnh nào i=2: so sánh i 2<2: false => thoát khỏi vòng lặp Kết quả in ra: 4 Thực hiện xuất giá trị a*i Bài 6/ trang 81: cho biết kết quả thực thi CT #include “stdio.h” #include “conio.h” int i=0; main() { int i,j; for(i=0,j=1;i<5;i++,j+=i++) printf(“i=%d j=%d i+j=%d \n ”,i,j,i+j); } i , j = giá trị rác (-8599…) Vòng lặp for được viết lại như sau: for(i=0,j=1;i<5;) { printf(“i=%d j=%d i+j=%d \n ”,i,j,i+j); i++; j+=i++; }