Question: Convert this code from Java to C. Thank you! //Main.java import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Main
Convert this code from Java to C. Thank you!
//Main.java
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList;
public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws FileNotFoundException, IOException { File file = null; if (0 < args.length) { file = new File(args[0]); } FileReader fileReader = new FileReader(file); BufferedReader bufferReader = new BufferedReader(fileReader); ArrayList processArray = new ArrayList(); String line; while((line = bufferReader.readLine()) !=null) { String[] lines = line.trim().split(" "); Process temp = new Process(Double.parseDouble(lines[0]), Double.parseDouble(lines[1]), 0,0,0); processArray.add(temp); } ArrayList processArray1 = new ArrayList(processArray); SJF shortest = new SJF(processArray); shortest.CalculateSJF(); // SRTF shortestRemain = new SRTF(processArray1); shortestRemain.CalculateSRTF(); } private static class SJF { private ArrayList processArray; private ArrayList tempArray = new ArrayList(); private double turnAround; private double wait; private double response; public SJF(ArrayList processArray) { this.processArray = processArray; } public void CalculateSJF() { int shortestTimeIndex = 0; double startTime = processArray.get(0).getSubmit(); double nextTime = 0; System.out.println("Shortest Job First"); int size = processArray.size(); ArrayList remainingArray = new ArrayList(processArray); for(int i = 0; i < size; i++) { shortestTimeIndex = shortestCheck(startTime, remainingArray, shortestTimeIndex); double turnAroundTemp; double waitTemp; double responseTemp; double duration = processArray.get(shortestTimeIndex).getDuration(); double submit = processArray.get(shortestTimeIndex).getSubmit(); if(i == 0) { nextTime = duration + submit; } else if(i < size -1) { if(nextTime < processArray.get(1).getSubmit() && (nextTime + duration) < processArray.get(1).getSubmit()) { nextTime = processArray.get(1).getSubmit(); } else { nextTime = nextTime + duration; } } else { nextTime = startTime + duration; } turnAroundTemp = startTime - submit + duration; waitTemp = startTime - submit; responseTemp = waitTemp; turnAround += turnAroundTemp; wait += waitTemp; response += responseTemp; startTime = nextTime; remainingArray.remove(shortestTimeIndex); processArray.remove(shortestTimeIndex); } System.out.println("Avg. Resp: " + String.format("%.2f" ,response/size) + " Avg. T.A: " + String.format("%.2f" ,turnAround/size) + " Avg. Wait: " + String.format("%.2f" ,wait/size)); } private int shortestCheck(double currentTime, ArrayList remainingArray, int shortest) { shortest = 0; int size = remainingArray.size(); int i = 0; for(i = 0; i < size; i++) { if(remainingArray.get(i).getSubmit() > currentTime) { break; } if(remainingArray.get(shortest).getDuration() > remainingArray.get(i).getDuration()) { shortest = i; } } return shortest; } } private static class SRTF { private ArrayList processArray; private ArrayList readyQueue = new ArrayList(); private double turnAround; private double wait; private double response; private double currentTime; private int shortestTimeIndex; private boolean addReady = false; private boolean done = false; private boolean gap = false; public SRTF(ArrayList processArray) { this.processArray = processArray; } public void CalculateSRTF() { shortestTimeIndex = 0; double startTime = 0; if(processArray.get(0).getSubmit() != 0) { startTime = processArray.get(0).getSubmit(); processArray.get(0).setStart(startTime); addReady = true; } currentTime = processArray.get(0).getSubmit(); double nextTime = 0; System.out.println("Shortest Time Remaining First"); int size = processArray.size(); ArrayList remainingArray = new ArrayList(processArray); int shortestRemanIndex = 0; double turnAroundTemp = 0; double waitTemp = 0; double responseTemp = 0; double duration = 0; double submit = 0; int i = 0; while(!processArray.isEmpty()) { int sizeReady = readyQueue.size(); int tempCount = 0; while(startTime >= processArray.get(tempCount).getSubmit()) { readyQueue.add(processArray.get(tempCount)); processArray.remove(tempCount); tempCount++; } shortestTimeIndex = shortestCheck(startTime, processArray, shortestTimeIndex, readyQueue); duration = readyQueue.get(shortestTimeIndex).getDuration(); submit = readyQueue.get(shortestTimeIndex).getSubmit(); if(readyQueue.get(shortestTimeIndex).getFirst() == 0) { readyQueue.get(shortestTimeIndex).setFirst(currentTime); } if(startTime + readyQueue.get(shortestTimeIndex).getRemaining() > processArray.get(0).getSubmit()) { addReady = true; gap = true; } if(addReady) { insertIntoReadyQueue(startTime); } if(gap) { gap = false; startTime = currentTime; } else { if(i == 0) { nextTime = readyQueue.get(shortestTimeIndex).getRemaining() + submit + (currentTime - readyQueue.get(shortestTimeIndex).getSubmit()); readyQueue.get(shortestTimeIndex).setEnd(nextTime); } else if(i < size -1) { if(nextTime < processArray.get(0).getSubmit() && (nextTime + duration) < processArray.get(0).getSubmit()) { nextTime = processArray.get(0).getSubmit(); readyQueue.get(shortestTimeIndex).setEnd(duration + submit); } else { nextTime = nextTime + duration; readyQueue.get(shortestTimeIndex).setEnd(duration + submit); } } else { nextTime = startTime + duration; readyQueue.get(shortestTimeIndex).setEnd(duration + submit); } waitTemp = currentTime - readyQueue.get(shortestTimeIndex).getSubmit() -(readyQueue.get(shortestTimeIndex).getDuration()- readyQueue.get(shortestTimeIndex).getRemaining()); turnAroundTemp = readyQueue.get(shortestTimeIndex).getDuration() + waitTemp; responseTemp = readyQueue.get(shortestTimeIndex).getFirst() - readyQueue.get(shortestTimeIndex).getSubmit(); turnAround += turnAroundTemp; wait += waitTemp; response += responseTemp; startTime = nextTime; currentTime = nextTime; if(!readyQueue.isEmpty()) { remainingArray.remove(shortestTimeIndex); readyQueue.remove(shortestTimeIndex); } else { i++; } if(nextTime < processArray.get(0).getSubmit() && readyQueue.isEmpty()) { nextTime = processArray.get(0).getSubmit(); readyQueue.add(processArray.get(0)); processArray.remove(0); startTime = nextTime; currentTime = nextTime; } } } if(processArray.isEmpty()) { while(!readyQueue.isEmpty()) { shortestTimeIndex = shortestCheck(startTime, processArray, shortestTimeIndex, readyQueue); duration = readyQueue.get(shortestTimeIndex).getDuration(); submit = readyQueue.get(shortestTimeIndex).getSubmit(); if(readyQueue.get(shortestTimeIndex).getFirst() == 0) { readyQueue.get(shortestTimeIndex).setFirst(currentTime); } nextTime = readyQueue.get(shortestTimeIndex).getRemaining() + submit + (currentTime - readyQueue.get(shortestTimeIndex).getSubmit()); readyQueue.get(shortestTimeIndex).setEnd(nextTime); waitTemp = currentTime - readyQueue.get(shortestTimeIndex).getSubmit() -(readyQueue.get(shortestTimeIndex).getDuration()- readyQueue.get(shortestTimeIndex).getRemaining()); turnAroundTemp = readyQueue.get(shortestTimeIndex).getDuration() + waitTemp; responseTemp = readyQueue.get(shortestTimeIndex).getFirst() - readyQueue.get(shortestTimeIndex).getSubmit(); turnAround += turnAroundTemp; wait += waitTemp; response += responseTemp; startTime = nextTime; currentTime = nextTime; if(!readyQueue.isEmpty()) { remainingArray.remove(shortestTimeIndex); readyQueue.remove(shortestTimeIndex); } } } System.out.println("Avg. Response: " + String.format("%.2f" ,response/size) + " Avg. T.A: " + String.format("%.2f" ,turnAround/size) + " Avg. Wait: " + String.format("%.2f" ,wait/size)); } private void insertIntoReadyQueue(double startTime) { for(int tempReadyCount = 0; tempReadyCount < processArray.size(); tempReadyCount++) { if(startTime + readyQueue.get(shortestTimeIndex).getRemaining() > processArray.get(tempReadyCount).getSubmit()) { readyQueue.add(processArray.get(tempReadyCount)); if((readyQueue.get(shortestTimeIndex).getRemaining() + startTime) > processArray.get(tempReadyCount).getRemaining()) { currentTime = processArray.get(tempReadyCount).getSubmit(); readyQueue.get(shortestTimeIndex).setRemaining(readyQueue.get(shortestTimeIndex).getRemaining() - (currentTime-startTime)); shortestTimeIndex = shortestCheck(currentTime, processArray, shortestTimeIndex, readyQueue); readyQueue.get(shortestTimeIndex).setStart(currentTime); gap = true; } processArray.remove(tempReadyCount); } else { addReady = false; break; } } } private int shortestCheck(double currentTime1, ArrayList remainingArray, int shortest, ArrayList readyQ) { shortest = 0; int size = readyQ.size(); int i = 0; for(i = 0; i < size; i++) { if(readyQ.get(shortest).getRemaining() > readyQ.get(i).getRemaining()) { shortest = i; } } return shortest; } } private static class Process { private double submitTime1 = 0; private double durationTime = 0; private double startTime = 0; private double endTime = 0; private double remainingTime = 0; private double firstRun = 0; public Process(double submit, double duration, double start, double end, double remaining) { this.submitTime1 = submit; this.durationTime = duration; this.startTime = start; this.endTime = end; this.remainingTime = duration; } public double getSubmit() { return this.submitTime1; } public double getDuration() { return this.durationTime; } public double getStart() { return this.startTime; } public double getEnd() { return this.endTime; } public double getRemaining() { return this.remainingTime; } public void setRemaining(double remainingTime) { this.remainingTime = remainingTime; } public void setEnd(double endTime) { this.endTime = endTime; } public void setStart(double startTime) { this.startTime = startTime; } public void setFirst(double firstRun) { this.firstRun = firstRun; } public double getFirst() { return this.firstRun; } } }