Lập trình C++ - ĐH xây dựng Hà Nội

49 584 9
Lập trình C++ - ĐH xây dựng Hà Nội

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Lập trình C++ đại học xây dựng Hà Nội

NGUYỄN PHÚ QUẢNG BỘ MÔN TIN HỌC XÂY DỰNG KHOA CÔNG NGHỆ THÔNG TIN – ĐẠI HỌC XÂY DỰNG LẬP TRÌNH C++ Tài liệu lưu hành nội bộ version 0.0.2 Lập trình C++ Nguyễn Phú Quảng Mục lục I. MỞ ĐẦU 4 I.1. Môi trường phát triển 4 I.2. Chương trình đầu tiên 4 I.3. Input & Output 5 II. NGÔN NGỮ 5 II.1. Cơ bản về ngôn ngữ 5 II.2. Kiểu 5 II.3. Chuyển đổi giữa các kiểu 7 II.4. Biểu thức & toán tử 7 III. LỆNH 9 III.1. Lệnh dạng biểu thức 9 III.2. Khối lệnh 9 III.3. Lệnh rẽ nhánh 9 III.4. Vòng lặp for 10 III.5. Vòng lặp while 13 III.6. Vòng lặp do while 13 III.7. Nhảy không điều kiện 13 IV. HÀM 13 IV.1. Định nghĩa hàm 13 IV.2. Ví dụ khai báo hàm 14 IV.3. Khi nào sử dụng hàm 14 IV.4. Hàm được gọi như thế nào? 14 IV.5. Hàm gọi đệ quy 15 V. MẢNG 17 V.1. Định nghĩa 17 V.2. Truy cập phần tử của mảng 17 V.3. Khởi tạo mảng 17 V.4. Mảng nhiều chiều 17 V.5. Sử dụng mảng làm tham số của hàm 17 VI. CON TRỎ 17 VI.1. Khai báo con trỏ 17 VI.2. Các toán tử trên con trỏ 17 VI.3. Con trỏ và mảng 17 VI.4. Con trỏ hàm 17 VII. STRUCT 17 VII.1. Định nghĩa Struct 17 VII.2. Khai báo biến 18 VII.3. Truy cập trường 18 VIII. Stream 18 VIII.1. File stream 18 VIII.2. String stream 19 VIII.3. Ghi có định dạng 19 IX. KIỂU NGƯỜI DÙNG ĐỊNH NGHĨA 21 X. CẤP PHÁT BỘ NHỚ ĐỘNG 21 2 Lập trình C++ Nguyễn Phú Quảng XI. LỚP 21 XII. MẪU 21 XIII. THƯ VIỆN CHUẨN 21 XIII.1. Các khái niệm 21 XIII.2. Kiểu vector 22 XIII.3. Kiểu string 26 XIII.4. Kiểu list (danh sách) 29 XIII.5. Kiểu set (tập hợp) 32 XIII.6. Kiểu map (ánh xạ) 32 XIII.7. Kiểu hash_map (ánh xạ dùng mảng băm) 34 XIII.8. Kiểu hash_set (tập hợp) 35 XIII.9. Thuật toán (Algorithm) 35 XIV. GIẢI MỘT SỐ BÀI TOÁN BẰNG STL 43 XIV.1. Quản lý sinh viên 43 XIV.2. Rào đất 45 XIV.3. Robot 46 XIV.4. Dijsktra 47 XIV.5. Hợp diện tích hình chữ nhật .47 XV. INPUT VÀ OUTPUT 49 3 Lập trình C++ Nguyễn Phú Quảng I. MỞ ĐẦU C++ là ngôn ngữ mạnh, được phát triển từ ngôn ngữ C. Học C++ đem lại nhiều lợi thế cho bạn với khối lượng mã nguồn vào loại lớn nhất trong các ngôn ngữ, cũng như tính tương đồng với hầu hết các ngôn ngữ tựa C (C-like language). Tài liệu này mong muốn giúp bạn có một cái nhìn tổng thể với cách tiếp cận thật ngắn gọn. Cấu trúc sách dựa trên cuốn "C++ in a nutshell" của nhà xuất bản O'Reilly. Tại Việt nam, đã có rất nhiều cuốn sách giới thiệu về C, C++. Trong tài liệu này, chúng tôi không mang tham vọng xây dựng một giáo trình về C++ mà chỉ là những đúc kết kinh nghiệm mà chúng tôi đã trực tiếp làm việc với C++, nhất là trong những bài toán thiên về giải thuật. Mọi góp ý xin gửi về địa chỉ: nguyenphuquang@gmail.com. Xin chân thành cảm ơn mọi đóng góp của các bạn. I.1. Môi trường phát triển Để thuận tiện cho việc học ngôn ngữ, chúng tôi xin giới thiệu 2 môi trường quen thuộc để bạn có thể thực hành lập trình C++. Microsoft Visual C++ (6.0, 7.0, 7.1): phần mềm này nằm trong bộ phần mềm Microsoft Visual Studio. DevC++ 5.0: Bạn có thể tải miễn phí từ địa chỉ http://www.bloodshed.net/devcpp.html, chúng tôi khuyến khích các bạn sử dụng phần mềm miễn phí này. Toàn bộ chương trình minh họa đều có thể chạy trên cả 2 môi trường VC++ và DevC. I.2. Chương trình đầu tiên Mở DevC, bạn tạo file mới, gõ vào đoạn chương trình dưới đây và lưu lại (tất nhiên là không gõ vào số dòng, trong tất cả các chương trình minh họa, chúng tôi sử dụng số dòng để giải thích cho chương trình). Sau đó bấm Ctrl+F9 để dịch chương trình, bấm Ctrl+F10 để chạy chương trình, bạn sẽ thấy một màn hình màu đen và dòng chữ "Hello every body!", khi bạn gõ 1 phím bất kỳ thì màn hình màu đen sẽ đóng lại. 01 #include <iostream> 02 #include <stdio.h> 03 04 using namespace std; 05 int main() { 06 cout << "Hello every body!" << endl; 07 getchar(); 08 } Dòng 01, 02: Sử dụng 2 thư viện iostream và stdio.h Dòng 04: Khi các chương trình dài và phức tạp, việc đặt tên cho các biến, hàm gặp khó khăn. Để dễ dàng hơn khi đặt tên, người ta chia tên thành nhiều không gian khác nhau gọi là namespace. std là một namespace được sử dụng trong iostream và một số thư viện chuẩn khác. Dòng 05: Hàm main là hàm không thể thiếu trong các chương trình C++. Khi chương trình được thực thi, nó sẽ gọi đến hàm main. Dòng 06: Trong C++, khái niệm stream chỉ một dòng dữ liệu (đầu vào hoặc đầu ra). Trong trường hợp này cout là dòng dữ liệu ra (mặc định là màn hình). Sử dụng toán tử <<, chúng ta thực hiện việc đưa 2 dữ liệu lần lượt là xâu ký tự "Hello every body!" và ký tự xuống dòng endl ra màn hình. 4 Lập trình C++ Nguyễn Phú Quảng Dòng 07: getchar() là hàm giúp chương trình dừng lại và đợi người dùng gõ một phím bất kỳ. Thực chất, trong ví dụ này không cần phải dừng chương trình. Nhưng do đặc tính của môi trường DevC và VC là màn hình output sẽ biến mất sau khi chương trình chạy xong, do đó chúng tôi đưa thêm lệnh này để dừng chương trình lại, giúp các bạn quan sát thấy xâu ký tự in trên màn hình. I.3. Input & Output II. NGÔN NGỮ II.1. Cơ bản về ngôn ngữ Ngôn ngữ lập có nhiều điểm tương tự với ngôn ngữ tự nhiên - Chứa một tập từ khóa (giống với từ vựng của ngôn ngữ tự nhiên) - Chứa một loạt các quy tắc kết hợp các từ khóa, toán tử với nhau (giống với ngữ pháp trong ngôn ngữ tự nhiên) Khi bạn đã thạo một ngôn ngữ lập trình, việc học một ngôn ngữ khác là tương đối đơn giản (cũng như bạn đã học tiếng Anh thì có thể học tiếng Pháp rất nhanh vì hai ngôn ngữ này có nhiều từ tương đồng với nhau). Việc học ngôn C++ (cũng như học tiếng Anh) đem lại cho bạn lợi thế rất lớn vì đây là ngôn ngữ được sử dụng phổ biến nhất. Hơn thế nữa có rất nhiều các ngôn ngữ lập trình khác được xây dựng trên cơ sở cú pháp của C++ (gọi là các ngôn ngữ giống-C – C-like), do đó bạn có thể tiếp cận rất nhanh với các ngôn ngữ này nếu đã thông thạo với C++. II.2. Kiểu II.2.1. Các kiểu cơ bản Phần này trình bày các kiểu dữ liệu cơ bản của C++. Trong giới hạn của tài liệu này, tôi không trình bày về con trỏ. Mặc dù con trỏ là một trong nhưng đặc điểm nổi bật của C++ nhưng tính phức tạp của con trỏ dễ gây nhầm lẫn cho người mới làm quen. Chúng ta sẽ giải quyết các bài toán trên C++ mà không hoặc hạn chế tối đa sử dụng con trỏ. a. Kiểu số • Số nguyên - Kiểu char (1 byte): (-128 đến 127) - Kiểu short (2 byte): (-32768 đến 32767) - Kiểu int, long (4 byte): (-2 tỷ đến 2 tỷ) - Tất cả các kiểu trên, nếu bổ sung unsign : o unsign char: o unsign short: o unsign int: - Việc lựa chọn kiểu dữ liệu trong bài toán phục thuộc vào vùng giá trị của biến. Khoảng giá trị càng lớn, biến càng chiếm nhiều bộ nhớ. Chương trình C++ dịch trên DevC hoạt động trên môi trường Windows thường là hệ điều hành 32 bit, số nguyên được sử dụng phổ biến nhất là kiểu int. 5 Lập trình C++ Nguyễn Phú Quảng - Ví dụ char a; int b = 20; long c = 30; unsign char d = 200; • Số thực - float (4 byte): Số thực độ chính xác đơn. - double (8 byte): Số thực độ chính xác kép. • Logic - bool : có 2 giá trị là true và false II.2.2. Các kiểu phức a. Kiểu mảng - Mảng là một dãy các phần tử cùng kiểu được sắp liên tiếp nhau trong bộ nhớ - Các phần tử được phân biệt với nhau bởi chỉ số, là các số tuần tự bắt đầu từ 0 - Ví dụ int a[100]; // Khai báo mảng gồm 100 số int // a[0] là 1 số int, phần tử đầu tiên của mảng // a[1] là 1 số int, phần tử thứ 2 của mảng // a[99] là 1 số int, phần tử cuối cùng của mảng long b[10]; // Khai báo mảng gồm 10 số long - Mảng được khai báo theo ví dụ trên là mảng 1 chiều. Chiều của mảng là số chỉ số sử dụng để xác định một phần tử (giống như hệ tọa độ 1 chiều, 2 chiều, 3 chiều) - Ví dụ khai bao và sử dụng mảng nhiều chiều như sau int a[3][3]; // Khai báo a là mảng 2 chiều (giống như 1 bảng) // a[0] là một mảng 1 chiều gồm 3 số nguyên (giống như 1 dòng của bảng) // a[0][0] là số int đầu tiên của dòng // a[0][1] là số int thứ 2 của dòng // a[0][2] là số int cuối cùng của dòng // a[1] là dòng thứ 2 của bảng // a[2] là dòng cuối cùng của bảng a[1][1] = 5; // Gán giá trị của số nguyên ở dòng 1, cột 1 là 5 b. Kiểu struct Struct là kiểu dữ liệu cho phép bạn tập hợp nhiều thành phần vào trong cùng một biến. Lấy ví dụ thông tin của một điểm gồm 2 tọa độ x, y, thông tin của một đoạn thẳng gồm điểm đầu và điểm cuối. Struct là kiểu dữ liệu, do đó bạn phải khai báo kiểu dữ liệu đó bằng lệnh typedef rồi mới có thể khai báo được các biến thuộc kiểu này. Cú pháp khai báo struct như sau: struct <Tên_kiểu> { // Khai báo kiểu struct <Kiểu_trường_1> <Tên_trường_1>; // Trường của struct (giống khai báo biến) <Kiểu_trường_2> <Tên_trường_2>, <Tên_trường_3>; }; <Tên_kiểu> <biến_1>, <biến_2>; // Khai báo biến thuộc kiểu mới tạo ra <biến_1>.<Tên_trường_1> = <Giá_trị>; // Truy cập trường dữ liệu của biến Các thành phần khai báo bên trong struct được gọi là trường (field). Một struct gồm nhiều trường, biến thuộc kiểu struct 6 Lập trình C++ Nguyễn Phú Quảng II.2.3. Các kiểu stl a. Kiểu string b. Kiểu vector c. Kiểu vector II.3. Chuyển đổi giữa các kiểu II.4. Biểu thức & toán tử II.4.1. Biểu thức Biểu thức là kết hợp của các toán tử và toán hạng. Toán hạng có thể là các số hoặc các biến. II.4.2. Toán tử a. Các phép toán số học - Phép cộng + o a + b - Phép trừ - o a - b - Phép nhân * o a * b - Phép chia /: Chú ý trong phép chia o Nếu cả 2 toán hạng cùng là số nguyên thì phép chia là chia nguyên  10 / 3 cho giá trị 3 o Nếu 1 trong 2 toán hạng là số thực thì phép chia là chia số thực  10.0 / 3 cho giá trị 3.3333333 - Phép lấy dư: % o 10 % 3 cho giá trị 1 b. Các phép toán so sánh - So sánh bằng == o 10 == 3 cho giá trị false o 10 == 10 cho giá trị true - So sánh khác != o 10 != 3 cho giá trị true 7 Lập trình C++ Nguyễn Phú Quảng - So sánh lớn hơn > - So sánh nhỏ hơn < - So sánh lớn hơn hay bằng >= - So sánh nhỏ hơn hay bằng <= c. Các phép toán logic - Phép toán and && o 10==3 && 5>4: cho giá trị false o 10>3 && 5>4: cho giá trị true - Phép toán or || o 10==3 || 5>4: cho giá trị true o 10==3 || 5<4 cho giá trị false - Phép toán not ! o !(10==3) cho giá trị d. Các phép toán trên bit - Phép toán and từng bit & o 10 & 3 = 1010 2 & 0011 2 = 0010 2 o 10 & 15 = 1010 2 & 1111 2 =1010 2 - Phép toán or từng bit | o 10 | 3 = 1010 2 | 0011 2 = 1011 2 o 10 | 15 = 1010 2 | 1111 2 = 1111 2 e. Các phép toán 1 ngôi - Phép tăng 1 đơn vị o i++ (chỉ dành cho biến có giá trị nguyên) - Phép giảm 1 đơn vị o i— - Phép tăng giá trị của biến o i += 2 - Phép giảm giá trị của biến o i -= 2 - Phép nhân giá trị của biến với 1 số o i *= 5 - Phép chia giá trị của biến cho 1 số o i /= 5 - Các phép toán khác như &=, |=, &&=, ||= tương tự 8 Lập trình C++ Nguyễn Phú Quảng III. LỆNH III.1. Lệnh dạng biểu thức III.1.1. Phép gán Tên biến = Biểu thức; - Biểu thức có thể là 1 hằng số - Biểu thức có thể là 1 biến - Biểu thức có thể là biến và hằng số kết hợp với nhau bởi toán tử III.2. Khối lệnh Các khối lệnh để phân chương trình thành nhiều khối con. Việc phân khối giúp chương trình rõ ràng, dễ hiểu hơn theo nguyên tắc chia để trị. Một khối lệnh được đặt trong cặp ngoặc { } và được coi như một lệnh đơn. C++ cho phép khai báo biến tại bất kỳ nơi nào trong chương trình. Biến khai báo trong khối lệnh nào thì chỉ tồn tại trong khối chương trình đó (biến khai báo trong khối chương trình trong không thể sử dụng trong khối chương trình ngoài). Ví dụ về việc sử dụng các khối chương trình. if (a>b) { int m; // Biến m khai báo trong khối if (a>b) m = 1; // m có thể được sử dụng tại cùng khối chương trình if (d>e) { m = 5; // m có thể được sử dụng tại khối chương trình bên trong } } else { m = 10; // m không thể sử dụng được ở khối chương trình ngoài } III.3. Lệnh rẽ nhánh Lệnh if sử dụng để có hay không thực hiện một đoạn chương trình theo một điều kiện (gọi là rẽ nhánh). Lệnh if gồm 2 dạng: rút gọn và đầy đủ - Dạng rút gọn: Nếu <Điều_kiện> đúng thì thực hiện <Lệnh> if (<Điều_kiện>) { <Lệnh> } o <Điều_kiện> có thể là  Một biểu thức logic  Một biểu thức kiểu số (số khác 0 được coi là đúng, bằng 0 là sai) o Nếu <Lệnh> chỉ là 1 lệnh đơn, bạn không cần để trong khối chương trình bằng cặp ngoặc {}. Tuy nhiên, việc này không được khuyến khích. - Dạng đầy đủ: Nếu <Điều_kiện> là đúng thì thực hiện <Lệnh_nếu_đúng>, ngược lại thực hiện <Lệnh_nếu_sai> if (<Điều_kiện>) { <Lệnh_nếu_đúng>; } else { <Lệnh_nếu_sai>; } If là một cấu trúc điều khiển được sử dụng phổ biến nhất. Đoạn chương trình sau sẽ nêu ví dụ sử dụng lệnh if. 9 Lập trình C++ Nguyễn Phú Quảng #include <iostream> #include <stdlib.h> using namespace std; int main () { int gio; cout << "Nhap vao gio (0-24): "; cin >> gio; if (gio<12) { cout << "Chao buoi sang"; } else { cout << "Chao buoi chieu"; } getchar(); getchar(); } III.4. Vòng lặp for III.4.1. Cú pháp vòng lặp for Vòng lặp for của C++ khái quát hơn vòng lặp for của Pascal. Bạn có thể sử dụng vòng lặp với cú pháp rất mềm dẻo cho nhiều hoàn cảnh khác nhau. Cú pháp của vòng lặp for như sau: for (<Lệnh_khởi_tạo> ; <Điều_kiện> ; <Lệnh_thay_đổi>) { <Lệnh_lặp>; } Trình tự thực hiện của vòng lặp như sau: - Thực hiện <Lệnh_khởi_tạo> - Kiểm tra <Điều_kiện> o Nếu <Điều_kiện> là đúng:  Thực hiện <Lệnh_lặp>  Thực hiện <Lệnh_thay_đổi> để thay đổi trạng thái  Lặp lại bước thứ 2 (Kiểm tra điều kiện) o Nếu <Điều_kiện> sai, thoát khỏi vòng lặp Xét ví dụ sau: for (int i=0; i<3; i++) { cout << "i = " << i << endl; } - Thực hiện lệnh khởi tạo (i=0) - Kiểm tra điều kiện (i<3) o i=0 nên điều kiện là đúng  Thực hiện lệnh cout lệnh này viết ra màn hình dòng chữ "i = 0"  Thực hiện lệnh thay đổi i++ (i tăng từ 0 thành 1)  Lặp lại bước kiểm tra - Kiểm tra điều kiện (i<3) o i=1 nên điều kiện là đúng  Thực hiện lệnh cout lệnh này viết ra màn hình dòng chữ "i = 1" 10 [...]... Do thư viện gồm rất nhiều hàm khác nhau, người ta phân thành các nhóm hàm sau: - Nhóm các hàm không thay đổi giá trị của container - Nhóm các hàm thay đổi giá trị của container - Nhóm các hàm sắp xếp - Nhóm các hàm trên danh sách được sắp xếp - Nhóm các hàm trộn - Nhóm các làm trên heap - Nhóm các hàm tìm min/max XIII.9.1 a Nhóm các hàm không thay đổi giá trị của container Các thuật... hết cho 1 số j, Chương trình sẽ nhảy trực tiếp đến // vị trí KoNguyenTo KoNguyenTo:; } getchar(); } IV HÀM IV.1 Định nghĩa hàm Cú pháp: ([Danh_sách_tham_số]) { ; return ; ; } Trong đó: - : Kiểu giá trị trả về của hàm, (nếu hàm không trả về giá trị, kiểu hàm là void) 13 Lập trình C++ Nguyễn Phú Quảng - : Tên của hàm (quy ước giống như... tích quá trình hoạt động của các hàm khi gọi đệ quy qua bảng sau 15 Lập trình C++ Nguyễn Phú Quảng Bước Mô tả main() Chương trình bắt đầu hoạt động từ hàm main() gọi GiaiThua(4) Hàm main() thực hiện lời gọi hàm GiaiThua(4) 4 Hàm GiaiThua(4) GiaiThua(3) 3 gọi GiaiThua(3) Stack gọi hàm 4 gọi GiaiThua(2) Hàm GiaiThua(3) GiaiThua(2) gọi hàm 2 3 4 gọi GiaiThua(1) Hàm GiaiThua(2) GiaiThua(1) gọi hàm 1 2 3... theo quy trình ngược lại - Lấy các biến đã khai báo ra khỏi stack - Lưu lại giá trị trả về của hàm (trong thanh ghi) - Trỏ chương trình về vị trí cũ (trước khi gọi hàm) Với quy trình này, có thể nhận ra các đặc điểm sau: - Khi gọi hàm, bộ nhớ của stack đầy lên bằng tổng kích thước của các tham số và các biến khai báo trong hàm 14 Lập trình C++ Nguyễn Phú Quảng - Sau khi thoát khỏi hàm, vùng bộ nhớ cấp... số của hàm được lưu trong stack, mỗi khi bạn gọi hàm, máy tính thực hiện các công việc sau: - Lần lượt đưa các tham số vào trong stack - Lưu lại vị trí gọi hàm (của hàm hiện tại) - Trỏ chương trình sang vị trí mới (của hàm được gọi) - Lấy các tham số ra khỏi stack - Mỗi biến được khai báo trong chương trình con sẽ được đưa vào stack Khi thoát khỏi chương trình con, máy tính làm việc theo quy trình ngược... 0173 // 7b 20 Lập trình C++ Nguyễn Phú Quảng IX KIỂU NGƯỜI DÙNG ĐỊNH NGHĨA X CẤP PHÁT BỘ NHỚ ĐỘNG XI LỚP XII MẪU XIII THƯ VIỆN CHUẨN C++ được đánh giá là ngôn ngữ mạnh vì tính mềm dẻo, gần gũi với ngôn ngữ máy Ngoài ra, với khả năng lập trình theo mẫu, C++ đã khiến ngôn ngữ lập trình trở thành khái quát, không cụ thể và chi tiết như nhiều ngôn ngữ khác Với khái niệm mẫu, những người lập trình đã đề ra... dụng hàm GiaiThua Bản thân hàm này sử dụng công thức truy hồi n! = n * (n-1)! Hàm GiaiThua(n) gọi hàm GiaiThua(n-1), GiaiThua(n-1) gọi GiaiThua(n-2) Cứ tuần tự cho đến hàm GiaiThua(1), hàm này quá đơn giản vì cho giá trị 1 nên không gọi đệ quy Như vậy, hàm GiaiThua(n) được tính bằng cách gọi đệ quy n lần thay vì dùng vòng lặp Để các bạn hiểu rõ hơn về đệ quy, chúng ta phân tích hoạt động của hàm GiaiThua(n)... tạo vector gồm 3 thành phần Tất cả gán giá trị 10 Đưa thành phần 0 ra màn hình Đưa thành phần 1 ra màn hình Đưa thành phần 2 ra màn hình Thành phần 3 (lệnh này hoạt động không đúng vì V chỉ có 3 thành phần 0,1,2 Thành phần 4 (càng không đúng) Nhưng 2 lệnh trên đều không gây lỗi // // // // Không Thành Thành Thành sử dụng phần 1, phần 2, phần 3: [], dùng phương thức at OK OK Lỗi, chương trình dừng // Dòng... trong hàm được khôi phục, stack trở về trạng thái cũ - Các hàm có thể gọi lẫn nhau, mỗi lần gọi hàm stack lại đầy thêm Stack chứa thông tin thứ tự các hàm gọi nhau và các biến trong hàm đó (thông tin này gọi là Call stack) IV.5 Hàm gọi đệ quy Đệ quy là cơ chế một hàm tự gọi chính nó Nhờ sử dụng stack, mỗi hàm sẽ có vùng nhớ lưu giữ tham số và biến của riêng nó Các vùng nhớ này được sắp xếp trên stack (hàm... trị n=1, hàm GiaiThua(1) không của gọi đệ quy mà trả về giá trị 1, GiaiThua(1) sau đó thoát ra, trở về hàm đã gọi nó (là hàm GiaiThua(2)) 1 2 3 4 Trả về giá trị n=2, Tính n*GiaiThua(1) = 2*1 của =2 GiaiThua(2) Trả về giá trị 2 Thoát trở về hàm đã gọi hàm này (là hàm GiaiThua(3)) Trả về giá trị n=3, Tính n*GiaiThua(2) = 3*2 của =6 GiaiThua(3) Trả về giá trị 6 Thoát trở về hàm đã gọi hàm này (là hàm GiaiThua(4))

Ngày đăng: 27/03/2014, 12:23

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan