Project C++: Sistem Inventaris Sederhana untuk Toko

Project C++: Sistem Inventaris Sederhana untuk Toko

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

  1. Download Code::Blocks versi terbaru dari situs resmi
  2. Pilih versi dengan compiler MinGW included
  3. Ikuti proses instalasi default
  4. Pastikan instalasi berhasil dengan membuat program “Hello World”

Membuat Project Baru

  1. Buka Code::Blocks
  2. Klik “Create a new project”
  3. Pilih “Console application”
  4. Pilih bahasa C++
  5. Beri nama project “SistemInventarisToko”
  6. Pilih folder penyimpanan
  7. Finish

Langkah 2: Membuat Struktur Data

Buat file baru Produk.h:

cpp
#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:

cpp
#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:

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:

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

  1. Tambahkan semua file ke project:
    • Klik kanan project > Add files
    • Pilih Produk.h, InventarisManager.h, InventarisManager.cpp, main.cpp
  2. Build project:
    • Klik Build > Build (Ctrl-F9)
    • Perbaiki error jika ada
  3. 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

  1. Manajemen Produk Lengkap (CRUD):
    • Create: Tambah produk baru
    • Read: Lihat daftar produk
    • Update: Edit produk yang ada
    • Delete: Hapus produk
  2. Persisten Data:
    • Penyimpanan ke file teks
    • Pemuatan data saat program dimulai
  3. Validasi Input:
    • Cek kode unik
    • Validasi tipe data
    • Konfirmasi aksi kritis
  4. 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!

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *