Ngôn ngữ lập trình C và C++ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa

Tài liệu Ngôn ngữ lập trình C và C++ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa: 4/21/2015 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ngôn ngữ lập trình C và C++ Bài 4: Hàm và Cấu trúc chương trình TS. Đỗ Đăng Khoa Bộ môn Cơ học Ứng dụng Viện Cơ khí 4/21/2015 2 Khái niệm về Hàm Một vấn đề phức tạp thường được chia nhỏ thành các phần đơn giản hơn để giải quyết (lập trình top-down) Những phần này được gọi là các hàm hay chương trình con Là một nhóm các lệnh để thực hiện một việc cụ thể, có thể TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI được dùng lại nhiều lần. Hàm main() gọi các hàm này để giải quyết vấn đề phức tạp ban đầu Hai nhóm hàm: Hàm được định nghĩa trước: printf, scanf, cout, cin...và Hàm người dùng định nghĩa 2 4/21/2015 3 Ưu điểm của Hàm Các hàm được sử dụng để rút gọn cho một tập hợp các lệnh được sử dụng lại nhiều lần Hàm dễ viết và dễ hiểu Gỡ lỗi chương trình dễ dàng hơn khi cấu trúc của TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI chương trình rõ ràng với hình thức lập trình theo module Dễ dàng bảo trì, bởi vì sự sửa đổi khi có yêu cầu đư...

