fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. public static void main (String[] args) throws java.lang.Exception
  11. {
  12. // your code goes here
  13. }
  14. }
Success #stdin #stdout 0.07s 52456KB
stdin
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

// ---------------- Train Class ----------------
class Train {
public:
    int trainNo;
    string trainName;
    string source;
    string destination;
    int totalSeats;
    int bookedSeats;
    float fare;

    Train() : trainNo(0), totalSeats(0), bookedSeats(0), fare(0) {}

    Train(int no, string name, string src, string dest, int seats, float f)
        : trainNo(no), trainName(name), source(src),
          destination(dest), totalSeats(seats), bookedSeats(0), fare(f) {}

    int availableSeats() const { return totalSeats - bookedSeats; }
};

// ---------------- Passenger Class ----------------
class Passenger {
public:
    int pnr;
    string name;
    int age;
    char gender;
    string phone;
    int trainNo;
    string trainName;
    string source;
    string destination;
    float fare;
    int seatNo;

    Passenger() : pnr(0), age(0), gender('M'), trainNo(0), fare(0), seatNo(0) {}
};

// ---------------- Railway System ----------------
class RailwaySystem {
private:
    vector<Train> trains;
    const string trainFile = "trains.dat";
    const string bookingFile = "bookings.dat";
    int nextPNR;

public:
    RailwaySystem() {
        loadTrains();
        if (trains.empty()) {
            initializeTrains();
        }
        loadNextPNR();
    }

    // Initialize default trains
    void initializeTrains() {
        trains.push_back(Train(12345, "Rajdhani Express", "Delhi", "Mumbai", 100, 2500.0));
        trains.push_back(Train(12346, "Shatabdi Express", "Delhi", "Bhopal", 80, 1200.0));
        trains.push_back(Train(12347, "Duronto Express", "Mumbai", "Chennai", 120, 1800.0));
        trains.push_back(Train(12348, "Garib Rath", "Kolkata", "Delhi", 150, 900.0));
        trains.push_back(Train(12349, "Chennai Express", "Chennai", "Mumbai", 110, 1500.0));
        saveTrains();
    }

    // ---------- File Handling ----------
    void saveTrains() {
        ofstream fout(trainFile, ios::binary);
        size_t size = trains.size();
        fout.write((char*)&size, sizeof(size));
        for (auto &t : trains) {
            fout.write((char*)&t.trainNo, sizeof(t.trainNo));
            size_t len = t.trainName.size();
            fout.write((char*)&len, sizeof(len));
            fout.write(t.trainName.c_str(), len);
            len = t.source.size();
            fout.write((char*)&len, sizeof(len));
            fout.write(t.source.c_str(), len);
            len = t.destination.size();
            fout.write((char*)&len, sizeof(len));
            fout.write(t.destination.c_str(), len);
            fout.write((char*)&t.totalSeats, sizeof(t.totalSeats));
            fout.write((char*)&t.bookedSeats, sizeof(t.bookedSeats));
            fout.write((char*)&t.fare, sizeof(t.fare));
        }
        fout.close();
    }

    void loadTrains() {
        ifstream fin(trainFile, ios::binary);
        if (!fin) return;
        size_t size;
        fin.read((char*)&size, sizeof(size));
        for (size_t i = 0; i < size; i++) {
            Train t;
            fin.read((char*)&t.trainNo, sizeof(t.trainNo));
            size_t len;
            fin.read((char*)&len, sizeof(len));
            t.trainName.resize(len);
            fin.read(&t.trainName[0], len);
            fin.read((char*)&len, sizeof(len));
            t.source.resize(len);
            fin.read(&t.source[0], len);
            fin.read((char*)&len, sizeof(len));
            t.destination.resize(len);
            fin.read(&t.destination[0], len);
            fin.read((char*)&t.totalSeats, sizeof(t.totalSeats));
            fin.read((char*)&t.bookedSeats, sizeof(t.bookedSeats));
            fin.read((char*)&t.fare, sizeof(t.fare));
            trains.push_back(t);
        }
        fin.close();
    }

