YOMEDIA
ADSENSE
Kỹ thuật lập trình C/C++-Chương: Hàm
177
lượt xem 23
download
lượt xem 23
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Tham khảo bài thuyết trình 'kỹ thuật lập trình c/c++-chương: hàm', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Kỹ thuật lập trình C/C++-Chương: Hàm
- Hàm (function) EE3490: Kỹ thuật lập trình – HK1 2011/2012 1 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Khái niệm Hàm là một khối các câu lệnh thực hiện một nhiệm vụ nhất định, và có thể được gọi khi cần Mỗi hàm có một tên (các hàm trong C không được trùng tên nhau), một số tham số, và một giá trị trả về Sử dụng hàm giúp: Chia nhỏ chương trình thành nhiều bài toán con Sử dụng lại trong một hoặc nhiều chương trình Cách khai báo: () { Khai báo các biến dùng cho hàm Các câu lệnh của hàm } Toán tử return dùng để thoát khỏi hàm và trả kết quả EE3490: Kỹ thuật lập trình – HK1 2011/2012 2 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Ví dụ Hàm tính tổng hai số double sum(double x, double y) { double z = x+y; return z; } int main() { double x = 10, y = sum(2,3); printf("x + y = %g", sum(x,y)); return 0; } Các tham số và các biến nội bộ chỉ giới hạn trong phạm vi của hàm EE3490: Kỹ thuật lập trình – HK1 2011/2012 3 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Phạm vi của biến, hằng Biến toàn cục: được khai báo ở ngoài các hàm, có phạm vi trong toàn chương trình và tồn tại trong suốt quá trình chạy Biến địa phương: được khai báo ở trong một hàm hoặc một khối lệnh, chỉ có phạm vi trong hàm/khối đó, và bị huỷ sau khi kết thúc chạy hàm/khối đó Khai báo biến địa phương sẽ “che” mất biến cùng tên khác có phạm vi rộng hơn Trong C, biến địa phương phải được khai báo ở đầu hàm hoặc khối lệnh Ví dụ biến địa phương của hàm: int x = 10, y = 20; /* phải khai báo trước hàm sum() */ int sum() { int z = x+y; return z; } int main() { int x = 1, y = 2; int z = sum(); /* trả về: 10+20 */ return 0; } EE3490: Kỹ thuật lập trình – HK1 2011/2012 4 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Biến trong khối lệnh Trong một khối lệnh { … } ta có thể khai thêm biến, biến đó chỉ tồn tại từ khi chương trình chạy vào tới khi thoát khỏi khối lệnh đó Ví dụ: int x = 1, y = 2; int sum(int x, int y) { return x+y; } int a = 1000, b = 2000; int main() { int x = 10, y = 20; { int x = 100, y = 200; x+y; } x+y; sum(a,b); return 0; } EE3490: Kỹ thuật lập trình – HK1 2011/2012 5 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Biến trong khối lệnh: vòng lặp Chỉ có phạm vi trong một lần chạy của vòng lặp, mỗi lần lặp sẽ tạo ra biến mới và khởi tạo lại Ví dụ: int x = 20; for (i=0; i
- Biến static Là biến chỉ có phạm vi địa phương nhưng vẫn tồn tại ngay cả khi chưa vào hoặc đã thoát khỏi hàm/khối Khai báo bằng cách thêm từ khoá static int callCount() { static int count = 0; count++; return count; } Cũng có biến static toàn cục: thuộc nội bộ của một file nguồn static int tic_time = 0; void tic() { tic_time = clock(); } int toc() { return clock() - tic_time; } Hàm static: tự tìm hiểu thêm EE3490: Kỹ thuật lập trình – HK1 2011/2012 7 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Câu lệnh return Kết thúc hàm và trả về một giá trị cho nơi gọi nó int find(int number, int a[], int n) { int i; for (i=0; i0; n--) *a++ = *b++; } Câu lệnh return không có tham số Không cần lệnh return ở cuối hàm EE3490: Kỹ thuật lập trình – HK1 2011/2012 8 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Tham số kiểu giá trị và kiểu tham chiếu Tham số của hàm là biến tạm thời, tạo ra khi gọi và huỷ khi hàm kết thúc gán giá trị cho tham số không ảnh hưởng tới biến nơi gọi void assign10(int x) { x = 10; } x (int) int main() { int a = 20; assign10(a); copy printf("a = %d", a); return 0; a } Dùng con trỏ nếu muốn thay đổi giá trị của biến ở nơi gọi void assign10(int *x) x (int*) { *x = 10; } copy int a = 20; assign10(&a); &a a Tham số con trỏ thường được dùng như một cách khác để trả về thêm giá trị, vì mỗi hàm chỉ có một giá trị trả về theo đúng nghĩa EE3490: Kỹ thuật lập trình – HK1 2011/2012 9 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Hàm trả về con trỏ Vấn đề với hàm trả về biến địa phương int* sum(int x, int y) { int* sum() { } z int z = x+y; return &z; copy } địa chỉ int* p = sum(2, 3); /* sai */ p Cấp phát bộ nhớ trong hàm int* sum(int x, int y) { int* z = (int*)malloc(sizeof(int)); *z = x+y; int* sum() { } return z; z } *z copy int* p = sum(2, 3); /* ... */ free(p); p EE3490: Kỹ thuật lập trình – HK1 2011/2012 10 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Nguyên mẫu (prototype) của hàm Là việc khai báo hàm trước, nội dung của nó được triển khai sau thường khai báo ở đầu file hoặc trong file .h Ví dụ: double tong(double x, double y); double tich(double x, double y); int main() { double x = 5., y = 10.; tong(x, y); tich(x, y); return 0; } double tong(double x, double y) { return x+y; } double tich(double x, double y) { return x*y; } EE3490: Kỹ thuật lập trình – HK1 2011/2012 11 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Hàm đệ quy (recursive function) Là hàm có câu lệnh gọi chính nó Ví dụ 1: giai thừa một số n unsigned int giai_thua(unsigned int n) { if (n
- Con trỏ hàm Là con trỏ trỏ tới một hàm là một kiểu dữ liệu trong C, thường được dùng để gọi một hàm chưa biết trước double (*SomeOpt)(double, double); typedef double (*OptFunc)(double, double); OptFunc SomeOpt; Ví dụ: double sum(double x, double y) { return x+y; } double mul(double x, double y) { return x*y; } int main() { double (*SomeOpt)(double, double) = ∑ SomeOpt(2., 5.); /* sum(2., 5.); */ SomeOpt = mul; (*SomeOpt)(2., 5.); /* mul(2., 5.); */ return 0; } Phép gán có thể dùng & hoặc không, gọi cũng có thể dùng * hoặc không EE3490: Kỹ thuật lập trình – HK1 2011/2012 13 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Macro Macro là đoạn mã được đại diện bằng một tên, mà mỗi khi tên đó xuất hiện trong chương trình thì sẽ được thay thế bằng đoạn mã tương ứng #define ERROR { printf("Error, exit now!"); exit(-1); } int main(int argc, char* argv[]) { if (argc != 3) ERROR /* … */ return 0; } Macro có thể được thay thế khi định nghĩa macro khác cùng tên Huỷ bỏ macro đã định nghĩa: #undef ERROR Kiểm tra xem macro đã định nghĩa chưa #ifdef ERROR /* ... */ #else /* ... */ #endif EE3490: Kỹ thuật lập trình – HK1 2011/2012 14 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Macro (tiếp) Macro có thể có tham số đôi khi được dùng như hàm #define MIN(x,y) x
- Thư viện hàm EE3490: Kỹ thuật lập trình – HK1 2011/2012 16 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Thư viện hàm Một chương trình có thể được chia nhỏ làm nhiều file, mỗi file chứa một nhóm những hàm liên quan tới một phần của chương trình Một số hàm có thể được dùng trong nhiều chương trình khác nhau thư viện hàm Một thư viện hàm gồm 2 phần: File header có đuôi .h chứa prototype các hàm có thể dùng được của thư viện File mã nguồn có đuôi .c chứa nội dung các hàm, hoặc file .obj, .lib nếu đã được dịch ra các dạng tương ứng Dùng thư viện hàm trong một file mã nguồn: #include /* trong đường dẫn mặc định */ #include "ten_file.h" /* cùng thư mục với file dịch */ Dẫn hướng #include có tác dụng như chèn nội dung file được khai báo vào file đang dịch ở vị trí xuất hiện EE3490: Kỹ thuật lập trình – HK1 2011/2012 17 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Lưu ý với tạo và sử dụng file .h Trong file abcd.h Để tránh lỗi khi bị #include nhiều lần, thêm vào đầu và cuối #ifndef __ABCD_H__ #define __ABCD_H__ /* Nội dung file abcd.h */ #endif Các biến toàn cục phải được khai báo trong file .c, nếu muốn được export thì trong file .h khai báo thêm bằng extern: extern int bien_toan_cuc; Sử dụng file abcd.h #include "abcd.h" /* .h cùng thư mục */ #include /* .h trong thư mục thư viện */ EE3490: Kỹ thuật lập trình – HK1 2011/2012 18 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Ví dụ: Thư viện tính diện tích các hình dientich.h #ifndef __DIENTICH_H__ #define __DIENTICH_H__ extern const double PI; double dt_tron(double r); double dt_elip(double r1, double r2); double dt_vuong(double l); double dt_chu_nhat(double l1, double l2); #endif dientich.c const double PI = 3.1415; double dt_tron(double r) { return r*r*PI; } double dt_elip(double r1, double r2) { return r1*r2*PI; } double dt_vuong(double l) { return l*l; } double dt_chu_nhat(double l1, double l2) { return l1*l2; } EE3490: Kỹ thuật lập trình – HK1 2011/2012 19 Đào Trung Kiên – ĐH Bách khoa Hà Nội
- Một số thư viện chuẩn Chức năng Tên Xuất, nhập với màn hình, file, bàn phím,… stdio.h Kiểm tra các lớp ký tự (chữ số, chữ cái,…) ctype.h Xử lý chuỗi và bộ nhớ string.h Một số hàm toán học math.h Chuyển đổi dữ liệu số-chuỗi, cấp phát bộ nhớ,… stdlib.h Các hàm về thời gian time.h EE3490: Kỹ thuật lập trình – HK1 2011/2012 20 Đào Trung Kiên – ĐH Bách khoa Hà Nội
ADSENSE
CÓ THỂ BẠN MUỐN DOWNLOAD
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn