Home » Blog lập trình » [Lập trình C/C++] Bài 6 – Cấu trúc hàm cơ bản trong ngôn ngữ lập trình C/C++

[Lập trình C/C++] Bài 6 – Cấu trúc hàm cơ bản trong ngôn ngữ lập trình C/C++

Một số lưu ý:

Dấu  //  dùng để comment ghi chú, giải thích

Dấu ;   dùng để kết thúc câu lệnh, luôn luôn có nếu không sẽ bị lỗi.

I. ĐẶT VẤN ĐỀ

TẠI SAO PHẢI CẦN HỌC KIẾN THỨC HÀM VÀ CÀI ĐẶT CODE CỦA MÌNH BẰNG HÀM ?

 

Đặt vấn đề

Nhập vào 3 số nguyên dương a, b, c(a , b, c yêu cầu là 3 giá trị lớn hơn 0 và nhỏ hơn 10). Viết chương trình tính S = a! + b! + c!

 

* LẬP TRÌNH TUYẾN TÍNH

Bước 1: Nhập vào giá trị cho 3 biến a , b, c (a , b, c yêu cầu là 3 giá trị lớn hơn 0 và nhỏ hơn 10)

 

Bước 2: Tính giai thừa của từng biến nguyên dương a, b, c. Sau đó tính tổng s = a! + b! + c!

 

* LẬP TRÌNH THỦ TỤC – HÀM

Viết 1 lần và sử dụng nhiều lần

 

Bước 0: Định nghĩa các hàm cần sử dụng trong bài toán – chương trình

 

Bước 1: Nhập vào giá trị cho 3 biến a , b, c (a , b, c yêu cầu là 3 giá trị lớn hơn 0 và nhỏ hơn 10)

 

Bước 2: Tính giai thừa của từng biến nguyên dương a, b, c. Sau đó tính tổng s = a! + b! + c!

 

Nhận xét

– Chia chương trình – bài toán nhỏ ra thành các chương trình con(hàm)

+ Chương trình gọn gàng – rành mạch – dễ quản lí – dễ thao tác và chuyên nghiệp hơn.

+ Tiết kiệm số lượng dòng code cần phải cài đặt.

+ Viết 1 lần sử dụng được nhiều lần.

+ Tối ưu mã nguồn, dễ dàng thay đổi – nâng cấp và phát triển mã nguồn về lâu dài.

…..

II. KHÁI NIỆM

Hàm là 1 khối lệnh được thực hiện khi nó được gọi từ 1 điểm khác của chương trình.

Hàm là một đơn vị độc lập của chương trình, mỗi hàm có một chức năng xác định, có thể được gọi thực hiện bởi hàm hoặc chương trình khác. Trong C/C++ các hàm đều ngang mức – tức là trong định nghĩa hàm không thể chứa định nghĩa hàm khác (gọi là hàm 1 mức).

– Có hai loại hàm đó là hàm có sẵn của thư viện(<math.h>, <string>…) và hàm do người lập trình định nghĩa (hay còn gọi là hàm của người dùng).

II. CÚ PHÁP

          1. Khái báo hàm

Cú pháp khai báo nguyên mẫu hàm
<kiểu_hàm> <tên_hàm>([danh_sách_tham_số_nếu_có])
Trong đó:
tên_hàm: là một tên hợp lệ theo quy tắc về tên của ngôn ngữ C/C++. mỗi hàm có tên duy nhất và không được trùng với các từ khóa. Tên hàm sẽ được dùng để gọi hàm.

kiểu_hàm : Hàm có thể trả về một giá trị cho nơi gọi, giá trị đó thuộc một kiểu dữ liệu nào đó, kiểu đó được gọi là kiểu hàm. Kiểu hàm có thể là kiểu chuẩn cũng có thể là kiểu do người dùng định nghĩa. Nếu hàm không trả về giá trị thì kiểu hàm là void.
–  danh_sách_tham_số_nếu_có: Hàm có thể nhận dữ liệu vào thông qua các tham số của nó (tham số hình thức), các tham số này cũng thuộc kiểu dữ liệu xác định. Có thể có nhiều tham số, các tham số cách nhau bởi dấu phẩy (,). Trong nguyên mẫu hàm không bắt buộc phải có tên tham số nhưng kiểu của nó thì bắt buộc. Nếu hàm không có tham số chúng ta có thể để trống phần này hoặc có thể khai báo là void.

 

Ví dụ

