Visualisasi Sederhana Sistem Transaksi
Membuat sistem kasir, meskipun dalam skala sederhana, adalah latihan fundamental yang sangat baik dalam pemrograman C++. Sistem ini biasanya melibatkan input barang, perhitungan harga total, diskon (opsional), dan pencetakan struk. C++ dipilih karena kemampuannya menangani operasi I/O yang cepat dan efisiensi memori, yang penting dalam aplikasi ritel yang sensitif terhadap waktu.
Dalam contoh ini, kita akan fokus pada implementasi berbasis konsol (command-line) untuk menjaga kesederhanaan dan fokus pada logika inti. Struktur data seperti std::vector atau std::map sering digunakan untuk menyimpan data produk, namun untuk contoh dasar, kita akan menggunakan array statis sederhana atau struktur data yang didefinisikan langsung di dalam program.
Tujuan utama dari kode kasir adalah:
Kode di bawah ini menunjukkan bagaimana mendefinisikan struktur barang dan menjalankan loop transaksi sederhana di konsol.
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
// Struktur untuk mendefinisikan produk
struct Produk {
int id;
string nama;
double harga;
};
// Struktur untuk item yang dibeli dalam transaksi
struct ItemTransaksi {
string nama;
double hargaSatuan;
int kuantitas;
double subtotal;
};
void tampilkanMenu(const vector<Produk>& daftarProduk) {
cout <<<< "\n=======================================" <<<< endl;
cout <<<< " DAFTAR BARANG TERSEDIA" <<<< endl;
cout <<<< "=======================================" <<<< endl;
cout <<<< "ID | Nama Produk | Harga (Rp)" <<<< endl;
cout <<<< "---------------------------------------" <<<< endl;
// Set format output agar rapi
cout <<<< fixed <<<< setprecision(0);
for (const auto& p : daftarProduk) {
cout <<<< setw(2) << p.id <<<< " | "
<<<< setw(20) <<<< left <<<< p.nama <<<< right <<<< " | "
<<<< setw(9) <<<< p.harga <<<< endl;
}
cout <<<< "---------------------------------------" <<<< endl;
}
void cetakStruk(const vector<ItemTransaksi>& keranjang, double totalAkhir) {
cout <<<< "\n\n========= STRUK PEMBAYARAN =========" <<<< endl;
cout <<<< " POS KITA" <<<< endl;
cout <<<< "---------------------------------------" <<<< endl;
cout <<<< setw(20) <<<< left <<<< "Barang" <<<< setw(5) <<<< "Qty" <<<< setw(7) <<<< "Harga" <<<< setw(8) <<<< "Subtotal" <<<< endl;
cout <<<< "---------------------------------------" <<<< endl;
// Reset precision untuk tampilan rupiah yang lebih baik
cout <<<< fixed <<<< setprecision(0);
for (const auto& item : keranjang) {
cout <<<< setw(20) <<<< left <<<< item.nama <<<< setw(5) <<<< item.kuantitas
<<<< setw(7) <<<< item.hargaSatuan
<<<< setw(8) <<<< item.subtotal <<<< endl;
}
cout <<<< "---------------------------------------" <<<< endl;
cout <<<< setw(32) <<<< right <<<< "TOTAL (Rp) : " <<<< totalAkhir <<<< endl;
cout <<<< "=======================================" <<<< endl;
cout <<<< " TERIMA KASIH SUDAH BERBELANJA!" <<<< endl;
}
int main() {
// 1. Inisialisasi Data Produk
vector<Produk> daftarProduk = {
{101, "Buku Tulis A5", 5500},
{102, "Pena Gel Hitam", 2500},
{103, "Pensil 2B", 1500},
{104, "Penghapus Besar", 3000},
{105, "Stapler Kecil", 12000}
};
vector<ItemTransaksi> keranjang;
double totalKeseluruhan = 0.0;
int inputID, inputQty;
bool transaksiSelesai = false;
tampilkanMenu(daftarProduk);
cout <<<< "\n--- MEMULAI TRANSAKSI ---" <<<< endl;
while (!transaksiSelesai) {
cout <<<< "Masukkan ID Barang (atau 0 untuk selesai): ";
cin >> inputID;
if (inputID == 0) {
transaksiSelesai = true;
break;
}
// Cari produk berdasarkan ID
Produk* produkDipilih = nullptr;
for (auto& p : daftarProduk) {
if (p.id == inputID) {
produkDipilih = &p;
break;
}
}
if (produkDipilih == nullptr) {
cout <<<< "Error: ID Produk tidak ditemukan. Coba lagi." <<<< endl;
continue;
}
cout <<<< "Berapa kuantitas " <<<< produkDipilih->nama <<<< "? ";
cin >> inputQty;
if (inputQty > 0) {
double subtotal = produkDipilih->harga * inputQty;
totalKeseluruhan += subtotal;
keranjang.push_back({
produkDipilih->nama,
produkDipilih->harga,
inputQty,
subtotal
});
cout <<<< "=> Berhasil ditambahkan. Subtotal saat ini: Rp" <<<< totalKeseluruhan <<<< endl;
} else {
cout <<<< "Kuantitas harus lebih dari nol." <<<< endl;
}
}
// 3. Pencetakan Struk
if (!keranjang.empty()) {
cetakStruk(keranjang, totalKeseluruhan);
} else {
cout <<<< "\nTransaksi dibatalkan. Tidak ada barang yang dibeli." <<<< endl;
}
return 0;
}
struct)Kita mendefinisikan dua struktur utama. Produk menyimpan data master barang (ID, nama, harga). Sementara itu, ItemTransaksi digunakan selama proses penjualan untuk mencatat apa saja yang sudah dibeli, termasuk kuantitas dan subtotal per item.
Fungsi tampilkanMenu bertanggung jawab untuk menyajikan daftar barang secara terformat. Penggunaan <iomanip> seperti std::setw sangat penting di sini untuk memastikan kolom-kolom (ID, Nama, Harga) sejajar rapi, memberikan pengalaman pengguna yang profesional meskipun berbasis teks.
main loop)Loop while menjadi inti dari sistem kasir. Pengguna terus menerus memasukkan ID produk hingga mereka memasukkan 0. Di dalam loop, kode melakukan pencarian (linear search) terhadap produk yang sesuai dengan ID yang dimasukkan. Jika ditemukan, kuantitas diminta, subtotal dihitung, dan item ditambahkan ke vektor keranjang.
Penjumlahan totalKeseluruhan dilakukan secara kumulatif setiap kali item baru berhasil ditambahkan. Hal ini merupakan cara yang efisien untuk melacak total belanja saat transaksi berlangsung.
Setelah transaksi selesai (input ID 0), fungsi cetakStruk dipanggil. Fungsi ini kembali menggunakan iomanip untuk memformat output struk agar terlihat profesional, mencantumkan setiap item, kuantitas, harga satuan, subtotal item tersebut, dan akhirnya total akhir transaksi. Ini mensimulasikan output yang akan dicetak oleh printer kasir.
Meskipun contoh di atas sudah fungsional untuk kasus dasar, sistem kasir di dunia nyata memerlukan fitur tambahan. Pengembangan lebih lanjut bisa mencakup:
C++ memberikan fondasi yang kuat untuk semua pengembangan ini, terutama karena kinerja komputasinya yang cepat saat berhadapan dengan perhitungan numerik kompleks.