Initial implementation with bugs
This commit is contained in:
		
							
								
								
									
										171
									
								
								Assignment8/code/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								Assignment8/code/main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | // Data structures and helper functions | ||||||
|  | typedef struct DiskRequest { | ||||||
|  | 	int position; | ||||||
|  | 	int time; | ||||||
|  | } DiskRequest; | ||||||
|  |  | ||||||
|  | typedef struct DiskQueue { | ||||||
|  | 	DiskRequest *requests; | ||||||
|  | 	int index; | ||||||
|  | 	int size; | ||||||
|  | } DiskQueue; | ||||||
|  |  | ||||||
|  | DiskQueue *createDiskQueue() { | ||||||
|  | 	DiskQueue *queue = malloc(sizeof(DiskQueue)); | ||||||
|  | 	if (queue == NULL) { | ||||||
|  | 		printf("Error allocating memory for queue\n"); | ||||||
|  | 		exit(EXIT_FAILURE); | ||||||
|  | 	} | ||||||
|  | 	queue->requests = malloc(sizeof(DiskRequest)); | ||||||
|  | 	if (queue->requests == NULL) { | ||||||
|  | 		printf("Error allocating memory for queue requests\n"); | ||||||
|  | 		exit(EXIT_FAILURE); | ||||||
|  | 	} | ||||||
|  | 	queue->index = 0; | ||||||
|  | 	queue->size = 0; | ||||||
|  | 	return queue; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | DiskRequest diskRequest(int position, int time) { | ||||||
|  | 	DiskRequest request; | ||||||
|  | 	request.position = position; | ||||||
|  | 	request.time = time; | ||||||
|  | 	return request; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void enqueue(DiskQueue *queue, DiskRequest request) { | ||||||
|  | 	queue->requests = realloc(queue->requests, sizeof(DiskRequest) * (queue->size + 1)); | ||||||
|  | 	queue->requests[queue->size] = request; | ||||||
|  | 	queue->size++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | DiskRequest dequeue(DiskQueue *queue) { | ||||||
|  | 	DiskRequest request = queue->requests[queue->index]; | ||||||
|  | 	queue->index++; | ||||||
|  | 	return request; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Allocates a new queue with the requests that have the same time | ||||||
|  | DiskQueue* queueOfSameTime(DiskQueue *queue, int time) { | ||||||
|  | 	DiskQueue *sameTimeQueue = createDiskQueue(); | ||||||
|  | 	for (int i = queue->index; i < queue->size - queue->index; i++) { | ||||||
|  | 		if (queue->requests[i].time == time) { | ||||||
|  | 			enqueue(sameTimeQueue, queue->requests[i]); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return sameTimeQueue; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Compare function for disk requests by position | ||||||
|  | int compareDiskRequestsByPosition(const void *a, const void *b) { | ||||||
|  | 	DiskRequest *requestA = (DiskRequest *) a; | ||||||
|  | 	DiskRequest *requestB = (DiskRequest *) b; | ||||||
|  | 	return requestA->position - requestB->position; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Sorts the queue by position, in place | ||||||
|  | DiskQueue* sortQueueByPosition(DiskQueue* queue) { | ||||||
|  | 	qsort(queue->requests, queue->size, sizeof(DiskRequest), compareDiskRequestsByPosition); | ||||||
|  | 	return queue; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void destroyDiskQueue(DiskQueue *queue) { | ||||||
|  | 	free(queue->requests); | ||||||
|  | 	free(queue); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | typedef enum DiskDirection { | ||||||
|  | 	UP, DOWN | ||||||
|  | } DiskDirection; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // 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; | ||||||
|  | 	int distance = position - destination; | ||||||
|  | 	DiskDirection direction = distance > 0 ? UP : DOWN; | ||||||
|  | 	time += abs(distance) / 5; | ||||||
|  | 	if (currentDirection != direction) { | ||||||
|  | 		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; | ||||||
|  | 	for (int i = 0; i < queue->size; i++) { | ||||||
|  | 		DiskRequest request = dequeue(queue); | ||||||
|  | 		seekTime += timeToProcessRequest(position, request.position); | ||||||
|  | 		movement += abs(position - request.position); | ||||||
|  | 		position = request.position; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void cscan(int start) { | ||||||
|  | 	int currentTime = 0; | ||||||
|  | 	int position = start; | ||||||
|  | 	for (int i = 0; i < queue->size; i++) { | ||||||
|  | 		DiskRequest request = dequeue(queue); | ||||||
|  | 		while (currentTime < request.time) { currentTime++; } | ||||||
|  |  | ||||||
|  | 		DiskQueue *sameTimeQueue = sortQueueByPosition(queueOfSameTime(queue, request.time)); | ||||||
|  | 		for (;i < sameTimeQueue->size; i++) { | ||||||
|  | 			DiskRequest request = dequeue(sameTimeQueue); | ||||||
|  |  | ||||||
|  | 			// Need to return to 0 because we have reached the end of the disk on the current pass | ||||||
|  | 			if (request.position < position) { | ||||||
|  | 				seekTime += timeToProcessRequest(position, 9999); | ||||||
|  | 				movement += abs(position - 9999); | ||||||
|  | 				position = 9999; | ||||||
|  | 				seekTime += timeToProcessRequest(position, 0); | ||||||
|  | 				movement += abs(position - 0); | ||||||
|  | 				position = 0; | ||||||
|  | 			} | ||||||
|  | 			seekTime += timeToProcessRequest(position, request.position); | ||||||
|  | 			movement += abs(position - request.position); | ||||||
|  | 			position = request.position; | ||||||
|  | 		} | ||||||
|  | 		//destroyDiskQueue(sameTimeQueue); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 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); | ||||||
|  | 	} else if (algorithm == 'C') { | ||||||
|  | 		cscan(start); | ||||||
|  | 	} | ||||||
|  | 	printf("Movement: %i Time:%.1lf\n", movement, seekTime); | ||||||
|  |  | ||||||
|  | 	destroyDiskQueue(queue); | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
| @@ -1,34 +0,0 @@ | |||||||
| #include <stdio.h> |  | ||||||
| char currentDirection; |  | ||||||
|  |  | ||||||
| void fcfs(int start){ |  | ||||||
|     int movement = 0; |  | ||||||
|     double time = 0; |  | ||||||
|     printf("Movement: %i Time:%.1lf\n", movement, time); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void cscan(int start){ |  | ||||||
|     int movement = 0; |  | ||||||
|     double time = 0; |  | ||||||
|     printf("Movement: %i Time:%.1lf\n", movement, time); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main (int argc, char** argv){ |  | ||||||
|     int position, time; |  | ||||||
|     char algorithm = argv[1][0]; |  | ||||||
|     int start = 0; |  | ||||||
|     currentDirection  = 'a'; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     while ( EOF!=(scanf("%i %i\n",&position,&time))) |  | ||||||
|     { |  | ||||||
|         printf("Delete me: position %i, Delete me: time %i\n",position,time); |  | ||||||
|     } |  | ||||||
|     if (algorithm == 'F'){ |  | ||||||
|         fcfs(start); |  | ||||||
|     }else if ( algorithm == 'C'){ |  | ||||||
|         cscan(start); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user