    void loadNextPNR() {
        ifstream fin(bookingFile, ios::binary);
        nextPNR = 1000;
        if (!fin) return;
        fin.seekg(0, ios::end);
        if (fin.tellg() == 0) { fin.close(); return; }
        fin.seekg(0);
        while (fin.peek() != EOF) {
            int pnr;
            fin.read((char*)&pnr, sizeof(pnr));
            if (fin.gcount() == 0) break;
            nextPNR = pnr + 1;
            // skip remaining passenger data
            int age, trainNo, seatNo;
            char gender;
            float fare;
            fin.read((char*)&age, sizeof(age));
            fin.read(&gender, sizeof(gender));
            size_t len;
            fin.read((char*)&len, sizeof(len)); fin.seekg(len, ios::cur); // name
            fin.read((char*)&len, sizeof(len)); fin.seekg(len, ios::cur); // phone
            fin.read((char*)&trainNo, sizeof(trainNo));
            fin.read((char*)&len, sizeof(len)); fin.seekg(len, ios::cur); // trainName
            fin.read((char*)&len, sizeof(len)); fin.seekg(len, ios::cur); // source
            fin.read((char*)&len, sizeof(len)); fin.seekg(len, ios::cur); // dest
            fin.read((char*)&fare, sizeof(fare));
            fin.read((char*)&seatNo, sizeof(seatNo));
        }
        fin.close();
    }

    void appendBooking(const Passenger &p) {
        ofstream fout(bookingFile, ios::binary | ios::app);
        fout.write((char*)&p.pnr, sizeof(p.pnr));
        fout.write((char*)&p.age, sizeof(p.age));
        fout.write(&p.gender, sizeof(p.gender));
        size_t len = p.name.size();
        fout.write((char*)&len, sizeof(len));
        fout.write(p.name.c_str(), len);
        len = p.phone.size();
        fout.write((char*)&len, sizeof(len));
        fout.write(p.phone.c_str(), len);
        fout.write((char*)&p.trainNo, sizeof(p.trainNo));
        len = p.trainName.size();
        fout.write((char*)&len, sizeof(len));
        fout.write(p.trainName.c_str(), len);
        len = p.source.size();
        fout.write((char*)&len, sizeof(len));
        fout.write(p.source.c_str(), len);
        len = p.destination.size();
        fout.write((char*)&len, sizeof(len));
        fout.write(p.destination.c_str(), len);
        fout.write((char*)&p.fare, sizeof(p.fare));
        fout.write((char*)&p.seatNo, sizeof(p.seatNo));
        fout.close();
    }

    // ---------- Core Functions ----------
    void displayAllTrains() {
        cout << "\n========== Available Trains ==========\n";
        cout << left << setw(10) << "TrainNo"
             << setw(22) << "Train Name"
             << setw(12) << "Source"
             << setw(12) << "Dest"
             << setw(10) << "Seats"
             << setw(10) << "Fare" << "\n";
        cout << string(76, '-') << "\n";
        for (auto &t : trains) {
            cout << left << setw(10) << t.trainNo
                 << setw(22) << t.trainName
                 << setw(12) << t.source
                 << setw(12) << t.destination
                 << setw(10) << t.availableSeats()
                 << setw(10) << t.fare << "\n";
        }
    }

    Train* findTrain(int no) {
        for (auto &t : trains)
            if (t.trainNo == no) return &t;
        return nullptr;
    }

