Trong bài này, bạn sẽ được học về các hướng tiếp cận khác nhau có thể sử dụng để giải quyết một vấn đề bằng cách dùng hàm.
Để hiểu rõ hơn về đối số và trả về trong hàm, hàm do người dùng định nghĩa có thể được phân loại thành:
- Hàm không có đối số và giá trị trả về
- Hàm không có đối số nhưng có trả về giá trị
- Hàm có đối số nhưng không trả về giá trị
- Hàm có đối số và có trả về giá trị
Xét trường hợp khi bạn cần kiểm tra số nguyên tố. Vấn đề này được giải quyết bên dưới bằng cách tạo ra một hàm do người dùng định nghĩa theo 4 cách khác nhau như đã nêu trên.
Ví dụ 1: Không truyền vào đối số và không trả về giá trị
# include <iostream>
using namespace std;
void prime();
int main()
{
// Không truyền vào đối số cho hàm prime()
prime();
return 0;
}
// Kiểu trả về là void vì hàm không trả về giá trị
void prime()
{
int num, i, flag = 0;
cout << "Enter a positive integer enter to check: ";
cin >> num;
for(i = 2; i <= num/2; ++i)
{
if(num % i == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
{
cout << num << " is not a prime number.";
}
else
{
cout << num << " is a prime number.";
}
}
Trong ví dụ trên, hàm prime() được gọi từ main() mà không có đối số nào.
Hàm prime() sẽ nhận một số nguyên từ người dùng và kiểm tra xem số đó có phải số nguyên tố hay không.
Vì kiểu trả về của prime() là void, nên không có giá trị nào được trả về từ hàm.
Ví dụ 2: Không truyền vào đối số nhưng trả về một giá trị
#include <iostream>
using namespace std;
int prime();
int main()
{
int num, i, flag = 0;
// Không truyền vào đối số cho hàm prime()
num = prime();
for (i = 2; i <= num/2; ++i)
{
if (num%i == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
{
cout<<num<<" is not a prime number.";
}
else
{
cout<<num<<" is a prime number.";
}
return 0;
}
// Kiểu trả về của hàm là int
int prime()
{
int n;
printf("Enter a positive integer to check: ");
cin >> n;
return n;
}
Trong ví dụ trên, hàm prime() được gọi từ main() mà không cần đối số.
Hàm prime() sẽ nhận một số nguyên dương từ người dùng. Vì kiểu trả về của hàm là một giá trị int, nó sẽ trả về số đã nhập vào từ người dùng cho hàm main().
Sau đó, việc kiểm tra số có phải là số nguyên tố hay không được thực hiện trong hàm main() và in ra màn hình.
Ví dụ 3: Truyền vào đối số nhưng không trả về giá trị
#include <iostream>
using namespace std;
void prime(int n);
int main()
{
int num;
cout << "Enter a positive integer to check: ";
cin >> num;
// Đối số num được truyền vào hàm prime()
prime(num);
return 0;
}
// Không có giá trị trả về nên kiểu trả về của hàm là void. */
void prime(int n)
{
int i, flag = 0;
for (i = 2; i <= n/2; ++i)
{
if (n%i == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
{
cout << n << " is not a prime number.";
}
else {
cout << n << " is a prime number.";
}
}
Trong ví dụ trên, các số nguyên dương được nhập vào từ người dùng và lưu vào biến num.
Sau đó, biến num được truyền vào hàm prime() và sẽ được kiểm tra liệu số đó có phải số nguyên tố hay không rồi in ra màn hình.
Vì kiểu trả về của hàm prime() là void nên không có giá trị nào được trả về từ hàm.
Ví dụ 4: Truyền vào đối số và trả về một giá trị
#include <iostream>
using namespace std;
int prime(int n);
int main()
{
int num, flag = 0;
cout << "Enter positive integer to check: ";
cin >> num;
// Truyền vào đối số num cho hàm prime()
flag = prime(num);
if(flag == 1)
cout << num << " is not a prime number.";
else
cout<< num << " is a prime number.";
return 0;
}
/* Hàm này trả về giá trị là một số nguyên. */
int prime(int n)
{
int i;
for(i = 2; i <= n/2; ++i)
{
if(n % i == 0)
return 1;
}
return 0;
}
Trong chương trình trên, một số nguyên dương được nhập vào từ người dùng lưu vào biến num.
Sau đó, num được truyền cho hàm prime(), nơi mà nó sẽ được kiểm tra xem liệu nó có phải số nguyên tố hay không.
Vì kiểu trả về của hàm prime() là int, 1 hoặc 0 sẽ được trả về hàm main(). Nếu số là nguyên tố, 1 được trả về. Nếu không, 0 sẽ được trả về.
Trở lại hàm main(), giá trị trả về 1 hoặc 0 được lưu trong biến flag, và câu trả lời tương ứng sẽ được in ra màn hình.
Phương pháp nào tốt hơn?
Tất cả 4 chương trình đều cho ra cùng đầu ra và tất cả đều là những chương trình hợp lý về mặt kỹ thuật.
Sẽ không có quy tắc cứng nhắc hoặc nhanh chóng nào về việc lựa chọn phương pháp sử dụng.
Phương pháp cụ thể được lựa chọn tùy theo tình huống và các bạn muốn giải quyết vấn đề.