Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
12 kB
5
Indexable
Never
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdlib> // Untuk fungsi rand()

using namespace std;

// Struktur data untuk kamar
struct Kamar {
    int nomor;
    bool tersedia;
    string tipe;
    double harga;
};

// Struktur data untuk pelanggan
struct Pelanggan {
    string nama;
    int nomorKamar;
    int jumlahHari;
    double totalHarga;
};

// Deklarasi kelas untuk mengelola data kamar
class Hotel {
private:
    // Gunakan array satu dimensi untuk menyimpan data kamar
    Kamar* kamar; 
    int jumlahKamar;    

    // Gunakan linked list untuk menyimpan data pelanggan
    struct Node {
        Pelanggan data;
        Node* next;
    };
    Node* headPelanggan; 

    // Gunakan stack untuk menyimpan data antrian check-in
    stack<Pelanggan> antrianCheckin; 

    // Gunakan queue untuk menyimpan data antrian check-out
    queue<Pelanggan> antrianCheckout; 

    // Fungsi untuk inisialisasi kamar
    void inisialisasiKamar() {
        // Inisialisasi array kamar dengan data dummy
        string tipeKamar[] = {"Standar", "Deluxe", "Suite"};
        double hargaKamar[] = {50000, 100000, 150000};

        for (int i = 0; i < jumlahKamar; i++) {
            kamar[i].nomor = i + 1;
            kamar[i].tersedia = true;
            int index = rand() % 3;
            kamar[i].tipe = tipeKamar[index];
            kamar[i].harga = hargaKamar[index];
        }
    }

public:
    // Konstruktor
    Hotel(int jumlahKamar) {
        this->jumlahKamar = jumlahKamar;
        kamar = new Kamar[jumlahKamar];
        inisialisasiKamar();
        headPelanggan = nullptr;
    }

    // Destruktor
    ~Hotel() {
        delete[] kamar;
        // Hapus linked list pelanggan
        Node* current = headPelanggan;
        while (current != nullptr) {
            Node* next = current->next;
            delete current;
            current = next;
        }
    }

    // Fungsi untuk menampilkan daftar kamar
    void tampilkanDaftarKamar() {
        cout << "----------------------------" << endl;
        cout << "Daftar Kamar" << endl;
        cout << "----------------------------" << endl;
        for (int i = 0; i < jumlahKamar; i++) {
            cout << "Kamar " << kamar[i].nomor << ": ";
            if (kamar[i].tersedia) {
                cout << "Tersedia";
            } else {
                cout << "Tidak Tersedia";
            }
            cout << " (Tipe: " << kamar[i].tipe << ", Harga: " << kamar[i].harga << " per malam)" << endl;
        }
    }

    // Fungsi untuk melakukan pemesanan kamar
    void pesanKamar(const string& namaPelanggan, int jumlahHari) {
        // Cari kamar yang tersedia
        int nomorKamar = -1;
        for (int i = 0; i < jumlahKamar; i++) {
            if (kamar[i].tersedia) {
                nomorKamar = i;
                break;
            }
        }

        if (nomorKamar != -1) {
            // Jika kamar tersedia, lakukan pemesanan
            kamar[nomorKamar].tersedia = false;
            double totalHarga = kamar[nomorKamar].harga * jumlahHari;
            Pelanggan pelanggan = {namaPelanggan, nomorKamar + 1, jumlahHari, totalHarga};
            antrianCheckin.push(pelanggan); // Masukkan ke stack antrian check-in
            cout << "Kamar " << nomorKamar + 1 << " berhasil dipesan untuk " << namaPelanggan << endl;
            cout << "Total harga untuk " << jumlahHari << " malam adalah " << totalHarga << endl;
        } else {
            // Jika tidak ada kamar yang tersedia, masukkan ke antrian tunggu
            cout << "Maaf, semua kamar sedang penuh. Anda akan dimasukkan ke antrian tunggu." << endl;
            Pelanggan pelanggan = {namaPelanggan, -1, jumlahHari, 0.0}; 
            antrianCheckin.push(pelanggan); // Masukkan ke stack antrian check-in
        }
    }

    // Fungsi untuk melakukan check-in
    void checkIn() {
        if (!antrianCheckin.empty()) {
            Pelanggan pelanggan = antrianCheckin.top();
            antrianCheckin.pop(); // Keluarkan dari stack
            
            // Cari kamar yang sesuai
            int nomorKamar = pelanggan.nomorKamar;
            if (nomorKamar != -1) {
                // Jika nomorKamar valid, masukkan ke linked list pelanggan
                Node* newNode = new Node;
                newNode->data = pelanggan;
                newNode->next = headPelanggan;
                headPelanggan = newNode;
                cout << "Selamat datang, " << pelanggan.nama << ". Kamar Anda adalah " << nomorKamar << endl;
            } else {
                // Jika nomorKamar tidak valid (antrian tunggu), beri tahu pelanggan
                cout << "Maaf, " << pelanggan.nama << ", kamar masih belum tersedia. Silakan tunggu." << endl;
                antrianCheckin.push(pelanggan); // Masukkan kembali ke stack
            }
        } else {
            cout << "Tidak ada pelanggan yang sedang menunggu check-in." << endl;
        }
    }

