2012-04-22 58 views
1

这是hwk链接提示以帮助解决任何问题。阅读下面看我的问题。这只是信息来了解我的问题是什么入队和出队程序运行只是不知道为什么输出不匹配

http://penguin.ewu.edu/cscd300/Spring_12/Assignments/prog2.html

使用队列和栈,在就业形式而言,我得到安宁家庭作业,基本上需要一个输入文件,并写入命令的参数来计算运行时间。即时通讯给出下面看到的输入文件:

Media Player 
100 
Angry Birds 
140 

我们然后键入在jgrasp参数如“jobs.txt 50 1”,这意味着文本文件,时间片,和等待时间。 (见上面的链接) 这里是上面显示基于样品输入程序执行的一个示例:

C:\classes\cscd300\queues>java QueueSimulation jobs.txt 50 1 

Time Slice: 50 
Latency: 1 

Adding Jobs to Queue 
-------------------- 
Media Player, 100 milliseconds to execute 
Angry Birds, 140 milliseconds to execute 

Begin Job Processing 
-------------------- 
Executing Media Player, 100 milliseconds remaining 
Executing Angry Birds, 140 milliseconds remaining 
Executing Media Player, 50 milliseconds remaining 
*Media Player finished, total time to execute was 153 milliseconds 
Executing Angry Birds, 90 milliseconds remaining 
*Angry Birds finished, total time to execute was 244 milliseconds 

所有作业完成!

这里是我的代码:(这里是一个工作类,一个测试人员,和一个linkedqueue类,我用它来创建我自己的类enqueue和dequeue(部分hwk,我没有包含它,因为那很多代码,只知道,入队和出队的方法),我的问题是在测试仪:

public class Job { 
    String jobName; 
    int runTime; 
    int remainTime; 
    int startTime; 

//constructures 
    public Job() { 
    jobName = ""; 
    runTime = 0; 
    remainTime = 0; 
    startTime = 0; 
    } 

    public Job(String _jobName, int _runTime) { 
    jobName = _jobName; 
    runTime = _runTime; 
    remainTime = _runTime; 
    startTime = 0; 
    } 
} 


public class QueueTester { 
    public static void main(String[] args) { 
     linkedQueue waitQ = new linkedQueue(); 
     linkedQueue runQ = new linkedQueue(); 
     String fileName = "no_fileName"; 
     int slice = 0, timeSW=0; 
     if (args.length !=3) 
     throw new IllegalStateException("No command line arguments...\n"); 
     fileName = args[0]; 
     slice = Integer.parseInt(args[1]); 
     timeSW = Integer.parseInt(args[2]); 
     System.out.println("\nTime Slice: " + slice); 
     System.out.println("\nLatency: " +timeSW + "\n"); 
     Job job = null; 
     try { 
      FileInputStream fstream = new FileInputStream(fileName); 
      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 
      System.out.println("adding jobs to queue"); 
      System.out.println("--------------------"); 
      boolean first = true; 
      while ((strLine = br.readLine()) != null) { 
       if (job == null) 
        job = new Job("", 0); 

       strLine = strLine.trim(); 
       if (strLine.startsWith("#")) continue; 
       if (strLine.length() == 0) continue; 

       if (first) { 
        job.jobName = strLine; 
        first = false; 
       } else { 
        job.runTime = Integer.parseInt(strLine); 
        job.remainTime = job.runTime; 
        job.startTime = 0; 
        System.out.println(job.jobName + ", " + job.runTime + "milliseconds to excecute."); 
        waitQ.enqueue(job); //enqueue 
        job = null; 
        first = true; 
       } 

      } 
      in.close(); //close the input stream 
     } 
     catch (Exception e) { 
      System.err.println("Error: " + e.getMessage()); 
     } 
     Job waitJob; 
     System.out.println("\nBegin Job Processing"); 
     System.out.println("---------------------"); 
     boolean done = false; 
     int elapsed = 0; 
     while (!done) { 
      while(!waitQ.isEmpty()) { 
       waitJob = (Job)waitQ.dequeue();//dequeue 
       runQ.enqueue(waitJob); //enqueue 
      } 

      Job runJob; 
      while (!runQ.isEmpty()) { 
       runJob = (Job)(runQ.dequeue()); 
       System.out.println("excecuting [" +runJob.jobName + "] " + runJob.remainTime + "milliseconds remaining"); 
       if (slice < runJob.remainTime) { 
        runJob.remainTime -= slice; 
        if (runQ.isEmpty() && waitQ.isEmpty()) 
         elapsed += slice; 
        else 
         elapsed += (slice + timeSW); 

        waitQ.enqueue(runJob); 
       }else { 
        int num = runJob.runTime + timeSW + runJob.remainTime; 
        System.out.println("*" + runJob.jobName + ", total time to execute was " +num+ "milliseconds"); 

        } 
       } 
      } 
    } 
} 

我的程序工作,但我下面的输出结果我的问题是,为什么它输出错误如果你能帮助我吗?对我的测试仪类进行更正,以使输出匹配,这将是可怕的。只是帮助我找到我的错误或我需要补充的谢谢:) *

Begin Job Processing 
--------------------- 
excecuting [Media Player] 100milliseconds remaining 
excecuting [Angry Birds] 140milliseconds remaining 
excecuting [Media Player] 50milliseconds remaining 
*Media Player, total time to execute was 151milliseconds 
excecuting [Angry Birds] 90milliseconds remaining 
excecuting [Angry Birds] 40milliseconds remaining 
*Angry Birds, total time to execute was 181milliseconds 

回答

1

如果您查看一次获得的代码,您会注意到您从不更新作业的运行时。在从作业剩余时间中减去时间片之后,还应该更新执行的时间作业。

“愤怒的小鸟”跑了50毫秒(剩余时间为90毫秒),但是一旦您将该作业排入队伍,您就会丢失该信息。

编辑:如果你基本上想让我给你答案。以下是您需要添加的缺失位。

runJob.runtime += slice 

(另外您也可以选择renitialize经过每个作业为0,并改变'runJob.runtime + =经过,因为过去已经包括了等待时间)再次排队作业之前。

+0

嗯那种有道理......那么最好的解决方案是什么? – anthony 2012-04-22 23:40:16

+0

最佳解决方案?你在你的代码中缺少一些东西。在将其添加回队列之前,只需在运行时添加50毫秒的作业时间即可。 – 2012-04-23 01:22:56

+0

@anthony:答案有问题吗? – 2012-04-23 19:22:12

相关问题