#include #include #include "disk.h" // Global tracking variables DiskDirection currentDirection = UP; int movement = 0; double seekTime = 0; // Array for storing the requests DiskQueue *queue; double timeToProcessRequest(int position, int destination) { //The time (a floating point number) required to process a request is computed by distance the head travels divided by 5 //Plus additional 15 milliseconds penalty if the direction has to change (for FCFS) double time = 0; // Calculated this way so that positive means up and negative means down int distance = destination - position; DiskDirection direction = (distance > 0) ? UP : DOWN; time += abs(distance) / 5.0; if (direction != currentDirection) { time += 15; currentDirection = direction; } return time; } // Your simulated disk is of size 10000, numbered from 0 to 9999. // In first come first the time the request comes in is irrelevant void fcfs(int start) { int position = start; int size = queue->size; for (int i = 0; i < size; i++) { DiskRequest request = dequeue(queue); while (seekTime < request.time) { seekTime++; } seekTime += timeToProcessRequest(position, request.position); movement += abs(position - request.position); position = request.position; } } void cscan(int start) { int position = start; DiskQueue *workingQueue = clone(queue); while (workingQueue->size > 0) { DiskQueue *candidates = queueOfLesserTime(workingQueue, seekTime); if (candidates->size == 0) { while (seekTime < peek(workingQueue).time) { seekTime++; } continue; } sortQueueByPosition(candidates); DiskRequest request = dequeue(candidates); if (request.position < position) { // Go to end of disk and back to 0 seekTime += timeToProcessRequest(position, 9999); seekTime += timeToProcessRequest(9999, 0); movement += abs(position - 9999); movement += abs(9999 - 0); position = 0; } seekTime += timeToProcessRequest(position, request.position); movement += abs(position - request.position); position = request.position; delete(workingQueue, request); destroyDiskQueue(candidates); } destroyDiskQueue(workingQueue); } int main(int argc, char **argv) { int position, time; char algorithm = argv[1][0]; int start = 0; queue = createDiskQueue(); while (EOF != (scanf("%i %i\n", &position, &time))) { enqueue(queue, diskRequest(position, time)); // printf("Delete me: position %i, Delete me: time %i\n", position, time); } if (algorithm == 'F') { fcfs(start); printf("Movement:%i Time:%.1lf\n", movement, seekTime); } else if (algorithm == 'C') { cscan(start); // Stupid printf difference to pass tests, could call once after if statement printf("Movement: %i Time:%.1lf\n", movement, seekTime); } destroyDiskQueue(queue); return 0; }