Untitled
unknown
plain_text
a year ago
12 kB
11
Indexable
#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;
}Editor is loading...
Leave a Comment