    void bookTicket() {
        displayAllTrains();
        int no;
        cout << "\nEnter Train Number to book: ";
        cin >> no;
        Train *t = findTrain(no);
        if (!t) { cout << "Train not found!\n"; return; }
        if (t->availableSeats() <= 0) {
            cout << "Sorry! No seats available.\n";
            return;
        }

        Passenger p;
        p.pnr = nextPNR++;
        p.trainNo = t->trainNo;
        p.trainName = t->trainName;
        p.source = t->source;
        p.destination = t->destination;
        p.fare = t->fare;

        cin.ignore();
        cout << "Enter Name: ";
        getline(cin, p.name);
        cout << "Enter Age: ";
        cin >> p.age;
        cout << "Enter Gender (M/F): ";
        cin >> p.gender;
        cin.ignore();
        cout << "Enter Phone: ";
        getline(cin, p.phone);

        t->bookedSeats++;
        p.seatNo = t->bookedSeats;

        appendBooking(p);
        saveTrains();

        cout << "\n===== Booking Confirmed =====\n";
        cout << "PNR       : " << p.pnr << "\n";
        cout << "Name      : " << p.name << "\n";
        cout << "Train     : " << p.trainName << " (" << p.trainNo << ")\n";
        cout << "Route     : " << p.source << " -> " << p.destination << "\n";
        cout << "Seat No   : " << p.seatNo << "\n";
        cout << "Fare      : Rs. " << p.fare << "\n";
    }

    void cancelTicket() {
        int pnr;
        cout << "\nEnter PNR to cancel: ";
        cin >> pnr;

        ifstream fin(bookingFile, ios::binary);
        if (!fin) { cout << "No bookings found.\n"; return; }

        vector<Passenger> all;
        bool found = false;
        Passenger target;

        while (fin.peek() != EOF) {
            Passenger p;
            fin.read((char*)&p.pnr, sizeof(p.pnr));
            if (fin.gcount() == 0) break;
            fin.read((char*)&p.age, sizeof(p.age));
            fin.read(&p.gender, sizeof(p.gender));
            size_t len;
            fin.read((char*)&len, sizeof(len)); p.name.resize(len); fin.read(&p.name[0], len);
            fin.read((char*)&len, sizeof(len)); p.phone.resize(len); fin.read(&p.phone[0], len);
            fin.read((char*)&p.trainNo, sizeof(p.trainNo));
            fin.read((char*)&len, sizeof(len)); p.trainName.resize(len); fin.read(&p.trainName[0], len);
            fin.read((char*)&len, sizeof(len)); p.source.resize(len); fin.read(&p.source[0], len);
            fin.read((char*)&len, sizeof(len)); p.destination.resize(len); fin.read(&p.destination[0], len);
            fin.read((char*)&p.fare, sizeof(p.fare));
            fin.read((char*)&p.seatNo, sizeof(p.seatNo));

            if (p.pnr == pnr && !found) {
                found = true;
                target = p;
            } else {
                all.push_back(p);
            }
        }
        fin.close();

        if (!found) { cout << "PNR not found!\n"; return; }

        // Rewrite bookings file
        ofstream fout(bookingFile, ios::binary | ios::trunc);
        for (auto &p : all) {
            fout.write((char*)&p.pnr, sizeof(p.pnr));
            fout.write((char*)&p.age, sizeof(p.age));
            fout.write(&p.gender, sizeof(p.gender));
            size_t len = p.name.size();
            fout.write((char*)&len, sizeof(len)); fout.write(p.name.c_str(), len);
            len = p.phone.size();
            fout.write((char*)&len, sizeof(len)); fout.write(p.phone.c_str(), len);
            fout.write((char*)&p.trainNo, sizeof(p.trainNo));
            len = p.trainName.size();
            fout.write((char*)&len, sizeof(len)); fout.write(p.trainName.c_str(), len);
            len = p.source.size();
            fout.write((char*)&len, sizeof(len)); fout.write(p.source.c_str(), len);
            len = p.destination.size();
            fout.write((char*)&len, sizeof(len)); fout.write(p.destination.c_str(), len);
            fout.write((char*)&p.fare, sizeof(p.fare));
            fout.write((char*)&p.seatNo, sizeof(p.seatNo));
        }
        fout.close();

        // Update train booked seats
        Train *t = findTrain(target.trainNo);
        if (t && t->bookedSeats > 0) t->bookedSeats--;
        saveTrains();

        cout << "\nTicket Cancelled Successfully!\n";
        cout << "Refund Amount: Rs. " << (target.fare * 0.9) << " (10% cancellation charge)\n";
    }

