Bài giảng Cơ sở lập trình - Chương 4: Hàm con

ppt 41 trang phuongnguyen 2651
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cơ sở lập trình - Chương 4: Hàm con", để 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:

  • pptbai_giang_co_so_lap_trinh_chuong_4_ham_con.ppt

Nội dung text: Bài giảng Cơ sở lập trình - Chương 4: Hàm con

  1. 7/5/2021 *CHƯƠNG 4 HÀM CON 1 1
  2. *CẤU TRÚC CHƯƠNG TRÌNH Khai báo thư viện hàm Khai báo Khai báo hàm Khai báo hằng số Cài đặt tất cả những hàm con Cài đặt hàm đã được khai báo CHƯƠNG TRÌNH C Gọi thực hiện các hàm theo Hàm main() yêu cầu của bài toán 2
  3. Tham số int Tong(int a, int b) { int s=a+b; return s; } void main() { Gọi hàm int kq = Tong (12, 3); Truyền đối số cout<<“Tong cua 12 va 3: “<<kq; } 3
  4. *KHÁI NIỆM *Ham̀ la ̀ môṭ đoaṇ chương trinh̀ đôc̣ lâp̣ thực hiêṇ troṇ veṇ môṭ công viêc̣ nhât́ đinḥ sau đo ́ tra ̉ vê7/5/2021 ̀ gia ́ tri ̣ cho chương trinh̀ goị no,́ hay noí cach́ khać ham̀ la ̀ sự chia nho ̉ cuả chương trinh.̀ *Mục đich́ sử dụng hàm: Khi co ́ môṭ công viêc̣ giônǵ nhau câǹ thực hiêṇ ở nhiêù vi ̣ tri.́ Khi câǹ chia môṭ chương trinh̀ lớn phức tap̣ thanh̀ cać đơn thê ̉ nho ̉ (ham̀ con) đê ̉ chương trinh̀ được trong sang,́ dê ̃ hiêủ trong viêc̣ xử ly,́ quan̉ ly ́ viêc̣ tinh́ toań va ̀ giaỉ quyêt́ vâń đê.̀ 4 4
  5. Mẫu tổng quát của hàm ̣ TênHàm([ds cać tham sô]);́ Trong đó: *Kiểu dữ liệu trả về của hàm (kết quả của hàm/ đầu ra), gồm 2 loại *void: Không trả về giá trị *float / int / long / char */ kiểu cấu trúc / : Trả về giá trị kết quả có kiểu dữ liệu tương ứng với bài toán (chỉ trả về được 1 giá trị theo kiểu dữ liệu) 5
  6. *TênHàm: Đặt tên theo qui ước sao cho phản ánh đúng chức năng thực hiện của hàm *Danh sách các tham số (nếu có): đầu vào của hàm (trong một số trường hợp có thể là đầu vào và đầu ra của hàm nếu kết quả đầu ra có nhiều giá trị - Tham số này gọi là tham chiếu) 6
  7. *HÀM KHÔNG TRẢ VỀ GIÁ TRỊ Cài đặt void TênHàm([danh sach́ cać tham sô])́ { Khai baó cać biêń cuc̣ bộ Cać câu lênḥ / khôí lênḥ hay lời goị đêń hàm khac.́ } Gọi hàm TênHàm(danh sách tên các đối số); Những phương thức loaị naỳ thường rơi vaò những nhoḿ chức năng: Nhâp̣ / xuât́ dữ liêụ , thônǵ kê, săṕ xêp,́ liêṭ kê 7
  8. *VÍ DỤ 1 Viêt́ chương trinh̀ nhâp̣ sô ́ nguyên dương n va ̀ in ra maǹ hinh̀ cać ước sô ́ cuả n Phân tich́ baì toan:́ * Input: n (Đê ̉ xać đinḥ tham sô)́ Kiêủ dữ liêu:̣ sô ́ nguyên dương (int). * Output: In ra cać ước sô ́ cuả n (Đê ̉ xać đinḥ kiêủ dữ liêụ trả về của hàm) Xuất ra màn hình Không tra ̉ vê ̀ gia ́ tri ̣ Kiêủ dữ liêụ của hàm la ̀ void . * Xać đinḥ tên hàm: Hàm naỳ dung̀ in ra cać ước sô ́ cuả n nên co ́ thê ̉ đăṭ la ̀ LietKeUocS void LietKeUocSo(int n); 8
  9. #include void LietKeUocSo(int n); Có dấu chấm phẩy void LietKeUocSo(int n) Không dấu chấm phẩy { for (int i = 1; i >n; cout<<"Cac uoc so cua “<<n<<“: “; LietKeUocSo(n); } 9
  10. Kết quả chương trình 10
  11. *HÀM TRẢ VỀ GIÁ TRỊ Cài đặt TênHàm([danh sach́ cać tham sô])́ { kq; Khai baó cać biêń cuc̣ bộ Cać câu lênḥ / khôí lênḥ hay lời goị đêń hàm khac.́ return kq; } Gọi hàm Tên biến = TênHàm (danh sách tên các đối số); Những phương thức này thường rơi vào các nhóm: Tính tổng, tích, trung bình, đếm, kiểm tra, tìm kiếm 11
  12. *VÍ DỤ 2 Viêt́ chương trinh̀ nhâp̣ sô ́ nguyên dương n va ̀ tinh́ tông̉ * Phân tich́ baì toan:́ Input: n (Đê ̉ xać đinḥ tham sô)́  Kiêủ dữ liêu:̣ sô ́ nguyên dương (int). Output: Tông̉ S (Đê ̉ xać đinḥ kiêủ dữ liêụ phương thức)  Tra ̉ vê ̀ gia ́ tri ̣ cuả S.  S la ̀ tông̉ cać sô ́ nguyên dương nên S cung̃ la ̀ sô ́ nguyên dương Kiêủ tra ̉ vê ̀ cuả ham̀ la ̀ int (hoăc̣ long). * Xać đinḥ TênHàm: Dung̀ tinh́ tông̉ S nên co ́ thê ̉ đăṭ la ̀ TongS int TongS(int n); 12
  13. #include int TongS(int n); int TongS(int n) { int kq = 0; for (int i = 1; i >n; S = TongS(n); cout<<"Tong tu 1 den n: " <<S; } 13
  14. * *Phạm vi khối *Phạm vi hàm *Phạm vi chương trình *Phạm vi tập tin 14
  15. * *Một khối được giới hạn bởi ngoặc {}. *Biến khai báo trong khối đó có phạm vi khối, nghĩa là nó chỉ hoạt động trong khối đó mà thôi. Phạm vi này còn gọi là cục bộ, và biến đưọc gọi là biến cục bộ. 15
  16. * void main() { int i=20; { int i=10; cout<<"Gia tri i ben trong khoi: "<<i<<endl; } cout<<"Gia tri i ben ngoai khoi: "<<i; } Kết quả Gia tri i ben trong khoi: 10 Gia tri i ben ngoai khoi: 20 16
  17. * *Hoạt động từ đầu đến cuối một hàm, chỉ có tác dụng trong hàm void main() { int k; float m; double x; //Các lệnh khác // } 17
  18. * int a, b; ượ *Đ c khai báo bên ngoài void Nhap() các hàm – còn được gọi là { biến toàn cục, có tác dụng cout >a; cout >b; được nhìn thấy ở mọi hàm } trong toàn chương trình, void main() nhưng không nên khai báo { sử dụng nhiều nếu không int c; cần thiết, vì nó sẽ gây trở Nhap(); c=a+b; ngại cho quá trình dò tìm cout<<"Tong = "<<c; lỗi khi debug chương trình } 18
  19. * *Biến được khai báo toàn cục và có kèm từ khóa static int x = 0; static int y = 0; static float z = 0.0; void main() { int i; //Các lệnh . . } 19
  20. *THAM SỐ LÀ THAM CHIẾU *Tham số làm kết quả đầu ra *Tham số vừa làm đầu vào và đầu ra *Dùng dấu & phía trước tên tham số khi cài đặt hàm 20
  21. *VÍ DỤ Xét chương trình hoán vị 2 số nguyên a, b cho trước Viết chương trình với 2 trường hợp *Trường hợp không dùng tham chiếu *Trường hợp dùng tham chiếu 21
  22. void HoanVi(int a, int b) { int tam = a; a = b; b = tam; cout<<"Trong HoanVi: a = “<<a<<“ ;b = “<<b; } void main() { int a = 5, b = 21; cout<<"Truoc khi HoanVi: a = “<<a<<“ ; b = “<<b; HoanVi(a, b); cout<<"Sau khi goi HoanVi: a = “<<a<<“ ;b = “<<b; } 22
  23. Kết quả 23
  24. void HoanVi(int &a, int &b) { int tam = a; a = b; b = tam; cout<<"Trong HoanVi: a = “<<a<<“ ;b = “<<b; } void main() { int a = 5, b = 21; cout<<"Truoc khi HoanVi: a = “<<a<<“ ; b = “<<b; HoanVi(a, b); cout<<"Sau khi goi HoanVi: a = “<<a<<“ ;b = “<<b; } 24
  25. Kết quả 25
  26. * Trước khi xây dựng hàm phải trả lời những câu hỏi sau: *Hàm trả về gì? Xác định kiểu dữ liệu trả về của hàm *Hàm làm gì? Xác định tên hàm *Cần những thông tin gì để hàm xử lý? Xác định tham số Ứng với mỗi thông tin đã xác định, xác định xem đã có giá trị trước khi vào hàm chưa, - Nếu chưa có Tham chiếu - Nếu có mà sau khi thực hiện xong hàm vẫn không thay đổi Tham trị (không là tham chiếu) - Nếu có mà sau khi thực hiện xong hàm thì giá trị cũng bị thay đổi theo Tham chiếu 26
  27. * *Môṭ ham̀ được goị co ́ tinh́ đê ̣ qui nêú trong thân cuả ham̀ đo ́ co ́ lênḥ goị laị chinh́ no ́ môṭ cach́ tường minh hay tiêm̀ ân.̉ *Phân loaị đê ̣ qui *Đệ qui tuyêń tinh.́ *Đê ̣ qui nhi ̣ phân. *Đê ̣ qui phi tuyên.́ *Đê ̣ qui hô ̃ tương. 27
  28. * • Trong thân ham̀ co ́ duy nhât́ môṭ lời goị ham̀ goị laị chinh́ no ́ môṭ cach́ tường minh. ̀ TenHam ( )́ { if (điêù kiêṇ dừng) { . . . //Tra ̉ vê ̀ gia ́ tri ̣ hay kêt́ thuć công viêc̣ } //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ . . . TenHam ( );́ //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ } 28
  29. Vi ́ du:̣ Tinh́ - Điêù kiêṇ dừng: S(0) = 0. - Qui tăć (công thức) tinh:́ S(n) = S(n-1) + n. long TongS (int n) { if(n==0) return 0; return ( TongS(n-1) + n ); } 29
  30. * Trong thân cuả ham̀ co ́ hai lời goị ham̀ goị laị chinh́ no ́ môṭ cach́ tường minh. ̀ TenHam ( )́ { if (điêù kiêṇ dừng) { . . . //Tra ̉ vê ̀ gia ́ tri ̣ hay kêt́ thuć công viêc̣ } //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ . . .TenHam ( );́ //Giaỉ quyêt́ vâń đê ̀ nho ̉ hơn //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ . . . TenHam ( );́ //Giaỉ quyêt́ vâń đê ̀ coǹ laị //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ } 30
  31. Vi ́ du:̣ Tinh́ sô ́ hang̣ thứ n cuả daỹ Fibonaci được đinḥ nghiã như sau: f1 = f0 =1 ; fn = fn-1 + fn-2­ ; (n>1) Điêù kiêṇ dừng: f(0) = f(1) = 1. long Fibonaci (int n) { if(n==0 || n==1) return 1; return Fibonaci(n-1) + Fibonaci(n-2); } 31
  32. * Trong thân cuả ham̀ co ́ lời goị ham̀ goị laị chinh́ no ́ được đăṭ bên trong vong̀ lăp.̣ ̀ TenHam ( )́ { for (int i = 1; i );́ } } } 32
  33. Vi ́ du:̣ Tinh́ sô ́ hang̣ thứ n cuả daỹ {Xn} được đinḥ nghiã như sau: X0 =1 ; 2 2 2 Xn = n X0 + (n-1) X1 + + 1 Xn-1­ ; (n≥1) Điêù kiêṇ dừng:X(0) = 1. long TinhXn (int n) { if(n==0) return 1; long s = 0; for (int i=1; i<=n; i++) s = s + i * i * TinhXn(n-i); return s; } 33
  34. * Trong thân cuả ham̀ naỳ co ́ lời goị ham̀ đêń ham̀ kia va ̀ trong thân cuả ham̀ kia co ́ lời goị ham̀ tới ham̀ nay.̀ 34
  35. ̀ TenHam2 ( );́ ̀ TenHam1 ( )́ { //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ TenHam2 ( );́ //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ } ̀ TenHam2 ( )́ { //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ TenHam1 ( );́ //Thực hiêṇ môṭ sô ́ công viêc̣ (nêú co)́ } 35
  36. Vi ́ du:̣ Tinh́ sô ́ hang̣ thứ n cuả hai daỹ {Xn}, {Yn} được đinḥ nghiã như sau: X0 =Y0 =1 ; Xn = Xn-1 + Yn-1; (n>0) 2 Yn = n Xn-1 + Yn-1; (n>0) - Điêù kiêṇ dừng:X(0) = Y(0) = 1. long TinhYn(int n); long TinhXn (int n) { if(n==0) return 1; return TinhXn(n-1) + TinhYn(n-1); } long TinhYn (int n) { if(n==0) return 1; return n*n*TinhXn(n-1) + TinhYn(n-1); } 36
  37. * *Ví dụ tính n! với n=5 37
  38. * Xác định các khai báo hàm của các bài toán sau: 1.Viêt́ chương trinh̀ tinh́ diêṇ tich́ va ̀ chu vi cuả hinh̀ chữ nhâṭ với chiêù daì va ̀ chiêù rông̣ được nhâp̣ từ baǹ phim.́ 2.Viêt́ chương trinh̀ tinh́ diêṇ tich́ va ̀ chu vi hinh̀ troǹ với bań kinh́ được nhâp̣ từ baǹ phim.́ 3.Nhâp̣ vaò 3 sô ́ thực a, b, c va ̀ kiêm̉ tra xem chunǵ co ́ thanh̀ lâp̣ thanh̀ 3 canḥ cuả môṭ tam giać hay không? Nêú co ́ haỹ tinh́ diêṇ tich,́ chiêù daì môĩ đường cao cuả tam giać va ̀ in kêt́ qua ̉ ra maǹ hinh.̀ 4.Viêt́ chương trinh̀ nhâp̣ 2 sô ́ nguyên dương a, b. Tim̀ USCLN va ̀ BSCNN cuả hai sô ́ nguyên đó 38
  39. * *Công thức tinh́ diêṇ tich́ s = sqrt(p*(p-a)*(p-b)*(p-c) ) với p là nửa chu vi của tam giác *Công thức tinh́ cać đường cao: ha = 2s/a, hb=2s/b, hc=2s/c. 39
  40. * 1. Viết chương trình tất cả các bài tập 1 2. Viêt́ chương trinh̀ nhâp̣ sô ́ nguyên dương n, tinh́ tông̉ cać ước số dương của n. Vi ́ du:̣ Nhâp̣ n=6 Tổng các ước số từ 1 đến n: 1+2+3+6=12. 3. Nhâp̣ vaò giờ, phut,́ giây. Kiêm̉ tra xem giờ, phut,́ giây đo ́ co ́ hợp lê ̣ hay không? In kêt́ qua ̉ ra maǹ hinh.̀ 4. Viêt́ chương trinh̀ nhâp̣ sô ́ nguyên dương n gôm̀ k chữ sô,́ đêḿ xem n co ́ bao nhiêu chữ sô ́ la ̀ sô ́ nguyên tô.́ 40
  41. 5. Viêt́ chương trinh̀ tinh́ tiêǹ thuê maý dicḥ vu ̣ Internet va ̀ in ra maǹ hinh̀ kêt́ qua.̉ Với dữ liêụ nhâp̣ vaò la ̀ giờ băt́ đâù thuê (GBD), giờ kêt́ thuć thuê (GKT), sô ́ maý thuê (SoMay).  Điêù kiêṇ cho dữ liêụ nhâp:̣ 6<=GBD<GKT<=21. Giờ la ̀ sô ́ nguyên.  Đơn gia:́ 2500đ cho môĩ giờ maý trước 17:30 va ̀ 3000đ cho môĩ giờ maý sau 17:30. 6. Viêt́ chương trinh̀ tinh́ tiêǹ lương ngaỳ cho công nhân, cho biêt́ trước giờ vaò ca, giờ ra ca cuả môĩ người. Gia ̉ sử răng:̀  Tiêǹ tra ̉ cho môĩ giờ trước 12 giờ la ̀ 6000đ va ̀ sau 12 giờ la ̀ 7500đ.  Giờ vaò ca sớm nhât́ la ̀ 6 giờ sanǵ va ̀ giờ ra ca trê ̃ nhât́ la ̀ 18 giờ (Gia ̉ sử giờ nhâp̣ vaò nguyên). 41