Thứ Bảy, 4 tháng 5, 2024

33. Truyền mảng vào hàm trong C++

Tạm thời cho đến lúc này chúng ta đã "hiểu sơ" về mảng trong C. Thật ra, bạn sẽ phải luyện rất nhiều mới thành thục về mảng.

Cần lưu ý:

  • Các phần tử trong mảng được đánh chỉ số tính từ 0, ví dụ mảng của bạn có 100 phần tử thì chỉ số sẽ được đánh số từ 0 tới 99. Tổng quát nếu mảng có n phần tử thì chỉ số sẽ được đánh từ 0 tới n - 1
  • Nếu muốn duyệt từ phần tử đầu tới phần tử cuối của mảng, ta sử dụng for(int i = 0; i < n; i++).
  • Nếu muốn duyệt từ phần tử cuối tới phần tử đầu của mảng, ta sử dụng for(int i = n - 1; i >= 0; i--).
  • Với mảng đã được khởi tạo, chúng ta có thể thay đổi giá trị của các phần tử trong mảng.
  • Để truy cập vào phần tử trong mảng 2 chiều ta luôn dùng chỉ số hàng (row) trước, chỉ số cột (column) sau. Bảng sau đây sẽ cho ta thấy điều đó:

 

Chúng tôi tách riêng phần này ra vì muốn bạn có cơ hội từng bước viết mã cho một chương trình C++ đã bắt đầu tương đối phức tạp.

Đầu tiên xét vài nhu cầu thực tế:

Ví dụ 1: Ta có một Hàm dùng để in các sinh viên có tên bắt đầu bằng chữ A.
Mặt khác ta có một mảng lưu trữ tên toàn bộ sinh viên.
Ta cần truyền cho Hàm này các tham số (parameter) là các phần tử tên sinh viên bắt đầu bằng chữ A.

Ví dụ 2: Ta có một hàm tính tuổi bình quân
Mặt khác ta có một mảng lưu trữ tuổi của tất cả sinh viên của trường.
Ta cần truyền cho Hàm này toàn bộ mảng như tham số (parameter)

Còn rất nhiều khái niệm chúng ta chưa bàn tới vì vậy chúng ta sẽ tạm sử dụng những mảng với số nguyên cho các chương trình trong phần này.

Viết chương trình 1:

1/Giả sử chúng ta sẽ viết một hàm gọi là inSo(int so1,int so2), sẽ có nhiệm vụ in 2 số được truyền cho tham số so1 và tham số so2.
2/so1 và so2 sẽ được truyền từ phần tử đầu tiên và phần tử thứ 3 của một mảng có 4 phần tử.
3/Ta sẽ bắt đầu một cách "chuyên nghiệp", không theo phong cách chương trình tào lao nữa. Chúng ta vẫn tạm sử dụng IDE Online.
4/Đầu tiên ta viết lệnh

#include <iostream>
 
using namespace std;


5/Tiếp theo là hàm main
int main() {
 
    return 0;
}
 

6/Bấm Run để chạy thử, thấy mọi thứ đều ổn thì mới tiếp tục.


 

7/Tiếp theo ta cần khai báo hàm trên main()định nghĩa hàm dưới main()


Khai báo hàm:

void inSo(int so1, int so2);



Định nghĩa hàm:

void inSo(int so1, int so2) {
    cout << so1 << endl;
    
cout << so2 << endl;
}
Đây là code

#include <iostream>
 
using namespace std;

void inSo(int so1, int so2);

int main(){

    return 0;
}

void inSo(int so1, int so2) {
    cout << so1 << endl;
    cout << so2 << endl;
}


8/Bấm Run để chắc chắn mọi thứ vẫn ổn

 


 

9/Tiếp tục là khai báo một mảng số nguyên có 4 phần tử, ta có thể khởi tạo luôn các giá trị. Đặt mảng trong main().

int soNguyen[] = {2, 7, 4, 5};

 

Đây là code: 

 

#include <iostream>
 
using namespace std;

void inSo(int so1, int so2);

int main(){
    int soNguyen[] = {2, 7, 4, 5};
    return 0;
}

void inSo(int so1, int so2) {
    cout << so1 << endl;
    cout << so2 << endl;
}

 

10/Bấm Run để chạy thử


 11/Cuối cùng, gọi hàm inSo(int so1, int so2); truyền phần tử thứ nhất và thứ 3 cho 2 tham số của hàm. Đặt hàm trong main().

inSo(soNguyen[0],soNguyen[2]);

 

Đây là code:

 

#include <iostream>
 
using namespace std;

void inSo(int so1, int so2);

int main(){
    int soNguyen[] = {2, 7, 4, 5};
    inSo(soNguyen[0],soNguyen[2]);
    return 0;
}

