Menu
CoddyTech

Lấy số dư

Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 26 trên 61.

challenge icon

Thử thách

Dễ

Tài khoản ngân hàng của bạn sắp hoàn thiện! Bạn đã xây dựng khả năng tạo tài khoản, nạp tiền và rút tiền, nhưng vẫn còn thiếu một phần quan trọng. Hiện tại, code bên ngoài không có cách nào xem số dư hiện tại. Hãy khắc phục bằng cách thêm một hàm getter.

Getter là cách phù hợp để cung cấp quyền truy cập vào dữ liệu ẩn trong một module được đóng gói. Thay vì đặt trường số dư ở chế độ công khai (điều này sẽ phá vỡ tính đóng gói), bạn cung cấp một hàm chỉ đọc và trả về giá trị. Cách này bảo vệ dữ liệu nhưng vẫn cho phép truy cập có kiểm soát.

Bạn sẽ tiếp tục làm việc với ba tệp:

  • account.h: Thêm nguyên mẫu hàm mới: get_balance. Hàm này nhận một const Account * (vì hàm chỉ đọc dữ liệu, không bao giờ sửa đổi dữ liệu) và trả về một double biểu thị số dư hiện tại. Giữ nguyên tất cả các khai báo hiện có.
  • account.c: Triển khai hàm get_balance. Hàm chỉ cần trả về trường số dư ẩn của tài khoản. Lưu ý hàm này có thể truy cập dữ liệu nội bộ vì được định nghĩa trong cùng tệp với struct: code bên ngoài vẫn không thể xem trực tiếp bên trong.
  • main.c: Giờ đây, cuối cùng bạn cũng có thể thấy những gì đang diễn ra bên trong các tài khoản! Tạo một tài khoản, thực hiện một số giao dịch và dùng getter mới để hiển thị số dư ở từng bước.

Bạn sẽ nhận bốn đầu vào: ID tài khoản (một số nguyên), số tiền nạp, số tiền rút và số tiền nạp lần thứ hai.

Trong tệp main, hãy tạo một tài khoản và in số dư ban đầu của tài khoản (phải là 0.00). Nạp số tiền thứ nhất rồi in số dư mới. Rút số tiền đã chỉ định rồi in lại số dư. Cuối cùng, nạp lần thứ hai và in số dư cuối cùng. Sau đó, hủy tài khoản.

In đầu ra theo định dạng này:

Account 1001 created
Balance: 0.00
Balance: 500.00
Balance: 200.00
Balance: 350.00
Account destroyed

Trong đó, 1001 là ID tài khoản, còn số dư thể hiện các mốc sau: ban đầu (0.00), sau khi nạp 500.00, sau khi rút 300.00 và sau khi nạp thêm 150.00. Định dạng tất cả giá trị số dư với hai chữ số thập phân bằng %.2f.

Khi có getter này, module tài khoản ngân hàng của bạn sẽ cung cấp quyền truy cập đầy đủ nhưng có kiểm soát vào dữ liệu tài khoản: người dùng có thể xem số dư nhưng chỉ có thể thay đổi số dư thông qua các hàm nạp tiền và rút tiền đã được kiểm tra hợp lệ.

Tự làm thử

#include <stdio.h>
#include "account.h"

int main() {
    int account_id;
    scanf("%d", &account_id);
    
    double deposit1;
    scanf("%lf", &deposit1);
    
    double withdraw_amount;
    scanf("%lf", &withdraw_amount);
    
    double deposit2;
    scanf("%lf", &deposit2);
    
    Account* account = create_account(account_id);
    printf("Account %d created\n", account_id);
    
    // TODO: In ra số dư ban đầu bằng get_balance
    
    deposit(account, deposit1);
    // TODO: In ra số dư sau lần gửi tiền đầu tiên
    
    withdraw(account, withdraw_amount);
    // TODO: In ra số dư sau khi rút tiền
    
    deposit(account, deposit2);
    // TODO: In ra số dư sau lần gửi tiền thứ hai
    
    destroy_account(account);
    printf("Account destroyed\n");
    
    return 0;
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C online