pdf40 trang | Chia sẻ: putihuynh11 | Lượt xem: 551 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Ngôn ngữ lập trình C và C++ - Bài 4: Hàm và cấu trúc chương trình - Đỗ Đăng Khoa, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
4/21/2015 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ngơn ngữ lập trình C và C++ Bài 4: Hàm và Cấu trúc chương trình TS. Đỗ Đăng Khoa Bộ mơn Cơ học Ứng dụng Viện Cơ khí 4/21/2015 2 Khái niệm về Hàm Một vấn đề phức tạp thường được chia nhỏ thành các phần đơn giản hơn để giải quyết (lập trình top-down) Những phần này được gọi là các hàm hay chương trình con Là một nhĩm các lệnh để thực hiện một việc cụ thể, cĩ thể TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI được dùng lại nhiều lần. Hàm main() gọi các hàm này để giải quyết vấn đề phức tạp ban đầu Hai nhĩm hàm: Hàm được định nghĩa trước: printf, scanf, cout, cin...và Hàm người dùng định nghĩa 2 4/21/2015 3 Ưu điểm của Hàm Các hàm được sử dụng để rút gọn cho một tập hợp các lệnh được sử dụng lại nhiều lần Hàm dễ viết và dễ hiểu Gỡ lỗi chương trình dễ dàng hơn khi cấu trúc của TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI chương trình rõ ràng với hình thức lập trình theo module Dễ dàng bảo trì, bởi vì sự sửa đổi khi cĩ yêu cầu được giới hạn trong từng hàm của chương trình 3 4/21/2015 4 Đầu vào và đầu ra của Hàm Hàm (Function) Kết quả TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 4 trả về Các tham số vào 4/21/2015 5 Khai báo Hàm  Khai báo một hàm cho trình biên dịch biết về tên của hàm, kiểu trả về và các tham số  Khai báo hàm thường được đặt trong tập tin tiêu đề  Việc khai báo hàm là bắt buộc khi hàm được sử dụng trước TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI khi nĩ được định nghĩa  Khai báo hàm cĩ dạng sau: Kiểu_dữ_liệu_trả_về tên_hàm( các_tham_số_vào) 4/21/2015 6 Khai báo hàm  Ví dụ: int max( int num1, int num2);  Hàm này nhận hai tham số nguyên và trả về một số kiểu nguyên  Tên các tham số khơng quan trọng trong khai báo hàm, TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI chỉ kiểu của chúng là cần thiết: int max( int, int) ; - Hàm khai báo như trên cịn được gọi là nguyên mẫu hàm. 4/21/2015 7 Định nghĩa một hàm Dạng tổng quát: Kiểu_dữ_liệu_trả_về Tên_hàm( Các_tham_số_vào) { phần thân hàm } Một định nghĩa hàm bao gồm đầu hàm và thân hàm. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - Kiểu_dữ_liệu_trả_về : kiểu của dữ liệu được hàm trả về. Sử dụng void với hàm khơng trả về giá trị nào. - Tên_hàm : tên hàm 4/21/2015 8 Ví dụ: hàm trả về số lớn nhất của hai số - Hàm max với 2 tham số /* function returning the max between two numbers */ int max(int num1, int num2) { int result; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI if (num1 > num2) result = num1; else result = num2; return result; } 4/21/2015 9 Gọi hàm  Chương trình khơng thực hiện các câu lệnh trong một hàm cho đến khi hàm đĩ được gọi  Khi chương trình gọi một hàm, điều khiển chương trình được chuyển đến hàm gọi. Hàm này thực hiện nhiệm vụ đã định và trả lại điều khiển chương trình cho TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI chương trình chính khi câu lệnh return được gọi hoặc đến hết hàm (dấu ngoặc nhọn đĩng, }).  Để gọi hàm, cần truyền các tham số yêu cầu cùng với tên hàm. Nếu hàm trả về giá trị thì cĩ thể lưu giá trị đĩ 4/21/2015 10 Gọi hàm → Gọi hàm với các TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI tham số yêu cầu ← Trở về câu lệnh tiếp theo 4/21/2015 11 Gọi hàm Dấu chấm phẩy được đặt cuối câu lệnh khi gọi hàm, Cặp dấu ngoặc () là bắt buộc theo sau tên hàm, cho dù hàm cĩ đối số hay khơng Hàm trả về nhiều nhất một giá trị TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Chương trình cĩ thể cĩ nhiều hơn một hàm Hàm gọi đến một hàm khác được gọi là hàm gọi Hàm đang được gọi đến được gọi là hàm được gọi 4/21/2015 12 Ví dụ #include using namespace std; // Khai báo hàm int max(int num1, int num2); int main () { // Định nghĩa hàm int max(int num1, int num2) { int result; if (num1 > num2) result = num1; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI int a = 100, b = 200, ret; // gọi hàm để lấy giá trị lớn nhất ret = max(a, b); cout <<"Max value = “ << ret; return 0; } else result = num2; return result; } 4/21/2015 13 Câu lệnh return  Kết thúc việc thực hiện hàm và trả lại điều khiển tới nơi gọi hàm. Các lệnh được thực hiện tiếp tục tại điểm ngay sau nơi gọi hàm.  return [expression];  Giá trị của biểu thức expression được trả lại nơi hàm gọi và cĩ kiểu tương ứng (hoặc được ép kiểu) tương ứng với kiểu TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI trả về.  Nếu bỏ qua expression, giá trị trả về của hàm khơng xác định.  Khi luồng điều khiển ra khỏi khối định nghĩa hàm, kết quả giống như thực hiện câu lệnh return khơng cĩ biểu thức.  Hàm cĩ thể cĩ số lượng câu lệnh return bất kỳ. 4/21/2015 14 Tham số của hàm  Nếu một hàm phải dùng các tham số, nĩ phải khai báo các biến để chấp nhận giá trị của các tham số. Các biến này được gọi là các tham số hình thức của hàm.  Tham số hình thức ứng xử giống như các biến cục bộ bên trong hàm và được tạo ra khi bắt đầu vào hàm và bị hủy khi ra khỏi hàm. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI  Khi gọi hàm, cĩ 3 cách mà tham số cĩ thể được truyền cho hàm:  Gọi theo giá trị (tham trị)  Gọi theo con trỏ  Gọi theo tham chiếu 4/21/2015 15 Gọi theo giá trị (tham trị) Khai báo tham số: kiểu tham_số Ví dụ: void swap(int a, int b); Gọi hàm: int c(5), d(7); swap(c, d); Cách thức này sao chép giá trị thực của tham số vào tham số hình thức của hàm. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI  Trong trường hợp này, những thay đổi với tham số hình thức bên trong hàm khơng ảnh hưởng đến tham số truyền vào. Mặc định, C/C++ sử dụng “gọi theo giá trị” để truyền tham số . Nĩi chung, điều này nghĩa là mã lệnh bên trong một hàm khơng thể thay đổi các tham số được dùng trong gọi hàm. 4/21/2015 16 Ví dụ: Hốn đổi hai số bằng tham trị #include using namespace std; // Khai báo hàm void swap(int a, int b); int main () { // Hàm hốn đổi hai số a và b void swap(int a, int b); { int c = a; a = b; b = c; } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI int c = 10, d = 20; // gọi hàm hốn đổi swap (c, d); cout <<“c = ” << c; cout <<“ d = ” << d; return 0; } Kết quả in ra: c = 10, d = 20 Hai biến c và d khơng thể đổi giá trị cho nhau 4/21/2015 17 Gọi theo con trỏ Khai báo tham số: kiểu *tham_số Ví dụ: int swap (int *a, int *b); Gọi hàm: int c(5), d(7); swap(&c, &d); Cách thức này copy địa chỉ của tham sốvào tham số hình TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI thức. Trong hàm, địa chỉ này được dùng để truy cập đến tham số thực tế được dùng trong lời gọi.  Việc này nghĩa là những thay đổi với tham số hình thức ảnh hưởng đến tham số truyền vào. Nhắc lại trong phần con trỏ. 4/21/2015 18 Ví dụ: Hốn đổi hai số bằng con trỏ #include using namespace std; // Khai báo hàm void swap(int* a, int* b); int main () { // Hàm hốn đổi hai số a và b void swap(int* a, int* b); { int c = *a; *a = *b; *b = c; } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI int c = 10, d = 20; // gọi hàm hốn đổi swap (&c, &d); cout <<“c = ” << c; cout <<“ d = ” << d; return 0; } Kết quả in ra: c = 20, d = 10 Hai biến c và d đổi giá trị cho nhau 4/21/2015 19 Gọi theo tham chiếu Khai báo tham số: kiểu &tham_số Ví dụ: void swap (int &a, int &b); Gọi hàm: int c(5), d(7); swap (c, d); Cách gọi này copy tham chiếu của một đối số vào tham số hình TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI thức. Bên trong hàm, tham chiếu được dùng để truy cập tham số thực được dùng trong lời gọi. Điều ngày cũng nghĩa là những thay đổi đối với tham số ảnh hưởng đến tham số truyền vào. Truyền tham số bằng tham chiếu để tạo hàm cĩ nhiều giá trị trả về 4/21/2015 20 Tham chiếu  Tham chiếu của một biến là bí danh (tên gọi khác) của một biến  Biến tham chiếu khơng được cấp phát bộ nhớ và cĩ thể dùng để truy cập hoặc thay đổi giá trị của biến được tham chiếu.  Biến tham chiếu phải được khởi gán ngay khi khai báo  Một khi đã được khởi gán chỉ tới một đối tượng, biến tham chiếu sẽ khơng thay đổi được đối tượng chỉ đến TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ví dụ: int a(5); int &b = a; // b là biến tham chiếu printf("a=%d\n",b);// In a=5 b++; printf("a=%d\n",a);// In a=6 4/21/2015 21 Ví dụ: Hốn đổi hai số bằng tham chiếu #include using namespace std; // Khai báo hàm int swap(int &a, int &b); int main () { // Hàm hốn đổi hai số a và b int swap(int &a, int &b); { int c = a; a = b; b = c; } Kết quả in ra: c = 20, d = 10 Hai biến c và d đã được đổi giá trị cho nhau TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI int c = 10, d = 20; // gọi hàm hốn đổi swap (c, d); cout <<“c = ” << c; cout <<“ d = ” << d; return 0; } Khi truyền tham số c và d vào hàm, hai biến tham chiếu a, b tương ứng với tham số sẽ được tạo ra và tham chiếu đến hai biến c, d. Việc hàm thực hiện thay đổi giá trị hai biến tham chiếu a, b sẽ ảnh hưởng tới tham số c, d và cho kết quả như yêu cầu. 4/21/2015 22 Giá trị mặc định cho tham số  Khi định nghĩa một hàm, ta cĩ thể xác định giá trị mặc định cho từng tham số cuối cùng. Giá trị này sẽ được sử dụng nếu đối số tương ứng được để trống khi gọi hàm.  Thực hiện bằng cách sử dụng tốn tử gán (=) và gán giá trị cho các đối số trong định nghĩa hàm.  Nếu một giá trị cho tham số đĩ khơng được truyền khi TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI hàm được gọi, giá trị mặc định đã cho được dùng.  Nếu một giá trị được truyền vào, giá trị mặc định được bỏ qua và giá trị truyền vào được sử dụng thay thế.  Các tham số cĩ giá trị mặc định phải đứng sau các tham số khơng cĩ giá trị mặc định. 4/21/2015 23 Giá trị mặc định cho tham số #include using namespace std; // Khai báo hàm int sum(int num1, int num2 = 20); int main () { // khơng truyền đối số thứ hai để sử dụng giá trị mặc định ret = sum(a); cout <<“sum = ” << ret << endl; return 0; } // function returning the sum of two TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI int a = 100, b = 200, ret; // gọi hàm để lấy tổng ret = sum(a, b); cout <<“sum = ” << ret << endl; // gọi hàm lần nữa để lấy tổng numbers int sum(int num1, int num2) { return num1 + num2; } Kết quả: sum = 300 sum = 120 4/21/2015 24 Nạp chồng hàm (C++) Đây là kỹ thuật cho phép sử dụng cùng một tên gọi cho các hàm “giống nhau” nhưng trên các kiểu dữ liệu đối số hoặc số các đối số khác nhau. Ví dụ: 1: int max(int a, int b) { return (a > b) ? a: b ; } 2: float max(float a, float b) { return (a > b) ? a: b ; } 3: char max(char a, char b) { return (a > b) ? a: b ; } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 4: long max(long a, long b) { return (a > b) ? a: b ; } 5: double max(double a, double b) { return (a > b) ? a: b ; } Khi gọi hàm, dựa vào đối số truyền vào gọi hàm tương ứng: max(3, 5)  gọi hàm 1 max(3.5, 4.5)  gọi hàm 5 max(‘a’, ‘b’) gọi hàm 3 max(3, 3.5)  k cĩ hàm tương ứng (kiểu int và double) 4/21/2015 25 Hàm mẫu (C++)  Khi nạp chồng hàm, nhiều hàm cĩ thể cùng định nghĩa. Ví dụ như hàm max nêu trên.  Với những trường hợp trên, C++ cho phép định nghĩa hàm mẫu với kiểu tổng quát.  Quy tắc định nghĩa hàm mẫu như hàm thơng thường nhưng bổ sung thêm từ khĩa template đằng trước và các tham số TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI mẫu bên trong dấu :  template function-declaration - Ví dụ: template Type max(Type a, Type b) { return (a > b) ? a: b ; } c = max(10, 20); d = max(5.0, 3.0); 4/21/2015 26 Hàm đệ qui  Một hàm gọi đến chính nĩ gọi là hàm là đệ qui.  Đệ qui là cách viết rất gọn, dễ viết và đọc chương trình  Hàm đệ qui được gọi rất nhiều lần, trong mỗi lần chạy chương trình sẽ tạo nên một tập biến cục bộ mới trên ngăn xếp độc lập với lần chạy trước đĩ, từ đĩ dễ gây tràn ngăn xếp.  Nếu bài tốn cĩ thể giải được bằng phương pháp lặp thì khơng nên TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI dùng đệ qui  Ví dụ: tính n! double gt(int n){ if (n==0) return 1; else return gt(n-1)*n; } 4/21/2015 27 Quy tắc về phạm vi  Phạm vi của một tên là phần chương trình bên trong đĩ tên cĩ thể được sử dụng  Những qui tắc quyết định một đoạn mã lệnh cĩ thể truy xuất đến một đoạn mã lệnh hay dữ liệu khác hay khơng int y = 38; void main( ){ int z=47; Phạm vi biến y TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI while(z<400) { int a = 90; z += a++; z++; } y = 2 * z; } Phạm vi biến a Phạm vi biến z 4/21/2015 28 Biến cục bộ  Được khai báo bên trong một hàm hay một khối lệnh {Œ}  Các biến chỉ tồn tại trong phạm vi hàm hoặc khối nơi nĩ được khai báo và định nghĩa. Chúng được cấp phát lúc khai báo và bị hủy lúc ra khỏi hàm hoặc khối (biến tự động) TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI  Các biến cục bộ cùng tên của các hàm khác nhau khơng cĩ liên quan gì tới nhau  Tham số của các hàm cũng được xem như biến cục bộ. 4/21/2015 29 Ví dụ: Biến cục bộ main(){ int i=4; /* i định nghĩa trong hàm main */ int j=10; i++; if (j > 0) { printf("i is %d\n",i); } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI if (j > 0){ int i=100; // 'i' được định nghĩa cục bộ trong khối printf("i is %d\n",i); } /* 'i' (giá trị 100) bị hủy ở đây */ printf("i is %d\n",i); /* 'i' (giá trị 5) của hàm main */ } 4/21/2015 30 Biến tồn cục Được khai báo bên ngồi tất cả các hàm Sử dụng được cho mọi hàm Nhiều hàm sử dụng chung một số biến thì cĩ thể sử dụng biến ngồi để biểu diễn một cách thuận lợi và hiệu quả hơn dùng một danh sách đối dài dằng dặc cho các hàm. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Tồn tại đến trong suốt thời gian chạy chương trình Trong trường hợp chương trình cĩ nhiều tệp mã nguồn, biến tồn cục chỉ cần khai báo ở một tệp nguồn nào đĩ, cịn các hàm trong các tệp mã nguồn khác mà muốn sử dụng thì chỉ việc khai báo biến tương tự và thêm từ khĩa extern phía trước 4/21/2015 31 Biến tồn cục in file1: extern int sp; extern double val[]; void push(double f) { ... } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI double pop(void) { ... } in file2: int sp = 0; double val[MAXVAL]; 4/21/2015 32 Biến tĩnh (static) Biến tĩnh cĩ thể là biến cục bộ hoặc biến tổng thể. Biến tĩnh trong là cục bộ đối với hàm chứa nĩ cũng như biến tự động (cục bộ), nhưng khác một điểm, chúng vẫn tồn tại sau mỗi lần gọi hàm mà khơng bị hủy đi như biến tự động. Biến tĩnh ngồi cĩ phạm vi tác dụng từ khi được khai báo tới hết tệp chương trình, khơng cĩ tác dụng đối với các tệp khác TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Khai báo: static kiểu_dữ_liệu tên_biến. Khai báo static cũng cĩ thể được áp dụng cho hàm. Thơng thường, tên hàm là tồn cục, mọi phần của chương trình đều gọi được. Tuy nhiên, nếu một hàm được khai báo static, thì hàm chỉ cĩ tác dụng bên trong tệp chứa nĩ, khơng gọi được từ các phần chương trình ở các tệp khác. 4/21/2015 33 Biến tĩnh (static) int i = 1; // I là biến tồn cục void ham(){ static int lanthu = 0; // biến cục bộ tĩnh lanthu++; i = 2 * i; cout << "Hàm chạy lần thứ " << lanthu << ", i = " << i ; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI } main(){ ham(); // Hàm chạy lần thứ 1, i = 1 ham(); // Hàm chạy lần thứ 2, i = 2 ham(); // Hàm chạy lần thứ 3, i = 4 } 4/21/2015 34 Biến thanh ghi (register) Để tăng tốc độ tính tốn C++ cho phép một số biến được đặt trực tiếp vào thanh ghi thay vì ở bộ nhớ.  Khai báo bằng từ khố register đứng trước khai báo biến. Khai báo này chỉ cĩ tác dụng đối với các biến cĩ kích thước TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI nhỏ như biến char, int. Ví dụ: register char c; register int dem; 4/21/2015 35 Các hàm trong chương trình cĩ nhiều tập tin Các hàm cũng cĩ thể được định nghĩa là static hoặc extern Các hàm tĩnh (static) chỉ được nhận biết bên trong tập tin chương trình và phạm vi của nĩ khơng vượt TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ra khỏi tập tin chương trình static kiểu_trả_về_hàm tên_hàm (ds_tham_số); Hàm ngoại (external) được nhận biết bởi tất cả các tập tin của chương trình extern kiểu_trả_về_hàm tên_hàm (ds_tham_số); 4/21/2015 36 Các chỉ thị tiền xử lý #include Ghép nội dung các tệp đã cĩ khác vào chương trình trước khi dịch Các tệp này chứa khai báo nguyên mẫu của các hằng, biến, hàm Œ cĩ sẵn trong C/C++ hoặc các hàm do lập trình viên tự viết. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 1: #include 2: #include “đường dẫn\tệp” Dạng khai báo 1 cho phép C++ ngầm định tìm tệp tại thư mục định sẵn Dạng khai báo 2 cho phép tìm tệp theo đường dẫn, nếu khơng cĩ đường dẫn sẽ tìm trong thư mục hiện tại 4/21/2015 37 Các chỉ thị tiền xử lý #define Bộ tiền xử lý sẽ tìm trong chương trình và thay thế bất kỳ vị trí xuất hiện nào của tên_macro bởi xâu kí tự.  Sử dụng macro để định nghĩa các hằng hoặc thay cụm từ này bằng cụm từ khác dễ nhớ hơn #define Tên_macro Xâu_ký_tự TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ví dụ: #define MAX 100 // thay MAX bằng 100 #define max(A,B) ((A) > (B) ? (A): (B)) 4/21/2015 38 Các chỉ thị tiền xử lý #define Chú ý: Tên macro phải được viết liền với dấu ngoặc của danh sách đối. Ví dụ khơng viết max (A,B). #define bp(x) (x*x) viết sai vì bp(5) đúng nhưng bp(a+b) sẽ thành (a+b*a+b) (tức a+b+ab). TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI #define max(A,B) (A > B ? A: B) là sai  Luơn bao các đối bởi dấu ngoặc. 4/21/2015 39 Các chỉ thị biên dịch cĩ điều kiện #if, #ifdef, #ifndef Chỉ thị: #if (điều kiên) dãy lệnh Œ #endif #if (điều kiện) dãy lệnh Œ #else dãy lệnh Œ #endif, Các chỉ thị này giống như câu lệnh if, mục đích của nĩ là báo cho chương trình dịch biết đoạn lệnh giữa #if (điều TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI kiện ) và #endif chỉ được dịch nếu điều kiện đúng Chỉ thị: #ifdef và #ifndef #ifdef được hiểu là nếu tên đã được định nghĩa thì dịch #ifndef được hiểu là nếu tên chưa được định nghĩa thì dịch 4/21/2015 40 Các chỉ thị biên dịch cĩ điều kiện #if, #ifdef, #ifndef  #ifdef và #ifndef : cĩ ích khi chèn các tệp thư viện vào để sử dụng. Một tệp thư viện cĩ thể được chèn nhiều lần trong văn bản do vậy nĩ cĩ thể sẽ được dịch nhiều lần, điều này sẽ gây ra lỗi vì các biến được khai báo nhiều lần TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

Các file đính kèm theo tài liệu này:

  • pdfngon_ngu_lap_trinh_c_va_c_bai_4_ham_va_cau_truc_chuong_trinh_4845_1993520.pdf
Tài liệu liên quan