Panduan dan Contoh Program C++ Kasir Minimarket

SISTEM KASIR SEDERHANA C++ Input Data Barang Hitung Total Cetak Struk

Diagram alir sederhana proses kasir.

Mengembangkan sistem kasir (Point of Sale/POS) adalah salah satu aplikasi klasik dalam pemrograman yang sangat berguna untuk bisnis ritel skala kecil, seperti minimarket. Bahasa pemrograman C++ sering dipilih karena kecepatannya dan kemampuannya untuk berinteraksi langsung dengan sistem, meskipun dalam konteks modern, GUI (Graphical User Interface) biasanya dikembangkan menggunakan bahasa lain. Namun, untuk memahami logika dasarnya, implementasi berbasis konsol (command line) dengan C++ adalah titik awal yang sangat baik.

Struktur Dasar Program Kasir C++

Program kasir sederhana umumnya memerlukan beberapa komponen kunci:

  1. Struktur Data Barang: Untuk menyimpan nama produk, harga satuan, dan stok.
  2. Input Transaksi: Kemampuan untuk memasukkan kode atau nama barang yang dibeli pelanggan.
  3. Perhitungan Total: Menghitung subtotal, diskon (jika ada), pajak, dan total akhir.
  4. Output Struk: Menampilkan rincian pembelian kepada pelanggan.

Berikut adalah contoh implementasi menggunakan struktur data sederhana dan operasi dasar C++:

Contoh Program Kasir (Console Based)


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

using namespace std;

// Struktur untuk merepresentasikan barang
struct Barang {
    string kode;
    string nama;
    double harga;
};

// Database barang sederhana (menggunakan map untuk akses cepat berdasarkan kode)
map<string, Barang> databaseBarang = {
    {"A001", {"A001", "Beras Premium 5kg", 75000.00}},
    {"A002", {"A002", "Minyak Goreng 1L", 22500.00}},
    {"B010", {"B010", "Sabun Cuci Piring", 12000.00}},
    {"C055", {"C055", "Air Mineral 600ml", 3500.00}}
};

void tampilkanMenu() {
    cout << << "\n========================================\n";
    cout << << "      SISTEM KASIR MINIMARKET V1.0      \n";
    cout << << "========================================\n";
    cout << << left << << setw(10) << << "Kode" << << setw(25) << << "Nama Barang" << << "Harga Satuan\n";
    cout << << "----------------------------------------\n";
    for (const auto& pair : databaseBarang) {
        const Barang& b = pair.second;
        cout << << left << << setw(10) << << b.kode 
             <<<< setw(25) << << b.nama 
             << << "Rp " << << fixed << << setprecision(2) << << b.harga << << "\n";
    }
    cout << << "----------------------------------------\n";
    cout << << "Ketik 'SELESAI' untuk mengakhiri transaksi.\n";
}