<kiểu_hàm> <tên_hàm> (<danh_sách_các_tham_số_nếu_có>) Mô tả
int Tim_Max (int a, int b) – Khai báo nguyên mẫu hàm Tim_Max – có hai tham số hình thức kiểu int là int a và int b, kết quả trả về kiểu int. Hàm có tác dụng trả về số lớn nhất trong 2 số a và b.
float Tinh_Tong (float a, int y) – Khai báo nguyên mẫu hàm Tinh_Tong – có 2 tham số hình thức là float a và int y, kết quả trả về là 1 số thực kiểu float. Hàm có tác dụng tính tổng của 1 số thực float  với 1 số nguyên int.
void Hoan_Vi (int &x, int &y) – Khai báo nguyên mẫu hàm Hoan_Vi – có 2 tham số hình thức là int x và int y, hàm này không có giá trị trả về – kiểu hàm void. Hàm này có tác dụng là hoán vị giá trị của 2 biến x và y.
bool Kiem_Tra_Nguyen_To (int n) – Khai báo nguyên mẫu hàm Kiem_Tra_Nguyen_To – có 1 tham số hình thức là int n, kết quả trả về là true hoặc false. Hàm này có tác dụng trả về true – nếu n là số nguyên tố, ngược lại trả về false – nếu n không phải là số nguyên tố.

 

          2. Định nghĩa hàm

Cú pháp

<kiểu_hàm> <tên_hàm>([danh_sách_tham_số_nếu_có])

{

< thân hàm>

}

– Dòng thứ nhất là tiêu đề hàm (dòng tiêu đề) chứa các thông tin về hàm: tên hàm, kiểu của hàm (hai thành phần này giống như trong nguyên mẫu hàm) và khai báo các tham số (tên và kiểu) của hàm, nếu có nhiều hơn một thì các tham số cách nhau bởi dấu phẩy(,).
– Thân hàm là các lệnh nằm trong cặp { }, đây là các lệnh thực hiện chức năng của hàm. Trong hàm có thể có các định nghĩa biến, hằng hoặc kiểu dữ liệu; các thành phần này trở thành các thành phần cục bộ của hàm.
Nếu hàm có giá trị trả về (kiểu hàm khác void) thì trong thân hàm trước khi kết thúc phải có câu lệnh trả về giá trị:
return <giá trị>;
+ <giá_trị> sau lệnh return chính là giá trị trả về của hàm, nó phải có kiểu phù hợp với kiểu của hàm được khai báo trong dòng tiêu đề. Trường hợp hàm void chúng ta có thể dùng câu lệnh return (không có giá trị) để kết thúc hàm hoặc khi thực hiện xong lệnh cuối cùng (gặp } cuối cùng) hàm cũng kết thúc.

+ Khi gặp lệnh return – trả về giá trị thì hàm sẽ kết thúc quá trình làm việc ngay tại thời điểm return đó. Nghĩa là các lệnh hoặc khối lệnh dưới return sẽ không được chương trình chạy tiếp nếu lệnh return được thực thi.

VD_1: Hàm Tim_Max trả lại giá trị lớn nhất trong 2 số nguyên a, b

 

III. LỜI GỌI HÀM VÀ TRUYỀN THAM SỐ

– Một hàm có thể gọi thực hiện thông qua tên hàm, với những hàm có tham số thì trong lời gọi phải truyền cho hàm các tham số thực sự (đối số) tương ứng với các tham số hình thức.
– Khi hàm được gọi và truyền tham số phù hợp thì các lệnh trong thân hàm được thực hiên bắt đầu từ lệnh đầu tiên sau dấu mở móc { và kết thúc khi gặp lệnh return, exit hay gặp dấu đóng móc } – kết thúc hàm.

Cú pháp:
<tên_hàm> ([danh sách các tham số thực sự]);
Các tham số thực sự phải phù hợp với các tham số hình thức:
+ Số tham số thực sự phải bằng số tham số hình thức.

+  Tham số thực sự được truyền cho các tham số hình thức tuần tự từ trái sang phải, tham số thực sự thứ nhất truyền cho tham số hình thức thứ nhất, tham số thực sự thứ 2 truyền cho tham số hình thức thứ 2,.. kiểu của các tham số thực phải phù hợp với kiểu của các tham số hình thức. Sự phù hợp ở đây được hiểu là kiểu trùng nhau hoặc kiểu của tham số thực sự có thể ép về kiểu của tham số hình thức.

Ví dụ

<kiểu_hàm> <tên_hàm> (<danh_sách_các_tham_số_nếu_có>) Lời gọi hàm
int Tim_Max (int a, int b) int Max = Tim_Max(8, 9);
float Tinh_Tong (float a, int y) float Tong = Tinh_Tong(5.5, 8);
void Hoan_Vi (int &x, int &y) int a = 4, b = 5;

Hoan_Vi(a, b);

bool Kiem_Tra_Nguyen_To (int n) bool KT;

KT = Kiem_Tra_Nguyen_To(7);

 

IV. THAM SỐ CỦA HÀM

          1. THAM SỐ GIÁ TRỊ(THAM TRỊ)

