Câu lệnh (statements)

1

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Khái niệm

 Câu lệnh được dùng để thực hiện một nhiệm vụ

trong chương trình: gán, tính toán, đọc/ghi dữ liệu, gọi hàm,…  Phân loại:

 Câu lệnh đơn

 Khối lệnh trong dấu { … }  Các lệnh rẽ nhánh và điều kiện: for, if, while, switch,…  Đặc biệt: câu lệnh trống, câu lệnh biểu thức, tạo nhãn,

return,…

2

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 printf("Xin chao!");  x = PI*R*R;

Câu lệnh if

 Rẽ nhánh theo điều kiện  Cú pháp:

[else ]

 Ví dụ:

 if (<điều kiện>)

printf("Nghich dao = %f",1/x);

else printf("Khong co gia tri nghich dao");

 if (x != 0.)

3

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 if (score > current_record) NewRecord(score);

Câu lệnh if lồng nhau

 Câu lệnh if thường được dùng lồng nhau để kiểm tra

nhiều điều kiện khác nhau

 Ví dụ:

 if (diem >= 8.)

printf("Xep loai gioi");

else if (diem >= 7.)

printf("Xep loai kha");

else if (diem >= 5.)

printf("Xep loai trung binh");

else

printf("Khong dat");

4

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Biểu thức logic

 Là biểu thức chứa các toán tử logic, biến/hằng logic  Trả về kết quả 1 (true) hoặc 0 (false)  Trong C, kiểu int có thể được ngầm hiểu là kiểu logic với

việc chuyển đổi: 0  false, khác 0  true  Hệ quả: so sánh một số với 0 có thể bỏ qua trong trong các biểu

thức logic:

 Ví dụ:

 if (x != 0) …  if (x) …

5

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 8*4 >= 10  x != y  b*b > 4*a*c  (a>2) && ((b<3) || (a>4)))  2-3 /* được ngầm chuyển thành true */

Câu lệnh switch

 switch () {

case :

case :

...

[default: ]

}

 Rẽ nhiều nhánh theo điều kiện  Cú pháp:

nào, sẽ nhảy tới chạy các câu lệnh ở trường hợp đó

 Tuỳ giá trị của biểu thức phân nhánh bằng giá trị của trường hợp

break để ngắt nếu không muốn

 Chỉ dùng điều kiện được với các kiểu tương đương số nguyên (char,

int, enum,…) và các giá trị phải là hằng

6

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 default là trường hợp còn lại nếu không trường hợp nào thoả mãn  Các câu lệnh thực hiện xong sẽ chạy tiếp case tiếp theo  dùng

Câu lệnh switch (tiếp)

 switch (x) {

case 0:

printf("x is 0"); break;

case 1:

printf("x is 1"); break;

default:

printf("x is something else");

}

 switch (day) { case Thu7: case ChuNhat:

printf("Duoc nghi"); break;

default:

printf("Di lam");

}

7

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Vòng lặp do và while

 Lặp đi lặp lại việc thực hiện một câu lệnh

 Cú pháp:

 while(<điều kiện>)

Kiểm tra điều kiện trước khi thực hiện mỗi lần lặp

 do while(<điều kiện>);

Kiểm tra điều kiện sau khi thực hiện mỗi lần lặp

 Ví dụ:

 x = 0;

do

printf("%d ", x++);

while (x < 10);

 x = 0;

while (x < 10)

printf("%d ", x++);

Kết quả chạy:

0 1 2 3 4 5 6 7 8 9

8

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Vòng lặp for

 Rất phổ biến trong C vì cú pháp ngắn gọn và linh hoạt  Cú pháp:

 for (; <điều kiện>; )

 Mỗi câu lệnh đều có thể được để trống nếu không dùng  Điều kiện được kiểm tra trước

 Ví dụ:

 for (x = 0; x < 10; x++)

printf("%d ", x++);

Kết quả chạy:

0 1 2 3 4 5 6 7 8 9

 for (i = 0; i < N; i++)

for (j = 0; j < M; j++) a[i,j] = i + j;

9

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

break và continue

 break dùng để ngắt giữa chừng một vòng lặp mà

không cần kiểm tra điều kiện

}

 continue dùng để kết thúc lần lặp đang chạy và nhảy

 for (x = 1; x <= 10; x++) { if (x == 8) break; printf ("%d ", x);

sang lần lặp mới

if (x == 8) continue; printf ("%d ", x);

}

