22
EE3490: Kỹ thuật lập trình HK1 2018/2019 TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội Bài 3: Câu lệnh biểu thức 1

Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Bài 3: Câu lệnh và biểu thức

1

Page 2: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Câu lệnh

(statements)

2

Page 3: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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

printf("Xin chao!");

x = PI*R*R;

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,…

3

Page 4: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Câu lệnh if

Rẽ nhánh theo điều kiện

Cú pháp: if (<điều kiện>) <câu lệnh>

[else <câu lệnh>]

Ví dụ: if (x != 0.)

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

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

if (score > current_record)

NewRecord(score);

4

Page 5: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

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

5

Page 6: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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ố nguyên với 0 có thể bỏ qua trong trong

các biểu thức logic:

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

Ví dụ: 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 */

6

Page 7: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Câu lệnh switch

Rẽ nhiều nhánh theo điều kiện

Cú pháp:

switch (<biểu thức>) {

case <giá trị 1>: <các câu lệnh cần thực hiện>

case <giá trị 2>: <các câu lệnh cần thực hiện>

...

[default: <các câu lệnh cần thực hiện>]

}

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

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

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

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

7

Page 8: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

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

8

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

}

Page 9: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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>) <câu lệnh>

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

do <câu lệnh> 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

9

Page 10: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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 (<lệnh khởi tạo>; <điều kiện>; <lệnh lặp>)

<câu lệnh thực hiệ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;

10

Page 11: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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 for (x = 1; x <= 10; x++) {

if (x == 8) break;

printf ("%d ", x);

}

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

sang lần lặp mới for (x = 1; x <= 10; x++) {

if (x == 8) continue;

printf ("%d ", x);

}

11

Page 12: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

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/lặp

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 = 0;

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

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

tong += a[i];

}

12

Page 13: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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òng lặp, điều kiện, nhãn,…

Ví dụ:

for (i=0; i<N; a[i]=b[i++]) ;

for (i=0; i<10; printf("%d ",i++)) ;

if (x==y) ;

else x=y;

13

Page 14: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

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

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

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

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

nếu cần)

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

14

Page 15: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Biểu thức

(expressions)

15

Page 16: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Khái niệm

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

hay biểu thức con

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

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

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

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

Ví dụ:

47

i

x++

sin(x+2)

( 2 * log( ( 3 + 10 ) - ( 2 * 6 ) ) )

16

Page 17: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Toán tử số học

Cơ bản: a+b a-b a*b 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

Modulo (chia lấy số dư): a%b

Tăng, giảm 1 đơn vị: a++ a-- ++a --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++ /* nên tránh dùng */

17

Page 18: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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

not: !A

So sánh:

x == y

x != y

x > y

x < y

x >= y

x <= y

18

Page 19: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

Toán tử bit

Bao gồm:

and: a & b

or: a | b

xor: a ^ b

not: ~a

Dịch trái, phải: a<<b a>>b

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

19

Page 20: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đà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 có trả về giá trị đúng bằng giá trị được gán x = y = 15;

if ((c = getchar()) == 'y' || c == 'n') { … }

if (a = b) { … } /* vẫn dịch được dù viết nhầm */

20

Toán tử gán Tương đương Toán tử gán Tương đương

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 a = a % b a >>= b a = a >> b

Page 21: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

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

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ử ngoặc (): (a+b)*c

Toán tử phảy “,”: không làm gì, chỉ bỏ qua giá trị thứ nhất

x++, y = x*2;

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

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

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> ? <biểu thức 1> : <biểu thức 2>

biggest = a > b ? a : b;

21

Page 22: Bài 3: Câu biểuthức. C...EE3490: Kỹthuậtlậptrình –HK1 2018/2019 TS. ĐàoTrung Kiên –ĐH Bách khoa Hà Nội Biểuthứclogic Là biểuthứcchứacác toán tửlogic,

EE3490: Kỹ thuật lập trình – HK1 2018/2019

TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội

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. 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

22