Studi Kasus: Contoh Program C++ Kasir Swalayan Dasar

Membuat sistem kasir swalayan adalah salah satu proyek dasar yang sangat baik untuk mengasah kemampuan pemrograman C++. Program ini biasanya melibatkan manajemen produk, perhitungan total harga, dan kalkulasi kembalian. Dalam konteks pengembangan aplikasi kecil, C++ menawarkan kecepatan eksekusi yang sangat baik meskipun antarmuka yang kita buat di sini bersifat konsol (CLI) untuk menjaga kesederhanaan fokus pada logika inti.

Program kasir sederhana harus mampu menampung data produk (seperti nama, harga, dan stok), menerima input jumlah barang yang dibeli pelanggan, lalu menghasilkan struk akhir. Untuk implementasi ini, kita akan menggunakan struktur data dasar (struct) dan fungsi input/output standar C++.

Struktur Data Produk

Langkah pertama adalah mendefinisikan bagaimana data setiap barang akan disimpan. Kita bisa menggunakan struct untuk mengelompokkan atribut produk.


struct Produk {
    int id;
    std::string nama;
    double harga;
    int stok;
};
        

Logika Inti Program Kasir

Program akan bekerja dalam beberapa tahapan utama: inisialisasi daftar produk, proses penjualan (looping), perhitungan subtotal, dan pencetakan nota akhir. Karena ini adalah contoh dasar, kita akan mengasumsikan daftar produk sudah didefinisikan di awal kode.

Berikut adalah contoh kode C++ yang menunjukkan kerangka dasar dari aplikasi kasir tersebut. Perhatikan penggunaan std::vector untuk menyimpan banyak produk.


#include <iostream>
#include <vector>
#include <string>
#include <iomanip>

using namespace std;

struct Produk {
    int id;
    string nama;
    double harga;
    int stok;
};

// Fungsi untuk menampilkan header nota
void cetakHeaderNota(double totalBelanja) {
    cout << "\n========================================\n";
    cout << "         NOTA PEMBAYARAN SWALAYAN       \n";
    cout << "========================================\n";
    cout << left << setw(25) << "Nama Barang" << right << setw(8) << "Harga" << endl;
    cout << "----------------------------------------\n";
}

// Fungsi untuk menghitung dan menampilkan kembalian
void hitungKembalian(double total) {
    double uangBayar;
    cout << "Total Belanja: Rp " << fixed << setprecision(2) << total << endl;
    
    cout << "Masukkan Uang Pembayaran: Rp ";
    cin >> uangBayar;

    if (uangBayar < total) {
        cout << "Uang tidak mencukupi! Proses dibatalkan.\n";
    } else {
        double kembalian = uangBayar - total;
        cout << "Kembalian Anda: Rp " << fixed << setprecision(2) << kembalian << endl;
        cout << "========================================\n";
        cout << "        TERIMA KASIH TELAH BERBELANJA!    \n";
        cout << "========================================\n";
    }
}

int main() {
    // Inisialisasi data produk (simulasi database kecil)
    vector<Produk> daftarProduk = {
        {101, "Beras Premium 5kg", 75000.00, 50},
        {102, "Minyak Goreng 2L", 35500.00, 100},
        {103, "Gula Pasir 1kg", 16000.00, 80},
        {104, "Kopi Instan", 4000.00, 200}
    };

    double totalBelanja = 0.0;
    int idInput;
    int jumlah;
    bool transaksiBerjalan = true;

    cout << "Sistem Kasir Swalayan - Mulai Transaksi\n";
    
    // Proses Penjualan
    while (transaksiBerjalan) {
        cout << "\nMasukkan ID Produk (atau 0 untuk selesai): ";
        cin >> idInput;

        if (idInput == 0) {
            transaksiBerjalan = false;
            continue;
        }

        bool produkDitemukan = false;
        for (const auto& p : daftarProduk) {
            if (p.id == idInput) {
                produkDitemukan = true;
                cout << "Anda memilih: " << p.nama << " (Harga: Rp " << p.harga << ")\n";
                cout << "Masukkan jumlah dibeli: ";
                cin >> jumlah;

                if (jumlah > 0 && jumlah <= p.stok) {
                    double subtotal = p.harga * jumlah;
                    totalBelanja += subtotal;

                    // Tambahkan detail ke nota sementara (di sini kita cetak langsung)
                    // Dalam aplikasi nyata, item ini akan disimpan di vektor penjualan
                    cout << "-> Item berhasil ditambahkan. Subtotal: Rp " << subtotal << endl;
                    
                    // Update stok (opsional, untuk simulasi)
                    // p.stok -= jumlah; // Catatan: Ini tidak akan mengubah stok asli karena 'p' adalah salinan
                } else {
                    cout << "Input jumlah tidak valid atau stok tidak mencukupi.\n";
                }
                break;
            }
        }

        if (!produkDitemukan) {
            cout << "ID Produk tidak ditemukan.\n";
        }
    }

    // Cetak Struk Akhir
    if (totalBelanja > 0) {
        cetakHeaderNota(totalBelanja);
        // Catatan: Untuk menampilkan seluruh daftar item yang dibeli, 
        // kita perlu struktur data tambahan untuk menyimpan item yang sudah terjual.
        // Di sini, kita hanya langsung menuju perhitungan pembayaran.
        hitungKembalian(totalBelanja);
    } else {
        cout << "\nTidak ada item yang dibeli. Transaksi dibatalkan.\n";
    }

    return 0;
}
        

Penjelasan Komponen Utama

  1. Struct Produk: Mengorganisasi data barang menjadi satu unit logis. Ini sangat penting untuk skalabilitas program.
  2. std::vector: Digunakan untuk menampung koleksi produk. Dalam sistem riil, data ini akan diambil dari database eksternal (SQL, file JSON, dll.), namun untuk contoh C++ dasar, vektor di memori sudah cukup.
  3. Loop Penjualan (while): Memungkinkan kasir memasukkan produk berulang kali hingga pengguna memasukkan kode keluar (dalam contoh ini, ID 0).
  4. Pengaturan Output (iomanip): Penggunaan setw dan setprecision memastikan format harga dan total belanja terlihat rapi, meskipun ini adalah aplikasi konsol.
  5. Fungsi Pembayaran: Memisahkan logika perhitungan kembalian ke fungsi terpisah (hitungKembalian) menjaga fungsi main tetap bersih dan fokus pada alur transaksi.

Program ini memberikan fondasi yang solid. Pengembangan lebih lanjut dapat mencakup validasi input yang lebih ketat, penanganan stok secara aktual (misalnya, menggunakan referensi atau pointer saat mengupdate stok), dan tentu saja, implementasi antarmuka grafis (GUI) menggunakan library seperti Qt atau wxWidgets jika diperlukan untuk lingkungan swalayan modern.

Visualisasi Alur Proses

Berikut adalah representasi sederhana alur kerja sistem kasir:

Mulai Transaksi Input ID Produk Verifikasi Data & Hitung Total Belanja Diakumulasi Cetak Nota & Kembalian