    void viewBookings() {
        ifstream fin(bookingFile, ios::binary);
        if (!fin) { cout << "\nNo bookings yet.\n"; return; }

        cout << "\n========== All Bookings ==========\n";
        cout << left << setw(8) << "PNR"
             << setw(18) << "Name"
             << setw(8) << "Age"
             << setw(6) << "Gen"
             << setw(22) << "Train"
             << setw(8) << "Seat"
             << setw(10) << "Fare" << "\n";
        cout << string(80, '-') << "\n";

        bool any = false;
        while (fin.peek() != EOF) {
            Passenger p;
            fin.read((char*)&p.pnr, sizeof(p.pnr));
            if (fin.gcount() == 0) break;
            fin.read((char*)&p.age, sizeof(p.age));
            fin.read(&p.gender, sizeof(p.gender));
            size_t len;
            fin.read((char*)&len, sizeof(len)); p.name.resize(len); fin.read(&p.name[0], len);
            fin.read((char*)&len, sizeof(len)); p.phone.resize(len); fin.read(&p.phone[0], len);
            fin.read((char*)&p.trainNo, sizeof(p.trainNo));
            fin.read((char*)&len, sizeof(len)); p.trainName.resize(len); fin.read(&p.trainName[0], len);
            fin.read((char*)&len, sizeof(len)); p.source.resize(len); fin.read(&p.source[0], len);
            fin.read((char*)&len, sizeof(len)); p.destination.resize(len); fin.read(&p.destination[0], len);
            fin.read((char*)&p.fare, sizeof(p.fare));
            fin.read((char*)&p.seatNo, sizeof(p.seatNo));

            cout << left << setw(8) << p.pnr
                 << setw(18) << p.name
                 << setw(8) << p.age
                 << setw(6) << p.gender
                 << setw(22) << (p.trainName + " (" + to_string(p.trainNo) + ")")
                 << setw(8) << p.seatNo
                 << setw(10) << p.fare << "\n";
            any = true;
        }
        fin.close();
        if (!any) cout << "No bookings found.\n";
    }

    void checkAvailability() {
        int no;
        cout << "\nEnter Train Number: ";
        cin >> no;
        Train *t = findTrain(no);
        if (!t) { cout << "Train not found!\n"; return; }
        cout << "\nTrain   : " << t->trainName << "\n";
        cout << "Route   : " << t->source << " -> " << t->destination << "\n";
        cout << "Total   : " << t->totalSeats << "\n";
        cout << "Booked  : " << t->bookedSeats << "\n";
        cout << "Available: " << t->availableSeats() << "\n";
        cout << "Fare    : Rs. " << t->fare << "\n";
    }
};

// ---------------- Menu ----------------
void showMenu() {
    cout << "\n╔════════════════════════════════════════╗\n";
    cout << "║    RAILWAY RESERVATION SYSTEM          ║\n";
    cout << "╠════════════════════════════════════════╣\n";
    cout << "║  1. View All Trains                    ║\n";
    cout << "║  2. Book Ticket                        ║\n";
    cout << "║  3. Cancel Ticket                      ║\n";
    cout << "║  4. Check Seat Availability            ║\n";
    cout << "║  5. View All Bookings                  ║\n";
    cout << "║  6. Exit                               ║\n";
    cout << "╚════════════════════════════════════════╝\n";
    cout << "Enter your choice: ";
}

int main() {
    RailwaySystem system;
    int choice;

    cout << "\n========================================\n";
    cout << " Welcome to Railway Reservation System  \n";
    cout << "========================================\n";

    do {
        showMenu();
        cin >> choice;

        switch (choice) {
            case 1: system.displayAllTrains(); break;
            case 2: system.bookTicket(); break;
            case 3: system.cancelTicket(); break;
            case 4: system.checkAvailability(); break;
            case 5: system.viewBookings(); break;
            case 6:
                cout << "\nThank you for using Railway Reservation System!\n";
                break;
            default:
                cout << "\nInvalid choice! Try again.\n";
        }
    } while (choice != 6);

    return 0;
}
stdout
Standard output is empty