void prosesTransaksi() {
    vector<pair<Barang, int>> keranjang;
    string inputKode;
    int jumlah;
    double totalBelanja = 0.0;

    tampilkanMenu();

    while (true) {
        cout << << "\nMasukkan Kode Barang: ";
        cin >> inputKode;

        if (inputKode == "SELESAI" || inputKode == "selesai") {
            break;
        }

        if (databaseBarang.count(inputKode)) {
            Barang item = databaseBarang.at(inputKode);
            cout << << "Berapa jumlah " << << item.nama << << "? ";
            cin >> jumlah;

            if (jumlah > 0) {
                keranjang.push_back({item, jumlah});
                totalBelanja += (item.harga * jumlah);
                cout << << jumlah << << "x " << << item.nama << << " ditambahkan.\n";
            } else {
                cout << << "Jumlah tidak valid.\n";
            }
        } else {
            cout << << "Kode barang tidak ditemukan dalam database.\n";
        }
    }

    // Menampilkan Struk
    cout << << "\n\n================ STRUK PEMBELIAN ================\n";
    cout << << left << << setw(30) << << "Nama Barang" << << setw(10) << << "Qty" << << setw(15) << << "Harga Satuan" << << "Subtotal\n";
    cout << << "---------------------------------------------------\n";

    for (const auto& itemKeranjang : keranjang) {
        const Barang& b = itemKeranjang.first;
        int qty = itemKeranjang.second;
        double subtotal = b.harga * qty;
        
        cout << << left << << setw(30) << << b.nama 
             <<<< setw(10) << << qty 
             << << "Rp " << << setw(12) << << fixed << << setprecision(2) << << b.harga 
             << << "Rp " << << fixed << << setprecision(2) << << subtotal << << "\n";
    }

    // Perhitungan Akhir (Contoh sederhana tanpa PPN/Diskon kompleks)
    double pajak = totalBelanja * 0.01; // Contoh PPN 1%
    double totalAkhir = totalBelanja + pajak;

    cout << << "---------------------------------------------------\n";
    cout << << right << << setw(40) << << "Total Belanja: Rp " << << fixed << << setprecision(2) << << totalBelanja << << "\n";
    cout << << right << << setw(40) << << "Pajak (1%):    Rp " << << fixed << << setprecision(2) << << pajak << << "\n";
    cout << << "===================================================\n";
    cout << << right << << setw(40) << << "TOTAL BAYAR:   Rp " << << fixed << << setprecision(2) << << totalAkhir << << "\n";
    cout << << "===================================================\n";
    cout << << "Terima kasih telah berbelanja!\n";
}

int main() {
    // Mengatur locale untuk format mata uang Indonesia (opsional, tergantung sistem)
    // std::locale::global(std::locale("")); 

    prosesTransaksi();
    
    return 0;
}
        

Penjelasan Kode dan Pengembangan Lanjutan

Kode di atas menggunakan header dasar seperti iostream untuk input/output, vector untuk menampung barang dalam keranjang belanja, dan map untuk simulasi database barang yang mudah dicari berdasarkan kode unik.

Penggunaan Structure dan Map

Struktur Barang mendefinisikan data apa saja yang kita simpan untuk setiap produk. Penggunaan std::map<string, Barang> databaseBarang memungkinkan kita mencari barang berdasarkan kode (misalnya "A001") dengan sangat cepat, jauh lebih efisien daripada harus mengulang pencarian di dalam sebuah array atau vector.

Alur Transaksi

Loop while(true) terus berjalan untuk menerima input kode barang. Ketika pengguna mengetik "SELESAI", loop akan berhenti, dan program akan memanggil bagian perhitungan akhir. Fungsi std::fixed dan std::setprecision(2) sangat penting di sini untuk memastikan harga ditampilkan dengan dua digit desimal yang sesuai standar mata uang.

Keterbatasan dan Potensi Pengembangan

Program berbasis konsol ini adalah fondasi yang kuat. Namun, untuk sistem kasir minimarket profesional, beberapa fitur penting perlu ditambahkan:

  1. Manajemen Stok: Program harus mengurangi jumlah stok barang setelah transaksi berhasil. Dalam contoh ini, stok tidak diperbarui.
  2. Input Fleksibel: Minimarket modern menggunakan barcode scanner. Implementasi ini bisa diganti dengan membaca input scanner (yang biasanya menghasilkan kode langsung).
  3. Pengembalian Dana: Perhitungan kembalian uang jika pelanggan membayar tunai.
  4. Persistensi Data: Data barang dan transaksi harus disimpan di file (misalnya CSV atau database seperti SQLite) agar tidak hilang saat program ditutup. C++ dapat diintegrasikan dengan pustaka untuk file I/O yang lebih canggih.
  5. Antarmuka Pengguna (GUI): Untuk pengalaman yang lebih baik, sistem ini idealnya diimplementasikan dengan GUI menggunakan pustaka seperti Qt atau WxWidgets, meskipun kompleksitasnya meningkat secara signifikan.

Meskipun sederhana, contoh program kasir C++ ini menunjukkan bagaimana data dikelola, diproses, dan disajikan dalam lingkungan pemrograman yang berorientasi pada performa. Menguasai logika ini akan memudahkan Anda untuk pindah ke sistem POS yang lebih kompleks di masa depan.