Chương trình con trong c++ là gì năm 2024
Phần trước: [C++ Cơ bản] Phần 10: Toán tử (tiếp) Ta không thể đặt thẳng giá trị của chúng như vậy được - nếu như ta viết Show
thì giá trị của
3 sẽ bằng giá trị của
4 lúc ban đầu, và dòng code thứ hai sẽ không có tác dụng gì hết. Giải pháp là sử dụng một biến tạm thời để lưu trữ giá trị cũ của
3, để gán về sau cho
4.
Nhưng nếu ta phải thực hiện công việc tầm 10 lần trong chương trình thì sao? Việc viết ba dòng code này mỗi khi cần đảo giá trị là một điều rất bất hợp lý - code sẽ dài và không trực quan (không có chỗ nào trong 3 dòng code ghi là đây là lệnh để đảo giá trị
3 và
4 cả). Hơn nữa, nếu phải sửa một chỗ nào đó trong việc đảo giá trị - ví dụ kiểm tra hai giá trị được đảo có cùng kiểu dữ liệu không chẳng hạn - ta sẽ phải sửa hàng chục lần. Giải pháp là sử dụng hàm (function, hay còn được gọi là chương trình con). Định nghĩa hàmHàm là một nhóm lệnh, yêu cầu chương trình phải hoàn thành một công việc nào gì đó. Hàm có thể được yêu cầu trả lại một giá trị nào đó (ví dụ: hàm tính lũy thừa của một số), hoặc không (hàm trả lại kiểu
9 - ví dụ như hàm
0 của
1).
2 là một hàm tiêu biểu, trả lại kiểu
3 là kết quả chạy của chương trình. Người dùng có thể tự định nghĩa hàm mới trong chương trình của mình. Cách định nghĩa hàm mớiCú pháp để định nghĩa hàm mới là
Kiểu dữ liệu trả vềHàm có thể chỉ thực hiện thao tác lên giá trị mà không trả về kiểu gì cả - khi đó kiểu dữ liệu trả về được đặt là
9 (không giá trị). Hàm cũng có thể sử dụng để thực hiện phép tính toán và trả lại kết quả - có thể là các kiểu dữ liệu nguyên thủy như
3,
6,
7,… hay các kiểu dữ liệu người dùng định nghĩa (sẽ được nói tới trong các bài sau). Tên của hàmQuy tắc đặt tên của hàm cũng giống như quy tắc đặt tên biến - trừ trong trường hợp overloading (viết đè hàm). Overloading sẽ được giải thích trong các bài viết sau. Các tham số của hàmMột hàm có thể được truyền vào một hoặc nhiều biến tham số để hoạt động. Ví dụ: hàm
0 của
1 cần có một xâu kí tự là địa chỉ của file cần mở, và một giá trị bitmask
0 không bắt buộc. Các tham số của hàm được định nghĩa theo cú pháp như khai báo biến -
1 - và được phân cách nhau bằng dấu phẩy (
2). Các tham số giống như biến local của hàm - chúng chỉ tồn tại bên trong hàm, và sẽ không thể truy cập được từ bên ngoài. Nếu như có biến global trùng tên, thì biến tham số của hàm sẽ được sử dụng trong hàm của nó. Ta không được phép đặt tên biến local trùng tên biến tham số của hàm. Hàm không bắt buộc phải có tham số - ví dụ như hàm
2. Khi đó ta bỏ qua mục này trong ngoặc tròn. Tham số của hàm có 3 dạng - các dạng của tham số sẽ được nói rõ hơn ở phần sau của bài viết. Nội dung của hàmNội dung của hàm là những việc ta cần hàm thực hiện, được biểu diễn trong khối lệnh ngoặc nhọn. Ví dụ: Nội dung của hàm có khả năng in ra giá trị của một số
Đối với các hàm có giá trị trả về (khác
9), ta cần phải sử dụng lệnh
5 để thông báo kết thúc chương trình và giá trị trả về. Ví dụ: Nội dung của hàm có khả năng trả về tổng của hai số
Từ khóa
6 sẽ thông báo kết thúc hàm ngay lập tức, và trả về giá trị nếu có. Một hàm được định nghĩa trả về một kiểu giá trị khác
9 mà kết thúc không có
6 sẽ khiến chương trình bị lỗi
9. Các bộ dịch không nhất thiết cần phải thông báo lỗi này (nhưng thường sẽ có cảnh báo), và chương trình vẫn có thể được dịch thành công kể cả khi có lỗi này. Khi đó giá trị trả về có thể là bất cứ giá trị nào. Để tránh sai sót, hãy luôn kết thúc các hàm một cách hợp lệ. Từ khóa
6 cũng có thể sử dụng trong hàm kiểu
9 để kết thúc hàm đó. Trong trường hợp này, ta không cần có phần giá trị trả về. Ví dụ:
Sử dụng hàm đã được định nghĩa Sau khi đã định nghĩa hàm, ta có thể sử dụng hàm bằng cách gọi tên của hàm cùng với giá trị của các tham số của nó (nếu có). Ví dụ thứ nhất: Chương trình sau đây gọi ra hàm
2 vừa rồi ở trong
2, để kiểm tra tính năng của từ khóa
6 ` include using namespace std; void testing() { }
int main()
{ }`Output
Ví dụ thứ hai: Chương trình sau đây sẽ in ra tổng của hai giá trị được tính toán bằng hàm
5 ` include using namespace std; int tinhTong(int a, int b) { }
int main()
{ }`Các kiểu tham số của hàm Ok, giờ ta có thể áp dụng hàm vào chương trình đảo hai số như đầu bài viết đặt ra! Ta chỉ cần viết một hàm
6 như sau
Rồi sau đó gọi hàm này ở dưới khi nào cần đảo số:
0 Output
1 Tại sao giá trị của
3 và
4 vẫn chưa đảo? Có 3 dạng tham số của hàm Tham số truyền giá trịĐây là kiểu tham số mặc định của hàm. Khi ta gọi hàm, chương trình sẽ tạo ra các biến mới, copy giá trị được truyền vào biến, và tất cả các thay đổi sẽ chỉ diễn ra trên các biến mới này. Hàm
6 ta vừa viết rơi vào trường hợp này - chỉ có giá trị của hai biến tham số
3 và
4 thay đổi,
3 và
4 ở bên ngoài vẫn không có gì thay đổi cả. Tham số truyền biếnĐể khai báo một biến tham số truyền biến, ta sử dụng cú pháp khai báo tham số
2 Kiểu tham số này thực hiện mọi thay đổi trực tiếp lên biến mà không thông qua bản copy nào. Ví dụ, ta viết lại hàm
6 như sau
3 Cho chạy chương trình với đoạn code sửa đổi, ta được output
4 Hàm đảo số đã thực hiện thay đổi trực tiếp lên hai biến
3 và
4, và nhờ đó mà giá trị của chúng đã được đảo thành công. Khi sử dụng hàm có tham số truyền biến, các tham số này bắt buộc phải là một biến - khác với tham số truyền giá trị chỉ cần truyền giá trị. Do đó nếu hàm có dạng
5 Thì tham số
3 chỉ có thể là một biến kiểu
3 hoặc tương đương. Trong khi đó nếu hàm có dạng
6 Thì tham số
3 có thể là 1 biến, 1 biểu thức cho ra kiểu
3 hoặc tương đương, hoăc một giá trị số cụ thể. Tham số truyền con trỏĐể khai báo một biến tham số truyền con trỏ, ta sử dụng cú pháp khai báo tham số
7 Kiểu dữ liệu này sẽ truyền giá trị địa chỉ ô nhớ của biến vào hàm. Kiểu tham số này, cùng với những kiến thức về con trỏ, sẽ được giải thích kĩ hơn ở các bài viết sau. Đệ quyGiả sử ta định nghĩa giai thừa của một số nguyên
1 như sau 0!=10!=1x!=(x−1)!∗x ∀x>0x!=(x−1)!∗x ∀x>0 Đây là một cách định nghĩa kiểu quy nạp - ta định nghĩa một giá trị cơ sở, và các giá trị quy nạp sẽ được định nghĩa từ các giá trị cơ sở trước nó. Trong chương trình, ta cũng có thể tự gọi một hàm ở ngay bên trong nó - hành động này được gọi là đệ quy. Ví dụ với hàm tính lũy thừa của một số theo định nghĩa trên
8 Dòng lệnh trên sử dụng toán tử điều kiện - nếu như
1 bằng 0, giai thừa sẽ trả lại 1. Nếu
1 khác 0, giai thừa sẽ bằng giai thừa của
4 nhân với
1. Chú ý rằng hành động đệ quy có thể sinh ra lặp vô hạn. Ví dụ như hàm sau
9 Hàm kia sẽ liên tục lấy hàm
6 của
4 nhân với
1, mà không hề có điểm dừng. Nếu gọi hàm này, chương trình hoặc sẽ không thể chạy được tiếp (do hàm này không bao giờ kết thúc), hoặc sẽ sinh lỗi tràn bộ nhớ (do phải tạo ra vô hạn biến tham số x cho mỗi lần gọi hàm). Giá trị mặc định cho tham sốNhư hàm open của
1 có giá trị mặc định cho
0, ta cũng có thể đặt giá trị mặc định cho các tham số của hàm.
0 Giá trị mặc định sẽ được sử dụng khi không có giá trị nào được truyền vào tham số tương ứng. Ví dụ: Chương trình sau sẽ gọi ra hàm tính tổng hai số mà không truyền hai số vào. Vì đã có giá trị mặc định từ trước, nên phép toán vẫn được thực hiện với hai giá trị mặc định. Khái niệm chương trình con là gì?Trong khoa học máy tính, chương trình con (subprogram) hay subroutine là một đoạn chương trình được đóng gói thành một đơn vị trình, nó thực hiện một số tác vụ cụ thể mà chương trình cần thực hiện nhiều lần từ nhiều nơi trong thời gian chạy của nó. Con trỏ trong C là gì?Trong lập trình C, con trỏ là một biến dùng để lưu trữ địa chỉ bộ nhớ của một biến khác. Con trỏ cho phép các chương trình có quyền thao tác trực tiếp vào bộ nhớ, điều này đặc biệt hữu ích khi bạn thực hiện các tác vụ như cấp phát bộ nhớ động hay làm việc với mảng. Con trỏ trong ngôn ngữ lập trình là gì?Trong khoa học máy tính, con trỏ (tiếng Anh: pointer) là một đối tượng ngôn ngữ lập trình, mà giá trị nó chỉ tới giá trị khác được chứa nơi nào đó trong bộ nhớ máy tính sử dụng địa chỉ bộ nhớ. Ngôn ngữ C là hướng gì?C là một ngôn ngữ lập trình đa năng (general purpose) cực phổ biến, đơn giản và linh hoạt. Nó là ngôn ngữ lập trình hướng cấu trúc và thủ tục, gần với ngôn ngữ máy nhưng độc lập máy (machine-independent), cơ động cao, được sử dụng rộng rãi ở các ứng dụng. |