OneCompiler

os18

101

Q1)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_BLOCKS 1000
#define MAX_FILES 100

typedef struct {
int allocated;
int blocks[MAX_BLOCKS];
} IndexEntry;

void show_bit_vector(IndexEntry index[], int n);
void create_new_file(IndexEntry index[], int n);
void show_directory(IndexEntry index[], int n);
void delete_file(IndexEntry index[], int n);

int main() {
int n;
IndexEntry index[MAX_FILES];

printf("Enter the number of blocks on the disk: ");
scanf("%d", &n);

// Initialize index entries
srand(time(NULL));
for (int i = 0; i < MAX_FILES; i++) {
    index[i].allocated = 0;
    for (int j = 0; j < MAX_BLOCKS; j++) {
        index[i].blocks[j] = 0;
    }
}

char choice;
do {
    printf("\nMenu:\n");
    printf("1. Show Bit Vector\n");
    printf("2. Create New File\n");
    printf("3. Show Directory\n");
    printf("4. Delete File\n");
    printf("5. Exit\n");
    printf("Enter your choice: ");
    scanf(" %c", &choice);

    switch (choice) {
        case '1':
            show_bit_vector(index, n);
            break;
        case '2':
            create_new_file(index, n);
            break;
        case '3':
            show_directory(index, n);
            break;
        case '4':
            delete_file(index, n);
            break;
        case '5':
            printf("Exiting...\n");
            break;
        default:
            printf("Invalid choice! Please try again.\n");
    }
} while (choice != '5');

return 0;

}

void show_bit_vector(IndexEntry index[], int n) {
printf("Bit Vector:\n");
for (int i = 0; i < MAX_FILES; i++) {
printf("%d ", index[i].allocated);
}
printf("\n");
}

void create_new_file(IndexEntry index[], int n) {
int file_num;
printf("Enter the file number to create (0-99): ");
scanf("%d", &file_num);

if (file_num < 0 || file_num >= MAX_FILES) {
    printf("Invalid file number!\n");
    return;
}

if (index[file_num].allocated) {
    printf("File%d already exists.\n", file_num);
    return;
}

index[file_num].allocated = 1;
printf("File%d created successfully.\n", file_num);

}

void show_directory(IndexEntry index[], int n) {
printf("Directory:\n");
printf("File Name\tBlock Numbers\n");
for (int i = 0; i < MAX_FILES; i++) {
if (index[i].allocated) {
printf("File%d\t\t", i);
for (int j = 0; j < n; j++) {
if (index[i].blocks[j] == 1) {
printf("%d ", j);
}
}
printf("\n");
}
}
}

void delete_file(IndexEntry index[], int n) {
int file_num;
printf("Enter the file number to delete: ");
scanf("%d", &file_num);

if (file_num < 0 || file_num >= MAX_FILES) {
    printf("Invalid file number!\n");
    return;
}

if (index[file_num].allocated == 0) {
    printf("File%d does not exist.\n", file_num);
    return;
}

index[file_num].allocated = 0;
for (int i = 0; i < n; i++) {
    index[file_num].blocks[i] = 0;
}
printf("File%d deleted successfully.\n", file_num);

}
Q2)
#include <stdio.h>
#include <stdlib.h>

void scan(int arr[], int n, int start, int direction);

int main() {
int n, start, direction;
printf("Enter the total number of disk blocks: ");
scanf("%d", &n);

int *requests = (int *)malloc(n * sizeof(int));
printf("Enter the disk request string:\n");
for (int i = 0; i < n; i++) {
    scanf("%d", &requests[i]);
}

printf("Enter the starting head position: ");
scanf("%d", &start);
printf("Enter the direction (1 for Right, -1 for Left): ");
scanf("%d", &direction);

scan(requests, n, start, direction);

free(requests);
return 0;

}

void scan(int arr[], int n, int start, int direction) {
int total_head_movements = 0;
int *visited = (int *)calloc(n, sizeof(int));

printf("List of requests in order of service:\n");

int cur = start;
while (1) {
    int min_diff = -1;
    int next_index = -1;

    for (int i = 0; i < n; i++) {
        if (!visited[i]) {
            if (arr[i] >= 0 && arr[i] <= n - 1) {
                int diff = abs(cur - arr[i]);
                if (min_diff == -1 || diff < min_diff) {
                    min_diff = diff;
                    next_index = i;
                }
            }
        }
    }

    if (next_index == -1) {
        if (direction == 1) {
            printf("%d -> ", n - 1);
            total_head_movements += n - 1 - cur;
            cur = n - 1;
        } else if (direction == -1) {
            printf("%d -> ", 0);
            total_head_movements += cur;
            cur = 0;
        }
        break;
    }

    printf("%d -> ", arr[next_index]);
    total_head_movements += abs(cur - arr[next_index]);
    visited[next_index] = 1;
    cur = arr[next_index];
}

printf("\nTotal number of head movements: %d\n", total_head_movements);
free(visited);

}