Project C++: Sistem Inventaris Sederhana untuk Toko dengan Code::Blocks (Lengkap Langkah-Langkahnya)
Sistem inventaris merupakan komponen penting dalam manajemen toko modern. Dalam panduan lengkap ini, kita akan membangun Sistem Inventaris Sederhana menggunakan C++ dengan IDE Code::Blocks, yang sangat cocok untuk pemula yang ingin belajar pemrograman berorientasi objek dasar.
Apa yang akan Anda pelajari:
✔ Konsep dasar pemrograman C++
✔ Manajemen data dengan struct dan file
✔ Implementasi operasi CRUD (Create, Read, Update, Delete)
✔ Pembuatan antarmuka console yang interaktif
✔ Penggunaan IDE Code::Blocks secara efektif
Fitur Sistem:
- Tambah, lihat, edit, dan hapus produk
- Pencarian produk berdasarkan kode/nama
- Penyimpanan data ke file teks
- Validasi input dan konfirmasi aksi
- Tampilan menu yang user-friendly
Langkah 1: Persiapan Tools
Instalasi Code::Blocks
- Download Code::Blocks versi terbaru dari situs resmi
- Pilih versi dengan compiler MinGW included
- Ikuti proses instalasi default
- Pastikan instalasi berhasil dengan membuat program “Hello World”
Membuat Project Baru
- Buka Code::Blocks
- Klik “Create a new project”
- Pilih “Console application”
- Pilih bahasa C++
- Beri nama project “SistemInventarisToko”
- Pilih folder penyimpanan
- Finish
Langkah 2: Membuat Struktur Data
Buat file baru Produk.h
:
#ifndef PRODUK_H #define PRODUK_H #include <iostream> #include <string> struct Produk { std::string kode; std::string nama; double harga; int stok; void tampilkanInfo() const { std::cout << "\nKode: " << kode << std::endl; std::cout << "Nama: " << nama << std::endl; std::cout << "Harga: Rp" << harga << std::endl; std::cout << "Stok: " << stok << std::endl; std::cout << "-----------------------" << std::endl; } }; #endif
Langkah 3: Membuat Kelas Manajer Inventaris
Buat file InventarisManager.h
:
#ifndef INVENTARIS_MANAGER_H #define INVENTARIS_MANAGER_H #include "Produk.h" #include <vector> #include <fstream> #include <algorithm> #include <limits> class InventarisManager { private: std::vector<Produk> daftarProduk; const std::string namaFile = "inventaris.txt"; int cariIndexProduk(const std::string& kode) const { for(int i = 0; i < daftarProduk.size(); i++) { if(daftarProduk[i].kode == kode) { return i; } } return -1; } public: void tambahProduk(); void tampilkanSemuaProduk() const; void cariProduk() const; void editProduk(); void hapusProduk(); void simpanKeFile(); void muatDariFile(); }; #endif
Implementasi di InventarisManager.cpp
:
#include "InventarisManager.h" void InventarisManager::tambahProduk() { Produk baru; std::cout << "\n=== TAMBAH PRODUK BARU ===" << std::endl; std::cout << "Kode Produk: "; std::cin >> baru.kode; // Validasi kode unik if(cariIndexProduk(baru.kode) != -1) { std::cout << "Error: Kode produk sudah ada!\n"; return; } std::cout << "Nama Produk: "; std::cin.ignore(); std::getline(std::cin, baru.nama); std::cout << "Harga: Rp"; while(!(std::cin >> baru.harga)) { std::cout << "Input tidak valid! Masukkan angka: "; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } std::cout << "Stok: "; while(!(std::cin >> baru.stok)) { std::cout << "Input tidak valid! Masukkan angka: "; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } daftarProduk.push_back(baru); std::cout << "\nProduk berhasil ditambahkan!\n"; } void InventarisManager::tampilkanSemuaProduk() const { if(daftarProduk.empty()) { std::cout << "\nInventaris kosong!\n"; return; } std::cout << "\n=== DAFTAR PRODUK (" << daftarProduk.size() << ") ===" << std::endl; for(const auto& produk : daftarProduk) { produk.tampilkanInfo(); } } void InventarisManager::cariProduk() const { std::string keyword; std::cout << "\n=== CARI PRODUK ===" << std::endl; std::cout << "Masukkan kode/nama produk: "; std::cin.ignore(); std::getline(std::cin, keyword); bool ditemukan = false; for(const auto& produk : daftarProduk) { if(produk.kode == keyword || produk.nama.find(keyword) != std::string::npos) { std::cout << "\nProduk ditemukan:"; produk.tampilkanInfo(); ditemukan = true; } } if(!ditemukan) { std::cout << "\nProduk tidak ditemukan!\n"; } } void InventarisManager::editProduk() { std::string kode; std::cout << "\n=== EDIT PRODUK ===" << std::endl; std::cout << "Masukkan kode produk: "; std::cin >> kode; int index = cariIndexProduk(kode); if(index == -1) { std::cout << "\nProduk tidak ditemukan!\n"; return; } Produk& produk = daftarProduk[index]; std::cout << "\nData saat ini:"; produk.tampilkanInfo(); std::cout << "Masukkan data baru (kosongkan jika tidak ingin mengubah):\n"; // Edit Nama std::cout << "Nama [" << produk.nama << "]: "; std::cin.ignore(); std::string namaBaru; std::getline(std::cin, namaBaru); if(!namaBaru.empty()) produk.nama = namaBaru; // Edit Harga std::cout << "Harga [" << produk.harga << "]: "; std::string hargaStr; std::getline(std::cin, hargaStr); if(!hargaStr.empty()) { try { produk.harga = std::stod(hargaStr); } catch(...) { std::cout << "Harga tidak valid!\n"; } } // Edit Stok std::cout << "Stok [" << produk.stok << "]: "; std::string stokStr; std::getline(std::cin, stokStr); if(!stokStr.empty()) { try { produk.stok = std::stoi(stokStr); } catch(...) { std::cout << "Stok tidak valid!\n"; } } std::cout << "\nProduk berhasil diupdate!\n"; } void InventarisManager::hapusProduk() { std::string kode; std::cout << "\n=== HAPUS PRODUK ===" << std::endl; std::cout << "Masukkan kode produk: "; std::cin >> kode; int index = cariIndexProduk(kode); if(index == -1) { std::cout << "\nProduk tidak ditemukan!\n"; return; } std::cout << "\nProduk yang akan dihapus:"; daftarProduk[index].tampilkanInfo(); std::cout << "Yakin ingin menghapus? (y/n): "; char confirm; std::cin >> confirm; if(tolower(confirm) == 'y') { daftarProduk.erase(daftarProduk.begin() + index); std::cout << "\nProduk berhasil dihapus!\n"; } else { std::cout << "\nPenghapusan dibatalkan.\n"; } } void InventarisManager::simpanKeFile() { std::ofstream file(namaFile); if(!file) { std::cerr << "Gagal membuka file untuk penyimpanan!\n"; return; } for(const auto& produk : daftarProduk) { file << produk.kode << "," << produk.nama << "," << produk.harga << "," << produk.stok << "\n"; } file.close(); std::cout << "\nData berhasil disimpan ke file!\n"; } void InventarisManager::muatDariFile() { std::ifstream file(namaFile); if(!file) { std::cerr << "\nFile inventaris tidak ditemukan. Membuat yang baru.\n"; return; } daftarProduk.clear(); std::string line; while(std::getline(file, line)) { Produk produk; size_t pos1 = line.find(','); size_t pos2 = line.find(',', pos1+1); size_t pos3 = line.find(',', pos2+1); produk.kode = line.substr(0, pos1); produk.nama = line.substr(pos1+1, pos2-pos1-1); produk.harga = std::stod(line.substr(pos2+1, pos3-pos2-1)); produk.stok = std::stoi(line.substr(pos3+1)); daftarProduk.push_back(produk); } file.close(); std::cout << "\nData berhasil dimuat! (" << daftarProduk.size() << " produk)\n"; }
Langkah 4: Membuat Menu Utama
Buat file main.cpp
:
#include <iostream> #include <limits> #include "InventarisManager.h" void tampilkanMenu() { std::cout << "\n=== SISTEM INVENTARIS TOKO ===" << std::endl; std::cout << "1. Tambah Produk" << std::endl; std::cout << "2. Tampilkan Semua Produk" << std::endl; std::cout << "3. Cari Produk" << std::endl; std::cout << "4. Edit Produk" << std::endl; std::cout << "5. Hapus Produk" << std::endl; std::cout << "6. Simpan Data ke File" << std::endl; std::cout << "7. Muat Data dari File" << std::endl; std::cout << "8. Keluar" << std::endl; std::cout << "Pilihan: "; } int main() { InventarisManager manager; int pilihan; std::cout << "====================================" << std::endl; std::cout << " SISTEM INVENTARIS TOKO C++" << std::endl; std::cout << " Azroi id" << std::endl; std::cout << "====================================" << std::endl; // Muat data otomatis saat program dimulai manager.muatDariFile(); do { tampilkanMenu(); while(!(std::cin >> pilihan)) { std::cout << "Input tidak valid! Masukkan angka 1-8: "; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } switch(pilihan) { case 1: manager.tambahProduk(); break; case 2: manager.tampilkanSemuaProduk(); break; case 3: manager.cariProduk(); break; case 4: manager.editProduk(); break; case 5: manager.hapusProduk(); break; case 6: manager.simpanKeFile(); break; case 7: manager.muatDariFile(); break; case 8: std::cout << "\nSimpan perubahan terakhir? (y/n): "; char save; std::cin >> save; if(tolower(save) == 'y') manager.simpanKeFile(); std::cout << "\nKeluar dari program...\n"; break; default: std::cout << "\nPilihan tidak valid! Masukkan 1-8.\n"; } // Clear input buffer std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } while(pilihan != 8); return 0; }
Langkah 5: Build dan Run di Code::Blocks
- Tambahkan semua file ke project:
- Klik kanan project > Add files
- Pilih Produk.h, InventarisManager.h, InventarisManager.cpp, main.cpp
- Build project:
- Klik Build > Build (Ctrl-F9)
- Perbaiki error jika ada
- Run program:
- Klik Build > Run (Ctrl-F10)
- Tes semua fitur:
- Tambah beberapa produk
- Edit produk
- Hapus produk
- Simpan/muat data
Fitur Utama yang Telah Diimplementasikan
- Manajemen Produk Lengkap (CRUD):
- Create: Tambah produk baru
- Read: Lihat daftar produk
- Update: Edit produk yang ada
- Delete: Hapus produk
- Persisten Data:
- Penyimpanan ke file teks
- Pemuatan data saat program dimulai
- Validasi Input:
- Cek kode unik
- Validasi tipe data
- Konfirmasi aksi kritis
- Antarmuka Pengguna:
- Menu interaktif
- Tampilan terstruktur
- Pesan error yang informatif
Kesimpulan
Anda telah berhasil membuat:
✅ Sistem inventaris lengkap dengan operasi CRUD
✅ Penyimpanan data persisten ke file
✅ Antarmuka console yang user-friendly
✅ Validasi input dan handling error
✅ Project terorganisir dengan baik di Code::Blocks
Challenge: Coba tambahkan fitur laporan produk yang hampir habis stoknya!