CSV Task Scheduler in C++

 avatar
unknown
c_cpp
a month ago
5.4 kB
1
Indexable
#include <iostream>
#include <fstream>
#include <sstream>
#include <climits>
#include <vector>

using namespace std;

const int MAX_TASKS = 100; // Adjust as needed

struct Task {
    int taskID;
    int arrivalTime;
    int burstTime;
    int priority;
    int completionTime;
    int turnaroundTime;
    int waitingTime;
};

Task tasks[MAX_TASKS];
int numTasks = 0;

// Function to read tasks from a CSV file
void readTasksFromFile(const string& filename) {
    ifstream file(filename);

    if (!file.is_open()) {
        cerr << "Error: Unable to open file " << filename << endl;
        return;
    }

    string line;
    getline(file, line); // Skip header row

    while (getline(file, line) && numTasks < MAX_TASKS) {
        stringstream ss(line);
        string token;

        getline(ss, token, ',');
        tasks[numTasks].taskID = stoi(token);

        getline(ss, token, ',');
        tasks[numTasks].arrivalTime = stoi(token);

        getline(ss, token, ',');
        tasks[numTasks].burstTime = stoi(token);

        getline(ss, token, ',');
        tasks[numTasks].priority = stoi(token);

        numTasks++;
    }

    file.close();
}

// Function to execute Round Robin scheduling
void roundRobin(int timeQuantum) {
    int time = 0;
    int remainingBurstTime[MAX_TASKS];

    for (int i = 0; i < numTasks; i++) {
        remainingBurstTime[i] = tasks[i].burstTime;
    }

    bool done;
    do {
        done = true;
        for (int i = 0; i < numTasks; i++) {
            if (remainingBurstTime[i] > 0) {
                done = false;
                if (remainingBurstTime[i] > timeQuantum) {
                    time += timeQuantum;
                    remainingBurstTime[i] -= timeQuantum;
                    cout << "Task " << tasks[i].taskID << " executed (remaining burst time: " << remainingBurstTime[i] << ")" << endl;
                } else {
                    time += remainingBurstTime[i];
                    tasks[i].completionTime = time;
                    remainingBurstTime[i] = 0;
                    cout << "Task " << tasks[i].taskID << " executed (remaining burst time: 0)" << endl;
                }
            }
        }
    } while (!done);
}

// Function to execute FCFS scheduling
void fcfs() {
    int time = 0;
    cout << "Level 2 (FCFS) Scheduling:" << endl;
    for (int i = 0; i < numTasks; i++) {
        if (time < tasks[i].arrivalTime) {
            time = tasks[i].arrivalTime;
        }
        time += tasks[i].burstTime;
        tasks[i].completionTime = time;
        cout << "Task " << tasks[i].taskID << " executed" << endl;
    }
}

// Function to execute SJF scheduling
void sjf() {
    int time = 0;
    bool completed[MAX_TASKS] = {false};

    cout << "Level 3 (SJF) Scheduling:" << endl;
    while (true) {
        int shortestTask = -1;
        int minBurstTime = INT_MAX;

        for (int i = 0; i < numTasks; i++) {
            if (!completed[i] && tasks[i].arrivalTime <= time && tasks[i].burstTime < minBurstTime) {
                minBurstTime = tasks[i].burstTime;
                shortestTask = i;
            }
        }

        if (shortestTask != -1) {
            time += tasks[shortestTask].burstTime;
            tasks[shortestTask].completionTime = time;
            completed[shortestTask] = true;
            cout << "Task " << tasks[shortestTask].taskID << " executed" << endl;
        } else {
            time++;
        }

        // Check if all tasks are completed
        bool allCompleted = true;
        for (int i = 0; i < numTasks; i++) {
            if (!completed[i]) {
                allCompleted = false;
                break;
            }
        }

        if (allCompleted) {
            break;
        }
    }
}

int main() {
    readTasksFromFile("tasks.csv");

    // Schedule tasks based on priority
    cout << "Level 1 (Round Robin) Scheduling:" << endl;
    for (int i = 0; i < numTasks; i++) {
        if (tasks[i].priority == 1) {
            roundRobin(2); // Time quantum for Level 1
        }
    }

    // Level 2 (FCFS) Scheduling
    fcfs();

    // Level 3 (SJF) Scheduling
    sjf();

    // Calculate Turnaround Time and Waiting Time
    for (int i = 0; i < numTasks; i++) {
        tasks[i].turnaroundTime = tasks[i].completionTime - tasks[i].arrivalTime;
        tasks[i].waitingTime = tasks[i].turnaroundTime - tasks[i].burstTime;
    }

    // Display results
    cout << "\nFinal Task Execution Order:" << endl;
    for (int i = 0; i < numTasks; i++) {
        cout << "Task " << tasks[i].taskID;
        if (i < numTasks - 1) cout << " -> ";
    }
    cout << endl;

    cout << "\nTask Completion Times:" << endl;
    for (int i = 0; i < numTasks; i++) {
        cout << "Task " << tasks[i].taskID << ": Completion Time = " << tasks[i].completionTime << endl;
    }

    cout << "\nTurnaround Times:" << endl;
    for (int i = 0; i < numTasks; i++) {
        cout << "Task " << tasks[i].taskID << ": Turnaround Time = " << tasks[i].turnaroundTime << endl;
    }

    cout << "\nWaiting Times:" << endl;
    for (int i = 0; i < numTasks; i++) {
        cout << "Task " << tasks[i].taskID << ": Waiting Time = " << tasks[i].waitingTime << endl;
    }

    return 0;
}
Leave a Comment