void inSo(int so1, int so2) {
    cout << so1 << endl;
    cout << so2 << endl;

12/Chạy thử:

 


 

Vậy là ta đã viết xong một chương trình hoàn chỉnh, chuyên nghiệp và tương đối phúc tạp! Chúng ta định nghĩa hàm inSo() với các tham số là các biến số nguyên int riêng lẻ, nên ta dễ dàng truy xuất các phần tử cũng là số nguyên int của mảng soNguyen[] để truyền cho hàm.

 

Viết chương trình 2:

1/Giả sử chúng ta sẽ viết một hàm gọi là tinhTong(int soTien[]), sẽ có nhiệm vụ tính tổng của số tiền đại điện bởi một mảng gọi là soTien[].
2/Mảng
soTien[] gồm 5 phần tử sẽ được truyền toàn bộ vào hàm tinhTong(). Lưu ý sự khác biệt với chương trình trên.
3/Ta sẽ bắt đầu một cách "chuyên nghiệp", không theo phong cách chương trình tào lao nữa.
4/Đầu tiên ta viết lệnh

#include <iostream>
 
using namespace std;


5/Tiếp theo là hàm main
int main() {
 
    return 0;
}
 

6/Bấm Run để chạy thử, thấy mọi thứ đều ổn thì mới tiếp tục.


 

 

7/Tiếp theo ta cần khai báo hàm trên main()định nghĩa hàm dưới main()


Khai báo hàm:

int tinhTong(int soTien[]);



Định nghĩa hàm:

int tinhTong(int soTien[]) {
    int s = 0;

    for (int i = 0; i < 5; ++i) {
        s += soTien[i];
    }

    return s;
}
-Hàm sẽ có tham số là mảng soTien[]

-Để đảm bảo chính xác, tổng số tiền ban đầu sẽ là s=0;

-Chúng ta dùng vòng lặp For để truy xuất 5 phần tử trong mảng soTien[]

-Cuối cùng Hàm sẽ trả về là tổng của các phần tử: return s;


8/Bấm Run để chắc chắn mọi thứ vẫn ổn


 

9/Tiếp tục là khai báo một mảng số nguyên có 5 phần tử, ta có thể khởi tạo luôn các giá trị. Đặt mảng trong main(). Ngoại trừ khai báo Hàm và định nghĩa Hàm, mọi thứ ta sẽ làm trong hàm main()

int soTien[] = {24, 35, 73, 18, 82};

10/Bấm Run để chạy thử

 


 

11/Tiếp theo, gọi hàm tinhTong(int soTien[]); truyền toàn bộ mảng soTien[] vào tham số của hàm. Đặt hàm trong main(). Lưu ý: Để truyền toàn bộ mảng cho một hàm, ta chỉ truyền tên của mảng vào hàm (chỉ truyền soTien chứ không truyền soTien[]).

tinhTong(soTien);

12/Chạy thử...có gì đó hơi sai sai... Đã làm đúng "qui trình", nhưng không thấy "có gì khác" cả??

 


13/Vấn đề là hai hàm rất khác nhau ở giá trị trả về. Hàm inSo() ở trên là void, nó chỉ in kết quả ra màn hình và không trả về giá trị nào. Trong lúc đó, hàm tinhTong()int, nó trả về một con số nguyên là tổng của 5 số nguyên. Muốn "thấy cái gì đó" thì ta phải in kết quả ra màn hình.

14/Ta sẽ khai báo một biến int gọi là ketQua và gán giá trị trả về của hàm tinhTong() cho biến ketQua, dùng lệnh printf để in ra, khi đó chúng ta mới thấy "có gì khác".

Khai báo và gán giá trị cho biến:

int ketQua = tinhTong(soTien);

In kết quả ra màn hình

printf("Kết quả = %d", ketQua);

15/Bấm Run để chạy thử, bây giờ ta đã thấy kết quả!


Đây là code của chương trình:

 

#include <iostream>
 
using namespace std;

int tinhTong(int soTien[]);
//Khai báo hàm

int main(){
    int soTien[] = {24, 35, 73, 18, 82};
//Mảng
    int ketQua = tinhTong(soTien);
    cout << ketQua << endl;
    return 0;
}

int tinhTong(int soTien[]) {
//Định nghĩa hàm
    int s = 0;

    for (int i = 0; i < 5; ++i) {
        s += soTien[i];
    }

    return s;
//Return của hàm tinhTong()
}

 

Bạn cố gắng tập thói quen luôn chạy thử mỗi khi thêm vài dòng lệnh mới, việc này tránh cho bạn đỡ phải ngồi tìm từng lỗi một. Không nên có thói quen cắm đầu viết code, đến cuối cùng mới chạy thử.

Mảng 2 chiều có thể làm tham số của hàm, tuy nhiên khi hàm có tham số là mảng 2 chiều thì bạn cần chỉ định số lượng cột của mảng 2 chiều. 

 

Phần tiếp theo

 

Phần trước

 

Không có nhận xét nào:

Đăng nhận xét