Xin chào thầy và tất cả mọi người. Em là newbie mới học lập trình, hiện vừa mới học tới mảng 1 chiều ( C++ ). Về hình thức em làm xuất ra kết quả đúng nhưng không đúng yêu cầu của thầy trên trường, thầy bảo khi tính toán gì thì phải khai báo hàm là int và return kết quả muốn trả về ( giá trị , mảng … ) thay vì cout chung với hàm tính toán giống như em. Em có test theo ý thầy nhưng chương trình chạy lỗi khi em muốn return mảng vừa tính toán. Mong các cao nhân chỉ em sự khác nhau giữa 2 cách này và demo giúp em 1 chương trình đơn giản cú pháp giống thầy ạ, em chưa học tới con trỏ. Em cảm ơn .
Giúp đỡ về cách return trả kết quả cho mảng
Có 1 cách để “trả về” kết quả là truyền mảng vào hàm, ghi dữ liệu vào mảng đấy.
Khi học đến con trỏ thì cấp phát động và trả về dạng con trỏ. Nhưng cách này nên kiểm soát tốt bộ nhớ, cấp phát và giải phóng hợp lý.
int result[100];
funccall(..., result);
// print result
anh có thể demo cụ thể dùm em được không ạ, ví dụ em code theo ý thầy nói như dưới đây thì nó báo lỗi vậy ạ và em không biết fix sao hix
.
#include <iostream>
using namespace std;
void nhapham(int arr[], int& n)
{
cout << "Nhap so phan tu cua ham: ";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "Nhap gia tri cho phan tu thu " << (i + 1) << " :";
cin >> arr[i];
}
}
//Ham tang gia tri phan tu len 1 don vi.
int tinhtong(int arr, int n)
{
for (int i = 0; i < n; i++)
{
arr[i]++;
}
return arr;
}
void xuatham(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
cout << arr[i] << endl;
}
}
int main()
{
int arr[50];
int n = 0;
nhapham(arr, n);
tinhtong( arr, n);
xuatham(arr, n);
return 0;
}
Và cho em hỏi cách dưới đây về sau có hạn chế gì mà phải return trả về kết quả tính toán ạ.
#include <iostream>
using namespace std;
void nhapham(int arr[], int& n);
void tinhtong(int arr[], int n);
void nhapham(int arr[], int& n)
{
cout << "Nhap so phan tu cua ham: ";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "Nhap gia tri cho phan tu thu " << (i + 1) << " :";
cin >> arr[i];
}
}
//Ham tang gia tri phan tu len 1 don vi.
void tinhtong(int arr[], int n)
{
for (int i = 0; i < n; i++)
{
arr[i]++;
cout << arr[i] << " ";
}
}
int main()
{
int arr[50];
int n = 0;
nhapham(arr, n);
tinhtong(arr, n);
return 0;
}
trong C++ muốn trả về mảng có nhiều cách :V
1 là xài output parameter:
void f(..., T* outputArray, size_t outputArrayMaxSize) {
// tính toán ...
// ghi kết quả vào outputArray
for (size_t i = 0; i < outputArrayMaxSize; ++i) {
outputArray[i] = ...;
}
}
2 là trả về std::vector, nên xài cách này :V
#include <vector>
std::vector<T> f(...) {
// khai báo mảng trả về, với resultSize là kích thước của mảng
std::vector<T> result(resultSize);
// tính toán ...
// ghi giá trị vào mảng
for (size_t i = 0; i < result.size(); ++i) {
result[i] = ...;
}
// hoặc nếu ko biết trước kích thước mảng trả về thì xài
for (...) {
//...
result.push_back(someValue);
}
return result; // trả về mảng
}
2 rưỡi :V :V là kết hợp 1 và 2, đa số ko xài :V
void f(..., std::vector<T>& output) {
//...
}
3 là xài std::array, chỉ xài được khi biết trước kích thước của mảng trả về
// ví dụ biết kích thước mảng trả về là 10
#include <array>
std::array<T, 10> f(...) {
// khai báo mảng trả về
std::array<T, 10> result{}; // dấu {} là gán 0 cho các giá trị trong mảng :V
// tính toán ...
// ghi giá trị vào mảng
for (size_t i = 0; i < result.size(); ++i) {
result[i] = ...;
}
return result; // trả về mảng
}
3 rưỡi, kết hợp 1 và 3, đa số ko xài :V
void f(..., std::array<T, 10>& output) {
//...
}
à ý thấy là đừng có xài cout cin trong mấy hàm nhapham tinhtong gì đó chứ đâu có đòi trả về mảng đâu :V
Thầy em có kêu là mỗi lần tính toán gì đó thì phải return trả kết quả, tính sum thì trả về sum, tính mảng thì trả về mảng ạ.
Em chưa học tới khai báo thư viện vector nên bài tập về nhà không được xài ạ. Hiện phải làm bài tập 1 project nhưng tầm hơn chục hàm, có những hàm làm thay đổi giá trị mảng ban đầu nhập vào em đang hoang mang không biết nếu làm theo cách thầy thì làm sao đảm bảo kết quả 
Đúng vậy hàm sum thì return kết quả và muốn in thì cout << "Sum: " << sum();
muốn tính 2 lần sum() thì 2*sum(), vì sum() có trả về kết quả nên mới nhân được, nếu trả về void thì không làm đc như kia.
parameter int arr kìa, đáng lẽ phải là mảng đúng ko
dạ, em muốn return trả về kết quả mảng mới, nhưng không biết cú pháp ạ.
thầy đòi viết vậy à :V :V
#include <iostream>
#include <vector>
// #include <numeric>
// template <class T>
std::istream& operator>>(std::istream& is, std::vector<int>& arr) {
for (auto& n : arr) is >> n;
return is;
}
// template <class T>
std::ostream& operator<<(std::ostream& os, const std::vector<int>& arr) {
for (const auto& n : arr) os << n << ' ';
return os;
}
int sum(const std::vector<int>& arr) {
// return std::accumulate(begin(arr), end(arr), 0);
int result = 0;
for (const auto& n : arr) result += n;
return result;
}
int main() {
int n = 0;
std::cout << "Nhập số phần tử của mảng: ";
std::cin >> n;
std::vector<int> arr(n);
std::cin >> arr;
std::cout << arr << "\n";
std::cout << "Tổng các phần tử trong mảng là: " << sum(arr) << "\n";
}
hoặc như này:
#include <iostream>
#include <vector>
std::vector<int> getIntArray(int size) {
std::vector<int> result(size);
for (auto& n : result) std::cin >> n;
return result;
}
void outputIntArray(const std::vector<int>& arr) {
for (const auto& n : arr) std::cout << n << ' ';
std::cout << '\n';
}
int sum(const std::vector<int>& arr) {
int result = 0;
for (const auto& n : arr) result += n;
return result;
}
int main() {
int n = 0;
std::cout << "Nhập số phần tử của mảng: ";
std::cin >> n;
auto arr = getIntArray(n);
outputIntArray(arr);
std::cout << "Tổng các phần tử trong mảng là: " << sum(arr) << "\n";
}
Thầy chưa cho dùng thư viện vector 
hàm trả về int => int function();
hàm trả về string => string funtion():
hàm trả về mảng int => int [] function();
cứ thử xem được không chứ ?
vậy học tới struct chưa :V
chứ trả về con trỏ sao gọi là trả về mảng được, nếu thầy ko cho xài struct thì chửi thầy bảo mảng ko phải là con trỏ :V
thôi cứ viết thẳng luôn khỏi cần hàm gì hết :V
int n = 0;
std::cout << "Nhập số phần tử của mảng: ";
std::cin >> n;
int* arr = new int[n];
std::cout << "Nhập " << n << " số:\n";
for (int i = 0; i < n; ++i) std::cin >> arr[i];
std::cout << "Mảng vừa nhập:\n";
for (int i = 0; i < n; ++i) std::cout << arr[i] << ' ';
std::cout << "\n";
std::cout << "Tổng các phần tử trong mảng là: " << sum(arr, n) << "\n";
delete[] arr; // nhớ giải phóng arr sau khi dùng
...
int sum(int* arr, int n) {
int res = 0;
...
return res;
}
Theo mình thì:
-
Đoạn code đầu tiên không chính xác đó là tên của hàm, điều này dễ dẫn đến hiểu lầm
. Bạn nên sửa lại tên cho đúng chức năng VD: tangTatCaGiaTriCuaMangLenmot. Hoặc nếu có comment rùi thì đặt tên ngắn lại. -
Đoạn code đầu tiên trình biên dịch báo lỗi khi bạn thao tác
return arr;là vì:-
bạn tạo ra một hàm mà chỉ có thể trả về đúng 1 “GIÁ TRỊ” tức là hàm này có chỉ có thể trả về 1 giá trị kiểu
int. -
Vậy khi bạn viết
return arr;là ý bạn đang muốn trả về “ĐỊA CHỈ” của mảng chứ hông phải kiểu trả về của hàm làint(mà địa chỉ thì chủ yếu được lưu trữ bởi con trỏ). -
Vậy khi bạn viết
return arr[i]thì nó lại được phép nhưng không đúng yêu cầu

