Bài giảng Ngôn ngữ lập trình C/C++ - Đại học Quốc gia Hà Nội

pdf 230 trang phuongnguyen 5081
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình C/C++ - Đại học Quốc gia Hà Nội", để 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_ngon_ngu_lap_trinh_cc_dai_hoc_quoc_gia_ha_noi.pdf

Nội dung text: Bài giảng Ngôn ngữ lập trình C/C++ - Đại học Quốc gia Hà Nội

  1. Bài giảng NGÔN NGỮ LẬP TRÌNH C/C++
  2. ĐẠỌỐỘ I H C QU C GIA HÀ N I TRƯỜ NG Đ Ạ I H Ọ C CÔNG NGH Ệ Khoa Công nghệ Thông tin PHẠỒ M H NG THÁI Bài giả ng NGÔN NGỮẬ L P TRÌNH C/C++ Hà Nộ i – 2003 LỜẦ I NÓI Đ U Ngôn ngữ l ậ p trình (NNLT) C/C++ là m ộ t trong nh ữ ng ngôn ng ữ l ậ p trình hướ ng đ ố i t ượ ng m ạ nh và ph ổ bi ế n hi ệ n nay do tính m ề m d ẻ o và đa năng c ủ a nó. Không chỉ các ứ ng d ụ ng đ ượ c vi ế t trên C/C++ mà c ả nh ữ ng ch ươ ng trình h ệ th ố ng lớ n đ ề u đ ượ c vi ế t h ầ u h ế t trên C/C++. C++ là ngôn ng ữ l ậ p trình h ướ ng đ ố i t ượ ng đượ c phát tri ể n trên n ề n t ả ng c ủ a C, không nh ữ ng kh ắ c ph ụ c m ộ t s ố nh ượ c đi ể m củ a ngôn ng ữ C mà quan tr ọ ng h ơ n, C++ cung c ấ p cho ng ườ i s ử d ụ ng (NSD) m ộ t phươ ng ti ệ n l ậ p trình theo k ỹ thu ậ t m ớ i: l ậ p trình h ướ ng đ ố i t ượ ng. Đây là k ỹ thu ậ t lậ p trình đ ượ c s ử d ụ ng h ầ u h ế t trong các ngôn ng ữ m ạ nh hi ệ n nay, đ ặ c bi ệ t là các ngôn ngữ ho ạ t đ ộ ng trong môi tru ờ ng Windows nh ư Microsoft Access, Visual Basic, Visual Foxpro Hiệ n nay NNLT C/C++ đã đ ượ c đ ư a vào gi ả ng d ạ y trong h ầ u h ế t các tr ườ ng Đạ i h ọ c, Cao đ ẳ ng đ ể thay th ế m ộ t s ố NNLT đã cũ nh ư FORTRAN, Pascal T ậ p bài giả ng này đ ượ c vi ế t ra v ớ i m ụ c đích đó, trang b ị ki ế n th ứ c và k ỹ năng th ự c hành cho sinh viên bắ t đ ầ u h ọ c vào NNLT C/C++ t ạ i Khoa Công ngh ệ , Đ ạ i h ọ c Qu ố c gia Hà Nộ i. Đ ể phù h ợ p v ớ i ch ươ ng trình, t ậ p bài gi ả ng này ch ỉ đ ề c ậ p m ộ t ph ầ n nh ỏ đế n k ỹ thu ậ t l ậ p trình h ướ ng đ ố i t ượ ng trong C++, đó là các k ỹ thu ậ t đóng gói d ữ liệ u, ph ươ ng th ứ c và đ ị nh nghĩa m ớ i các toán t ử . Tên g ọ i c ủ a t ậ p bài gi ả ng này nói
  3. lên điề u đó, có nghĩa n ộ i dung c ủ a bài gi ả ng th ự c ch ấ t là NNLT C đ ượ c m ở r ộ ng vớ i m ộ t s ố đ ặ c đi ể m m ớ i c ủ a C++. V ề k ỹ thu ậ t l ậ p trình h ướ ng đ ố i t ượ ng (trong C++) sẽ đ ượ c trang b ị b ở i m ộ t giáo trình khác. Tuy nhiên đ ể ng ắ n g ọ n, trong t ậ p bài giả ng này tên g ọ i C/C++ s ẽ đ ượ c chúng tôi thay b ằ ng C++. Nộ i dung t ậ p bài gi ả ng này g ồ m 8 ch ươ ng. Ph ầ n đ ầ u g ồ m các ch ươ ng t ừ 1 đ ế n 6 chủ y ế u trình bày v ề NNLT C++ trên n ề n t ả ng c ủ a k ỹ thu ậ t l ậ p trình c ấ u trúc. Các chươ ng còn l ạ i (ch ươ ng 7 và 8) s ẽ trình bày các c ấ u trúc c ơ b ả n trong C++ đó là k ỹ thuậ t đóng gói (l ớ p và đ ố i t ượ ng) và đ ị nh nghĩa phép toán m ớ i cho l ớ p. Tuy đã có nhiề u c ố g ắ ng nh ư ng do th ờ i gian và trình đ ộ ng ườ i vi ế t có h ạ n nên chắ c ch ắ n không tránh kh ỏ i sai sót, vì v ậ y r ấ t mong nh ậ n đ ượ c s ự góp ý c ủ a b ạ n đ ọ c để bài gi ả ng ngày càng m ộ t hoàn thi ệ n h ơ n. Tác giả . Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ CHƯƠ NG 1 CÁC KHÁI NIỆƠẢỦ M C B N C A C++ Các yế u t ố c ơ b ả n Môi trườ ng làm vi ệ c c ủ a C++ Các bướ c đ ể t ạ o và th ự c hi ệ n m ộ t ch ươ ng trình Vào/ra trong C++ I. CÁC YẾỐƠẢ U T C B N Mộ t ngôn ng ữ l ậ p trình (NNLT) b ậ c cao cho phép ng ườ i s ử d ụ ng (NSD) bi ể u hiệ n ý t ưở ng c ủ a mình đ ể gi ả i quy ế t m ộ t v ấ n đ ề , bài toán b ằ ng cách di ễ n đ ạ t g ầ n v ớ i ngôn ngữ thông th ườ ng thay vì ph ả i di ễ n đ ạ t theo ngôn ng ữ máy (dãy các kí hi ệ u 0,1). Hiể n nhiên, các ý t ưở ng NSD mu ố n trình bày ph ả i đ ượ c vi ế t theo m ộ t c ấ u trúc ch ặ t ch ẽ thườ ng đ ượ c g ọ i là thu ậ t toán ho ặ c gi ả i thu ậ t và theo đúng các qui t ắ c c ủ a ngôn ng ữ gọ i là cú pháp ho ặ c văn ph ạ m. Trong giáo trình này chúng ta bàn đ ế n m ộ t ngôn ng ữ lậ p trình nh ư v ậ y, đó là ngôn ng ữ l ậ p trình C++ và làm th ế nào đ ể th ể hi ệ n các ý t ưở ng giả i quy ế t v ấ n đ ề b ằ ng cách vi ế t thành ch ươ ng trình trong C++. Trướ c h ế t, trong m ụ c này chúng ta s ẽ trình bày v ề các qui đ ị nh b ắ t bu ộ c đ ơ n gi ả n và cơ b ả n nh ấ t. Thông th ườ ng các qui đ ị nh này s ẽ đ ượ c nh ớ d ầ n trong quá trình h ọ c ngôn ngữ , tuy nhiên đ ể có m ộ t vài khái ni ệ m t ươ ng đ ố i h ệ th ố ng v ề NNLT C++ chúng ta trình bày sơ l ượ c các khái ni ệ m c ơ b ả n đó. Ng ườ i đ ọ c đã t ừ ng làm quen v ớ i các NNLT khác có thể đ ọ c l ướ t qua ph ầ n này. 1. Bả ng ký t ự c ủ a C++ Hầ u h ế t các ngôn ng ữ l ậ p trình hi ệ n nay đ ề u s ử d ụ ng các kí t ự ti ế ng Anh, các kí hiệ u thông d ụ ng và các con s ố đ ể th ể hi ệ n ch ươ ng trình. Các kí t ự c ủ a nh ữ ng ngôn ng ữ khác không đượ c s ử d ụ ng (ví d ụ các ch ữ cái ti ế ng Vi ệ t). D ướ i đây là b ả ng kí t ự đ ượ c phép dùng để t ạ o nên nh ữ ng câu l ệ nh c ủ a ngôn ng ữ C++. − Các chữ cái la tinh (vi ế t th ườ ng và vi ế t hoa): a z và A Z. Cùng m ộ t ch ữ cái như ng vi ế t th ườ ng phân bi ệ t v ớ i vi ế t hoa. Ví d ụ ch ữ cái 'a' là khác v ớ i 'A'. − Dấ u g ạ ch d ướ i: _ − Các chữ s ố th ậ p phân: 0, 1, . ., 9. 1Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++
  4. − Các ký hiệ u toán h ọ c: +, -, *, /, % , &, ||, !, >, <, = − Các ký hiệ u đ ặ c bi ệ t khác: , ;: [ ], {}, #, d ấ u cách, 2. Từ khoá Mộ t t ừ khoá là m ộ t t ừ đ ượ c qui đ ị nh tr ướ c trong NNLT v ớ i m ộ t ý nghĩa c ố đ ị nh, thườ ng dùng đ ể ch ỉ các lo ạ i d ữ li ệ u ho ặ c k ế t h ợ p thành câu l ệ nh. NSD có th ể t ạ o ra nhữ ng t ừ m ớ i đ ể ch ỉ các đ ố i t ượ ng c ủ a mình nh ư ng không đ ượ c phép trùng v ớ i t ừ khoá. Dướ i đây chúng tôi li ệ t kê m ộ t vài t ừ khoá th ườ ng g ặ p, ý nghĩa c ủ a các t ừ này, s ẽ đượ c trình bày d ầ n trong các đ ề m ụ c liên quan. auto, break, case, char, continue, default, do, double, else, externe, float, for, goto, if, int, long, register, return, short, sizeof, static, struct, switch, typedef, union, unsigned, while Mộ t đ ặ c tr ư ng c ủ a C++ là các t ừ khoá luôn luôn đ ượ c vi ế t b ằ ng ch ữ th ườ ng. 3. Tên gọ i Để phân bi ệ t các đ ố i t ượ ng v ớ i nhau chúng c ầ n có m ộ t tên g ọ i. H ầ u h ế t m ộ t đ ố i tượ ng đ ượ c vi ế t ra trong ch ươ ng trình thu ộ c 2 d ạ ng, m ộ t d ạ ng đã có s ẵ n trong ngôn ngữ (ví d ụ các t ừ khoá, tên các hàm chu ẩ n ), m ộ t s ố do NSD t ạ o ra dùng đ ể đ ặ t tên cho hằ ng, bi ế n, ki ể u, hàm các tên g ọ i do NSD t ự đ ặ t ph ả i tuân theo m ộ t s ố qui t ắ c sau: − Là dãy ký tự liên ti ế p (không ch ứ a d ấ u cách) và ph ả i b ắ t đ ầ u b ằ ng ch ữ cái hoặ c g ạ ch d ướ i. − Phân biệ t kí t ự in hoa và th ườ ng. − Không đượ c trùng v ớ i t ừ khóa. − Số l ượ ng ch ữ cái dùng đ ể phân bi ệ t tên g ọ i có th ể đ ượ c đ ặ t tuỳ ý. − Chú ý các tên gọ i có s ẵ n c ủ a C++ cũng tuân th ủ theo đúng qui t ắ c trên. Trong mộ t ch ươ ng trình n ế u NSD đ ặ t tên sai thì trong quá trình x ử lý s ơ b ộ (tr ướ c khi chạ y ch ươ ng trình) máy s ẽ báo l ỗ i (g ọ i là l ỗ i văn ph ạ m). Ví dụ 1 : • Các tên gọ i sau đây là đúng (đ ượ c phép): i, i1, j, tinhoc, tin_hoc, luu_luong • Các tên gọ i sau đây là sai (không đ ượ c phép): 1i, tin hoc, luu-luong-nuoc • Các tên gọ i sau đây là khác nhau: ha_noi, Ha_noi, HA_Noi, HA_NOI, 2 Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ 4. Chú thích trong chươ ng trình Mộ t ch ươ ng trình th ườ ng đ ượ c vi ế t m ộ t cách ng ắ n g ọ n, do v ậ y thông th ườ ng bên cạ nh các câu l ệ nh chính th ứ c c ủ a ch ươ ng trình, NSD còn đ ượ c phép vi ế t vào ch ươ ng trình các câu ghi chú, giả i thích đ ể làm rõ nghĩa h ơ n ch ươ ng trình. M ộ t chú thích có th ể ghi chú về nhi ệ m v ụ , m ụ c đích, cách th ứ c c ủ a thành ph ầ n đang đ ượ c chú thích nh ư biế n, h ằ ng, hàm ho ặ c công d ụ ng c ủ a m ộ t đo ạ n l ệ nh Các chú thích s ẽ làm cho chươ ng trình sáng s ủ a, d ễ đ ọ c, d ễ hi ể u và vì v ậ y d ễ b ả o trì, s ử a ch ữ a v ề sau. Có 2 cách báo cho chươ ng trình bi ế t m ộ t đo ạ n chú thích: − Nế u chú thích là m ộ t đo ạ n kí t ự b ấ t kỳ liên ti ế p nhau (trong 1 dòng ho ặ c trên nhiề u dòng) ta đ ặ t đo ạ n chú thích đó gi ữ a c ặ p d ấ u đóng m ở chú thích /* (m ở ) và */ (đóng). − Nế u chú thích b ắầừộị t đ u t m t v trí nào đó cho đ ếế n h t dòng, thì ta đ ặấở t d u // vị trí đó. Nh ư v ậ y // s ử d ụ ng cho các chú thích ch ỉ trên 1 dòng. Như đã nh ắ c ở trên, vai trò c ủ a đo ạ n chú thích là làm cho ch ươ ng trình d ễ hi ể u đố i v ớ i ng ườ i đ ọ c, vì v ậ y đ ố i v ớ i máy các đo ạ n chú thích s ẽ đ ượ c b ỏ qua. L ợ i d ụ ng đ ặ c
  5. điể m này c ủ a chú thích đôi khi đ ể t ạ m th ờ i b ỏ qua m ộ t đo ạ n l ệ nh nào đó trong ch ươ ng trình (như ng không xoá h ẳểỏảạầ n đ kh i ph i gõ l i khi c n dùng đ ế n) ta có th ểặấ đ t các d u chú thích bao quanh đoạ n l ệ nh này (ví d ụ khi ch ạ y th ử ch ươ ng trình, g ỡ l ỗ i ), khi c ầ n sử d ụ ng l ạ i ta có th ể b ỏ các d ấ u chú thích. Chú ý: Cặ p d ấ u chú thích /* */ không đ ượ c phép vi ế t l ồ ng nhau, ví d ụ dòng chú thích sau là không đượ c phép /* Đây là đoạ n chú thích /* ch ứ a đo ạ n chú thích này */ nh ư đo ạ n chú thích con */ cầ n ph ả i s ử a l ạ i nh ư sau: • hoặ c ch ỉ gi ữ l ạ i c ặ p d ấ u chú thích ngoài cùng /* Đây là đoạ n chú thích ch ứ a đo ạ n chú thích này nh ư đo ạ n chú thích con */ • hoặ c chia thành các đo ạ n chú thích liên ti ế p nhau /* Đây là đoạ n chú thích */ /*ch ứ a đo ạ n chú thích này*/ /*nh ư đo ạ n chú thích con */ II. MÔI TRƯỜ NG LÀM VI Ệ C C Ủ A C++ 1. Khở i đ ộ ng - Thoát kh ỏ i C++ Khở i đ ộ ng C++ cũng nh ư m ọ i ch ươ ng trình khác b ằ ng cách nh ấ p đúp chu ộ t lên biể u t ượ ng c ủ a ch ươ ng trình. Khi ch ươ ng trình đ ượ c kh ở i đ ộ ng s ẽ hi ệ n ra giao di ệ n gồ m có menu công vi ệ c và m ộ t khung c ử a s ổ bên d ướ i ph ụ c v ụ cho so ạ n th ả o. M ộ t con 3Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ trỏ nh ấ p nháy trong khung c ử a s ổ và chúng ta b ắ t đ ầ u nh ậ p n ộ i dung (văn b ả n) ch ươ ng trình vào trong khung cử a s ổ so ạ n th ả o này. M ụ c đích c ủ a giáo trình này là trang b ị nhữ ng ki ế n th ứ c c ơ b ả n c ủ a l ậ p trình thông qua NNLT C++ cho các sinh viên m ớ i b ắ t đầ u nên chúng tôi v ẫ n ch ọ n trình bày giao di ệ n c ủ a các trình biên d ị ch quen thu ộ c là Turbo C hoặ c Borland C. V ề các trình biên d ị ch khác đ ộ c gi ả có th ể t ự tham kh ả o trong các tài liệ u liên quan. Để k ế t thúc làm vi ệ c v ớ i C++ (so ạ n th ả o, ch ạ y ch ươ ng trình ) và quay v ề môi trườ ng Windows chúng ta ấ n Alt-X. 2. Giao diệ n và c ử a s ổ so ạ n th ả o a. Mô tả chung Khi gọạ i ch y C++ trên màn hình s ẽấệộ xu t hi n m t menu x ổố xu ng và m ộửổ t c a s soạ n th ả o. Trên menu g ồ m có các nhóm ch ứ c năng: File, Edit, Search, Run, Compile, Debug, Project, Options, Window, Help. Để kích ho ạ t các nhóm ch ứ c năng, có th ể ấn Alt+ch ữ cái bi ể u th ị cho menu c ủ a ch ứ c năng đó (là ch ữ cái có g ạ ch d ướ i). Ví d ụ đ ể mở nhóm ch ứ c năng File ấ n Alt+F, sau đó d ịểộếụầọồ ch chuy n h p sáng đ n m c c n ch n r i ấn Enter. Đ ể thu ậ n ti ệ n cho NSD, m ộ t s ố các ch ứ c năng hay dùng còn đ ượ c g ắ n v ớ i mộ t t ổ h ợ p các phím cho phép ng ườ i dùng có th ể ch ọ n nhanh ch ứ c năng này mà không cầ n thông qua vi ệở c m menu nh ư đã mô t ảở trên. M ộốổợ t s t h p phím c ụểẽ th đó s đượ c trình bày vào cu ố i ph ầ n này. Các b ộ ch ươ ng trình d ị ch h ỗ tr ợ ng ườ i l ậ p trình m ộ t môi trườ ng tích h ợ p t ứ c ngoài ch ứ c năng so ạ n th ả o, nó còn cung c ấ p nhi ề u ch ứ c năng, tiệ n ích khác giúp ng ườ i l ậ p trình v ừ a có th ể so ạ n th ả o văn b ả n ch ươ ng trình v ừ a g ọ i chạ y ch ươ ng trình v ừ a g ỡ l ỗ i Các chứ c năng liên quan đ ếạảầớốớộạả n so n th o ph n l n gi ng v i các b so n th o khác (như WinWord) do v ậ y chúng tôi ch ỉ trình bày tóm t ắ t mà không trình bày chi ti ế t ở đây. b. Các chứ c năng so ạ n th ả o Giốầế ng h u h t các b ộạả so n th o văn b ảộạảủ n, b so n th o c a Turbo C ho ặ c Borland C cũng sử d ụ ng các phím sau cho quá trình so ạ n th ả o:
  6. − Dị ch chuy ể n con tr ỏ : các phím mũi tên cho phép d ị ch chuy ể n con tr ỏ sang trái, phả i m ộ t kí t ự ho ặ c lên trên, xu ố ng d ướ i 1 dòng. Đ ể d ị ch chuy ể n nhanh có các phím như Home (v ề đ ầ u dòng), End (v ề cu ố i dòng), PgUp, PgDn (lên, xuố ng m ộ t trang màn hình). Đ ể d ị ch chuy ể n xa h ơ n có th ể k ế t h ợ p các phím này cùng phím Control (Ctrl, ^) như ^PgUp: v ề đ ầ u t ệ p, ^PgDn: v ề cu ố i t ệ p. − Chèn, xoá, sử a: Phím Insert cho phép chuy ể n ch ế đ ộ so ạ n th ả o gi ữ a chèn và đè. Các phím Delete, Backspace cho phép xoá mộ t kí t ự t ạ i v ị trí con tr ỏ và 4 Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ trướ c v ị trí con tr ỏ (xoá lùi). − Các thao tác vớ i kh ố i dòng: Đ ể đánh d ấ u kh ố i dòng (th ự c ch ấ t là kh ố i kí t ự liề n nhau b ấ t kỳ) ta đ ư a con tr ỏ đ ế n v ị trí đ ầ u ấ n Ctrl-KB và Ctrl-KK t ạ i v ị trí cuố i. Cũng có th ể thao tác nhanh h ơ n b ằ ng cách gi ữ phím Shift và dùng các phím dị ch chuy ể n con tr ỏừịầếịố quét t v trí đ u đ n v trí cu i, khi đó kh ốự i kí t đuợ c đánh d ấ u s ẽ chuy ể n m ầ u n ề n. M ộ t kh ố i đ ượ c đánh d ấ u có th ể dùng đ ể cắ t, dán vào m ộ t n ơ i khác trong văn b ả n ho ặ c xoá kh ỏ i văn b ả n. Đ ể th ự c hi ệ n thao tác cắ t dán, đ ầ u tiên ph ả i đ ư a kh ố i đã đánh d ấ u vào b ộ nh ớ đ ệ m b ằ ng nhóm phím Shift-Delete (cắ t), sau đó d ị ch chuy ể n con tr ỏ đ ế n v ị trí m ớ i c ầ n hiệ n n ộ i dung v ừ a c ắ t và ấ n t ổ h ợ p phím Shift-Insert. M ộ t đo ạ n văn b ả n đ ượ c ghi vào bộ nh ớ đ ệ m có th ể đ ượ c dán nhi ề u l ầ n vào nhi ề u v ị trí khác nhau b ằ ng cách lặ p l ạ i t ổ h ợ p phím Shift-Insert t ạ i các v ị trí khác nhau trong văn b ả n. Đ ể xoá mộ t kh ố i dòng đã đánh d ấ u mà không ghi vào b ộ nh ớ đ ệ m, dùng t ổ h ợ p phím Ctrl-Delete. Khi mộ t n ộ i dung m ớ i ghi vào b ộ nh ớ đ ệ m thì nó s ẽ xoá (ghi đè) nộ i dung cũ đã có, do v ậ y c ầ n cân nh ắ c đ ể s ử d ụ ng phím Ctrl-Delete (xoá và không lư u l ạ i n ộ i dung v ừ a xoá vào b ộ đ ệ m) và Shift-Delete (xoá và lư u l ạ i n ộ i dung v ừ a xoá) m ộ t cách phù h ợ p. − Tổ h ợ p phím Ctrl-A r ấ t thu ậ n l ợ i khi c ầ n đánh d ấ u nhanh toàn b ộ văn b ả n. c. Chứ c năng tìm ki ế m và thay th ế Chứ c năng này dùng đ ể d ị ch chuy ể n nhanh con tr ỏ văn b ả n đ ế n t ừ c ầ n tìm. Đ ể thự c hi ệ n tìm ki ế m b ấ m Ctrl-QF, tìm ki ế m và thay th ế b ấ m Ctrl-QA. Vào t ừ ho ặ c nhóm từ c ầ n tìm vào c ử a s ổ Find, nhóm thay th ế (n ế u dùng Ctrl-QA) vào c ử a s ổ Replace và đánh dấ u vào các tuỳ ch ọ n trong c ử a s ổ bên d ướ i sau đó ấ n Enter. Các tuỳ chọ n g ồ m: không phân bi ệ t ch ữ hoa/th ườ ng, tìm t ừ đ ộ c l ậ p hay đ ứ ng trong t ừ khác, tìm trong toàn văn bả n hay ch ỉ trong ph ầ n đ ượ c đánh d ấ u, chi ề u tìm đi đ ế n cu ố i hay ng ượ c vềầ đ u văn b ả n, thay th ếỏạ có h i l i hay không h ỏạểị i l i Đ d ch chuy ể n con tr ỏế đ n các vùng khác nhau trong mộ t menu hay c ử a s ổ ch ứ a các tuỳ ch ọ n ta s ử d ụ ng phím Tab. d. Các chứ c năng liên quan đ ế n t ệ p − Ghi tệ p lên đĩa: Ch ọ n menu File\Save ho ặ c phím F2. N ế u tên t ệ p ch ư a có (còn mang tên Noname.cpp) máy sẽ yêu c ầ u cho tên t ệ p. Ph ầ n m ở r ộ ng c ủ a tên t ệ p đượ c m ặ c đ ị nh là CPP. − Soạảệớọ n th o t p m i: Ch n menu File\New. Hi ệửổạảắ n ra c a s so n th o tr ng và tên file tạ m th ờ i l ấ y là Noname.cpp. − Soạ n th ả o t ệ p cũ: Ch ọ n menu File\Open ho ặ c ấ n phím F3, nh ậ p tên t ệ p ho ặ c dị ch chuy ể n con tr ỏ trong vùng danh sách t ệ p bên d ướ i đ ế n tên t ệ p c ầ n so ạ n rồ i ấ n Enter. Cũng có th ể áp d ụ ng cách này đ ể so ạ n t ệ p m ớ i khi không nh ậ p 5Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ vào tên tệ p c ụ th ể .
  7. − Ghi tệ p đang so ạ n th ả o lên đĩa v ớ i tên m ớ i: Ch ọ n menu File\Save As và nh ậ p tên tệ p m ớ i vào r ồ i ấ n Enter. e. Chứ c năng d ị ch và ch ạ y ch ươ ng trình − Ctrl-F9: Khở i đ ộ ng ch ứ c năng d ị ch và ch ạ y toàn b ộ ch ươ ng trình. − F4: Chạ y ch ươ ng trình t ừ đ ầ u đ ế n dòng l ệ nh hi ệ n t ạ i (đang ch ứ a con tr ỏ ) − F7: Chạ y t ừ ng l ệ nh m ộ t c ủ a hàm main(), k ể c ả các l ệ nh con trong hàm. − F8: Chạ y t ừ ng l ệ nh m ộ t c ủ a hàm main(). Khi đó m ỗ i l ờ i g ọ i hàm đ ượ c xem là mộ t l ệ nh (không ch ạ y t ừ ng l ệ nh trong các hàm đ ượ c g ọ i). Các chứ c năng liên quan đ ế n d ị ch ch ươ ng trình có th ể đ ượ c ch ọ n thông qua menu Compile (Alt-C). f. Tóm tắ t m ộ t s ố phím nóng hay dùng − Các phím kích hoạ t menu: Alt+ch ữ cái đ ạ i di ệ n cho nhóm menu đó. Ví d ụ Alt-F mở menu File đ ể ch ọ n các ch ứ c năng c ụ th ể trong nó nh ư Open (m ở file), Save (ghi file lên đĩa), Print (in nộ i dung văn b ả n ch ươ ng trình ra máy in), Alt-C mở menu Compile đ ể ch ọ n các ch ứ c năng d ị ch ch ươ ng trình. − Các phím dị ch chuy ể n con tr ỏ khi so ạ n th ả o. − F1: mở c ử a s ổ tr ợ giúp. Đây là ch ứ c năng quan tr ọ ng giúp ng ườ i l ậ p trình nh ớ tên lệ nh, cú pháp và cách s ử d ụ ng. − F2: ghi tệ p lên đĩa. − F3: mở t ệ p cũ ra s ử a ch ữ a ho ặ c so ạ n th ả o t ệ p m ớ i. − F4: chạ y ch ươ ng trình đ ế n v ị trí con tr ỏ . − F5: Thu hẹ p/m ở r ộ ng c ử a s ổ so ạ n th ả o. − F6: Chuyể n đ ổ i gi ữ a các c ử a s ổ so ạ n th ả o. − F7: Chạ y ch ươ ng trình theo t ừ ng l ệ nh, k ể c ả các l ệ nh trong hàm con. − F8: Chạ y ch ươ ng trình theo t ừ ng l ệ nh trong hàm chính. − F9: Dị ch và liên k ế t ch ươ ng trình. Th ườ ng dùng ch ứ c năng này đ ể tìm l ỗ i cú pháp củ a ch ươ ng trình ngu ồ n tr ướ c khi ch ạ y. − Alt-F7: Chuyể n con tr ỏ v ề n ơ i gây l ỗ i tr ướ c đó. − Alt-F8: Chuyể n con tr ỏ đ ế n l ỗ i ti ế p theo. 6 Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ − Ctrl-F9: Chạ y ch ươ ng trình. − Ctrl-Insert: Lư u kh ố i văn b ả n đ ượ c đánh d ấ u vào b ộ nh ớ đ ệ m. − Shift-Insert: Dán khố i văn b ả n trong b ộ nh ớ đ ệ m vào văn b ả n t ạ i v ị trí con tr ỏ . − Shift-Delete: Xoá khố i văn b ả n đ ượ c đánh d ấ u, l ư u nó vào b ộ nh ớ đ ệ m. − Ctrl-Delete: Xoá khố i văn b ả n đ ượ c đánh d ấ u (không l ư u vào b ộ nh ớ đ ệ m). − Alt-F5: Chuyể n sang c ử a s ổ xem k ế t qu ả c ủ a ch ươ ng trình v ừ a ch ạ y xong. − Alt-X: thoát C++ về l ạ i Windows. 3. Cấ u trúc m ộ t ch ươ ng trình trong C++ Mộ t ch ươ ng trình C++ có th ể đ ượ c đ ặ t trong m ộ t ho ặ c nhi ề u file văn b ả n khác nhau. Mỗ i file văn b ả n ch ứ a m ộ t s ố ph ầ n nào đó c ủ a ch ươ ng trình. V ớ i nh ữ ng ch ươ ng trình đơ n gi ả n và ng ắ n th ườ ng ch ỉ c ầ n đ ặ t chúng trên m ộ t file. Mộ t ch ươ ng trình g ồ m nhi ề u hàm, m ỗ i hàm ph ụ trách m ộ t công vi ệ c khác nhau củ a ch ươ ng trình. Đ ặ c bi ệ t trong các hàm này có m ộ t hàm duy nh ấ t có tên hàm là main(). Khi chạ y ch ươ ng trình, các câu l ệ nh trong hàm main() s ẽ đ ượ c th ự c hi ệ n đ ầ u tiên. Trong hàm main() có thể có các câu l ệ nh g ọ i đ ế n các hàm khác khi c ầ n thi ế t, và các hàm này khi chạ y l ạ i có th ể g ọ i đ ế n các hàm khác n ữ a đã đ ượ c vi ế t trong ch ươ ng
  8. trình (trừ vi ệ c g ọ i quay l ạ i hàm main()). Sau khi ch ạ y đ ế n l ệ nh cu ố i cùng c ủ a hàm main() chươ ng trình s ẽ k ế t thúc. Cụ th ể , thông th ườ ng m ộ t ch ươ ng trình g ồ m có các n ộ i dung sau: − Phầ n khai báo các t ệ p nguyên m ẫ u: khai báo tên các t ệ p ch ứ a nh ữ ng thành phầ n có s ẵ n (nh ư các h ằ ng chu ẩ n, ki ể u chu ẩ n và các hàm chu ẩ n) mà NSD s ẽ dùng trong chươ ng trình. − Phầ n khai báo các ki ể u d ữ li ệ u, các bi ế n, h ằ ng do NSD đ ị nh nghĩa và đ ượ c dùng chung trong toàn bộ ch ươ ng trình. − Danh sách các hàm củ a ch ươ ng trình (do NSD vi ế t, bao g ồ m c ả hàm main()). Cấ u trúc chi ti ế t c ủ a m ỗ i hàm s ẽ đ ượ c đ ề c ậ p đ ế n trong ch ươ ng 4. Dướ i đây là m ộ t đo ạ n ch ươ ng trình đ ơ n gi ả n ch ỉ g ồ m 1 hàm chính là hàm main(). Nộ i dung c ủ a ch ươ ng trình dùng in ra màn hình dòng ch ữ : Chào các b ạ n, bây gi ờ là 2 giờ . #include // khai báo tệ p nguyên m ẫ u đ ể void main() // đượ c s ử d ụ ng toán t ử in cout << { 7Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ int h = 2, // Khai báo và khở i t ạ o bi ế n h = 2 cout << “Chào các bạ n, bây gi ờ là ” << h << " gi ờ " ; // in ra màn hình } Dòng đầ u tiên c ủ a ch ươ ng trình là khai báo t ệ p nguyên m ẫ u iostream.h. Đây là khai báo bắ t bu ộ c vì trong ch ươ ng trình có s ử d ụ ng ph ươ ng th ứ c chu ẩ n “cout <<” (in ra màn hình), phươ ng th ứ c này đ ượ c khai báo và đ ị nh nghĩa s ẵ n trong iostream.h. Không riêng hàm main(), mọ i hàm khác đ ề u ph ả i b ắ t đ ầ u t ậ p h ợ p các câu l ệ nh củ a mình b ởấ i d u { và k ếởấậệấ t thúc b i d u }. T p các l nh b t kỳ bên trong c ặấ p d u này đượ c g ọ i là kh ố i l ệ nh. Kh ố i l ệ nh là m ộ t cú pháp c ầ n thi ế t trong các câu l ệ nh có c ấ u trúc như ta s ẽ th ấ y trong các ch ươ ng ti ế p theo. III. CÁC BƯỚ C Đ Ể T Ạ O VÀ TH Ự C HI Ệ N M Ộ T CH ƯƠ NG TRÌNH 1. Qui trình viế t và th ự c hi ệ n ch ươ ng trình Trướ c khi vi ế t và ch ạ y m ộ t ch ươ ng trình thông th ườ ng chúng ta c ầ n: 1. Xác đị nh yêu c ầ u c ủ a ch ươ ng trình. Nghĩa là xác đ ị nh d ữ li ệ u đ ầ u vào (input) cung cấ p cho ch ươ ng trình và t ậ p các d ữ li ệ u c ầ n đ ạ t đ ượ c t ứ c đ ầ u ra (output). Các tậ p h ợ p d ữ li ệ u này ngoài các tên g ọ i còn c ầ n xác đ ị nh ki ể u c ủ a nó.Ví d ụ để gi ả i m ộ t ph ươ ng trình b ậ c 2 d ạ ng: ax2 + bx + c = 0, cầ n báo cho ch ươ ng trình biế t d ữ li ệ u đ ầ u vào là a, b, c và đ ầ u ra là nghi ệ m x1 và x2 c ủ a ph ươ ng trình. Kiể u c ủ a a, b, c, x1, x2 là các s ố th ự c. 2. Xác đị nh thu ậ t toán gi ả i. 3. Cụ th ể hoá các khai báo ki ể u và thu ậ t toán thành dãy các l ệ nh, t ứ c vi ế t thành chươ ng trình thông th ườ ng là trên gi ấ y, sau đó b ắ t đ ầ u so ạ n th ả o vào trong máy. Quá trình này đượ c g ọ i là so ạ n th ả o ch ươ ng trình ngu ồ n. 4. Dị ch ch ươ ng trình ngu ồ n đ ể tìm và s ử a các l ỗ i g ọ i là l ỗ i cú pháp. 5. Chạ y ch ươ ng trình, ki ể m tra k ế t qu ả in ra trên màn hình. N ế u sai, s ử a l ạ i chươ ng trình, d ị ch và ch ạ y l ạ i đ ể ki ể m tra. Quá trình này đ ượ c th ự c hi ệ n l ặ p đi lặ p l ạ i cho đ ế n khi ch ươ ng trình ch ạ y t ố t theo yêu c ầ u đ ề ra c ủ a NSD. 2. Soạ n th ả o t ệ p ch ươ ng trình ngu ồ n
  9. Soạ n th ả o ch ươ ng trình ngu ồ n là m ộ t công vi ệ c đ ơ n gi ả n: gõ n ộ i dung c ủ a chươ ng trình (đã vi ế t ra gi ấ y) vào trong máy và l ư u l ạ i nó lên đĩa. Thông th ườ ng khi đã lư u l ạ i ch ươ ng trình lên đĩa l ầ n sau s ẽ không c ầ n ph ả i gõ l ạ i. Có th ể so ạ n ch ươ ng trình nguồ n trên các b ộ so ạ n th ả o (editor) khác nh ư ng ph ả i ch ạ y trong môi tr ườ ng tích h ợ p 8 Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ C++ (Borland C, Turbo C). Mụ c đích c ủ a so ạ n th ả o là t ạ o ra m ộ t văn b ả n ch ươ ng trình và đư a vào b ộ nh ớ c ủ a máy. Văn b ả n ch ươ ng trình c ầ n đ ượ c trình bày sáng s ủ a, rõ ràng. Các câu lệ nh c ầ n gióng th ẳ ng c ộ t theo c ấ u trúc c ủ a l ệ nh (các l ệ nh ch ứ a trong m ộ t lệ nh c ấ u trúc đ ượ c trình bày th ụ t vào trong so v ớ i đi ể m b ắ t đ ầ u c ủ a l ệ nh). Các chú thích nên ghi ngắ n g ọ n, rõ nghĩa và phù h ợ p. 3. Dị ch ch ươ ng trình Sau khi đã soạ n th ả o xong ch ươ ng trình ngu ồ n, b ướ c ti ế p theo th ườ ng là d ị ch ( ấ n tổ h ợ p phím Alt-F9) đ ể tìm và s ử a các l ỗ i g ọ i là l ỗ i cú pháp. Trong khi d ị ch C++ s ẽ đ ặ t con trỏ vào n ơ i gây l ỗ i (vi ế t sai cú pháp) trong văn b ả n. Sau khi s ử a xong m ộ t l ỗ i NSD có thể dùng Alt-F8 đ ểể chuy n con tr ỏếỗế đ n l i ti p theo ho ặịạểể c d ch l i. Đ chuy n con tr ỏ về ng ượ c l ạ i l ỗ i tr ướ c đó có th ể dùng Alt-F7. Quá trình s ử a l ỗ i − d ị ch đ ượ c l ặ p l ạ i cho đế n khi văn b ả n đã đ ượ c s ử a h ế t l ỗ i cú pháp. Sả n ph ẩ m sau khi d ị ch là m ộ t t ệ p m ớ i g ọ i là ch ươ ng trình đích có đuôi EXE t ứ c là tệ p mã máy đ ểựệệ th c hi n.T p này có th ểưạờ l u t m th i trong b ộớụụ nh ph c v cho quá trình chạ y ch ươ ng trình ho ặ c l ư u l ạ i trên đĩa tuỳ theo tuỳ ch ọ n khi d ị ch c ủ a NSD. Trong và sau khi dị ch, C++ s ẽ hi ệ n m ộ t c ử a s ổ ch ứ a thông báo v ề các l ỗ i (n ế u có), hoặ c thông báo ch ươ ng trình đã đ ượ c d ị ch thành công (không còn l ỗ i). Các l ỗ i này đượ c g ọ i là l ỗ i cú pháp. Để d ị ch ch ươ ng trình ta ch ọ n menu \Compile\Compile ho ặ c \Compile\Make ho ặ c nhanh chóng hơ n b ằ ng cách ấ n t ổ h ợ p phím Alt-F9. 4. Chạ y ch ươ ng trình Ấn Ctrl-F9 đ ể ch ạ y ch ươ ng trình, n ế u ch ươ ng trình ch ư a d ị ch sang mã máy, máy sẽ t ự đ ộ ng d ị ch l ạ i tr ướ c khi ch ạ y. K ế t qu ả c ủ a ch ươ ng trình s ẽ hi ệ n ra trong m ộ t c ử a sổ k ế t qu ả đ ể NSD ki ể m tra. N ế u k ế t qu ả ch ư a đ ượ c nh ư mong mu ố n, quay l ạ i văn b ả n để s ử a và l ạ i ch ạ y l ạ i ch ươ ng trình. Quá trình này đ ượ c l ặ p l ạ i cho đ ế n khi ch ươ ng trình chạ y đúng nh ư yêu c ầ u đã đ ề ra. Khi ch ươ ng trình ch ạ y, c ử a s ổ k ế t qu ả s ẽ hi ệ n ra tạ m th ờ i che khu ấ t c ử a s ổ so ạ n th ả o. Sau khi k ế t thúc ch ạ y ch ươ ng trình c ử a s ổ so ạ n thảẽựộ o s t đ ng hi ệ n ra tr ởạ l i và che khu ấửổếảể t c a s k t qu . Đ xem l ạếả i k t qu đã hi ệ n ấn Alt-F5. Sau khi xem xong đ ể quay l ạ i c ử a s ổ so ạ n th ả o ấ n phím b ấ t kỳ. IV. VÀO/RA TRONG C++ Trong phầ n này chúng ta làm quen m ộ t s ố l ệ nh đ ơ n gi ả n cho phép NSD nh ậ p d ữ liệ u vào t ừ bàn phím ho ặ c in k ế t qu ả ra màn hình. Trong ph ầ n sau c ủ a giáo trình chúng ta sẽ kh ả o sát các câu l ệ nh vào/ra ph ứ c t ạ p h ơ n 9Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ 1. Vào dữ li ệ u t ừ bàn phím Để nh ậ p d ữ li ệ u vào cho các bi ế n có tên bi ế n_1, bi ế n_2, bi ế n_3 chúng ta s ử d ụ ng câu lệ nh: cin >> biế n_1 ; cin >> biế n_2 ; cin >> biế n_3 ;
  10. hoặ c: cin >> biế n_1 >> bi ế n_2 >> bi ế n_3 ; biế n_1, bi ế n_2, bi ế n_3 là các bi ế n đ ượ c s ử d ụ ng đ ể l ư u tr ữ các giá tr ị NSD nh ậ p vào từ bàn phím. Khái ni ệ m bi ế n s ẽ đ ượ c mô t ả c ụ th ể h ơ n trong ch ươ ng 2, ở đây biế n_1, bi ế n_2, bi ế n_3 đ ượ c hi ể u là các tên g ọ i đ ể ch ỉ 3 giá tr ị khác nhau. Hi ể n nhiên có thểậữệềơếằ nh p d li u nhi u h n 3 bi n b ng cách ti ếụế p t c vi t tên bi ế n vào bên ph ả i sau dấ u >> c ủ a câu l ệ nh. Khi chạ y ch ươ ng trình n ế u g ặ p các câu l ệ nh trên ch ươ ng trình s ẽ "t ạ m d ừ ng" đ ể chờ NSD nh ậ p d ữ li ệ u vào cho các bi ế n. Sau khi NSD nh ậ p xong d ữ li ệ u, ch ươ ng trình sẽ ti ế p t ụ c ch ạ y t ừ câu l ệ nh ti ế p theo sau c ủ a các câu l ệ nh trên. Cách thứậữệủ c nh p d li u c a NSD ph ụộ thu c vào lo ạ i giá tr ịủếầậ c a bi n c n nh p mà ta gọể i là ki u, ví d ụậộố nh p m t s có cách th ứ c khác v ớậộỗựảử i nh p m t chu i kí t . Gi s cầ n nh ậ p đ ộ dài hai c ạ nh c ủ a m ộ t hình ch ữ nh ậ t, trong đó c ạ nh dài đ ượ c qui ướ c b ằ ng tên biế n cd và chi ề u r ộ ng đ ượ c qui ướ c b ở i tên bi ế n cr. Câu l ệ nh nh ậ p s ẽ nh ư sau: cin >> cd >> cr ; Khi máy dừờậữệ ng ch nh p d li u NSD s ẽ gõ giá tr ịụểủ c th c a các chi ề u dài, r ộ ng theo đúng thứ t ự trong câu l ệ nh. Các giá tr ị này c ầ n cách nhau b ở i ít nh ấ t m ộ t d ấ u tr ắ ng (ta qui ướ c g ọ i d ấ u tr ắ ng là m ộ t trong 3 lo ạ i d ấ u đ ượ c nh ậ p b ở i các phím sau: phím spacebar (dấ u cách), phím tab (d ấ u tab) ho ặ c phím Enter (d ấ u xu ố ng dòng)). Các giá tr ị NSD nhậ p vào cũng đ ượ c hi ể n th ị trên màn hình đ ể NSD d ễ theo dõi. Ví dụ n ế u NSD nh ậ p vào 23 11 ↵ thì chươ ng trình s ẽ gán giá tr ị 23 cho bi ế n cd và 11 cho biế n cr. Chú ý: giả s ử NSD nh ậ p 2311 ↵ (không có dấ u cách gi ữ a 23 và 11) thì ch ươ ng trình sẽ xem 2311 là m ộ t giá tr ị và gán cho cd. Máy s ẽ t ạ m d ừ ng ch ờ NSD nh ậ p ti ế p giá trị cho bi ế n cr. 2. In dữ li ệ u ra màn hình Để in giá tr ị c ủ a các bi ể u th ứ c ra màn hình ta dùng câu l ệ nh sau: cout > cd trướ c đó) và ta c ầ n bi ế t giá tr ị này là bao nhiêu thì có th ể s ử d ụ ng câu l ệ nh in ra màn
  11. hình. cout . Thông thườ ng ta hay s ử d ụ ng l ệ nh in đ ể in câu thông báo nh ắ c NSD nh ậ p d ữ li ệ u trướ c khi có câu l ệ nh nh ậ p. Khi đó trên màn hình s ẽ hi ệ n dòng thông báo này r ồ i m ớ i tạừờữệậừ m d ng ch d li u nh p vào t bàn phím. Nh ờ vào thông báo này NSD s ẽếả bi t ph i nhậ p d ữ li ệ u, nh ậ p n ộ i dung gì và nh ư th ế nào ví d ụ : cout > cd; cout > cr; khi đó máy sẽ in dòng thông báo "Hãy nh ậ p chi ề u dài: " và ch ờ sau khi NSD nhậ p xong 23 ↵, máy sẽ th ự c hi ệ n câu l ệ nh ti ế p theo t ứ c in dòng thông báo "Và nh ậ p chiề u r ộ ng: " và ch ờ đ ế n khi NSD nh ậ p xong 11 ↵ chươ ng trình s ẽ ti ế p t ụ c th ự c hi ệ n các câu lệ nh ti ế p theo. Ví dụ 2 : T ừ các th ả o lu ậ n trên ta có th ể vi ế t m ộ t cách đ ầ y đ ủ ch ươ ng trình tính diệ n tích và chu vi c ủ a m ộ t hình ch ữ nh ậ t. Đ ể ch ươ ng trình có th ể tính v ớ i các b ộ giá trị khác nhau c ủ a chi ề u dài và r ộ ng ta c ầ n l ư u giá tr ị này vào trong các bi ế n (ví d ụ cd, cr). #include // khai báo tệ p nguyên m ẫ u đ ể dùng đ ượ c cin, cout void main() // đây là hàm chính củ a ch ươ ng trình { float cd, cr ; // khai báo các biế n có tên cd, cr đ ể ch ứ a đ ộ dài các c ạ nh cout > cd ; // nh ậ p d ữ li ệ u cout > cr ; cout << "Diệ n tích = " << cd * cr << '\n' ; // in k ế t qu ả cout << "Chu vi = " << 2 * (cd + cr) << '\n';
  12. return ; } Chươ ng trình này có th ể gõ vào máy và ch ạ y. Khi ch ạ y đ ế n câu l ệ nh nh ậ p, chươ ng trình d ừ ng đ ể ch ờ nh ậ n chi ề u dài và chi ề u r ộ ng, NSD nh ậ p các giá tr ị c ụ th ể , chươ ng trình s ẽ ti ế p t ụ c th ự c hi ệ n và in ra k ế t qu ả . Thông qua câu l ệ nh nh ậ p d ữ li ệ u và 2 biế n cd, cr NSD có th ể yêu c ầ u ch ươ ng trình cho k ế t qu ả c ủ a m ộ t hình ch ữ nh ậ t b ấ t 12Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ kỳ chứ không ch ỉ trong tr ườ ng h ợ p hình có chi ề u dài 23 và chi ề u r ộ ng 11 nh ư trong ví dụ c ụ th ể trên. 3. Đị nh d ạ ng thông tin c ầ n in ra màn hình Mộ t s ố đ ị nh d ạ ng đ ơ n gi ả n đ ượ c chúng tôi trình bày tr ướ c ở đây. Các đ ị nh d ạ ng chi tiế t và ph ứ c t ạ p h ơ n s ẽ đ ượ c trình bày trong các ph ầ n sau c ủ a giáo trình. Đ ể s ử dụ ng các đ ị nh d ạ ng này c ầ n khai báo file nguyên m ẫ u ở đ ầ u ch ươ ng trình bằ ng ch ỉ th ị #include . − endl: Tươ ng đ ươ ng v ớ i kí t ự xu ố ng dòng '\n'. − setw(n): Bình thườ ng các giá tr ị đ ượ c in ra b ở i l ệ nh cout // để s ử d ụ ng cout // để s ử d ụ ng các đ ị nh d ạ ng #include // để s ử d ụ ng các hàm clrscr() và getch() void main() { clrscr(); // xoá màn hình cout << "CHI TIÊU" << endl << "===" << endl ; cout << setiosflags(ios::showpoint) << setprecision(2) ; cout << "Sách vở " << setw(20) << 123.456 << endl; cout << "Thứ c ăn" << setw(20) << 2453.6 << endl; cout << "Quầ n áo l ạ nh" << setw(15) << 3200.0 << endl; 13Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ getch(); // tạ m d ừ ng (đ ể xem k ế t qu ả ) return ; // kế t thúc th ự c hi ệ n hàm main() } Chươ ng trình này khi ch ạ y s ẽ in ra b ả ng sau: CHI TIÊU
  13. === Sách vở 123.46 Thứ c ăn 2453.60 Quầ n áo l ạ nh 3200.00 Chú ý: toán tửậ nh p >> ch ủế y u làm vi ệớữệểốểậ c v i d li u ki u s . Đ nh p kí t ựặ ho c xâu kí tự , C++ cung c ấ p các ph ươ ng th ứ c (hàm) sau: − cin.get(c): cho phép nhậ p m ộ t kí t ự vào bi ế n kí t ự c, − cin.getline(s,n): cho phép nhậ p t ố i đa n-1 kí t ự vào xâu s. các hàm trên khi thựệẽấ c hi n s l y các kí t ự còn l ạ i trong b ộớệủầậ nh đ m (c a l n nh p trướ c) đ ể gán cho c ho ặ c s. Do toán t ử cin >> x s ẽ đ ể l ạ i kí t ự xu ố ng dòng trong b ộ đ ệ m nên kí tự này s ẽ làm trôi các l ệ nh sau đó nh ư cin.get(c), cin.getline(s,n) (máy không dừ ng đ ể nh ậ p cho c ho ặ c s). Vì v ậ y tr ướ c khi s ử d ụ ng các ph ươ ng th ứ c cin.get(c) ho ặ c cin.getline(s,n) nên sử d ụ ng ph ươ ng th ứ c cin.ignore(1) đ ể l ấ y ra kí t ự xu ố ng dòng còn sót lạ i trong b ộệụạệ đ m. Ví d đo n l nh sau cho phép nh ậộố p m t s nguyên x (b ằ ng toán t ử >>) và mộ t kí t ự c (b ằ ng ph ươ ng th ứ c cin.get(c)): int x; char c; cin >> x; cin.ignore(1); cin.get(c); 4. Vào/ra trong C Trong phầ n trên chúng tôi đã trình bày 2 toán t ử vào/ra và m ộ t s ố ph ươ ng th ứ c, hàm nhậ p và đ ị nh d ạ ng trong C++. Ph ầ n này chúng tôi trình bày các câu lênh nh ậ p xuấ t theo khuôn d ạ ng cũ trong C. Hi ể n nhiên các câu l ệ nh này v ẫ n dùng đ ượ c trong chươ ng trình vi ế t b ằ ng C++, tuy nhiên ch ỉ nên s ử d ụ ng ho ặ c các câu l ệ nh c ủ a C++ hoặ c c ủ a C, không nên dùng l ẫ n l ộ n c ả hai vì d ễ gây nh ầ m l ẫ n. Do đó m ụ c này ch ỉ có 14Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ giá trị tham kh ả o đ ể b ạ n đ ọ c có th ể hi ể u đ ượ c các câu l ệ nh vào/ra trong các ch ươ ng trình viế t theo NNLT C cũ. a. In kế t qu ả ra màn hình Để in các giá tr ị bt_1, bt_2, , bt_n ra màn hình theo m ộ t khuôn d ạ ng mong muố n ta có th ể s ử d ụ ng câu l ệ nh sau đây: printf(dòng đị nh d ạ ng, bt_1, bt_2, , bt_n) ; trong đó dòng đị nh d ạ ng là m ộ t dãy kí t ự đ ặ t trong c ặ p d ấ u nháy kép (“”) qui đ ị nh khuôn dạ ng c ầ n in c ủ a các giá tr ị bt_1, bt_2, , bt_n. Các bt_i có th ể là các h ằ ng, bi ế n hay các biể u th ứ c tính toán. Câu l ệ nh trên s ẽ in giá tr ị c ủ a các bt_i này theo th ứ t ự xu ấ t hiệ n c ủ a chúng và theo qui đ ị nh đ ượ c cho trong dòng đ ị nh d ạ ng. Ví dụ , gi ả s ử x = 4, câu l ệ nh: printf(“%d %0.2f”, 3, x + 1) ; sẽ in các s ố 3 và 5.00 ra màn hình, trong đó 3 đ ượ c in d ướ i d ạ ng s ố nguyên (đ ượ c qui đị nh b ở i “%d”) và x + 1 (có giá tr ị là 5) đ ượ c in d ướ i d ạ ng s ố th ự c v ớ i 2 s ố l ẻ th ậ p phân (đượ c qui đ ị nh b ở i “%0.2f”). C ụ th ể , các kí t ự đi sau kí hi ệ u % dùng đ ể đ ị nh d ạ ng việ c in g ồ m có: d in số nguyên d ướ i d ạ ng h ệ th ậ p phân
  14. o in số nguyên d ạ ng h ệ 8 x, X in số nguyên d ạ ng h ệ 16 u in số nguyên d ạ ng không d ấ u c in kí tự s in xâu kí tự e, E in số th ự c d ạ ng d ấ u ph ẩ y đ ộ ng f in số th ự c d ạ ng d ấ u ph ẩ y tĩnh − Các kí tự trên ph ả i đi sau d ấ u %. Các kí t ự n ằ m trong dòng đ ị nh d ạ ng n ế u không đi sau % thì sẽ đ ượ c in ra màn hình. Mu ố n in % ph ả i vi ế t 2 l ầ n (t ứ c %%). Ví dụ câu l ệ nh: printf(“T ỉ l ệ h ọ c sinh gi ỏ i: %0.2f %%”, 32.486) ; sẽ in câu “T ỉ l ệ h ọ c sinh gi ỏ i: “, ti ế p theo s ẽ in s ố 32.486 đ ượ c làm tròn đ ế n 2 s ố l ẻ thậ p phân l ấ p vào v ị trí c ủ a “%0.2f”, và cu ố i cùng s ẽ in d ấ u “%” (do có %% trong dòng đị nh d ạ ng). Câu đ ượ c in ra màn hình s ẽ là: Tỉ l ệ h ọ c sinh gi ỏ i: 32.49% Chú ý: Mỗ i bt_i c ầ n in ph ả i có m ộ t đ ị nh d ạ ng t ươ ng ứ ng trong dòng đ ị nh d ạ ng. 15Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ Ví dụ câu l ệ nh trên cũng có th ể vi ế t: printf(“%s %0.2f” , “Tỉ l ệ h ọ c sinh gi ỏ i: “, 32.486); trong câu lệ nh này có 2 bi ểứầ u th c c n in. Bi ểứứấ u th c th nh t là xâu kí t ựỉệọ “T l h c sinh giỏ i:” đ ượ c in v ớ i khuôn d ạ ng %s (in xâu kí t ự ) và bi ể u th ứ c th ứ hai là 32.486 đượ c in v ớ i khuôn d ạ ng %0.2f (in s ố th ự c v ớ i 2 s ố l ẻ ph ầ n th ậ p phân). − Nếữự u gi a kí t % và kí t ựịạ đ nh d ng có s ốểịộộầ bi u th đ r ng c n in thì giá tr ị in ra sẽ đ ượ c gióng c ộ t sang l ề ph ả i, đ ể tr ố ng các d ấ u cách phía tr ướ c. N ế u đ ộ rộ ng âm (thêm d ấ u tr ừ − phía tr ướ c) s ẽ gióng c ộ t sang l ề trái. N ế u không có độ r ộ ng ho ặ c đ ộ r ộ ng b ằ ng 0 (ví d ụ %0.2f) thì đ ộ r ộ ng đ ượ c t ự đi ề u ch ỉ nh đúng bằ ng đ ộ r ộ ng c ủ a giá tr ị c ầ n in. − Dấ u + tr ướ c đ ộ r ộ ng đ ể in giá tr ị s ố kèm theo d ấ u (d ươ ng ho ặ c âm) − Trướ c các đ ị nh d ạ ng s ố c ầ n thêm kí t ự l (ví d ụ ld, lf) khi in s ố nguyên dài long hoặ c s ố th ự c v ớ i đ ộ chính xác g ấ p đôi double. Ví dụ 4 : main() { int i = 2, j = 3 ; printf(“Chươ ng trình tính t ổ ng 2 s ố nguyên:\ni + j = %d”, i+j); } sẽ in ra: Chươ ng trình tính t ổ ng 2 s ố nguyên: i + j = 5. b. Nhậ p d ữ li ệ u t ừ bàn phím scanf(dòng đị nh d ạ ng, bi ế n_1, bi ế n_2, , bi ế n_n) ; Lệ nh này cho phép nh ậ p d ữ li ệ u vào cho các bi ế n bi ế n_1, , bi ế n_n. Trong đó dòng đị nh d ạ ng ch ứ a các đ ị nh d ạ ng v ề ki ể u bi ế n (nguyên, th ự c, kí t ự ) đ ượ c vi ế t nh ư trong mô tả câu l ệ nh printf. Các bi ế n đ ượ c vi ế t d ướ i d ạ ng đ ị a ch ỉ c ủ a chúng t ứ c có d ấ u & trướ c m ỗ i tên bi ế n. Ví d ụ câu l ệ nh:
  15. scanf(“%d %f %ld”, &x, &y, &z) ; cho phép nhậ p giá tr ị cho các bi ế n x, y, z trong đó x là bi ế n nguyên, y là bi ế n th ự c và z là biế n nguyên dài (long). Câu l ệ nh: 16Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ scanf(“%2d %f %lf %3s”, &i, &x, &d, s); cho phép nhậ p giá tr ị cho các bi ế n i, x, d, s, trong đó i là bi ế n nguyên có 2 ch ữ s ố , f là biế n th ự c (đ ộ dài tùy ý), d là bi ế n nguyên dài và s là xâu kí t ự có 3 kí t ự . Gi ả s ử NSD nhậ p vào dãy d ữ li ệ u: 12345 67abcd ↵ thì các biế n trên s ẽ đ ượ c gán các giá tr ị như sau: i = 12, x = 345, d = 67 và s = “abc”. Kí t ự d và d ấ u enter (↵) sẽ đ ượ c l ư u l ạ i trong bộ nh ớ và t ự đ ộ ng gán cho các bi ế n c ủ a l ầ n nh ậ p sau. Cuố i cùng, ch ươ ng trình trong ví d ụ 3 đ ượ c vi ế t l ạ i v ớ i printf() và scanf() nh ư sau: Ví dụ 5 : #include // để s ử d ụ ng các hàm printf() và scanf() #include // để s ử d ụ ng các hàm clrscr() và getch() void main() { clrscr(); // xoá màn hình printf("CHI TIÊU\n===\n") ; printf("Sách vở %20.2f\n" , 123.456) ; printf("Thứ c ăn %20.2f\n" , 2453.6) ; printf(“Quầ n áo l ạ nh %15.2f\n" , 3200.0) ; getch(); // tạ m d ừ ng (đ ể xem k ế t qu ả ) return ; // kế t thúc th ự c hi ệ n hàm main() } BÀI TẬ P 1. Nhữ ng tên g ọ i nào sau đây là h ợ p l ệ : − x − 123variabe − tin_hoc − toan tin − so-dem − RADIUS − one.0 − number# − Radius − nam2000 2. Bạ n hãy th ử vi ế t m ộ t ch ươ ng trình ng ắ n nh ấ t có th ể đ ượ c. 3. Tìm các lỗ i cú pháp trong ch ươ ng trình sau: 17Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ #include (iostream.h) void main(); / Giả i ph ươ ng trình b ậ c 1 { cout << 'Day la chươ ng trình: Gptb1.\nXin chao cac ban'; getch(); } 4. Viế t ch ươ ng trình in n ộ i dung m ộ t bài th ơ nào đó. 5. Viế t ch ươ ng trình in ra 4 dòng, 2 c ộ t g ồ m các s ố sau và gióng c ộ t: − thẳ ng theo l ề trái 0.63 64.1 − thẳ ng theo l ề ph ả i 12.78 -11.678
  16. − thẳ ng theo d ấ u ch ấ m th ậ p phân -124. 6 59.002 65.7 -1200.654 6. Hãy viế t và ch ạ y các ch ươ ng trình trong các ví d ụ 3, 5. 7. Chươ ng trình sau khai báo 5 bi ế n kí t ự a, b, c, d, e và m ộ t bi ế n s ố nam. Hãy đi ề n thêm các câu lệ nh vào các dòng đ ể ch ươ ng trình th ự c hi ệ n nhi ệ m v ụ sau: − Nhậ p giá tr ị cho bi ế n nam − Nhậ p giá tr ị cho các bi ế n kí t ự a, b, c, d, e. − In ra màn hình dòng chữ đ ượ c ghép b ở i 5 kí t ự đã nh ậ p và ch ữ "năm" sau đó in số đã nh ậ p (nam). Ví d ụ n ế u 5 ch ữ cái đã nh ậ p là 'H', 'A', 'N', 'O', 'I' và nam đượ c nhap là 2000, thì màn hình in ra dòng ch ữ : HANOI năm 2000. − Nhậ p ch ươ ng trình đã s ử a vào máy và ch ạ y đ ể ki ể m tra k ế t qu ả . #include #include main() { int nam; char a, b, c, d, e; clrscr(); cin >> nam ; ; cin.get(a); cin.get(b); cin.get(c); ; ; 18Chươ ng 1. Các khái ni ệ m c ơ b ả n c ủ a C++ // in kế t qu ả cout << a << << << << << " nam " << ; getch(); } 19Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh CHƯƠ NG 2 KIỂỮỆỂỨỆ U D LI U, BI U TH C VÀ CÂU L NH Kiể u d ữ li ệ u đ ơ n gi ả n Hằ ng - khai báo và s ử d ụ ng h ằ ng Biế n - khai báo và s ử d ụ ng bi ế n Phép toán, biể u th ứ c và câu l ệ nh Thư vi ệ n các hàm toán h ọ c I. KIỂỮỆƠẢ U D LI U Đ N GI N 1. Khái niệ m v ề ki ể u d ữ li ệ u Thông thườ ng d ữ li ệ u hay dùng là s ố và ch ữ . Tuy nhiên vi ệ c phân chia ch ỉ 2 loai dữệ li u là không đ ủểễơậ . Đ d dàng h n cho l p trình, h ầế u h t các NNLT đ ề u phân chia d ữ liệ u thành nhi ề u ki ể u khác nhau đ ượ c g ọ i là các ki ể u c ơ b ả n hay chu ẩ n. Trên c ơ s ở k ế t hợ p các ki ểữệ u d li u chu ẩ n, NSD có th ểựặ t đ t ra các ki ểữệớểụụ u d li u m i đ ph c v cho chươ ng trình gi ả i quy ế t bài toán c ủ a mình. Có nghĩa lúc đó m ỗ i đ ố i t ượ ng đ ượ c qu ả n lý trong chươ ng trình s ẽ là m ộ t t ậ p h ợ p nhi ề u thông tin h ơ n và đ ượ c t ạ o thành t ừ nhi ề u loạ i (ki ể u) d ữ li ệ u khác nhau. D ướ i đây chúng ta s ẽ xét đ ế n m ộ t s ố ki ể u d ữ li ệ u chu ẩ n
  17. đượ c qui đ ị nh s ẵ n b ở i C++. Mộếưếộốớế t bi n nh đã bi t là m t s ô nh liên ti p nào đó trong b ộớ nh dùng đ ểư l u trữ d ữ li ệ u (vào, ra hay k ế t qu ả trung gian) trong quá trình ho ạ t đ ộ ng c ủ a ch ươ ng trình. Để qu ả n lý ch ặ t ch ẽ các bi ế n, NSD c ầ n khai báo cho ch ươ ng trình bi ế t tr ướ c tên bi ế n và kiể u c ủ a d ữ li ệ u đ ượ c ch ứ a trong bi ế n. Vi ệ c khai báo này s ẽ làm ch ươ ng trình qu ả n lý các biế n d ễ dàng h ơ n nh ư trong vi ệ c phân b ố b ộ nh ớ cũng nh ư qu ả n lý các tính toán trên biế n theo nguyên t ắ c: ch ỉ có các d ữ li ệ u cùng ki ể u v ớ i nhau m ớ i đ ượ c phép làm toán vớ i nhau. Do đó, khi đ ề c ậ p đ ế n m ộ t ki ể u chu ẩ n c ủ a m ộ t NNLT, thông th ườ ng chúng ta sẽ xét đ ế n các y ế u t ố sau: − tên kiể u: là m ộ t t ừ dành riêng đ ể ch ỉ đ ị nh ki ể u c ủ a d ữ li ệ u. − số byte trong b ộớểưữộơịữệ nh đ l u tr m t đ n v d li u thu ộể c ki u này: Thông thườ ng s ố byte này ph ụ thu ộ c vào các trình biên d ị ch và h ệ th ố ng máy khác nhau, ở đây ta ch ỉ xét đ ế n h ệ th ố ng máy PC thông d ụ ng hi ệ n nay. − Miề n giá tr ịủể c a ki u: Cho bi ếộơịữệ t m t đ n v d li u thu ộể c ki u này s ẽ có th ểấ l y 20Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh giá trị trong mi ề n nào, ví d ụ nh ỏ nh ấ t và l ớ n nh ấ t là bao nhiêu. Hi ể n nhiên các giá trị này ph ụ thu ộ c vào s ố byte mà h ệ th ố ng máy qui đ ị nh cho t ừ ng ki ể u. NSD cầớếề n nh đ n mi n giá tr ịể này đ khai báo ki ể u cho các bi ếầửụ n c n s d ng mộ t cách thích h ợ p. Dướ i đây là b ả ng tóm t ắ t m ộ t s ố ki ể u chu ẩ n đ ơ n gi ả n và các thông s ố c ủ a nó đ ượ c sử d ụ ng trong C++. Loạ i d ữ li ệ u Tên ki ể u S ố ô nh ớ Mi ề n giá tr ị Kí tự char 1 byte − 128 127 unsigned char 1 byte 0 255 Số nguyên int 2 byte − 32768 32767 unsigned int 2 byte 0 65535 short 2 byte − 32768 32767 long 4 byte − 215 215 – 1 Số th ự c float 4 byte ± 10 -37 . . ± 10 +38 double 8 byte ± 10 -307 . . ± 10 +308 Bả ng 1. Các lo ạ i ki ể u đ ơ n gi ả n Trong chươ ng này chúng ta ch ỉ xét các lo ạ i ki ể u đ ơ n gi ả n trên đây. Các lo ạ i ki ể u có cấ u trúc do ng ườ i dùng đ ị nh nghĩa s ẽ đ ượ c trình bày trong các ch ươ ng sau. 2. Kiể u ký t ự Mộựộệ t kí t là m t kí hi u trong b ả ng mã ASCII. Nh ưếộốựặ đã bi t m t s kí t có m t chữ trên bàn phím (ví d ụ các ch ữ cái, ch ữ s ố ) trong khi m ộ t s ố kí t ự l ạ i không (ví d ụ kí
  18. tựểễệạộ bi u di n vi c lùi l i m t ô trong văn b ảựỉệế n, kí t ch vi c k t thúc m ộ t dòng hay k ế t thúc mộ t văn b ả n). Do v ậ y đ ể bi ể u di ễ n m ộ t kí t ự ng ườ i ta dùng chính mã ASCII c ủ a kí tự đó trong b ả ng mã ASCII và th ườ ng g ọ i là giá tr ị c ủ a kí t ự . Ví d ụ phát bi ể u "Cho kí tự 'A'" là cũng t ươ ng đ ươ ng v ớ i phát bi ể u "Cho kí t ự 65" (65 là mã ASCII c ủ a kí t ự 'A'), hoặ c "Xoá kí t ự xu ố ng dòng" là cũng t ươ ng đ ươ ng v ớ i phát bi ể u "Xoá kí t ự 13" vì 13 là mã ASCII củ a kí t ự xu ố ng dòng. Như v ậ y m ộ t bi ế n ki ể u kí t ự có th ể đ ượ c nh ậ n giá tr ị theo 2 cách t ươ ng đ ươ ng - chữ ho ặ c giá tr ị s ố : ví d ụ gi ả s ử c là m ộ t bi ế n kí t ự thì câu l ệ nh gán c = 'A' cũng t ươ ng đươ ng v ớ i câu l ệ nh gán c = 65. Tuy nhiên đ ể s ử d ụ ng giá tr ị s ố c ủ a m ộ t kí t ự c nào đó ta phả i yêu c ầ u đ ổ i c sang giá tr ị s ố b ằ ng câu l ệ nh int(c). Theo bả ng trên ta th ấ y có 2 lo ạ i kí t ự là char v ớ i mi ề n giá tr ị t ừ -128 đ ế n 127 và 21Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh unsigned char (kí tự không d ấ u) v ớ i mi ề n giá tr ị t ừ 0 đ ế n 255. Tr ườ ng h ợ p m ộ t bi ế n đượ c gán giá tr ị v ượ t ra ngoài mi ề n giá tr ị c ủ a ki ể u thì giá tr ị c ủ a bi ế n s ẽ đ ượ c tính theo mã bù − (256 − c). Ví dụ n ế u gán cho char c giá tr ị 179 (v ượ t kh ỏ i mi ề n giá tr ị đã đ ượ c qui đị nh c ủ a char) thì giá tr ị th ự c s ự đ ượ c l ư u trong máy s ẽ là − (256 − 179) = −77. Ví dụ 1 : char c, d ; // c, d đượ c phép gán giá tr ị t ừ -128 đ ế n 127 unsigned e ; // e đượ c phép gán giá tr ị t ừ 0 đ ế n 255 c = 65 ; d = 179 ; // d có giá trị ngoài mi ề n cho phép e = 179; f = 330 ; // f có giá trị ngoài mi ề n cho phép cout << c << int(c) ; // in ra chữ cái 'A' và giá tr ị s ố 65 cout << d << int(d) ; // in ra là kí tự '|' và giá tr ị s ố -77 cout << e << int(e) // in ra là kí tự '|' và giá tr ị s ố 179 cout << f << int(f) // in ra là kí tự 'J' và giá tr ị s ố 74 Chú ý: Qua ví dụ trên ta th ấ y m ộ t bi ế n n ế u đ ượ c gán giá tr ị ngoài mi ề n cho phép sẽ d ẫ n đ ế n k ế t qu ả không theo suy nghĩ thông th ườ ng. Do v ậ y nên tuân th ủ qui t ắ c ch ỉ gán giá trị cho bi ếộề n thu c mi n giá tr ịểủế mà ki u c a bi n đó qui đ ị nh. Ví d ụếốử n u mu n s dụ ng bi ế n có giá tr ị t ừ 128 255 ta nên khai báo bi ế n d ướ i d ạ ng kí t ự không d ấ u (unsigned char), còn nế u giá tr ị v ượ t quá 255 ta nên chuy ể n sang ki ể u nguyên (int) chẳ ng h ạ n. 3. Kiể u s ố nguyên Các số nguyên đ ượ c phân chia thành 4 lo ạ i ki ể u khác nhau v ớ i các mi ề n giá tr ị tươ ng ứ ng đ ượ c cho trong b ả ng 1. Đó là ki ể u s ố nguyên ng ắ n (short) t ươ ng đ ươ ng v ớ i kiể u s ố nguyên (int) s ử d ụ ng 2 byte và s ố nguyên dài (long int) s ử d ụ ng 4 byte. Ki ể u s ố nguyên thườ ng đ ượ c chia làm 2 lo ạ i có d ấ u (int) và không d ấ u (unsigned int ho ặ c có thể vi ế t g ọ n h ơ n là unsigned). Qui t ắ c mã bù cũng đ ượ c áp d ụ ng n ế u giá tr ị c ủ a bi ế n vượ t ra ngoài mi ề n giá tr ị cho phép, vì v ậ y c ầ n cân nh ắ c khi khai báo ki ể u cho các biế n. Ta th ườ ng s ử d ụ ng ki ể u int cho các s ố nguyên trong các bài toán v ớ i mi ề n giá tr ị vừ a ph ả i (có giá tr ị tuy ệ t đ ố i bé h ơ n 32767), ch ẳ ng h ạ n các bi ế n đ ế m trong các vòng lặ p, 4. Kiể u s ố th ự c Đểửụốựầ s d ng s th c ta c n khai báo ki ể u float ho ặ c double mà mi ềịủ n giá tr c a chúng đượ c cho trong b ả ng 1. Các giá tr ị s ố ki ể u double đ ượ c g ọ i là s ố th ự c v ớ i đ ộ chính xác gấ p đôi vì v ớ i ki ể u d ữ li ệ u này máy tính có cách bi ể u di ễ n khác so v ớ i ki ể u
  19. 22Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh float đểảảốốẻ đ m b o s s l sau m ộốự t s th c có th ể tăng lên đ ảả m b o tính chính xác cao hơ n so v ớ i s ố ki ể u float. Tuy nhiên, trong các bài toán thông d ụ ng th ườ ng ngày đ ộ chính xác củ a s ố ki ể u float là đ ủ dùng. Như đã nh ắ c đ ế n trong ph ầ n các l ệ nh vào/ra ở ch ươ ng 1, liên quan đ ế n vi ệ c in ấ n sốự th c ta có m ộ t vài cách thi ếặạ t đ t d ng in theo ý mu ốụộộốểể n, ví d đ r ng t i thi u đ in mộ t s ố hay s ố s ố l ẻ th ậ p phân c ầ n in Ví dụ 2 : Ch ươ ng trình sau đây s ẽ in di ệ n tích và chu vi c ủ a m ộ t hình tròn có bán kính 2cm vớ i 3 s ố l ẻ . #include #include void main() { float r = 2 ; // r là tên biế n dùng đ ể ch ứ a bán kính cout << "Diệ n tích = " << setiosflags(ios::showpoint) ; cout << setprecision(3) << r * r * 3.1416 ; getch() ; } II. HẰỬỤẰ NG - KHAI BÁO VÀ S D NG H NG Hằ ng là m ộ t giá tr ị c ố đ ị nh nào đó ví d ụ 3 (h ằ ng nguyên), 'A' (h ằ ng kí t ự ), 5.0 (hằ ng th ự c), "Ha noi" (h ằ ng xâu kí t ự ). M ộ t giá tr ị có th ể đ ượ c hi ể u d ướ i nhi ề u ki ể u khác nhau, do vậ y khi vi ế t h ằ ng ta cũng c ầ n có d ạ ng vi ế t thích h ợ p. 1. Hằ ng nguyên − kiể u short, int: 3, -7, − kiể u unsigned: 3, 123456, − kiể u long, long int: 3L, -7L, 123456L, (vi ế t L vào cu ố i m ỗ i giá tr ị ) Các cách viế t trên là th ể hi ệ n c ủ a s ố nguyên trong h ệ th ậ p phân, ngoài ra chúng còn đượ c vi ế t d ướ i các h ệ đ ế m khác nh ư h ệ c ơ s ố 8 ho ặ c h ệ c ơ s ố 16. M ộ t s ố nguyên trong cơ s ố 8 luôn luôn đ ượ c vi ế t v ớ i s ố 0 ở đ ầ u, t ươ ng t ự v ớ i c ơ s ố 16 ph ả i vi ế t v ớ i 0x ở đ ầ u. Ví d ụ ta bi ế t 65 trong c ơ s ố 8 là 101 và trong c ơ s ố 16 là 41, do đó 3 cách vi ế t 65, 0101, 0x41 là như nhau, cùng bi ể u di ễ n giá tr ị 65. 23Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh 2. Hằ ng th ự c Mộ t s ố th ự c có th ể đ ượ c khai báo d ướ i d ạ ng ki ể u float ho ặ c double và các giá tr ị củ a nó có th ể đ ượ c vi ế t d ướ i m ộ t trong hai d ạ ng. a. Dạ ng d ấ u ph ả y tĩnh Theo cách viế t thông th ườ ng. Ví d ụ : 3.0, -7.0, 3.1416, b. Dạ ng d ấ u ph ả y đ ộ ng Tổ ng quát, m ộ t s ố th ự c x có th ể đ ượ c vi ế t d ướ i d ạ ng: men ho ặ c mEn, trong đó m đượ c g ọ i là ph ầ n đ ị nh tr ị , n g ọ i là ph ầ n b ậ c (hay mũ). S ố men bi ể u th ị giá tr ị x = m x 10n . Ví dụ s ố π = 3.1416 có th ể đ ượ c vi ế t: π = = 0.031416e2 = 0.31416e1 = 3.1416e0 = 31.416e−1 = 314.16e−2 = vì π = 0.031416 x 102 = 0.31416 x 101 = 3.1416 x 100
  20. = Như v ậ y m ộ t s ố x có th ể đ ượ c vi ế t d ướ i d ạ ng mEn v ớ i nhi ề u giá tr ị m, n khác nhau, phụ thu ộ c vào d ấ u ph ả y ngăn cách ph ầ n nguyên và ph ầ n th ậ p phân c ủ a s ố . Do vậ y cách vi ế t này đ ượ c g ọ i là d ạ ng d ấ u ph ả y đ ộ ng. 3. Hằ ng kí t ự a. Cách viế t h ằ ng Có 2 cách để vi ế t m ộ t h ằ ng kí t ự . Đ ố i v ớ i các kí t ự có m ặ t ch ữ th ể hi ệ n ta th ườ ng sửụ d ng cách vi ế t thông d ụ ng đó là đ ặặữữấ t m t ch đó gi a 2 d u nháy đ ơư n nh : 'A', '3', ' ' (dấ u cách) ho ặ c s ử d ụ ng tr ự c ti ế p giá tr ị s ố c ủ a chúng. Ví d ụ các giá tr ị t ươ ng ứ ng củ a các kí t ự trên là 65, 51 và 32. V ớ i m ộ t s ố kí t ự không có m ặ t ch ữ ta bu ộ c ph ả i dùng giá trị (s ố ) c ủ a chúng, nh ư vi ế t 27 thay cho kí t ự đ ượ c nh ấ n b ở i phím Escape, 13 thay cho kí tự đ ượ c nh ấ n b ở i phím Enter Đểểễựằ bi u di n kí t b ng giá tr ịố s ta có th ểếựế vi t tr c ti p (không dùng c ặấ p d u nháy đơ n) giá tr ị đó d ướ i d ạ ng h ệ s ố 10 (nh ư trên) ho ặ c đ ặ t chúng vào c ặ p d ấ u nháy đơ n, tr ườ ng h ợ p này ch ỉ dùng cho giá tr ị vi ế t d ướ i d ạ ng h ệ 8 ho ặ c h ệ 16 theo m ẫ u sau: − '\kkk': không quá 3 chữ s ố trong h ệ 8. Ví d ụ '\11' bi ể u di ễ n kí t ự có mã 9. − '\xkk': không quá 2 chữ s ố trong h ệ 16. Ví d ụ '\x1B' bi ể u di ễ n kí t ự có mã 27. Tóm lạ i, m ộ t kí t ự có th ể có nhi ề u cách vi ế t, ch ẳ ng h ạ n 'A' có giá tr ị là 65 (h ệ 10) hoặ c 101 (h ệ 8) ho ặ c 41 (h ệ 16), do đó kí t ự 'A' có th ể vi ế t b ở i m ộ t trong các d ạ ng sau: 65, 0101, 0x41 hoặ c 'A' , '\101' , '\x41' Tươ ng t ự , d ấ u k ế t thúc xâu có giá tr ị 0 nên có th ể vi ế t b ở i 0 ho ặ c '\0' ho ặ c '\x0', trong các cách này cách viế t '\0' đ ượ c dùng thông d ụ ng nh ấ t. 24Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh b. Mộ t s ố h ằ ng thông d ụ ng Đố i v ớ i m ộ t s ố h ằ ng kí t ự th ườ ng dùng nh ư ng không có m ặ t ch ữ t ươ ng ứ ng, ho ặ c các kí tự đ ượ c dành riêng v ớ i nhi ệ m v ụ khác, khi đó thay vì ph ả i nh ớ giá tr ị c ủ a chúng ta có thể vi ế t theo qui ướ c sau: '\n' : biể u th ị kí t ự xu ố ng dòng (cũng t ươ ng đ ươ ng v ớ i endl) '\t' : kí tự tab '\a' : kí tự chuông (t ứ c thay vì in kí t ự , loa s ẽ phát ra m ộ t ti ế ng 'bíp') '\r' : xuố ng dòng '\f' : kéo trang '\\' : dấ u \ '\?' : dấ u ch ấ m h ỏ i ? '\'' : dấ u nháy đ ơ n ' '\"' : dấ u nháy kép " '\kkk' : kí tự có mã là kkk trong h ệ 8 '\xkk' : kí tự có mã là kk trong h ệ 16 Ví dụ : cout đ ể bi ể u di ễ n d ấ u cách. Ví d ụ trong giáo trình này dấ u cách (có giá tr ị là 32) đ ượ c vi ế t ' ' (d ấ u nháy đ ơ n bao m ộ t d ấ u
  21. cách) hoặ c rõ ràng h ơ n b ằ ng cách vi ế t theo qui ướ c ", "" là các hằ ng xâu kí t ự , trong đó "" là xâu không ch ứ a kí t ự nào, các xâu " " ho ặ c "A" có đ ộ dài 1 còn xâu "L ớ p K43*" có đ ộ dài 8. Chú ý phân biệ t gi ữ a 2 cách vi ế t 'A' và "A", tuy chúng cùng bi ể u di ễ n ch ữ cái A như ng ch ươ ng trình s ẽ hi ể u 'A' là m ộ t kí t ự còn "A" là m ộ t xâu kí t ự (do v ậ y chúng đượ c b ố trí khác nhau trong b ộ nh ớ cũng nh ư cách s ử d ụ ng chúng là khác nhau). Tươ ng t ự ta không đ ượ c vi ế t '' (2 d ấ u nháy đ ơ n li ề n nhau) vì không có khái ni ệ m kí t ự 25Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh "rỗ ng". Đ ể ch ỉ xâu r ỗ ng (không có kí t ự nào) ta ph ả i vi ế t "" (2 d ấ u nháy kép li ề n nhau). Tóm lạ i m ộ t giá tr ị có th ể đ ượ c vi ế t d ướ i nhi ề u ki ể u d ữ li ệ u khác nhau và do đó cách sử d ụ ng chúng cũng khác nhau. Ví d ụ liên quan đ ế n khái ni ệ m 3 đ ơ n v ị có th ể có các cách viế t sau tuy nhiên chúng hoàn toàn khác nhau: − 3 : số nguyên 3 đ ơ n v ị − 3L : số nguyên dài 3 đ ơ n v ị − 3.0 : số th ự c 3 đ ơ n v ị − '3' : chữ s ố 3 − "3" : xâu chứ a kí t ự duy nh ấ t là 3 5. Khai báo hằ ng Mộ t giá tr ị c ố đ ị nh (h ằ ng) đ ượ c s ử d ụ ng nhi ề u l ầ n trong ch ươ ng trình đôi khi s ẽ thuậ n l ợ i h ơ n n ế u ta đ ặ t cho nó m ộ t tên g ọ i, thao tác này đ ượ c g ọ i là khai báo h ằ ng. Ví dụ m ộ t ch ươ ng trình qu ả n lý sinh viên v ớ i gi ả thi ế t s ố sinh viên t ố i đa là 50. N ế u s ố sinh viên tố i đa không thay đ ổ i trong ch ươ ng trình ta có th ể đ ặ t cho nó m ộ t tên g ọ i nh ư sosv chẳ ng h ạ n. Trong su ố t ch ươ ng trình b ấ t kỳ ch ỗ nào xu ấ t hi ệ n giá tr ị 50 ta đ ề u có thể thay nó b ằ ng sosv. T ươ ng t ự C++ cũng có nh ữ ng tên h ằ ng đ ượ c đ ặ t s ẵ n, đ ượ c g ọ i là các hằ ng chu ẩ n và NSD có th ể s ử d ụ ng khi c ầ n thi ế t. Ví d ụ h ằ ng π đ ượ c đ ặ t s ẵ n trong C++ vớ i tên g ọ i M_PI. Vi ệ c s ử d ụ ng tên h ằ ng thay cho h ằ ng có nhi ề u đi ể m thu ậ n lợ i nh ư sau: − Chươ ng trình d ễ đ ọ c h ơ n, vì thay cho các con s ố ít có ý nghĩa, m ộ t tên g ọ i s ẽ làm NSD dễ hình dung vai trò, n ộ i dung c ủ a nó. Ví d ụ , khi g ặ p tên g ọ i sosv NSD sẽ hình dung đ ượ c ch ẳ ng h ạ n, "đây là s ố sinh viên t ố i đa trong m ộ t l ớ p", trong khi số 50 có th ể là s ố sinh viên mà cũng có th ể là tu ổ i c ủ a m ộ t sinh viên nào đó. − Chươ ng trình d ễ s ử a ch ữ a h ơ n, ví d ụ bây gi ờ n ế u mu ố n thay đ ổ i ch ươ ng trình sao cho bài toán quả n lý đ ượ c th ự c hi ệ n v ớ i s ố sinh viên t ố i đa là 60, khi đó ta cầ n tìm và thay th ế hàng trăm v ị trí xu ấ t hi ệ n c ủ a 50 thành 60. Vi ệ c thay th ế như v ậ y d ễ gây ra l ỗ i vì có th ể không tìm th ấ y h ế t các s ố 50 trong ch ươ ng trình hoặ c thay nh ầ m s ố 50 v ớ i ý nghĩa khác nh ư tu ổ i c ủ a m ộ t sinh viên nào đó chẳ ng h ạ n. N ế u trong ch ươ ng trình s ử d ụ ng h ằ ng sosv, bây gi ờ vi ệ c thay thế tr ở nên chính xác và d ễ dàng h ơ n b ằ ng thao tác khai báo l ạ i giá tr ị h ằ ng sosv bằ ng 60. Lúc đó trong ch ươ ng trình b ấ t kỳ n ơ i nào g ặ p tên h ằ ng sosv đề u đ ượ c ch ươ ng trình hi ể u v ớ i giá tr ị 60. Để khai báo h ằ ng ta dùng các câu khai báo sau: 26Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh
  22. #define tên_hằ ng giá_tr ị _h ằ ng ; hoặ c: const tên_hằ ng = giá_tr ị _h ằ ng ; Ví dụ : #define sosv 50 ; #define MAX 100 ; const sosv = 50 ; Như trên đã chú ý m ộịằư t giá tr h ng ch a nói lên ki ểửụủ u s d ng c a nó vì v ậầ y ta c n khai báo rõ ràng hơ n b ằ ng cách thêm tên ki ể u tr ướ c tên h ằ ng trong khai báo const, các hằ ng khai báo nh ư v ậ y đ ượ c g ọ i là h ằ ng có ki ể u. Ví dụ : const int sosv = 50 ; const float nhiet_do_soi = 100.0 ; III. BIẾỬỤẾ N - KHAI BÁO VÀ S D NG BI N 1. Khai báo biế n Biế n là các tên g ọ i đ ể l ư u giá tr ị khi làm vi ệ c trong ch ươ ng trình. Các giá tr ị đ ượ c lư u có th ể là các giá tr ị d ữ li ệ u ban đ ầ u, các giá tr ị trung gian t ạ m th ờ i trong quá trình tính toán hoặ c các giá tr ịếảố k t qu cu i cùng. Khác v ớằ i h ng, giá tr ịủếể c a bi n có th thay đổ i trong quá trình làm vi ệ c b ằ ng các l ệ nh đ ọ c vào t ừ bàn phím ho ặ c gán. Hình ả nh c ụ thể c ủ a bi ế n là m ộ t s ố ô nh ớ trong b ộ nh ớ đ ượ c s ử d ụ ng đ ể l ư u các giá tr ị c ủ a bi ế n. Mọ i bi ế n ph ả i đ ượ c khai báo tr ướ c khi s ử d ụ ng. M ộ t khai báo nh ư v ậ y s ẽ báo cho chươ ng trình bi ế t v ề m ộ t bi ế n m ớ i g ồ m có: tên c ủ a bi ế n, ki ể u c ủ a bi ế n (t ứ c ki ể u c ủ a giá trị d ữ li ệ u mà bi ế n s ẽ l ư u gi ữ ). Thông th ườ ng v ớ i nhi ề u NNLT t ấ t c ả các bi ế n ph ả i đượ c khai báo ngay t ừ đ ầ u ch ươ ng trình hay đ ầ u c ủ a hàm, tuy nhiên đ ể thu ậ n ti ệ n C++ cho phép khai báo biế n ngay bên trong ch ươ ng trình ho ặ c hàm, có nghĩa b ấ t kỳ lúc nào NSD thấầếửụếớọ y c n thi t s d ng bi n m i, h có quy ề n khai báo và s ửụ d ng nó t ừở đó tr đi. Cú pháp khai báo biế n g ồ m tên ki ể u, tên bi ế n và có th ể có hay không kh ở i t ạ o giá trịầ ban đ u cho bi ếểởạặ n. Đ kh i t o ho c thay đ ổ i giá tr ịủế c a bi n ta dùng l ệ nh gán (=). a. Khai báo không khở i t ạ o tên_kiể u tên_bi ế n_1 ; tên_kiể u tên_bi ế n_2 ; 27Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh tên_kiể u tên_bi ế n_3 ; Nhiề u bi ế n cùng ki ể u có th ể đ ượ c khai báo trên cùng m ộ t dòng: tên_kiể u tên_bi ế n_1, tên_bi ế n_2, tên_bi ế n_3 ; Ví dụ : void main() { int i, j ; // khai báo 2 biế n i, j có ki ể u nguyên float x ; // khai báo biế n th ự c x char c, d[100] ; // biế n kí t ự c, xâu d ch ứ a t ố i đa 100 kí t ự unsigned int u ; // biế n nguyên không d ấ u u } b. Khai báo có khở i t ạ o Trong câu lệ nh khai báo, các bi ế n có th ể đ ượ c gán ngay giá tr ị ban đ ầ u b ở i phép
  23. toán gán (=) theo cú pháp: tên_kiể u tên_bi ế n_1 = gt_1, tên_bi ế n_2 = gt_2, tên_bi ế n_3 = gt_3 ; trong đó các giá trị gt_1, gt_2, gt_3 có th ể là các h ằ ng, bi ế n ho ặ c bi ể u th ứ c. Ví dụ : const int n = 10 ; void main() { int i = 2, j , k = n + 5; // khai báo i và khở i t ạ o b ằ ng 2, k b ằ ng 15 float eps = 1.0e-6 ; // khai báo biế n th ự c epsilon kh ở i t ạ o b ằ ng 10-6 char c = 'Z'; // khai báo biế n kí t ự c và kh ở i t ạ o b ằ ng 'A' char d[100] = "Tin họ c"; // khai báo xâu kí t ự d ch ứ a dòng ch ữ "Tin h ọ c" } 2. Phạ m vi c ủ a bi ế n Như đã bi ế t ch ươ ng trình là m ộ t t ậ p h ợ p các hàm, các câu l ệ nh cũng nh ư các khai báo. Phạ m vi tác d ụ ng c ủ a m ộ t bi ế n là n ơ i mà bi ế n có tác d ụ ng, t ứ c hàm nào, câu l ệ nh 28Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh nào đượ c phép s ử d ụ ng bi ế n đó. M ộ t bi ế n xu ấ t hi ệ n trong ch ươ ng trình có th ể đ ượ c s ử dụ ng b ở i hàm này nh ư ng không đ ượ c b ở i hàm khác ho ặ c b ở i c ả hai, đi ề u này ph ụ thuộ c ch ặ t ch ẽ vào v ị trí n ơ i bi ế n đ ượ c khai báo. M ộ t nguyên t ắ c đ ầ u tiên là bi ế n s ẽ có tác dụ ng k ể t ừ v ị trí nó đ ượ c khai báo cho đ ế n h ế t kh ố i l ệ nh ch ứ a nó. Chi ti ế t c ụ th ể hơ n s ẽ đ ượ c trình bày trong ch ươ ng 4 khi nói v ề hàm trong C++. 3. Gán giá trị cho bi ế n (phép gán) Trong các ví dụ tr ướ c chúng ta đã s ử d ụ ng phép gán dù nó ch ư a đ ượ c trình bày, đơ n gi ả n m ộ t phép gán mang ý nghĩa t ạ o giá tr ị m ớ i cho m ộ t bi ế n. Khi bi ế n đ ượ c gán giá trị m ớ i, giá tr ị cũ s ẽ đ ượ c t ự đ ộ ng xoá đi b ấ t k ể tr ướ c đó nó ch ứ a giá tr ị nào (ho ặ c chư a có giá tr ị , ví d ụ ch ỉ m ớ i v ừ a khai báo xong). Cú pháp c ủ a phép gán nh ư sau: tên_biế n = bi ể u th ứ c ; Khi gặ p phép gán ch ươ ng trình s ẽ tính toán giá tr ị c ủ a bi ể u th ứ c sau đó gán giá tr ị này cho biế n. Ví d ụ : int n, i = 3; // khở i t ạ o i b ằ ng 3 n = 10; // gán cho n giá trị 10 cout << n <<", " << i << endl; // in ra: 10, 3 i = n / 2; // gán lạ i giá tr ị c ủ a i b ằ ng n/2 = 5 cout << n <<", " << i << endl; // in ra: 10, 5 Trong ví dụ trên n đ ượ c gán giá tr ị b ằ ng 10; trong câu l ệ nh ti ế p theo bi ể u th ứ c n/2 đượ c tính (b ằ ng 5) và sau đó gán k ế t qu ả cho bi ế n i, t ứ c i nh ậ n k ế t qu ả b ằ ng 5 dù tr ướ c đó nó đã có giá trị là 2 (trong tr ườ ng h ợ p này vi ệ c kh ở i t ạ o giá tr ị 2 cho bi ế n i là không có ý nghĩa). Mộ t khai báo có kh ở i t ạ o cũng t ươ ng đ ươ ng v ớ i m ộ t khai báo và sau đó thêm lệ nh gán cho bi ế n (ví d ụ int i = 3 cũng t ươ ng đ ươ ng v ớ i 2 câu l ệ nh int i; i = 3) tuy nhiên vềặảấởạ m t b n ch t kh i t o giá tr ịếẫ cho bi n v n khác v ớ i phép toán gán nh ưẽ ta s thấ y trong các ph ầ n sau. 4. Mộ t s ố đi ể m l ư u ý v ề phép gán Vớ i ý nghĩa thông th ườ ng c ủ a phép toán (nghĩa là tính toán và cho l ạ i m ộ t giá tr ị ) thì phép toán gán còn mộ t nhi ệụữ m v n a là tr ảạộ l i m t giá tr ị . Giá tr ịảạủ tr l i c a phép
  24. toán gán chính là giá trị c ủ a bi ể u th ứ c sau d ấ u b ằ ng. L ợ i d ụ ng đi ề u này C++ cho phép chúng ta gán "kép" cho nhiề u bi ế n nh ậ n cùng m ộ t giá tr ị b ở i cú pháp: biế n_1 = bi ế n_2 = = bi ế n_n = gt ; vớ i cách gán này t ấ t c ả các bi ế n s ẽ nh ậ n cùng giá tr ị gt. Ví d ụ : 29Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh int i, j, k ; i = j = k = 1; Biể u th ứ c gán trên có th ể đ ượ c vi ế t l ạ i nh ư (i = (j = (k = 1))), có nghĩa đ ầ u tiên đ ể thự c hi ệ n phép toán gán giá tr ị cho bi ế n i ch ươ ng trình ph ả i tính bi ể u th ứ c (j = (k = 1)), tứ c ph ả i tính k = 1, đây là phép toán gán, gán giá tr ị 1 cho k và tr ả l ạ i giá tr ị 1, giá tr ị tr ả lạ i này s ẽ đ ượ c gán cho j và tr ả l ạ i giá tr ị 1 đ ể ti ế p t ụ c gán cho i. Ngoài việ c gán kép nh ư trên, phép toán gán còn đ ượ c phép xu ấ t hi ệ n trong b ấ t kỳ biể u th ứ c nào, đi ề u này cho phép trong m ộ t bi ể u th ứ c có phép toán gán, nó không ch ỉ tính toán mà còn gán giá trị cho các bi ế n, ví d ụ n = 3 + (i = 2) s ẽ cho ta i = 2 và n = 5. Việ c s ử d ụ ng nhi ề u ch ứ c năng c ủ a m ộ t câu l ệ nh làm cho ch ươ ng trình g ọ n gàng h ơ n (trong mộ t s ố tr ườ ng h ợ p) nh ư ng cũng tr ở nên khó đ ọ c, ch ẳ ng h ạ n câu l ệ nh trên có th ể viế t tách thành 2 câu l ệ nh i = 2; n = 3 + i; s ẽễọơấốớạớắ d đ c h n ít nh t đ i v i các b n m i b t đầ u tìm hi ể u v ề l ậ p trình. IV. PHÉP TOÁN, BIỂỨỆ U TH C VÀ CÂU L NH 1. Phép toán C++ có rấ t nhi ề u phép toán lo ạ i 1 ngôi, 2 ngôi và th ậ m chí c ả 3 ngôi. Đ ể h ệ thố ng, chúng tôi t ạ m phân chia thành các l ớ p và trình bày ch ỉ m ộ t s ố trong chúng. Các phép toán còn lạ i s ẽ đ ượ c tìm hi ể u d ầ n trong các ph ầ n sau c ủ a giáo trình. Các thành phầ n tên g ọ i tham gia trong phép toán đ ượ c g ọ i là h ạ ng th ứ c ho ặ c toán h ạ ng, các kí hiệ u phép toán đ ượ c g ọ i là toán t ử . Ví d ụ trong phép toán a + b; a, b đ ượ c g ọ i là toán hạ ng và + là toán t ử . Phép toán 1 ngôi là phép toán ch ỉ có m ộ t toán h ạ ng, ví d ụ −a (đ ổ i dấ u s ố a), &x (l ấ y đ ị a ch ỉ c ủ a bi ế n x) M ộ t s ố kí hi ệ u phép toán cũng đ ượ c s ử d ụ ng chung cho cả 1 ngôi l ẫ n 2 ngôi (hi ể n nhiên v ớ i ng ữ nghĩa khác nhau), ví d ụ kí hi ệ u − đượ c s ử d ụ ng cho phép toán tr ừ 2 ngôi a − b, ho ặ c phép & còn đ ượ c s ử d ụ ng cho phép toán lấ y h ộ i các bit (a & b) c ủ a 2 s ố nguyên a và b a. Các phép toán số h ọ c: +, -, *, /, % − Các phép toán + (cộ ng), − (tr ừ ), * (nhân) đ ượ c hi ể u theo nghĩa thông th ườ ng trong số h ọ c. − Phép toán a / b (chia) đượ c th ự c hi ệ n theo ki ể u c ủ a các toán h ạ ng, t ứ c n ế u c ả hai toán hạ ng là s ố nguyên thì k ế t qu ả c ủ a phép chia ch ỉ l ấ y ph ầ n nguyên, ngượ c l ạ i n ế u 1 trong 2 toán h ạ ng là th ự c thì k ế t qu ả là s ố th ự c. Ví d ụ : 13/5 = 2 // do 13 và 5 là 2 số nguyên 13.0/5 = 13/5.0 = 13.0/5.0 = 2.6 // do có ít nhấ t 1 toán h ạ ng là th ự c 30Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh − Phép toán a % b (lấ y ph ầ n d ư ) tr ả l ạ i ph ầ n d ư c ủ a phép chia a/b, trong đó a và b là 2 số nguyên. Ví d ụ : 13%5 = 3 // phầ n d ư c ủ a 13/5 5%13 = 5 // phầ n d ư c ủ a 5/13 b. Các phép toán tự tăng, gi ả m: i++, ++i, i , i − Phép toán ++i và i++ sẽ cùng tăng i lên 1 đ ơ n v ị t ứ c t ươ ng đ ươ ng v ớ i câu l ệ nh i = i+1. Tuy nhiên nế u 2 phép toán này n ằ m trong câu l ệ nh ho ặ c bi ể u th ứ c thì
  25. ++i khác vớ i i++. C ụ th ể ++i s ẽ tăng i, sau đó i m ớ i đ ượ c tham gia vào tính toán trong biể u th ứ c. Ng ượ c l ạ i i++ s ẽ tăng i sau khi bi ể u th ứ c đ ượ c tính toán xong (vớ i giá tr ị i cũ). Đi ể m khác bi ệ t này đ ượ c minh ho ạ thông qua ví d ụ sau, giả s ử i = 3, j = 15. Phép toán Tươ ng đ ươ ng K ế t qu ả i = ++j ; // tăng trướ c j = j + 1 ; i = j ; i = 16 , j = 16 i = j++ ; // tăng sau i = j ; j = j + 1 ; i = 15 , j = 16 j = ++i + 5 ; i = i + 1 ; j = i + 5 ; i = 4, j = 9 j = i++ + 5 ; j = i + 5; i = i + 1; i = 4, j = 8 Ghi chú: Việ c k ế t h ợ p phép toán t ự tăng gi ả m vào trong bi ể u th ứ c ho ặ c câu l ệ nh (như ví d ụ trong ph ầ n sau) s ẽ làm ch ươ ng trình g ọ n nh ư ng khó hi ể u h ơ n. c. Các phép toán so sánh và lôgic Đây là các phép toán mà giá trị tr ả l ạ i là đúng ho ặ c sai. N ế u giá tr ị c ủ a bi ể u th ứ c là đúng thì nó nhậ n giá tr ị 1, ng ượ c l ạ i là sai thì bi ể u th ứ c nh ậ n giá tr ị 0. Nói cách khác 1 và 0 là giá trị c ụ th ể c ủ a 2 khái ni ệ m "đúng", "sai". M ở r ộ ng h ơ n C++ quan ni ệ m m ộ t giá trị b ấ t kỳ khác 0 là "đúng" và giá tr ị 0 là "sai". • Các phép toán so sánh == (bằ ng nhau), != (khác nhau), > (l ớ n h ơ n), = (l ớ n h ơ n hoặ c b ằ ng), = 2) // = 4 vì 5>=2 bằ ng 1 Chú ý: cầ n phân bi ệ t phép toán gán (=) và phép toán so sánh (==). Phép gán v ừ a gán giá trị cho bi ếừảạịấ n v a tr l i giá tr b t kỳ (là giá tr ịủ c a toán h ạ ng bên ph ả i), trong khi phép so sánh luôn luôn trả l ạ i giá tr ị 1 ho ặ c 0. • Các phép toán lôgic: && (và), || (hoặ c ), ! (không, ph ủ đ ị nh) Hai toán hạ ng c ủ a lo ạ i phép toán này ph ả i có ki ể u lôgic t ứ c ch ỉ nh ậ n m ộ t trong hai giá trị "đúng" (đ ượ c th ể hi ệ n b ở i các s ố nguyên khác 0) ho ặ c "sai" (th ể hi ệ n b ở i 0). Khi đó giá trị tr ả l ạ i c ủ a phép toán là 1 ho ặ c 0 và đ ượ c cho trong b ả ng sau: a b a && b a || b ! a 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 Tóm lạ i: − Phép toán "và" đúng khi và chỉ khi hai toán h ạ ng cùng đúng − Phép toán "hoặ c" sai khi và ch ỉ khi hai toán h ạ ng cùng sai − Phép toán "không" (hoặ c "ph ủ đ ị nh") đúng khi và ch ỉ khi toán h ạ ng c ủ a nó
  26. sai. Ví dụ : 3 && (4 > 5) // = 0 vì có hạ ng th ứ c (4>5) sai (3 >= 1) && (7) // = 1 vì cả hai h ạ ng th ứ c cùng đúng !1 // = 0 ! (4 + 3 = 6) // = 1 vì có mộ t h ạ ng th ứ c (5) đúng (5 = 6) // = 0 vì cả hai h ạ ng th ứ c đ ề u sai Chú ý: việ c đánh giá bi ể u th ứ c đ ượ c ti ế n hành t ừ trái sang ph ả i và s ẽ d ừ ng khi biế t k ế t qu ả mà không ch ờ đánh giá h ế t bi ể u th ứ c. Cách đánh giá này s ẽ cho nh ữ ng k ế t quả ph ụ khác nhau n ế u trong bi ể u th ứ c ta "tranh th ủ " đ ư a thêm vào các phép toán t ự tăng giả m. Ví d ụ cho i = 2, j = 3, xét 2 bi ể u th ứ c sau đây: x = (++i 5) cho kế t qu ả x = 0 , i = 3 , j = 4 32Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh y = (++j > 5 && ++i 5 đ ể đánh giá đ ượ c bi ể u th ứ c. Do v ậ y sau khi đánh giá xong c ả i và j đề u đ ượ c tăng 1 (i=3, j=4). Trong khi đó v ớ i bi ể u th ứ c sau do ++j > 5 là sai nên chươ ng trình có th ể k ế t lu ậ n đ ượ c toàn b ộ bi ể u th ứ c là sai mà không c ầ n tính ti ế p ++i 5 s ẽ d ừ ng và vì v ậ y ch ỉ có bi ế n j đượ c tăng 1, t ừ đó ta có i = 2, j = 4 khác v ớ i k ế t qu ả c ủ a bi ể u th ứ c trên. Ví d ụ này m ộ t lầữắ n n a nh c ta chú ý ki ểỹệửụ m soát k vi c s d ng các phép toán t ựả tăng gi m trong bi ể u thứ c và trong câu l ệ nh. 2. Các phép gán • Phép gán thông thườ ng: Đây là phép gán đã đ ượ c trình bày trong m ụ c tr ướ c. • Phép gán có điề u ki ệ n: biế n = (đi ề u_ki ệ n) ? a: b ; điềệộểứ u_ki n là m t bi u th c logic, a, b là các bi ểứấ u th c b t kỳ cùng ki ểớể u v i ki u củ a bi ế n. Phép toán này gán giá tr ị a cho bi ế n n ế u đi ề u ki ệ n đúng và b n ế u ng ượ c l ạ i. Ví dụ : x = (3 + 4 b) ? a: b // x = số l ớ n nh ấ t trong 2 s ố a, b. • Cách viế t g ọ n c ủ a phép gán: M ộ t phép gán d ạ ng x = x @ a ; có th ể đ ượ c vi ế t gọ n d ướ i d ạ ng x @= a trong đó @ là các phép toán s ố h ọ c, x ử lý bit Ví d ụ : thay cho viế t x = x + 2 có th ể vi ế t x += 2; hoặ c x = x/2 ; x = x*2 có th ể đ ượ c vi ế t l ạ i nh ư x /= 2; x *= 2; Cách viế t g ọ n này có nhi ề u thu ậ n l ợ i khi vi ế t và đ ọ c ch ươ ng trình nh ấ t là khi tên biế n quá dài ho ặ c đi kèm nhi ề u ch ỉ s ố thay vì ph ả i vi ế t hai l ầ n tên bi ế n trong câu lệ nh thì ch ỉảếộầề ph i vi t m t l n, đi u này tránh vi ếặạếễ t l p l i tên bi n d gây ra sai sót. Ví d ụ thay vì viế t: ngay_quoc_te_lao_dong = ngay_quoc_te_lao_dong + 365; có thể vi ế t g ọ n h ơ n b ở i:
  27. ngay_quoc_te_lao_dong += 365; 33Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh hoặ c thay cho vi ế t : Luong[Nhanvien[3][2*i+1]] = Luong[Nhanvien[3][2*i+1]] * 290 ; có thể đ ượ c vi ế t l ạ i b ở i: Luong[Nhanvien[3][2*i+1]] *= 290; 3. Biể u th ứ c Biể u th ứ c là dãy kí hi ệ u k ế t h ợ p gi ữ a các toán h ạ ng, phép toán và c ặ p d ấ u () theo mộắấị t qui t c nh t đ nh. Các toán h ạằế ng là h ng, bi n, hàm. Bi ểứ u th c cung c ấộ p m t cách thứ c đ ể tính giá tr ị m ớ i d ự a trên các toán h ạ ng và toán t ử trong bi ể u th ứ c. Ví d ụ : (x + y) * 2 - 4 ; 3 - x + sqrt(y) ; (-b + sqrt(delta)) / (2*a) ; a. Thứ t ự ư u tiên c ủ a các phép toán Để tính giá tr ịủộểứầ c a m t bi u th c c n có m ộậự t tr t t tính toán c ụểốấ th và th ng nh t. Ví dụ xét bi ể u th ứ c x = 3 + 4 * 2 + 7 − nế u tính theo đúng tr ậ t t ự t ừ trái sang ph ả i, ta có x = ((3+4) * 2) + 7 = 21, − nế u ư u tiên d ấ u + đ ượ c th ự c hi ệ n tr ướ c d ấ u *, x = (3 + 4) * (2 + 7) = 63, − nế u ư u tiên d ấ u * đ ượ c th ự c hi ệ n tr ướ c d ấ u +, x = 3 + (4 * 2) + 7 = 18. Như v ậ y cùng m ộ t bi ể u th ứ c tính x nh ư ng cho 3 k ế t qu ả khác nhau theo nh ữ ng cách hiể u khác nhau. Vì v ậầộ y c n có m t cách hi ểốấự u th ng nh t d a trên th ứựư t u tiên củ a các phép toán, t ứ c nh ữ ng phép toán nào s ẽ đ ượ c ư u tiên tính tr ướ c và nh ữ ng phép toán nào đượ c tính sau C++ qui đị nh tr ậ t t ự tính toán theo các m ứ c đ ộ ư u tiên nh ư sau: 1. Các biể u th ứ c trong c ặ p d ấ u ngo ặ c () 2. Các phép toán 1 ngôi (tự tăng, gi ả m, l ấ y đ ị a ch ỉ , l ấ y n ộ i dung con tr ỏ ) 3. Các phép toán số h ọ c. 4. Các phép toán quan hệ , logic. 5. Các phép gán. Nế u có nhi ề u c ặ p ngo ặ c l ồ ng nhau thì c ặ p trong cùng (sâu nh ấ t) đ ượ c tính tr ướ c. Các phép toán trong cùng mộ t l ớ p có đ ộ ư u tiên theo th ứ t ự : l ớ p nhân (*, /, &&), l ớ p cộ ng (+, −, ||). N ế u các phép toán có cùng th ứ t ự ư u tiên thì ch ươ ng trình s ẽ th ự c hi ệ n từ trái sang ph ả i. Các phép gán có đ ộ ư u tiên cu ố i cùng và đ ượ c th ự c hi ệ n t ừ ph ả i sang trái. Ví dụ . theo m ứ c ư u tiên đã qui đ ị nh, bi ể u th ứ c tính x trong ví d ụ trên s ẽ đ ượ c tính như x = 3 + (4 * 2) + 7 = 18. 34Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh Phầ n l ớ n các tr ườ ng h ợ p mu ố n tính toán theo m ộ t tr ậ t t ự nào đó ta nên s ử d ụ ng c ụ thể các d ấ u ngo ặ c (vì các bi ể u th ứ c trong d ấ u ngo ặ c đ ượ c tính tr ướ c). Ví d ụ : − Để tính Δ = b2 - 4ac ta viế t delta = b * b − 4 * a * c ; − Để tính nghi ệ m ph ươ ng trình b ậ c 2: x = a b 2 Δ+− viế t : x = −b + sqrt(delta) / 2*a; là sai vì theo mứ c đ ộ ư u tiên x s ẽ đ ượ c tính nh ư −b + ((sqrt(delta)/2) * a) (thứ t ự tính s ẽ là phép toán 1 ngôi đ ổ i d ấ u −b, đ ế n phép chia, phép nhân và
  28. cuố i cùng là phép c ộ ng). Đ ể tính chính xác c ầ n ph ả i vi ế t (−b + sqrt(delta)) / (2*a). − Cho a = 1, b = 2, c = 3. Biể u th ứ c a += b += c cho giá tr ị c = 3, b = 5, a = 6. Thứ t ự tính s ẽ là t ừ ph ả i sang trái, t ứ c câu l ệ nh trên t ươ ng đ ươ ng v ớ i các câu lệ nh sau: a = 1 ; b = 2 ; c = 3 ; b = b + c ; // b = 5 a = a + b ; // a = 6 Để rõ ràng, t ố t nh ấ t nên vi ế t bi ể u th ứ c c ầ n tính tr ướ c trong các d ấ u ngo ặ c. b. Phép chuyể n đ ổ i ki ể u Khi tính toán mộ t bi ể u th ứ c ph ầ n l ớ n các phép toán đ ề u yêu c ầ u các toán h ạ ng phả i cùng ki ể u. Ví d ụ đ ể phép gán th ự c hi ệ n đ ượ c thì giá tr ị c ủ a bi ể u th ứ c ph ả i có cùng kiể u v ớ i bi ế n. Trong tr ườ ng h ợ p ki ể u c ủ a giá tr ị bi ể u th ứ c khác v ớ i ki ể u c ủ a phép gán thì hoặ c là ch ươ ng trình s ẽ t ự đ ộ ng chuy ể n ki ể u giá tr ị bi ể u th ứ c v ề thành ki ể u c ủ a bi ế n đượ c gán (n ế u đ ượ c) ho ặ c s ẽ báo l ỗ i. Do v ậ y khi c ầ n thi ế t NSD ph ả i s ử d ụ ng các câu lệể nh đ chuy ểểủểứ n ki u c a bi u th c cho phù h ợớểủế p v i ki u c a bi n. − Chuyểểựộềặ n ki u t đ ng: v m t nguyên t ắ c, khi c ầế n thi t các ki ể u có giá tr ịấ th p sẽ đ ượ c ch ươ ng trình t ự đ ộ ng chuy ể n lên ki ể u cao h ơ n cho phù h ợ p v ớ i phép toán. Cụ th ể phép chuy ể n ki ể u có th ể đ ượ c th ự c hi ệ n theo s ơ đ ồ nh ư sau: char ↔ int → long int → float → double Ví dụ : int i = 3; float f ; f = i + 2; trong ví dụ trên i có ki ể u nguyên và vì v ậ y i+2 cũng có ki ể u nguyên trong khi f có kiể u th ự c. Tuy v ậ y phép toán gán này là h ợ p l ệ vì ch ươ ng trình s ẽ t ự đ ộ ng chuy ể n ki ể u 35Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh cuả i+2 (b ằ ng 5) sang ki ể u th ự c (b ằ ng 5.0) r ồ i m ớ i gán cho f. − Ép kiể u: trong chuy ể n ki ể u t ự đ ộ ng, ch ươ ng trình chuy ể n các ki ể u t ừ th ấ p đ ế n cao, tuy nhiên chiề u ng ượ c l ạ i không th ể th ự c hi ệ n đ ượ c vì nó có th ể gây m ấ t dữ li ệ u. Do đó n ế u c ầ n thi ế t NSD ph ả i ra l ệ nh cho ch ươ ng trình. Ví d ụ : int i; float f = 3 ; // tự đ ộ ng chuy ể n 3 thành 3.0 và gán cho f i = f + 2 ; // sai vì mặ c dù f + 2 = 5 nh ư ng không gán đ ượ c cho i Trong ví dụ trên đ ể câu l ệ nh i = f+2 th ự c hi ệ n đ ượ c ta ph ả i ép ki ể u c ủ a bi ể u th ứ c f+2 về thành ki ể u nguyên. Cú pháp t ổ ng quát nh ư sau: (tên_kiể u)bi ể u_th ứ c // cú pháp cũ trong C hoặ c: tên_kiể u(bi ể u_th ứ c) // cú pháp m ớ i trong C++ trong đó tên_kiể u là ki ể u c ầ n đ ượ c chuy ể n sang. Nh ư v ậ y câu l ệ nh trên ph ả i đ ượ c viế t l ạ i: i = int(f + 2) ; khi đó f+2 (bằ ng 5.0) đ ượ c chuy ể n thành 5 và gán cho i. Dướ i đây ta s ẽ xét m ộ t s ố ví d ụ v ề l ợ i ích c ủ a vi ệ c ép ki ể u. • Phép ép kiểừộốựềố u t m t s th c v s nguyên s ẽắỏấảầậ c t b t t c ph n th p phân c ủ a sốựỉểạầ th c, ch đ l i ph n nguyên. Nh ưậể v y đ tính ph ầ n nguyên c ủộốự a m t s th c
  29. x ta chỉ c ầ n ép ki ể u c ủ a x v ề thành ki ể u nguyên, có nghĩa int(x) là ph ầ n nguyên củốựấ a s th c x b t kỳ. Ví d ụểể đ ki m tra m ộố t s nguyên n có ph ảố i là s chính phươ ng, ta c ầ n tính căn b ậ c hai c ủ a n. N ế u căn b ậ c hai x c ủ a n là s ố nguyên thì n là số chính ph ươ ng, t ứ c n ế u int(x) = x thì x nguyên và n là chính phươ ng, ví d ụ : int n = 10 ; float x = sqrt(n) ; // hàm sqrt(n) trả l ạ i căn b ậ c hai c ủ a s ố n if (int(x) == x) cout > c ; cout > x >> y ; x = 3 + x ; y = (x = sqrt(x)) + 1 ; cout << x ; cout << y ; Các câu lệ nh đ ượ c phép vi ế t trên cùng m ộ t ho ặ c nhi ề u dòng. M ộ t s ố câu l ệ nh đượ c g ọ i là l ệ nh có c ấ u trúc, t ứ c bên trong nó l ạ i ch ứ a dãy l ệ nh khác. Dãy l ệ nh này phả i đ ượ c bao gi ữ a c ặ p d ấ u ngo ặ c {} và đ ượ c g ọ i là kh ố i l ệ nh. Ví d ụ t ấ t c ả các l ệ nh trong mộ t hàm (nh ư hàm main()) luôn luôn là m ộ t kh ố i l ệ nh. M ộ t đ ặ c đi ể m c ủ a kh ố i lệ nh là các bi ế n đ ượ c khai báo trong kh ố i l ệ nh nào thì ch ỉ có tác d ụ ng trong kh ố i l ệ nh đó. Chi tiế t h ơ n v ề các đ ặ c đi ể m c ủ a l ệ nh và kh ố i l ệ nh s ẽ đ ượ c trình bày trong các chươ ng ti ế p theo c ủ a giáo trình. 37Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh
  30. V. THƯỆỌ VI N CÁC HÀM TOÁN H C Trong phầ n này chúng tôi tóm t ắ t m ộ t s ố các hàm toán h ọ c hay dùng. Các hàm này đề u đ ượ c khai báo trong file nguyên m ẫ u math.h. 1. Các hàm số h ọ c • abs(x), labs(x), fabs(x) : trả l ạ i giá tr ị tuy ệ t đ ố i c ủ a m ộ t s ố nguyên, s ố nguyên dài và số th ự c. • pow(x, y) : hàm mũ, trả l ạ i giá tr ị x lũy th ừ a y (xy ). • exp(x) : hàm mũ, trả l ạ i giá tr ị e mũ x (e x ). • log(x), log10(x) : trả l ạ i lôgarit c ơ s ố e và lôgarit th ậ p phân c ủ a x (lnx, logx) . • sqrt(x) : trả l ạ i căn b ậ c 2 c ủ a x. • atof(s_number) : trả l ạ i s ố th ự c ứ ng v ớ i s ố vi ế t d ướ i d ạ ng xâu kí t ự s_number. 2. Các hàm lượ ng giác • sin(x), cos(x), tan(x) : trả l ạ i các giá tr ị sinx, cosx, tgx. BÀI TẬ P 1. Viế t câu l ệ nh khai báo bi ế n đ ể l ư u các giá tr ị sau: − Tuổ i c ủ a m ộ t ng ườ i − S ố l ượ ng cây trong thành ph ố − Độ dài c ạ nh m ộ t tam giác − Kho ả ng cách gi ữ a các hành tinh − Mộ t ch ữ s ố − Nghi ệ m x c ủ a ph ươ ng trình b ậ c 1 − Mộ t ch ữ cái − Bi ệ t th ứ c Δ c ủ a ph ươ ng trình b ậ c 2 2. Viế t câu l ệ nh nh ậ p vào 4 giá tr ị l ầ n l ượ t là s ố th ự c, nguyên, nguyên dài và kí t ự . In ra màn hình các giá trị này đ ể ki ể m tra. 3. Viế t câu l ệ nh in ra màn hình các dòng sau (không k ể các s ố th ứ t ự và d ấ u: ở đ ầ u mỗ i dòng) 1: Bộ Giáo d ụ c và Đào t ạ o C ộ ng hoà xã h ộ i ch ủ nghĩa Vi ệ t Nam 2: 38Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh 3: Sở Giáo d ụ c Hà N ộ i Đ ộ c l ậ p - T ự do - H ạ nh phúc Chú ý: khoả ng tr ố ng gi ữ a ch ữ Đào t ạ o và C ộ ng hoà (dòng 1) là 2 tab. Dòng 2: đ ể trố ng. 4. Viế t ch ươ ng trình nh ậ p vào m ộ t kí t ự . In ra kí t ự đó và mã ascii c ủ a nó. 5. Viế t ch ươ ng trình nh ậ p vào hai s ố th ự c. In ra hai s ố th ự c đó v ớ i 2 s ố l ẻ và cách nhau 5 cộ t. 6. Nhậ p, ch ạ y và gi ả i thích k ế t qu ả đ ạ t đ ượ c c ủ a đo ạ n ch ươ ng trình sau: #include void main() { char c1 = 200; unsigned char c2 = 200 ; cout << "c1 = " << c1 << ", c2 = " << c2 << "\n" ; cout << "c1+100 = " << c1+100 << ", c2+100 = " << c2+100 ; }
  31. 7. Nhậ p a, b, c. In ra màn hình dòng ch ữ ph ươ ng trình có d ạ ng ax^2 + bx + c = 0, trong đó các giá trị a, b, c ch ỉ in 2 s ố l ẻ (ví d ụ v ớ i a = 5.141, b = −2, c = 0.8 in ra 5.14 x^2 −2.00 x + 0.80). 8. Viế t ch ươ ng trình tính và in ra giá tr ị các bi ể u th ứ c sau v ớ i 2 s ố l ẻ : a. 333 ++ b. 2 1 2 1 2 1 + + 9. Nhậ p a, b, c là các s ố th ự c. In ra giá tr ị c ủ a các bi ể u th ứ c sau v ớ i 3 s ố l ẻ : a. a 2 − 2b + ab/c c. 3a − b3 − 2 c b. a acb 2 4 2 − d. 14 2 +− bc/ab/a 10. In ra tổ ng, tích, hi ệ u và th ươ ng c ủ a 2 s ố đ ượ c nh ậ p vào t ừ bàn phím. 11. In ra trung bình cộ ng, trung bình nhân c ủ a 3 s ố đ ượ c nh ậ p vào t ừ bàn phím. 12. Viế t ch ươ ng trình nh ậ p c ạ nh, bán kính và in ra di ệ n tích, chu vi c ủ a các hình: vuông, chữ nh ậ t, tròn. 13. Nhậ p a, b, c là đ ộ dài 3 c ạ nh c ủ a tam giác (chú ý đ ả m b ả o t ổ ng 2 c ạ nh ph ả i l ớ n 39Chươ ng 2. Ki ể u d ữ li ệ u, bi ể u th ứ c và câu l ệ nh hơ n c ạ nh còn l ạ i). Tính chu vi, di ệ n tích, đ ộ dài 3 đ ườ ng cao, 3 đ ườ ng trung tuy ế n, 3 đườ ng phân giác, bán kính đ ườ ng tròn n ộ i ti ế p, ngo ạ i ti ế p l ầ n l ượ t theo các công thứ c sau: C = 2p = a + b + c ; S = )cp)(bp)(ap(p −−− ; a S ha 2 = ; ma = 222 22 2
  32. 1 acb −+ ; ga = )ap(bcp cb − + 2 ; p S r = ; S abc R 4 = ; 14. Tính diệ n tích và th ể tích c ủ a hình c ầ u bán kính R theo công th ứ c: S = 4πR2 ; V = RS/3 15. Nhậ p vào 4 ch ữố s . In ra t ổủữố ng c a 4 ch s này và ch ữố s hàng ch ụ c, hàng đ ơị n v củ a t ổ ng (ví d ụ 4 ch ữ s ố 3, 1, 8, 5 có t ổ ng là 17 và ch ữ s ố hàng ch ụ c là 1 và hàng đơ n v ị là 7, c ầ n in ra 17, 1, 7). 16. Nhậ p vào m ộố t s nguyên (có 4 ch ữố s ). In ra t ổủữố ng c a 4 ch s này và ch ữốầ s đ u, chữốốụố s cu i (ví d s 3185 có t ổ ng các ch ữố s là 17, đ ầ u và cu ố i là 3 và 5, k ếả t qu in ra là: 17, 3, 5). 17. Hãy nhậ p 2 s ố a và b. Vi ế t ch ươ ng trình đ ổ i giá tr ị c ủ a a và b theo 2 cách: − dùng biế n ph ụ t: t = a; a = b; b = t; − không dùng biế n ph ụ : a = a + b; b = a - b; a = a - b; In kế t qu ả ra màn hình đ ể ki ể m tra. 18. Viế t ch ươ ng trình đoán s ố c ủ a ng ườ i ch ơ i đang nghĩ, b ằ ng cách yêu c ầ u ng ườ i chơ i nghĩ m ộ t s ố , sau đó th ự c hi ệ n m ộ t lo ạ t các tính toán trên s ố đã nghĩ r ồ i cho biế t k ế t qu ả . Máy s ẽ in ra s ố mà ng ườ i ch ơ i đã nghĩ. (ví d ụ yêu c ầ u ng ườ i ch ơ i l ấ y số đã nghĩ nhân đôi, tr ừ 4, bình ph ươ ng, chia 2 và tr ừ 7 r ồ i cho bi ế t k ế t qu ả , máy sẽ in ra s ố ng ườ i ch ơ i đã nghĩ). 19. Mộ t sinh viên g ồ m có các thông tin: h ọ tên, tu ổ i, đi ể m toán (h ệ s ố 2), đi ể m tin (h ệ số 1). Hãy nh ậ p các thông tin trên cho 2 sinh viên. In ra b ả ng đi ể m g ồ m các chi tiế t nêu trên và đi ể m trung bình c ủ a m ỗ i sinh viên. 20. Mộ t nhân viên g ồ m có các thông tin: h ọ tên, h ệ s ố l ươ ng, ph ầ n trăm ph ụ c ấ p (theo lư ong) và ph ầ n trăm ph ả i đóng BHXH. Hãy nh ậ p các thông tin trên cho 2 nhân viên. In ra bả ng l ươ ng g ồ m các chi ti ế t nêu trên và t ổ ng s ố ti ề n cu ố i cùng m ỗ i nhân viên đượ c nh ậ n. 40Chươ ng 3. C ấ u trúc đi ề u khi ể n và d ữ li ệ u ki ể u m ả ng CHƯƠ NG 3 CẤỀỂỮỆỂẢ U TRÚC ĐI U KHI N VÀ D LI U KI U M NG Cấ u trúc r ẽ nhánh Cấ u trúc l ặ p
  33. Mả ng d ữ li ệ u Mả ng hai chi ề u I. CẤẼ U TRÚC R NHÁNH Nói chung việ c th ự c hi ệ n ch ươ ng trình là ho ạ t đ ộ ng tu ầ n t ự , t ứ c th ự c hi ệ n t ừ ng lệ nh m ộ t t ừ câu l ệ nh b ắ t đ ầ u c ủ a ch ươ ng trình cho đ ế n câu l ệ nh cu ố i cùng. Tuy nhiên, đểệậ vi c l p trình hi ệảơầế u qu h n h u h t các NNLT b ậề c cao đ u có các câu l ệẽ nh r nhánh và các câu lệ nh l ặ p cho phép th ự c hi ệ n các câu l ệ nh c ủ a ch ươ ng trình không theo trình tự tu ầ n t ự nh ư trong văn b ả n. Phầ n này chúng tôi s ẽ trình bày các câu l ệ nh cho phép r ẽ nhánh nh ư v ậ y. Đ ể thố ng nh ấ t m ỗ i câu l ệ nh đ ượ c trình bày v ề cú pháp (t ứ c cách vi ế t câu l ệ nh), cách s ử dụặểụ ng, đ c đi m, ví d minh ho ạộềầ và m t vài đi u c n chú ý khi s ửụệ d ng l nh. 1. Câu lệ nh đi ề u ki ệ n if a. Ý nghĩa Mộ t câu l ệ nh if cho phép ch ươ ng trình có th ể th ự c hi ệ n kh ố i l ệ nh này hay kh ố i lệ nh khác ph ụ thu ộ c vào m ộ t đi ề u ki ệ n đ ượ c vi ế t trong câu l ệ nh là đúng hay sai. Nói cách khác câu lệ nh if cho phép ch ươ ng trình r ẽ nhánh (ch ỉ th ự c hi ệ n 1 trong 2 nhánh). b. Cú pháp − if (điề u ki ệ n) { kh ố i l ệ nh 1; } else { kh ố i l ệ nh 2; } − if (điề u ki ệ n) { kh ố i l ệ nh 1; } Trong cú pháp trên câu lệ nh if có hai d ạ ng: có else và không có else. đi ề u ki ệ n là mộ t bi ể u th ứ c lôgic t ứ c nó có giá tr ị đúng (khác 0) ho ặ c sai (b ằ ng 0). Khi chươ ng trình th ự c hi ệ n câu l ệ nh if nó s ẽ tính bi ể u th ứ c đi ề u ki ệ n. N ế u đi ề u kiệ n đúng ch ươ ng trình s ẽ ti ế p t ụ c th ự c hi ệ n các l ệ nh trong kh ố i l ệ nh 1, ng ượ c l ạ i n ế u 41Chươ ng 3. C ấ u trúc đi ề u khi ể n và d ữ li ệ u ki ể u m ả ng điề u ki ệ n sai ch ươ ng trình s ẽ th ự c hi ệ n kh ố i l ệ nh 2 (n ế u có else) ho ặ c không làm gì (nế u không có else). c. Đặ c đi ể m − Đặ c đi ể m chung c ủ a các câu l ệ nh có c ấ u trúc là b ả n thân nó ch ứ a các câu l ệ nh khác. Điề u này cho phép các câu l ệ nh if có th ể l ồ ng nhau. − Nế u nhi ề u câu l ệ nh if (có else và không else) l ồ ng nhau vi ệ c hi ể u if và else nào đi vớ i nhau c ầ n ph ả i chú ý. Qui t ắ c là else s ẽ đi v ớ i if g ầ n nó nh ấ t mà chư a đ ượ c ghép c ặ p v ớ i else khác. Ví d ụ câu l ệ nh if (n>0) if (a>b) c = a; else c = b; là tươ ng đ ươ ng v ớ i if (n>0) { if (a>b) c = a; else c = b;} d. Ví dụ minh ho ạ Ví dụ 1 : B ằ ng phép toán gán có đi ề u ki ệ n có th ể tìm s ố l ớ n nh ấ t max trong 2 s ố a, b như sau: max = (a > b) ? a: b ; hoặ c max đ ượ c tìm b ở i dùng câu l ệ nh if: if (a > b) max = a; else max = b; Ví dụ 2 : Tính năm nhu ậ n. Năm th ứ n là nhu ậ n n ế u nó chia h ế t cho 4, nh ư ng không chia hế t cho 100 ho ặ c chia h ế t 400. Chú ý: m ộ t s ố nguyên a là chia h ế t cho b n ế u ph ầ n dư c ủ a phép chia b ằ ng 0, t ứ c a%b == 0. #include
  34. void main() { int nam; cout > nam ; if (nam%4 == 0 && year%100 !=0 || nam%400 == 0) cout // tệ p ch ứ a các ph ươ ng th ứ c vào/ra #include // tệ p ch ứ a các hàm toán h ọ c void main() { float a, b, c; // khai báo các hệ s ố float delta; float x1, x2; // 2 nghiem cout > a >> b >> c ; // qui ướ c nh ậ p a ≠ 0 delta = b*b - 4*a*c ; if (delta < 0) cout << “ph. trình vô nghiệ m\n” ; else if (delta==0) cout<<“ph. trình có nghiệ m kép:" << -b/(2*a) << '\n'; else { x1 = (-b+sqrt(delta))/(2*a); x2 = (-b-sqrt(delta))/(2*a); cout << “nghiem 1 = " << x1 << " và nghiem 2 = " << x2 ; } } Chú ý: do C++ quan niệ m "đúng" là m ộ t giá tr ị khác 0 b ấ t kỳ và "sai" là giá tr ị 0 nên thay vì viế t if (x != 0) ho ặ c if (x == 0) ta có th ể vi ế t g ọ n thành if (x) ho ặ c if (!x) vì nế u (x != 0) đúng thì ta có x ≠ 0 và vì x ≠ 0 nên (x) cũng đúng. Ng ượ c l ạ i n ế u (x) đúng thì x ≠ 0, từ đó (x != 0) cũng đúng. T ươ ng t ự ta d ễ dàng th ấ y đ ượ c (x == 0) là t ươ ng đươ ng v ớ i (!x). 2. Câu lệ nh l ự a ch ọ n switch a. Ý nghĩa Câu lệ nh if cho ta kh ả năng đ ượ c l ự a ch ọ n m ộ t trong hai nhánh đ ể th ự c hi ệ n, do đó nế u s ử d ụ ng nhi ề u l ệ nh if l ồ ng nhau s ẽ cung c ấ p kh ả năng đ ượ c r ẽ theo nhi ề u nhánh. Tuy nhiên trong trườ ng h ợ p nh ư v ậ y ch ươ ng trình s ẽ r ấ t khó đ ọ c, do v ậ y C++ còn cung cấ p m ộ t câu l ệ nh c ấ u trúc khác cho phép ch ươ ng trình có th ể ch ọ n m ộ t trong nhiề u nhánh đ ể th ự c hi ệ n, đó là câu l ệ nh switch. b. Cú pháp 43Chươ ng 3. C ấ u trúc đi ề u khi ể n và d ữ li ệ u ki ể u m ả ng switch (biể u th ứ c đi ề u khi ể n) {
  35. case biể u_th ứ c_1: dãy l ệ nh 1 ; case biể u_th ứ c_2: dãy l ệ nh 2 ; case : ; case biể u_th ứ c_n: dãy l ệ nh n ; default: dãy lệ nh n+1; } − biể u th ứ c đi ề u khi ể n: ph ả i có ki ể u nguyên ho ặ c kí t ự , − các biể u_th ứ c_i: đ ượ c t ạ o t ừ các h ằ ng nguyên ho ặ c kí t ự , − các dãy lệ nh có th ể r ỗ ng. Không c ầ n bao dãy l ệ nh b ở i c ặ p d ấ u {}, − nhánh default có thể có ho ặ c không và v ị trí c ủ a nó có th ể n ằ m b ấ t kỳ trong câu lệ nh (gi ữ a các nhánh case), không nh ấ t thi ế t ph ả i n ằ m cu ố i cùng. c. Cách thự c hi ệ n Để th ự c hi ệ n câu l ệ nh switch đ ầ u tiên ch ươ ng trình tính giá tr ị c ủ a bi ể u th ứ c đi ề u khiể n (btđk), sau đó so sánh k ế t qu ả c ủ a btđk v ớ i giá tr ị c ủ a các bi ể u_th ứ c_i bên d ướ i lầ n l ượ t t ừ bi ể u th ứ c đ ầ u tiên (th ứ nh ấ t) cho đ ế n bi ể u th ứ c cu ố i cùng (th ứ n), n ế u giá tr ị củ a btđk b ằ ng giá tr ị c ủ a bi ể u th ứ c th ứ i đ ầ u tiên nào đó thì ch ươ ng trình s ẽ th ự c hi ệ n dãy lệứ nh th i và ti ếụựệấảệ p t c th c hi n t t c dãy l nh còn l ạừệứ i (t dãy l nh th i+1) cho đ ế n hế t (g ặ p d ấ u ngo ặ c đóng } c ủ a l ệ nh switch). N ế u quá trình so sánh không g ặ p bi ể u th ứ c (nhánh case) nào bằ ng v ớ i giá tr ị c ủ a btđk thì ch ươ ng trình th ự c hi ệ n dãy l ệ nh trong default và tiế p t ụ c cho đ ế n h ế t (sau default có th ể còn nh ữ ng nhánh case khác). Tr ườ ng hợ p câu l ệ nh switch không có nhánh default và btđk không kh ớ p v ớ i b ấ t c ứ nhánh case nào thì chươ ng trình không làm gì, coi nh ư đã th ự c hi ệ n xong l ệ nh switch. Nế u mu ố n l ệ nh switch ch ỉ th ự c hi ệ n nhánh th ứ i (khi btđk = bi ể u_th ứ c_i) mà không phả i th ự c hi ệ n thêm các l ệ nh còn l ạ i thì cu ố i dãy l ệ nh th ứ i thông th ườ ng ta đ ặ t thêm lệ nh break; đây là l ệ nh cho phép thoát ra kh ỏ i m ộ t l ệ nh c ấ u trúc b ấ t kỳ. d. Ví dụ minh ho ạ Ví dụ 1 : In s ố ngày c ủ a m ộ t tháng b ấ t kỳ nào đó đ ượ c nh ậ p t ừ bàn phím. int th; cout > th ; switch (th) 44Chươ ng 3. C ấ u trúc đi ề u khi ể n và d ữ li ệ u ki ể u m ả ng { case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout << "tháng này có 31 ngày" ; break ; case 2: cout << "tháng này có 28 ngày" ; break; case 4: case 6: case 9: case 11: cout << "tháng này có 30 ngày" ; break; default: cout << "Bạ n đã nh ậ p sai tháng, không có tháng này" ; } Trong chươ ng trình trên gi ả s ử NSD nh ậ p tháng là 5 thì ch ươ ng trình b ắ t đ ầ u th ự c hiệ n dãy l ệ nh sau case 5 (không có l ệ nh nào) sau đó ti ế p t ụ c th ự c hi ệ n các l ệ nh còn l ạ i, cụ th ể là b ắ t đ ầ u t ừ dãy l ệ nh trong case 7, đ ế n case 12 ch ươ ng trình g ặ p l ệ nh in k ế t qu ả "tháng này có 31 ngày", sau đó gặ p l ệ nh break nên ch ươ ng trình thoát ra kh ỏ i câu l ệ nh switch (đã thự c hi ệ n xong). Vi ệ c gi ả i thích cũng t ươ ng t ự cho các tr ườ ng h ợ p khác c ủ a tháng. Nế u NSD nh ậ p sai tháng (ví d ụ tháng n ằ m ngoài ph ạ m vi 1 12), ch ươ ng trình
  36. thấ y th không kh ớ p v ớ i b ấ t kỳ nhánh case nào nên s ẽ th ự c hi ệ n câu l ệ nh trong default, in ra màn hình dòng chữ "B ạ n đã nh ậ p sai tháng, không có tháng này" và k ế t thúc l ệ nh. Ví dụ 2 : Nh ậ p 2 s ố a và b vào t ừ bàn phím. Nh ậ p kí t ự th ể hi ệ n m ộ t trong b ố n phép toán: cộ ng, tr ừ , nhân, chia. In ra k ế t qu ả th ự c hi ệ n phép toán đó trên 2 s ố a, b. void main() { float a, b, c ; // các toán hạ ng a, b và k ế t qu ả c char dau ; // phép toán đượ c cho d ướ i d ạ ng kí t ự cout > a >> b ; cout > dau ; switch (dau) { case '+': c = a + b ; break ; case '−': c = a - b ; break ; case 'x': case '.': case '*': c = a * b ; break ; case ':': case '/': c = a / b ; break ; } cout ; Vị trí ch ươ ng trình chuy ể n đ ế n th ự c hi ệ n là đo ạ n l ệ nh đ ứ ng sau nhãn và d ấ u hai chấ m (:). c. Ví dụ minh ho ạ Ví dụ 3 : Nhân 2 s ố nguyên theo ph ươ ng pháp Ấ n đ ộ . Phươ ng pháp Ấ n đ ộ cho phép nhân 2 s ố nguyên b ằ ng cách ch ỉ dùng các phép toán nhân đôi, chia đôi và cộ ng. Các phép nhân đôi và chia đôi th ự c ch ấ t là phép toán dị ch bit v ề bên trái (nhân) ho ặ c bên ph ả i (chia) 1 bit. Đây là các phép toán c ơ s ở trong bộ x ử lý, do v ậ y dùng ph ươ ng pháp này s ẽ làm cho vi ệ c nhân các s ố nguyên đ ượ c th ự c hiệ n r ấ t nhanh. Có th ể tóm t ắ t ph ươ ng pháp nh ư sau: Gi ả s ử c ầ n nhân m v ớ i n. Ki ể m tra m nế u l ẻ thì c ộ ng thêm n vào kq (đ ầ u tiên kq đ ượ c kh ở i t ạ o b ằ ng 0), sau đó l ấ y m chia 2 và n nhân 2. Quay lạ i ki ể m tra m và th ự c hi ệ n nh ư trên. Quá trình d ừ ng khi không thể chia đôi m đ ượ c n ữ a (m = 0), khi đó kq là k ế t qu ả c ầ n tìm (t ứ c kq = m*n). Để d ễ hi ể u ph ươ ng pháp này chúng ta ti ế n hành tính trên ví d ụ v ớ i các s ố m, n c ụ th ể .
  37. Giả s ử m = 21 và n = 11. Các b ướ c ti ế n hành đ ượ c cho trong b ả ng d ướ i đây: Bướ c m (chia 2) n (nhân 2) kq (kh ở i t ạ o kq = 0) 1 21 11 m lẻ , c ộ ng thêm 11 vào kq = 0 + 11 = 11 2 10 22 m chẵ n, b ỏ qua 3 5 44 m lẻ , c ộ ng thêm 44 vào kq = 11 + 44 = 55 46Chươ ng 3. C ấ u trúc đi ề u khi ể n và d ữ li ệ u ki ể u m ả ng 4 2 88 m chẵ n, b ỏ qua 5 1 176 m lẻ , c ộ ng thêm 176 vào kq = 55 + 176 = 231 6 0 m = 0, dừ ng cho k ế t qu ả kq = 231 Sau đây là chươ ng trình đ ượ c vi ế t v ớ i câu l ệ nh goto. void main() { long m, n, kq = 0; // Các số c ầ n nhân và k ế t qu ả kq cout > m >> n ; lap: // đây là nhãn để ch ươ ng trình quay l ạ i if (m%2) kq += n; // nế u m l ẻ thì c ộ ng thêm n vào kq m = m >> 1; // dị ch m sang ph ả i 1 bit t ứ c m = m / 2 n = n << 1; // dị ch m sang trái 1 bit t ứ c m = m * 2 if (m) goto lap; // quay lạ i n ế u m ≠ 0 cout << “m nhân n =” << kq ; } II. CẤẶ U TRÚC L P Mộ t trong nh ữ ng c ấ u trúc quan tr ọ ng c ủ a l ậ p trình c ấ u trúc là các câu l ệ nh cho phép lặ p nhi ề u l ầ n m ộ t đo ạ n l ệ nh nào đó c ủ a ch ươ ng trình. Ch ẳ ng h ạ n trong ví d ụ v ề bài toán nhân theo phươ ng pháp Ấ n đ ộ , đ ể l ặ p l ạ i m ộ t đo ạ n l ệ nh chúng ta đã s ử d ụ ng câu lệ nh goto. Tuy nhiên nh ư đã l ư u ý vi ệ c dùng nhi ề u câu l ệ nh này làm ch ươ ng trình r ấ t khó đọ c. Do v ậ y c ầ n có nh ữ ng câu l ệ nh khác tr ự c quan h ơ n và th ự c hi ệ n các phép l ặ p mộ t cách tr ựế c ti p. C++ cung c ấ p cho chúng ta 3 l ệặưậềựấệ nh l p nh v y. V th c ch t 3 l nh này là tươ ng đ ươ ng (cũng nh ư có th ể dùng goto thay cho c ả 3 l ệ nh l ặ p này), tuy nhiên để ch ươ ng trình vi ế t đ ượ c sáng s ủ a, rõ ràng, C++ đã cung c ấ p nhi ề u ph ươ ng án cho NSD lự a ch ọ n câu l ệ nh khi vi ế t ch ươ ng trình phù h ợ p v ớ i tính ch ấ t l ặ p. M ỗ i bài toán lặ p có m ộ t đ ặ c tr ư ng riêng, ví d ụ l ặ p cho đ ế n khi đã đ ủ s ố l ầ n đ ị nh tr ướ c thì d ừ ng ho ặ c lặ p cho đ ế n khi m ộ t đi ề u ki ệ n nào đó không còn tho ả mãn n ữ a thì d ừ ng vi ệ c s ử dụ ng câu l ệ nh l ặ p phù h ợ p s ẽ làm cho ch ươ ng trình d ễ đ ọ c và d ễ b ả o trì h ơ n. Đây là ý nghĩa chung củ a các câu l ệ nh l ặ p, do v ậ y trong các trình bày v ề câu l ệ nh ti ế p theo sau đây chúng ta sẽ không c ầ n ph ả i trình bày l ạ i ý nghĩa c ủ a chúng. 1. Lệ nh l ặ p for 47Chươ ng 3. C ấ u trúc đi ề u khi ể n và d ữ li ệ u ki ể u m ả ng a. Cú pháp for (dãy biể u th ứ c 1 ; đi ề u ki ệ n l ặ p ; dãy bi ể u th ứ c 2) { kh ố i l ệ nh l ặ p; } − Các biể u th ứ c trong các dãy bi ể u th ứ c 1, 2 cách nhau b ở i d ấ u ph ả y (,). Có th ể có nhiề u bi ể u th ứ c trong các dãy này ho ặ c dãy bi ể u th ứ c cũng có th ể tr ố ng. − Điề u ki ệ n l ặ p: là bi ể u th ứ c lôgic (có giá tr ị đúng, sai). − Các dãy biểứ u th c và/ho ặềệ c đi u ki n có th ểố tr ng tuy nhiên v ẫữạ n gi l i các d ấ u
  38. chấ m ph ả y (;) đ ể ngăn cách các thành ph ầ n v ớ i nhau. b. Cách thự c hi ệ n Khi gặ p câu l ệ nh for trình t ự th ự c hi ệ n c ủ a ch ươ ng trình nh ư sau: • Thự c hi ệ n dãy bi ể u th ứ c 1 (thông th ườ ng là các l ệ nh kh ở i t ạ o cho m ộ t s ố biế n), • Kiể m tra đi ềệặế u ki n l p, n u đúng thì th ựệốệặ c hi n kh i l nh l p → th ựệ c hi n dãy biể u th ứ c 2 → quay lai ki ể m tra đi ề u ki ệ n l ặ p và l ặ p l ạ i quá trình trên cho đ ế n bướ c nào đó vi ệ c ki ể m tra đi ề u ki ệ n l ặ p cho k ế t qu ả sai thì d ừ ng. Tóm lạ i, bi ể u th ứ c 1 s ẽ đ ượ c th ự c hi ệ n 1 l ầ n duy nh ấ t ngay t ừ đ ầ u quá trình l ặ p sau đó thự c hi ệ n các câu l ệ nh l ặ p và dãy bi ể u th ứ c 2 cho đ ế n khi nào không còn tho ả điề u ki ệ n l ặ p n ữ a thì d ừ ng. c. Ví dụ minh ho ạ Ví dụ 1 : Nhân 2 s ố nguyên theo ph ươ ng pháp Ấ n đ ộ void main() { long m, n, kq; // Các số c ầ n nhân và k ế t qu ả kq cout > m >> n ; for (kq = 0 ; m ; m >>= 1, n >= 1 và n > 1 (tươ ng đ ươ ng v ớ i m = m / 2) và n = n << 1 (t ươ ng đ ươ ng v ớ i n = n * 2). − Khốệặỉộệ i l nh l p: ch có m t l nh duy nh ấ t if (m%2) kq += n ; (n ếầưủ u ph n d c a m chia 2 là khác 0, tứ c m l ẻ thì c ộ ng thêm n vào kq). Cách thự c hi ệ n c ủ a ch ươ ng trình nh ư sau: • Đầ u tiên th ự c hi ệ n bi ể u th ứ c 1 t ứ c gán kq = 0. Chú ý r ằ ng n ế u kq đã đ ượ c khở i t ạ o tr ướ c b ằ ng 0 trong khi khai báo (gi ố ng nh ư trong ví d ụ 6) thì thành phầểứở n bi u th c 1 đây có th ểểố đ tr ng (nh ưẫữạấể ng v n gi l i d u ; đ phân bi ệ t vớ i các thành ph ầ n khác). • Kiể m tra đi ềệảử u ki n: gi s m ≠ 0 (t ứềệ c đi u ki n đúng) for s ẽựệệặ th c hi n l nh l p tứ c ki ể m tra n ế u m l ẻ thì c ộ ng thêm n vào cho kq. • Quay lạ i th ự c hi ệ n các bi ể u th ứ c 2 t ứ c chia đôi m và nhân đôi n và vòng l ặ p đượ c ti ế p t ụ c l ạ i b ắ t đ ầ u b ằ ng vi ệ c ki ể m tra m • Đế n m ộ t b ướ c l ặ p nào đó m s ẽ b ằ ng 0 (vì b ị chia đôi liên ti ế p), đi ề u ki ệ n không thoả , vòng l ặ p d ừ ng và cho ta k ế t qu ả là kq. Ví dụ 2 : Tính t ổ ng c ủ a dãy các s ố t ừ 1 đ ế n 100. Chươ ng trình dùng m ộ t bi ế n đ ế m i đ ượ c kh ở i t ạ o t ừ 1, và m ộ t bi ế n kq đ ể ch ứ a tổ ng. M ỗ i b ướ c l ặ p ch ươ ng trình c ộ ng i vào kq và sau đó tăng i lên 1 đ ơ n v ị . Ch ươ ng trình còn lặ p khi nào i còn ch ư a v ượ t qua 100. Khi i l ớ n h ơ n 100 ch ươ ng trình d ừ ng. Sau đây là văn bả n ch ươ ng trình.