– Tức là trong hàm chúng ta sử dụng tham số hình thức như là một bản sao dữ liệu của tham số được truyền cho hàm, do vậy chúng không làm thay đổi giá trị của tham số truyền vào. Hay nói khác đi, các tham số hình thức là các biến cục bộ trong hàm.

– Trong quá trình thực hiện các lệnh bên trong hàm – mọi sự tác động làm thay đổi giá trị của biến hình thức – nếu có(tham số hình thức) sẽ hoàn toàn không ảnh hướng đến tham số thực – biến gửi đến tham số hình thức của hàm.

 

Kết quả in ra màn hình

Trước khi gọi hàm Hoan_Vi: a = 4, b = 5

Sau khi gọi hàm Hoan_Vi: a = 4, b =5

==> Hàm Hoan_Vi(a, b) thực hiện không đúng chức năng của nó là hoán đổi giá trị của 2 biến thực a và b.

– Nguyên nhân là hàm Hoan_Vi(int x, int y) thì x , y là 2 tham số hình thức tham trị, nói 1 cách dễ hiểu thì x, y là 2 biến cục bộ của hàm Hoan_Vi. Khi ta gọi hàm Hoan_Vi(a, b) thì chương trình cấp phát ra 2 vùng nhớ cục bộ trong hàm là x và y, sau đó chương trình sao chép giá trị của a vào x, b vào y để thực hiện xử lí,  mọi xử lí trong hàm Hoan_Vi đều đang thao tác trên 2 biến x và y, vì vậy giá trị a và b không đổi sau khi gọi hàm Hoan_Vi(a, b).

          2.  THAM SỐ THAM CHIẾU(THAM CHIẾU – THAM BIẾN)

– Tức là tham số thực được gửi đến hàm, khi thực hiện các lệnh bên trong hàm, sẽ có các lệnh tính toán có thể làm thay đổi giá trị của tham số hình thức, khi đó giá trị của tham số thực được truyền vào hàm cũng thay đổi theo tham số hình thức đó. Trường hợp này tham số thực gửi đến sẽ được gắn kết trực tiếp với tham số hình thức, vào lúc hàm đang chạy(nhớ là khi hàm đang chạy thôi nha) thì tham số hình thức và tham số thực xem như là đồng nhất với nhau – đồng nhất về địa chỉ vùng nhớ.

– Ngôn ngữ C++ qui ước dùng dấu & đặt phía trước các tham số dạng tham chiếu(tham biến). Lưu ý cơ chế này chỉ dành riêng cho C++, không thể dùng cho các chương trình ngôn ngữ C. Với các chương trình C – chúng ta sẽ cài đặt tham chiếu(tham biến) dựa vào biến con trỏ(khi nào lớn sẽ biết :)))

 

Kết quả in ra màn hình

Trước khi gọi hàm Hoan_Vi: a = 4, b = 5

Sau khi gọi hàm Hoan_Vi: a = 5, b =4

==> Hàm Hoan_Vi(a, b) thực hiện đúng chức năng của nó là hoán đổi giá trị của 2 biến thực a và b

 

CÁC BƯỚC CÀI ĐẶT 1 HÀM

Bước 1: Xác định xem hàm của mình cài đặt là hàm thuộc kiểu gì ?

– Hàm có kiểu dữ liệu trả về hay là hàm không có kiểu dữ liệu trả về ?

Bước 2: Tìm 1 cái tên đặt cho hàm của mình dự định sẽ cài đặt.

Lưu ý:

– Tên hàm phải mang tính chất gợi nhớ – nghĩa là khi người dùng hoặc lập trình viên khác nhìn vảo hàm của mình cài đặt thông qua tên hàm thì người đó biết rằng : hàm của mình cài đặt có chức năng gì ? Thực hiện – xử lí công việc gì ?

– Tên hàm phải luôn luôn có ý nghĩa gần nhất với chức năng xử lí của hàm, phải có mối liên hệ mật thiết với chức năng của hàm.

Bước 3:  

– Xác định xem hàm của mình đang làm công việc gì ?

– Cần bao nhiêu tham số hình thức ?

Tham số hình thức đó mình cần dùng là tham trị hay tham chiếu(tham biến).

Lời kết luận từ tác giả:

– Đây là tài liệu dùng để học và tham khảo.

– Trong quá trình biên soạn bộ tài liệu có:

+ Tham khảo 1 số nguồn tài liệu(google search, ebook, sách chuyên ngành…).

+ Kiến thức – kinh nghiệm cá nhân của tôi.

– Có thể còn 1 số lỗi sai sót – sẽ luôn cập nhật phiên bản mới.

– Mong nhận được sự đóng góp và phản hồi tích cực từ các bạn đọc. Chân thành cảm ơn.

Link download file PDF: Here

Share
Share
Free WordPress Themes - Download High-quality Templates