10

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 for (x = 1; x <= 10; x++) {

Khối lệnh

 Gộp các lệnh đơn lại bằng { … }  Thường được dùng với các câu lệnh rẽ nhánh  Ví dụ:

 if (delta > 0) {

d = sqrt(delta); x1 = (-b+d)/2.; x2 = (-b-d)/2.; printf("x1 = %.3f, x2 = %.3f", x1, x2);

}

 tong_le = 0;

tong_chan = 0; for (i = 0; i < N; i++) {

if (i%2 == 1) tong_le += a[i]; else tong_chan += a[i];

}

11

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Câu lệnh rỗng (null statement)

 Không có gì, chỉ dùng “;” để kết thúc  Câu lệnh rỗng không thực hiện gì, không gây ra hiệu

ứng gì và không mất thời gian chạy của máy

 Đôi khi cần dùng để kết thúc câu lệnh một cách hợp

lệ

 Ví dụ:

 for (i=0; i

12

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Câu lệnh goto và nhãn

printf("Nhap ngay: "); scanf("%d", &ngay); if (ngay<1 || ngay>31) goto error; printf("Nhap thang: "); scanf("%d", &thang); if (thang<1 || thang>12) goto error; /* … */

error:

printf("Loi nhap du lieu!");

 Nhãn: dùng để đánh dấu một vị trí trong mã nguồn  Câu lệnh goto: nhảy tới vị trí của nhãn và chạy tiếp

nếu cần)

 Sau nhãn phải có ít nhất một câu lệnh (có thể dùng câu lệnh rỗng

13

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 Lệnh goto phá vỡ tính cấu trúc, nên hạn chế sử dụng

Biểu thức (expressions)

14

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Khái niệm

hay biểu thức con

 Một biểu thức có chứa ít nhất một toán hạng và 0 hoặc nhiều toán tử  Toán hạng có thể là: giá trị hằng, hằng, biến, kết quả của một hàm

cách dùng ngoặc ( … )

 Các toán tử có độ ưu tiên khác nhau, nhưng có thể bị thay đổi bằng

sin(x) + cos(x)  hàm sin(x) được gọi trước cos(x)

 Các toán tử có cùng độ ưu tiên được thực hiện tử trái sang phải:

15

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 Ví dụ:  47  x++  sin(x+2)  ( 2 * log( ( 3 + 10 ) - ( 2 * 6 ) ) )

Toán tử số học

a-b a*b a/b

 Cơ bản: a+b

 Nhân/chia ưu tiên cao hơn cộng/trừ: 2+3*4+1  Phép toán giữa 2 số nguyên  kết quả là số nguyên  Phép toán có ít nhất 1 số thực  kết quả là số thực

a-- ++a ++b

 Modulo (chia lấy số dư): a%b  Tăng, giảm 1 đơn vị: a++

 Toán hạng phải là một biến kiểu số nguyên  a++ và a-- thực hiện phép tính với giá trị của a rồi mới

tăng/giảm giá trị của a, trong khi ++a và --a thì ngược lại  a++ * 2  ++a * 2  a++ + a++

16

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Toán tử logic và so sánh

 Logic:

 and: A && B  or: A || B  xor: !A  So sánh:  x == y  x != y  x > y  x < y  x >= y  x <= y

17

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Toán tử bit

 Bao gồm:

a>>b

 and: a & b  or: a | b  xor: a ^ b  not: ~a  Dịch trái, phải: a<

 Chỉ áp dụng với kiểu số nguyên  Chú ý tránh nhầm lẫn với các toán tử logic

18

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

Toán tử gán  Cơ bản: a = b

 Các toán tử gộp:

Toán tử gán

Toán tử gán

Tương đương a = a + b

a &= b

Tương đương a = a & b

a += b

a = a – b

a |= b

a = a | b

a -= b

a = a * b

a ^= b

a = a ^ b

a *= b

a = a / b

a <<= b

a = a >> b

a /= b

a = a % b

a >>= b

a = a << b

a %= b

 Toán tử gán có trả về giá trị đúng bằng giá trị được gán

19

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 x = y = 15;  if ((c = getchar()) == 'y' || c == 'n') { … }  if (a = b) { … } /* vẫn dịch được dù viết nhầm */

Các toán tử đặc biệt khác

 x++, y = x*2;  for (i=2, j=3, x=1; i<10; i+=2, j+=3, x++) {…}

 Cộng, trừ đơn hạng: +a, -a  sizeof: trả về kích thước của kiểu/biến/hằng  Toán tử phảy “,”: không làm gì, chỉ bỏ qua kết quả

 Phần tử mảng: a[4]

 biggest = a > b ? a : b;

20

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội

 Con trỏ: *a  Địa chỉ: &a  Lấy thành phần: sv.ten, b->tuoi  Ép kiểu: (int)a  Gọi hàm (): sin(x), pow(x, 3)  Điều kiện: <điều kiện> ? :

Bài tập

1. Nhập các hệ số a, b, c và giải phương trình bậc 2 2. Tính tổng nghịch đảo các số chẵn từ 2 tới 100:

1/2+1/4+1/6+…+1/100

3. Nhập một dãy số và tính giá trị trung bình 4. Viết lại câu lệnh sau dùng while

for (A; B; C) do_something();

5.

In ra màn hình một menu và đọc lựa chọn của người dùng bằng 2 cách: dùng lệnh rẽ nhánh hoặc dùng mảng

6. Nhập khối lượng của một vật và tính quãng đường đi được của một vật rơi tự do tại các thời điểm t=1,2, 3,…,20s 7. Vẫn bài toán trên, nhập thêm độ cao ban đầu, chỉ tính tới

thời điểm mà vật chạm đất

21

EE3490: Kỹ thuật lập trình – HK1 2011/2012 Đào Trung Kiên – ĐH Bách khoa Hà Nội