Bài giảng Phương pháp lập trình - Chương 2: Biểu thức (Expressions) - Võ Quang Hoàng Khang

pdf 50 trang phuongnguyen 2491
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình - Chương 2: Biểu thức (Expressions) - Võ Quang Hoàng Khang", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_phuong_phap_lap_trinh_chuong_2_bieu_thuc_expressio.pdf

Nội dung text: Bài giảng Phương pháp lập trình - Chương 2: Biểu thức (Expressions) - Võ Quang Hoàng Khang

  1. CHƯƠNG 2 BIỂUTHU THỨC (Expressions)
  2. 1. Khái ni ệmvm về biểuuth thức ‰ Biểuthứclàmộtsự kếthợpgiữacáctoán tử (operator) và các toán hạng (operand) theo đúng mộttrậttự nhất định. ‰ Mỗitoánhạng có thể là mộthằng,mộtbiến hoặcmộtbiểuthứckhác. ‰ Trong trường hợp, biểuthức có nhiềutoán tử,tadùngcặpdấungoặc đơn()để chỉ định tátoán tử nào được thực hiện trước.
  3. 2. Ki ểudu dữ liệu(Data type) ‰C/C++ có nămkiểudữ liệucơ sở: −Ký tự (char) −Số nguyên (int) −Số thực(float) −Số thựccóđộ chính xác gấp đôi (double) −Kiểuvôđịnh (void). ‰Kích thướcvàphạmvicủanhững kiểudữ liệu này có thể thay đổi tùy theo loại CPU và trình biên dịch.
  4. 2. Ki ểudu dữ liệu(Data type) ‰ Kiểucharchứagiátrị củabộ mã ASCII (Amercican Standard Code for Information Interchange). Kích thướclà1byte. ‰ Kích thướccủakiểu int là 16 bits (2 bytes) trên môi trường 16-bit như DOS và 32 bits (4 btbytes ) têtrênmôi trường 32-bit như Windows 95 ‰ Kiểuvoid dùng để khai báo hàm không trả về giá trị hoặctạonêncáccontrỏ tổng quát (generic pointers).
  5. 2. Ki ểudu dữ liệu(Data type)
  6. 3. Định danh (Identifier Name) ‰ Trong C/C++, tên biến, hằng, hàm, được gọi là định danh ‰ Những định danh này có thể là 1 hoặc nhiều ký tự.Kýtự đầutiênphảilàmộtchữ cái hoặcdấu _ (underscore), những ký tự theo sau phải là chữ cái,chữ số, hoặc dấu_ ‰ C/C++ phân biệtkýtự HOA và thường. ‰ Định danh không đượctrùngvớitừ khóa (keywords).
  7. 4. T ừ khóa (keywords) ‰ Là những từ được dành riêng bởi ngôn ngữ lập trình cho những mục đích riêng của nó ‰ Tất cả các từ khóa trong C/C++ đều là chữ thường (lowercase). ‰ Danh sách các từ khóa trong C/C++
  8. 5. Bi ến (variables) ‰ Biếnlàđịnh danh củamột vùng trong bộ nhớ dùng để giiữ một giáiá trị mà có thể bị thay đổibởichương trình. ‰ Tất cả biến phải được khai báo trước khi sử dụng. ‰ Cách khai báo: type variableNames; − type: là một trong các kiểu dữ liệu hợp lệ. − variableNames:têncủamột hay nhiều biến phân cách nhau bởi dấu phẩy.
  9. 5. Bi ến (variables) ‰ Ngoài ra, ta có thể vừa khai báo vừa khởi tạo giá trị ban đầu cho biến: type varName1=value, ,varName_n=value; ‰ Ví dụ: float mark1, mark2, mark3, average = 0;
  10. 6. Ph ạmvicm vi củabia biến ‰ Biếncụcbộ (local variables) − Những biến được khai báo bên trong một hàm gọilàbiếncụcbộ. − Các biếncụcbộ chỉđược tham chiếu đến bởinhững lệnh trong khối (block) có khai báo biến. − Mộtkhối được đặttrongcặpdấu{}. − Biếncụcbộ chỉ tồntạitrongkhikhốichứa nó đang thựcthivàbị hủykhikhốichứanó thựcthixong.
  11. 6. Ph ạmvicm vi củabia biến Ví dụ: void func1(void) { int x; x = 10; } void func2(void) { int x; x = -199; }
  12. 6. Ph ạmvicm vi củabia biến ‰ Tham số hình thức(formal parameters) − Nếumộthàmcónhậncácđốisố truyền vàohàmthìnóphảikhaibáocácbiến để nhận giá trị củacácđốisố khi hàm đượcgọi. − Những biếnnàygọi là các tham số hình thức. Những biếnnàyđượcsử dụng giiống như các biếncục bộ.
  13. 6. Ph ạmvicm vi củabia biến Ví dụ: int sum(int from, int to) { int total=0; for((;;)int i=from ; i<=to ; i++) total +=i; return total; }
  14. 6. Ph ạmvicm vi củabia biến ‰ Biếntoàncục (global variables) − Biếntoàncụccóphạmvilàtoànbộ chương trình. − Tấtcả các lệnh có trong chương trình đềucóthể tham chiếu đếnbiếntoàn cục. − Biếntoàncục được khai báo bên ngoài tất cả hàm.
  15. 6. Ph ạmvicm vi củabia biến #include int gVar = 100; void increase() { gVVar = gVVar + 11};} void decrease() { gVar = gVar -1;} void main() { cout << “Value of gVar= “ << gVar; increase(); cout << “After increased, gVar= “ << gVar; decrease(); cout << “After decreased, gVar= “ << gVar; }
  16. 7. T ừ khóa const ‰ Giá trị củabiếnthayđổi trong suốtquá trình thựcthichương trình. ‰ Để giá trị củabiếnkhôngbị thay đổi, ta đặt trước khai báo biếntừ khóa const. ‰ Thông thường ta dùng chữ HOA để đặttên cho những biếnnày. Ví dụ: const int MAX = 200;
  17. 8. H ằng (constants) ‰ Hằng là những giá trị cốđịnh (fixed values) mà chương trình không thể thay đổi. Mỗikiểudữ liệu đềucóhằng tương ứng. Hằng còn được gọi là literals. ‰ Hằng ký tựđược đặttrongcặp nháy đơn. Ví dụ: '’'a’ ‰ Hằng nguyên là những số mà không có phần thập phân. Ví dụ 100 , -100
  18. 8. H ằng (constants) y Hằng số thựcyêucầumộtdấuchấm phân cách phầnnguyên và phầnthập phân. Ví dụ: 123.45 y Cách viết một số loại hằng số
  19. 8. H ằng chuỗikýti ký tự (string constants) ‰ Hằng chuỗi ký tự là một tập các ký tự đặt trong cặp nháy kép “”. Ví dụ: • "This is a string" //là một chuỗi. • ‘a’ //là m ộtth hằng ký t ự. • “a” //là một hằng chuỗi.
  20. 9. Hằng ký tự đặc biệt(escape sequences)
  21. 9. Hằng ký tự đặc biệt(escape sequences) #include void main(void) { cout <<"Items:\n"; cout <<”\tItem1\n”; cout <<”\tItem2\n”; cout <<”\tItem3\n”; }
  22. 10. Toán t ử (operators) ‰ Toán tử gán (assignment operator) Cú pháp tổng quát variableName = expression; − variableName: Tên biến − expression: Biểu thức Lưuý:phíabêntráidấu=phảilàmột biến hay con trỏ và không thể là hàm hay hằng. Ví dụ: total = a + b + c + d;
  23. 11. Chuyển đổi kiểu trong câu lệnh gán y Đốivớicâulệnh gán, giá trị củabiểuthức bên phảidấu=đượctự động chuyển thành kiểudữ liệucủabiếnbêntráidấu= Ví dụ: int i=100; double d = 123.456; y Nếuthựcthilệnh i = d;thìi = 123 (chuyển đổi kiểumất mát thông tin) . y Nếuthựcthilệnh d = i;thìd =100.0 (chuyển đổi kiểu không mất mát thông tin).
  24. 11. Chuyển đổi kiểu trong câu lệnh gán y Khi chuyển đổitừ kiểudữ liệucómiềngiá trị nhỏ sang kiểudữ liệucómiền giá trị lớn hơn:charÆintÆlongÆfloatÆdouble, thì việc chuyển đổi kiểu này là không mất mát thông tin y Khi chuyển đổi từ kiểu dữ liệucó miền giáiá trị lớnsangkiểudữ liệucómiềngiátrị nhỏ hơn:doubleÆfloatÆlongÆintÆchar, thì việc chuyển đổikiểunàylàmấtmátthông tin
  25. 12. Toán tử số học (arithmetic operators) Toántn tử Tên Ví dụ + Cộng 12 + 4.9 // kết quả 16.9 - Trừ 3.98 - 4 // kết quả - 0020.02 *Nhân 2 * 3.4 // kết quả 6.8 /Chia 9 / 2.0 // kết quả 4.5 % Lấy phần dư 13 % 3//k3 // kết quả 1
  26. 12. Toán tử số học (arithmetic operators) y Khi tử số và mẫusố củaphépchialàsố nguyên thì đólàphépchianguyên nên phầndư củaphépchianguyênbị cắtbỏ. Ví dụ:5/2chokếtquả là 2. y Toán tử lấy phầndư % (modulus opp)erator) chỉ áp dụng vớisố nguyên.
  27. 13. Toán t ử gán phứcch hợp Toán Tử Ví dụ Tương đương với += n += 25 n = n + 25 -= n -= 25 n = n – 25 *=n *= 25 n = n * 25 /=n //5= 25 n = n //5 25 %= n %= 25 n = n % 25
  28. 13. Toán t ử gán phứcch hợp #include int main () { int a, b=3; a = b; a+=2; // tương đương với a=a+2 cout << a; return 0; }
  29. 14. Toán tử ++ và (increment and ddtecrement operatt)ors) y Toán tử tăng (++) và toán tử giảm ( ) có tác dụng làm tăng hoặc giảm 1 giá trị lưu trong biến. y Ví dụ: a++;//tương đương với a+=1; và a=a+1 a ;//tương đương với a-=1; và a=a-1
  30. 14. Toán tử ++ và (increment and ddtecrement operatt)ors) Toán tử tăng/giảm có 2 dạng: y Tiềntố (prefix):Toántử ++/ đặttrước toán hạng, hành động tăng/giảmtrêntoán hạng đượcthực hiệntrước, sau đó giá trị mớicủatoánhạng sẽ tham gia định trị của biểu thức. y Ví dụ: B3;B=3; A=++B; Kếtqut quả: AchA chứaagiátr giá trị 4, B chứaagiátr giá trị 4
  31. 14. Toán tử ++ và (increment and ddtecrement operatt)ors) y Hậu tố (postfix): Toán tử ++/ đặt sau toán hạng, giá trị trong toán hạng được tăng/giảm sau khi đã tính toán. y Vídí dụ: B=3; ABA=B++; Kết quả: A chứa giá trị 3, B chứa giá trị 4
  32. 14. Toán tử ++ và (increment and ddtecrement operatt)ors) Ví dụ: int x = 100; int n,m; n = ++x + 1; // n sẽ có giá trị là 102 (1) n = x++ + 1; // n sẽ có giá trị là 101 ()(2) y Sau lệnh (1), (2) thì x có giá trị là 101 m = x + 1;;// // m sẽ có giá trị là 100 ()(3) m = x + 1; // m sẽ có giá trị 101 (4) y Sau lệnh (3), ( 4) thì x có g iá trị làà99 99
  33. 14. Toán tử ++ và (increment and ddtecrement operatt)ors) y Khi các toán tử số học xuất hiện trong một biểu thức, thì độ ưu tiên thực hiện như sau: Toán tử Độ ưu tiên ++ – – 1 – (dấu âm) 2 * / % 3 + – 4
  34. 15. Toán tử quan hệ & luận lý (ltil&lil(relational & logical operat ors) y Toán tử quan hệ được định trị là true hoặc false. Toán tử Tên Ví dụ == So sánh bằng 5 == 5 // kết quả 1 != So sánh không bằng 5 != 5 // kết quả 0 So sánh lớn hơn5 > 5.5 // kết quả 0 >= So sánh lớn hơn hoặc bằng 636.3 >= 5 //kết quả1
  35. 15. Toán tử quan hệ & luận lý (ltil&lil(relational & logical operat ors) y Toán tử luận lý: Operator Action Ví dụ !Not !(5 == 5) // kết quả là 0 && and 5 < 6 && 6 < 6// kết quả là 0 || or 5 < 6 || 6 < 5 // kết quả là 1 y Bảng chân trị: P Q P&&Q P||Q !P 00 0 0 1 01 0 1 1 1 0 0 1 0 11 1 1 0
  36. 15. Toán tử quan hệ & luận lý (ltil&lil(relational & logical operat ors) y Độ ưu tiên của toán tử quan hệ và luận lý: Toán tửĐộ ưutiên ! 1 > >= < <= 2 == != 3 && 4 || 5
  37. 15. Toán tử quan hệ & luận lý (ltil&lil(relational & logical operat ors) Ví dụ biểu thức: (10>9 && 8!=7) || (6 4) Được định trị như sau:
  38. 16. Toán t ử ? (? operator) y Toán tử ? là mộttoántử ba ngôi do đóphải có ba toán hạng. y Dạng tổng quát củatoántử ?là: Exp1 ? Exp2 : Exp3; y Exp1, Exp2, và Exp3 là các biểuthức. y Ýnghĩa: −NếuExp1đúng thì Exp2 được định trị và nó trở thành giá trị củabiểuthức. −Ngượclại, nếu Exp1 sai, Exp3 được định trị và trở thành giá trị của biểuthức.
  39. 16. Toán t ử ? (? operator) Ví dụ: X = 10 Y = X > 9 ? 100*X : 200*X Vì X>9 là true nên giá trị của biểu thức sẽ là 1000. Vậy y sẽ có giá trị là 1000. Ví dụ: int m = 1, n = 2, p =3; int min =(m < n ? (m < p ? m : p) : (n < p ? n : p));
  40. 17. Toán t ử sizeof y sizeof là toán tử mộtngôimàtrả về số byte củakiểudữ liệuchiếmtrong bộ nhớ. Tùy môi trường (hệđiềuhành,loại CPU, ) mà mỗi kiểu dữ liệu có số byte khác nhau. y Cú pháp: sif(d)izeof(operand) y operand:cóthể là tên kiểudữ liệu, biến, biểu thức.
  41. 18. Toán tử dấu phẩy (comma operator) y Toán tử comma buộccácbiểuthức cùng với nhau. y Biểuthứcbêntráicủatoántử comma luôn luôn được định trị như void, biểuthứcbên phải được định trị và trở thành giá trị của biểu thức. y Dạng tổng quát của toán tử comma: (exp_1, exp_2, , exp_n)
  42. 18. Toán tử dấu phẩy (comma operator) y Các biểuthức được định trị từ trái sang phải, biểuthứccuốicùng (exp_n) được định trị và trở thành giá trị củatoànbộ biểu thức. y Ví dụ: x = (3(y=3, y+1) ; Y được gán giá trị 3, sau đó x được gán giá trị y+1 là 4 .
  43. 19. Độ ưutiêncu tiên của các toán t ử
  44. 20. Bi ểuuth thức (expressions) y MộtbiểuthứctrongC/C++làsự kếthợp củacácthànhphần: toán tử,hằng,biến, và hàm có trả về giá trị. y Thhứ tự định trị của biểuthứctùythuộcvào độ ưutiêncủa các toán tử. y Để biểu thứcrõ ràng và thực hiệnviệc định trịđúng, nên dùng cặpdấungoặctròn() bao quanh các biểu thức con của biểu thức.
  45. 20. Bi ểuuth thức (expressions) y Ví dụ: định trị biểu thức sau: result = x * y - z % 10 + w/2; c ứ u th ể bi ị nh tr ị đđ ự t ứ Th
  46. 21. Chuyểnnki kiểuutrongbi trong biểuthu thức y Khi các hằng và biếncủanhững kiểukhác nhau tồntạitrong mộtbiểuthức, giá trị củachúngphải đượcchuyển thành cùng kiểu trước khi các phép toán giửa chúng đượcthựchiện. y Trình biên dịch sẽ thực hiện việc chuyển kiểu(convert)tựđộng đếnkiểucủatoán hạng có kiểu lớn nhất. Việc chuyển kiểu này gọilàthăng cấpkiểu (type promotion).
  47. 21. Chuyểnnki kiểuutrongbi trong biểuthu thức y Ví dụ: char ch; int i; float f; double d;
  48. 22. Ép ki ểu (casting) y Casting dùng để ép kiểucủamộtbiểuthức thành mộtkiểutheoýmuốncủalậptrình viên. y Dạng tổng quát của casting là (type)expression Hoặc t(type(expressi i)on) type: là tên một kiểu dữ liệu hợp lệ.
  49. 22. Ép ki ểu (casting) Ví dụ: float result; result = 7/2; y Do 7/2 là phép chia nguyên nên kếtquả không có phần thập phân. y Sau lệnh trên result có giá trị là 3. Để phép chia trên là phép chia số thực ta thực hiệnépkiểutử số hoặcmẫusố hoặccả hai.
  50. 22. Ép ki ểu (casting) y Ví dụ: Các cách viết sau đây cho cùng kết quả: result = (float)7/2; result = 7/(float)2; result = (float)7/(float)2; result = float(7)/float(2);