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
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 (
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 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 14 EE3490: Kỹ thuật lập trình – HK1 2011/2012
Đào Trung Kiên – ĐH Bách khoa Hà Nội 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 ) ) ) 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 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 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 Các toán tử gộp: 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 */ 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> ? 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ộiCâu lệnh goto và nhãn
Biểu thức (expressions)
Khái niệm
Toán tử số học
a-b a*b a/b
Toán tử logic và so sánh
Toán tử bit
Toán tử gán
Cơ bản: a = b
Toán tử gán
Toán tử gán
Tương đương
a = a + b
Tương đương
a = a & b
Các toán tử đặc biệt khác
Bài tập