    // Fungsi untuk melakukan check-out
    void checkOut(const string& namaPelanggan) {
        Node* current = headPelanggan;
        Node* previous = nullptr;

        // Cari data pelanggan dalam linked list
        while (current != nullptr) {
            if (current->data.nama == namaPelanggan) {
                // Jika ditemukan, hapus dari linked list
                if (previous == nullptr) {
                    headPelanggan = current->next;
                } else {
                    previous->next = current->next;
                }
                int nomorKamar = current->data.nomorKamar;
                kamar[nomorKamar - 1].tersedia = true; // Set kamar sebagai tersedia
                antrianCheckout.push(current->data); // Masukkan ke queue antrian check-out

                // Tampilkan rincian biaya dan proses pembayaran
                cout << "Rincian Biaya:" << endl;
                cout << "Nama: " << current->data.nama << endl;
                cout << "Kamar: " << nomorKamar << endl;
                cout << "Jumlah Hari: " << current->data.jumlahHari << endl;
                cout << "Total Harga: " << current->data.totalHarga << endl;

                double pembayaran;
                cout << "Masukkan jumlah pembayaran: ";
                cin >> pembayaran;

                if (pembayaran >= current->data.totalHarga) {
                    double kembalian = pembayaran - current->data.totalHarga;
                    cout << "Pembayaran berhasil. Kembalian: " << kembalian << endl;
                } else {
                    cout << "Pembayaran gagal. Jumlah pembayaran kurang." << endl;
                }

                delete current;
                cout << "Terima kasih, " << namaPelanggan << ". Kamar " << nomorKamar << " telah dikosongkan." << endl;
                return;
            }
            previous = current;
            current = current->next;
        }

        if (current == nullptr) {
            cout << "Pelanggan dengan nama " << namaPelanggan << " tidak ditemukan." << endl;
        }
    }

    // Fungsi untuk menampilkan daftar pelanggan yang sedang menginap
    void tampilkanDaftarPelanggan() {
        cout << "----------------------------" << endl;
        cout << "Daftar Pelanggan" << endl;
        cout << "----------------------------" << endl;
        Node* current = headPelanggan;
        if (current == nullptr) {
            cout << "Tidak ada pelanggan yang sedang menginap." << endl;
        } else {
            while (current != nullptr) {
                cout << "Nama: " << current->data.nama << ", Kamar: " << current->data.nomorKamar 
                     << ", Jumlah Hari: " << current->data.jumlahHari 
                     << ", Total Harga: " << current->data.totalHarga << endl;
                current = current->next;
            }
        }
    }

    // Fungsi untuk menampilkan antrian check-in
    void tampilkanAntrianCheckin() {
        cout << "----------------------------" << endl;
        cout << "Antrian Check-in" << endl;
        cout << "----------------------------" << endl;
        if (antrianCheckin.empty()) {
            cout << "Tidak ada pelanggan yang sedang menunggu check-in." << endl;
        } else {
            stack<Pelanggan> temp = antrianCheckin;
            while (!temp.empty()) {
                Pelanggan pelanggan = temp.top();
                temp.pop();
                cout << "Nama: " << pelanggan.nama << ", Kamar: " << pelanggan.nomorKamar 
                     << ", Jumlah Hari: " << pelanggan.jumlahHari 
                     << ", Total Harga: " << pelanggan.totalHarga << endl;
            }
        }
    }

    // Fungsi untuk menampilkan antrian check-out
    void tampilkanAntrianCheckout() {
        cout << "----------------------------" << endl;
        cout << "Antrian Check-out" << endl;
        cout << "----------------------------" << endl;
        if (antrianCheckout.empty()) {
            cout << "Tidak ada pelanggan yang sedang menunggu check-out." << endl;
        } else {
            queue<Pelanggan> temp = antrianCheckout;
            while (!temp.empty()) {
                Pelanggan pelanggan = temp.front();
                temp.pop();
                cout << "Nama: " << pelanggan.nama << ", Kamar: " << pelanggan.nomorKamar 
                     << ", Jumlah Hari: " << pelanggan.jumlahHari 
                     << ", Total Harga: " << pelanggan.totalHarga << endl;
            }
        }
    }
};

int main() {
    // Inisialisasi hotel dengan jumlah kamar tertentu
    int jumlahKamar = 10;
    Hotel hotel(jumlahKamar);

    // Menu utama
    int pilihan;
    do {
        cout << "\n===== Sistem Pemesanan Kamar Hotel =====" << endl;
        cout << "1. Tampilkan Daftar Kamar" << endl;
        cout << "2. Pesan Kamar" << endl;
        cout << "3. Check-in" << endl;
        cout << "4. Check-out" << endl;
        cout << "5. Tampilkan Daftar Pelanggan" << endl;
        cout << "6. Tampilkan Antrian Check-in" << endl;
        cout << "7. Tampilkan Antrian Check-out" << endl;
        cout << "0. Keluar" << endl;
        cout << "Masukkan pilihan: ";
        cin >> pilihan;

        switch (pilihan) {
            case 1:
                hotel.tampilkanDaftarKamar();
                break;
            case 2: {
                string namaPelanggan;
                int jumlahHari;
                cout << "Masukkan nama pelanggan: ";
                cin.ignore(); // Clear buffer
                getline(cin, namaPelanggan);
                cout << "Masukkan jumlah hari menginap: ";
                cin >> jumlahHari;
                hotel.pesanKamar(namaPelanggan, jumlahHari);
                break;
            }
            case 3:
                hotel.checkIn();
                break;
            case 4: {
                string namaPelanggan;
                cout << "Masukkan nama pelanggan: ";
                cin.ignore(); // Clear buffer
                getline(cin, namaPelanggan);
                hotel.checkOut(namaPelanggan);
                break;
            }
            case 5:
                hotel.tampilkanDaftarPelanggan();
                break;
            case 6:
                hotel.tampilkanAntrianCheckin();
                break;
            case 7:
                hotel.tampilkanAntrianCheckout();
                break;
            case 0:
                cout << "Terima kasih!" << endl;
                break;
            default:
                cout << "Pilihan tidak valid. Silakan coba lagi." << endl;
        }
    } while (pilihan != 0);

    return 0;
}
Leave a Comment