Membuat program kasir (Point of Sale/POS) adalah salah satu proyek fundamental yang sangat baik untuk mengasah kemampuan pemrograman, terutama dalam bahasa C++. C++ menawarkan kecepatan dan kontrol yang diperlukan untuk aplikasi yang membutuhkan respons cepat, seperti sistem transaksi. Proyek ini tidak hanya melibatkan logika aritmatika sederhana tetapi juga pengelolaan data, struktur kontrol, dan interaksi pengguna (User Interface) berbasis teks.
Meskipun banyak bahasa modern tersedia, C++ tetap relevan karena efisiensi eksekusinya. Dalam lingkungan ritel yang sibuk, latensi sekecil apa pun dapat merugikan. C++ memungkinkan kita untuk memanipulasi memori secara langsung (meskipun kita akan menggunakan pendekatan yang lebih aman dengan OOP dasar), menghasilkan program yang ringan dan cepat. Untuk aplikasi kasir sederhana berbasis konsol, C++ adalah pilihan yang solid untuk memahami dasar-dasar komputasi transaksi.
Sebuah sistem kasir sederhana memerlukan beberapa komponen utama:
Kita akan menggunakan struct untuk merepresentasikan setiap item di toko. Untuk kesederhanaan awal, kita bisa menggunakan std::vector untuk menyimpan daftar barang.
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
struct Produk {
int kode;
std::string nama;
double harga;
};
std::vector<Produk> daftar_produk = {
{101, "Buku Tulis", 5000.00},
{102, "Pulpen Gel", 3500.00},
{103, "Pensil 2B", 2000.00}
};
Antarmuka pengguna harus jelas. Kita perlu fungsi untuk menampilkan semua produk yang tersedia agar kasir mudah memasukkan kode yang benar.
void tampilkanMenu() {
std::cout << "\n====================================\n";
std::cout << "| KODE | NAMA BARANG | HARGA (Rp) |\n";
std::cout << "====================================\n";
for (const auto& item : daftar_produk) {
std::cout << "| " << std::setw(4) << item.kode
<< " | " << std::setw(11) << std::left << item.nama
<< " | " << std::setw(9) << std::right << item.harga << " |\n";
}
std::cout << "====================================\n";
}
Produk* cariProduk(int kode) {
for (auto& item : daftar_produk) {
if (item.kode == kode) {
return &item;
}
}
return nullptr;
}
Bagian paling krusial adalah loop transaksi yang terus berjalan hingga kasir memilih untuk keluar (misalnya, memasukkan kode 0). Dalam loop ini, kita akan mengakumulasi total belanjaan. Penggunaan std::fixed dan std::setprecision(2) sangat penting untuk memastikan output mata uang ditampilkan dengan format yang benar (dua desimal).
void prosesTransaksi() {
double totalBelanja = 0.0;
int kodeInput;
int kuantitas;
tampilkanMenu();
std::cout << "Masukkan kode produk (0 untuk selesai): ";
while (std::cin >> kodeInput && kodeInput != 0) {
Produk* barang = cariProduk(kodeInput);
if (barang == nullptr) {
std::cout << "Kode produk tidak ditemukan. Coba lagi.\n";
} else {
std::cout << "Masukkan kuantitas " << barang->nama << ": ";
std::cin >> kuantitas;
if (kuantitas > 0) {
totalBelanja += (barang->harga * kuantitas);
std::cout << barang->nama << " (" << kuantitas << "x) ditambahkan. Subtotal saat ini: "
<< std::fixed << std::setprecision(2) << totalBelanja << "\n";
}
}
std::cout << "Lanjutkan input kode (0 untuk selesai): ";
}
// Output Struk Akhir
if (totalBelanja > 0) {
double pajak = totalBelanja * 0.11; // Asumsi PPN 11%
double totalAkhir = totalBelanja + pajak;
std::cout << "\n\n--- STRUK PEMBELIAN ---\n";
std::cout << std::left << std::setw(20) << "Subtotal:" << std::right << std::setw(10) << totalBelanja << "\n";
std::cout << std::left << std::setw(20) << "PPN (11%):" << std::right << std::setw(10) << pajak << "\n";
std::cout << "----------------------------------\n";
std::cout << std::left << std::setw(20) << "TOTAL BAYAR:" << std::right << std::setw(10) << totalAkhir << "\n";
std::cout << "==================================\n";
// Logika Uang Tunai (Opsional tapi penting untuk kasir)
double bayar;
std::cout << "Uang Tunai Diterima: ";
std::cin >> bayar;
double kembalian = bayar - totalAkhir;
if (kembalian >= 0) {
std::cout << "Kembalian: " << std::fixed << std::setprecision(2) << kembalian << "\n";
} else {
std::cout << "Pembayaran Kurang! Kekurangan: " << std::abs(kembalian) << "\n";
}
} else {
std::cout << "\nTransaksi dibatalkan atau tidak ada item yang dipilih.\n";
}
}
Kita menyatukan semua fungsi dalam blok main. Aplikasi ini dirancang untuk berjalan secara berkelanjutan hingga pengguna secara eksplisit keluar dari loop transaksi.
int main() {
// Mengatur locale agar input/output lebih stabil, tergantung sistem operasi
// std::ios_base::sync_with_stdio(false);
// std::cin.tie(NULL);
std::cout << "=== APLIKASI KASIR SEDERHANA C++ ===\n";
prosesTransaksi();
std::cout << "\nTerima kasih telah menggunakan sistem kasir kami.\n";
return 0;
}
Dengan mengikuti langkah-langkah di atas, Anda telah berhasil membuat kerangka dasar program kasir fungsional menggunakan C++. Meskipun ini adalah versi berbasis konsol, konsepnya dapat diperluas. Untuk pengembangan lebih lanjut, Anda bisa menambahkan fitur seperti manajemen stok (mengurangi jumlah stok setelah transaksi), sistem login kasir, penggunaan file (seperti CSV atau TXT) untuk menyimpan data produk secara permanen daripada menggunakan array statis, atau bahkan menggunakan pustaka seperti Qt atau SDL untuk antarmuka grafis (GUI) jika Anda ingin beralih dari konsol murni. Pemahaman mendalam tentang struktur data dan alokasi memori dalam C++ akan sangat membantu dalam menskalakan aplikasi ini menjadi sistem POS yang robust di masa depan.