intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Kỹ thuật lập trình C/C++-Chương: Hàm

Chia sẻ: Nguyễn Kim Thành | Ngày: | Loại File: PDF | Số trang:21

177
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ả

Chủ đề:
Lưu

Nội dung Text: Kỹ thuật lập trình C/C++-Chương: Hàm

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. Macro (tiếp) Macro có thể có tham số  đôi khi được dùng như hàm  #define MIN(x,y) x
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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

 

Đồng bộ tài khoản
4=>1