Implementasi Coding Struk Belanja Menggunakan C++

TOKO SERBAGUNA JL. PEMROGRAMAN NO. 45 1x Apel @ Rp 5.000 5.000 2x Roti Tawar @ Rp 12.000 24.000 TOTAL: 29.000 TERIMA KASIH

Representasi visual sederhana struktur belanja.

Pendahuluan: Otomatisasi Struk Belanja

Dalam dunia ritel modern, kecepatan dan akurasi perhitungan transaksi sangatlah vital. Salah satu komponen kunci dalam sistem Point of Sale (POS) adalah kemampuan untuk mencetak struk belanja yang jelas dan terperinci. Penggunaan bahasa pemrograman seperti C++ menawarkan keunggulan dalam hal kinerja (performance) yang tinggi, yang sangat dibutuhkan untuk pemrosesan transaksi cepat. Artikel ini akan membahas dasar-dasar bagaimana kita dapat merancang dan mengimplementasikan logika untuk menghasilkan output struk belanja menggunakan C++.

Struk belanja, meskipun tampak sederhana, memerlukan manajemen data yang terstruktur. Kita perlu merepresentasikan item yang dibeli (nama produk, kuantitas, harga satuan) serta melakukan perhitungan agregat seperti total subtotal, diskon (jika ada), dan total akhir. C++ sangat cocok untuk tugas ini karena kemampuannya dalam manajemen memori dan struktur data yang kuat.

Struktur Data Item Belanja

Langkah pertama dalam coding struk belanja di C++ adalah mendefinisikan bagaimana setiap barang akan disimpan. Kita bisa menggunakan struktur (`struct`) atau kelas (`class`) untuk mengelompokkan informasi item.

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

// Mendefinisikan struktur untuk merepresentasikan satu item
struct ItemBelanja {
    std::string nama;
    int kuantitas;
    double hargaSatuan;

    double hitungSubtotal() const {
        return kuantitas * hargaSatuan;
    }
};
            

Membangun Logika Pencetakan Struk

Setelah memiliki struktur data, tantangan berikutnya adalah memformat output agar menyerupai struk fisik. Ini melibatkan penggunaan manipulasi I/O (Input/Output) stream C++ seperti `iomanip` untuk mengatur lebar kolom, presisi desimal, dan perataan teks.

Dalam konteks pemrograman kasir, seringkali output struk diarahkan ke printer termal (printer kasir), yang umumnya mencetak karakter berukuran tetap (monospace). Oleh karena itu, penggunaan `std::setw` dan `std::left`/`std::right` menjadi sangat penting untuk menjaga keselarasan kolom.

Contoh Fungsi Cetak Struk

void cetakStruk(const std::vector<ItemBelanja>& keranjang) {
    double totalKeseluruhan = 0.0;
    const int LEBAR_STRUK = 40;

    std::cout << std::string(LEBAR_STRUK, '=') << "\n";
    std::cout << std::setw(LEBAR_STRUK / 2 + 5) << std::left << "TOKO COBA C++" << "\n";
    std::cout << std::string(LEBAR_STRUK, '-') << "\n";
    std::cout << std::left << std::setw(20) << "ITEM"
              << std::right << std::setw(10) << "QTY"
              << std::right << std::setw(10) << "HARGA" << "\n";
    std::cout << std::string(LEBAR_STRUK, '-') << "\n";

    // Iterasi dan cetak setiap item
    for (const auto& item : keranjang) {
        double subtotal = item.hitungSubtotal();
        totalKeseluruhan += subtotal;

        std::cout << std::left << std::setw(20) << item.nama.substr(0, 18) // Potong jika terlalu panjang
                  << std::right << std::setw(5) << item.kuantitas
                  << std::right << std::setw(15) << std::fixed << std::setprecision(2) << subtotal << "\n";
    }

    std::cout << std::string(LEBAR_STRUK, '-') << "\n";

    // Bagian Total
    std::cout << std::left << std::setw(LEBAR_STRUK - 10) << "TOTAL BELANJA"
              << std::right << std::setw(10) << std::fixed << std::setprecision(2) << totalKeseluruhan << "\n";
    
    std::cout << std::string(LEBAR_STRUK, '=') << "\n";
    std::cout << std::setw(LEBAR_STRUK) << std::right << "Terima Kasih!" << "\n";
}
            

Fungsi Utama dan Pengujian

Untuk menjalankan fungsi pencetakan di atas, kita perlu menyiapkan data sampel di fungsi `main`. Penggunaan `std::vector` memungkinkan kita untuk secara dinamis menambahkan item belanja tanpa perlu menentukan jumlah maksimum di awal.

int main() {
    // 1. Persiapan data keranjang
    std::vector<ItemBelanja> pesananPelanggan;
    
    pesananPelanggan.push_back({"Kopi Hitam Premium", 1, 18500.00});
    pesananPelanggan.push_back({"Buku Pemrograman C++", 2, 85000.00});
    pesananPelanggan.push_back({"Snack Sehat", 5, 7250.50});

    // 2. Cetak struk
    cetakStruk(pesananPelanggan);

    return 0;
}
            

Ketika kode ini dieksekusi, output di konsol akan terformat dengan rapi menyerupai struk yang biasa kita terima setelah berbelanja, menunjukkan komputasi yang akurat dari total belanja.

Keunggulan C++ dalam Pemrosesan Struk

Mengapa C++ sering dipilih untuk sistem POS? Jawabannya terletak pada efisiensi. Untuk aplikasi yang menangani ribuan transaksi per hari, overhead komputasi harus diminimalisir. C++ yang dikompilasi langsung ke kode mesin memberikan kecepatan eksekusi yang superior dibandingkan bahasa interpretatif.

Selain kecepatan, kontrol terhadap alokasi memori melalui pointer dan struktur data kustom memungkinkan pengembang untuk mengoptimalkan penyimpanan data transaksi sementara, meskipun untuk aplikasi sederhana seperti ini, library standar seperti `std::vector` sudah sangat memadai. Kemampuan untuk berinteraksi langsung dengan *hardware* I/O (melalui library spesifik sistem operasi) juga memudahkan integrasi dengan printer kasir fisik, menjadikannya pilihan yang kokoh dalam lingkungan ritel berkecepatan tinggi.