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
30 trang |
Chia sẻ: lylyngoc | Lượt xem: 1947 | Lượt tải: 4
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++;
}