-
-
Tốt nhất nếu muốn sửa đoạn code thứ nhất bạn nên viết
return 1. Nếu mà có trường hợp không trả về được thì cứ lấy máy tính ra nhúng nước một lúc sẽ trả về được. -
Còn đoạn code thứ 2 bạn viết sai mấy chỗ cơ
. Nên nói chung là thầy muốn bạn hiểu rằng 2 hàm nhập và xuất mảng thì sài void ok (Vì nó có chức năng xịn xò, trả về nhiều thứ hoặc ko gì hết). Còn mấy hàm chỉ có 1 chức năng xác định thôi thì ta nên sử dụng một kiểu trả về rõ ràng để kết quả đầu ra của hàm minh bạch hơn. -
Theo quan điểm cá nhân của mình, thì hàm tăng tất cả các giá trị của mảng lên 1 thì nên để kiểu void thì hay hơn. Nhưng đừng cout ra giống bạn nó hơi thừa. Bạn có thể gọi lại hàm xuất mảng ở hàm main cho nhanh để giảm tải đi.
-
Ví dụ trường hợp tính tổng của của tất cả giá trị trong mảng thì bạn nên sài kiểu trả về là
inthay gì đó.
GOOD LUCK
Dạ. Vậy tóm lại ý chính của anh là đối với hàm em cần trả về 1 giá trị cụ thể, ví dụ trả về tổng các số nguyên tố trong mảng, số đứng đầu, đứng cuối trong mảng ,… thì nên xài kiểu trả về là INT . Còn đối với hàm em tác động lên mảng, và em cần xuất mảng đó ra thì vẫn khai báo void và xuất mảng ở hàm main đúng không ạ? Và cho em hỏi code thứ 2 sai lỗi nào vậy ạ? Mặc dù nó vẫn xuất kết quả đúng.
- Kiểu trả về nên phụ thuộc vào kết quả (output) của hàm chức năng đó. VD: hàm tính điểm trung bình thì nên sài kiểu ‘double’ hoặc ‘float’.
- Sử dụng kiểu trả về là ‘void’ ở đây là do người lập trình thui, TH trên là do mình cảm thấy không có một cái đơn vị(kiểu dữ liệu sẵn có của C++) nào miêu tả được kết quả thực thụ nên mình Phán: “MÉO HIỂU KIỂU GÌ”. phang ngay cho ló cái void.
- Nếu trường hợp bạn sợ có điều gì sai sai sẽ xảy ra trong hàm thì bạn có thể đặt một biến kiểm tra và
return 1;tượng trưng cho việc không có gì sai,return 0;nếu có sai xót ở đâu đó trong hàm.
- Bạn làm để hiểu thì OK nhưng nên tương đối như vầy
abc để tránh hậu họa về sau.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?