基本需求如下:
1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情要做,但每人每次只允许做一件,并且从第一件开始做.2.等到丁做完一件事后,休息1分钟,然后又从甲开始做剩下的事情,以此循环,直到四人都做完自己的所有事情.以上为基本要求,附加扩展需求如下:
1.如果一件事做失败了,则记录它的做事者,以及失败原因,失败时间等,再输入到c:/note.txt,然后再跳过该件事,其它人继续进行.2.当四人完成所有事情后,记录每人完成事情的所需的总时间以及成功率(或失败率),最好能用图表显示统计.我想方法可能不少,但效率可能有别,此算法看似简单,但要运用的知识点却不少,线程,异常处理,循环应用,文件操作等等,
对一般人练练手应该还是有意义的啦.大家有兴趣也来露两手如何?附加要求可以不考虑.本人的就不贴上去献丑了,呵最后说下,本人认为该需求用于面试也不错,如果有人能在30分钟内完成,水平应该是相当不错的(使用时间越少,正确率越高,相对来说被面试者水平越高)
当然如果你认为是这是作业题或太简单了而不屑一顾的话,那你可以绕路了(此处已难以展现你才能了,人各有志吧,水平不同当然目标不同了,可以理解的,呵.)

解决方案 »

  1.   

    这样可不可以
    public class FTest{
    public static void main(String[] args) {
    Logger log=new Logger();
    People a=new People("甲", log);
    People b=new People("乙", log);
    People c=new People("丙", log);
    People d=new People("丁", log);
    for(int i=0;i<10;i++){
    a.doMatter();
    System.out.println("----pause-----1min----");
    b.doMatter();
    System.out.println("----pause-----1min----");
    c.doMatter();
    System.out.println("----pause-----1min----");
    d.doMatter();
    System.out.println("----pause-----1min----");
    }
    log.addTime(-1);
    System.out.println(log);
    }
    }
    class People{
    private String name;
    private int count;
    private Logger log;
    public People(String name,Logger log){
    this.name=name;
    this.log=log;
    }
    public void doMatter(){
    System.out.println(name+"doing No."+(count+1));
    int cost=(int)(Math.random()*5+1);
    System.out.println("takes "+cost+" mins");
    log.addTime(cost);
    if(Math.random()>0.7){
    log.addError();
    System.out.println("fail!!");
    }else{
    System.out.println("success!!!");
    }
    log.addTime(1);
    count++;
    }
    }
    class Logger{
    private int time;
    private int error;
    public void addTime(int time){
    this.time+=time;
    }
    public void addError(){
    error++;
    }
    public String toString() {
    return "times:"+time+","+"errors:"+error;
    }

    }
      

  2.   

    结果大概是这样的甲doing No.1
    takes 5 mins
    success!!!
    ----pause-----1min----
    乙doing No.1
    takes 2 mins
    fail!!
    ----pause-----1min----
    丙doing No.1
    takes 2 mins
    success!!!
    ----pause-----1min----
    丁doing No.1
    takes 3 mins
    fail!!
    ----pause-----1min----
    甲doing No.2
    takes 3 mins
    success!!!
    ----pause-----1min----
    乙doing No.2
    takes 4 mins
    success!!!
    ----pause-----1min----
    丙doing No.2
    takes 5 mins
    success!!!
    ----pause-----1min----
    丁doing No.2
    takes 2 mins
    fail!!
    ----pause-----1min----
    甲doing No.3
    takes 2 mins
    success!!!
    ----pause-----1min----
    乙doing No.3
    takes 1 mins
    fail!!
    ----pause-----1min----
    丙doing No.3
    takes 5 mins
    success!!!
    ----pause-----1min----
    丁doing No.3
    takes 2 mins
    fail!!
    ----pause-----1min----
    甲doing No.4
    takes 5 mins
    fail!!
    ----pause-----1min----
    乙doing No.4
    takes 5 mins
    fail!!
    ----pause-----1min----
    丙doing No.4
    takes 2 mins
    success!!!
    ----pause-----1min----
    丁doing No.4
    takes 1 mins
    fail!!
    ----pause-----1min----
    甲doing No.5
    takes 4 mins
    success!!!
    ----pause-----1min----
    乙doing No.5
    takes 5 mins
    fail!!
    ----pause-----1min----
    丙doing No.5
    takes 1 mins
    success!!!
    ----pause-----1min----
    丁doing No.5
    takes 1 mins
    success!!!
    ----pause-----1min----
    甲doing No.6
    takes 4 mins
    fail!!
    ----pause-----1min----
    乙doing No.6
    takes 3 mins
    success!!!
    ----pause-----1min----
    丙doing No.6
    takes 4 mins
    success!!!
    ----pause-----1min----
    丁doing No.6
    takes 1 mins
    fail!!
    ----pause-----1min----
    甲doing No.7
    takes 4 mins
    success!!!
    ----pause-----1min----
    乙doing No.7
    takes 2 mins
    success!!!
    ----pause-----1min----
    丙doing No.7
    takes 2 mins
    success!!!
    ----pause-----1min----
    丁doing No.7
    takes 1 mins
    success!!!
    ----pause-----1min----
    甲doing No.8
    takes 5 mins
    success!!!
    ----pause-----1min----
    乙doing No.8
    takes 5 mins
    fail!!
    ----pause-----1min----
    丙doing No.8
    takes 1 mins
    success!!!
    ----pause-----1min----
    丁doing No.8
    takes 4 mins
    success!!!
    ----pause-----1min----
    甲doing No.9
    takes 1 mins
    success!!!
    ----pause-----1min----
    乙doing No.9
    takes 1 mins
    success!!!
    ----pause-----1min----
    丙doing No.9
    takes 5 mins
    success!!!
    ----pause-----1min----
    丁doing No.9
    takes 5 mins
    success!!!
    ----pause-----1min----
    甲doing No.10
    takes 5 mins
    success!!!
    ----pause-----1min----
    乙doing No.10
    takes 4 mins
    success!!!
    ----pause-----1min----
    丙doing No.10
    takes 3 mins
    fail!!
    ----pause-----1min----
    丁doing No.10
    takes 3 mins
    success!!!
    ----pause-----1min----
    times:162,errors:13
      

  3.   

    图表我就会用jfreechart 不过就这个问题好像没啥大的意义
      

  4.   

    设四个变量分别表示四个人完成的情况,然后再用wait(),notify(),应该可以啊
      

  5.   

    这种些些小问题,楼主不是有些夸大吧?什么应聘之类的都扯上了,我虽然还没有毕业(不过都大四了),但是我看了下,找工作也不是那么容易的嘛!你这个问题其实没那么复杂,就是几个简单的语句在那里重用几下就行了,思路很简单的!我模拟了一个事件,假如是随机比较大小这样一件事!import java.util.Random;
    public class A{public static void delays(int t){
    int i=0;
    for(i=0;i<t;i++);
    //当然这里可以是线程的,由老板嘛!
    }public static void main(String args[]) {
     int i,j,k=0; 
     
     Random rand = new Random();
     
    people peoples[]=new people[4];//找到这样四个数据库
     //下面这几句是给这 分配任务
     for(i=0;i<4;i++){
     peoples[i]=new people();
       for(j=0;j<10;j++){
          peoples[i].event_rand[j]=rand.nextInt(50)+30;
          peoples[i].state[j]=0;  
          
       }
       peoples[i].f[i]=0;
     }
     //现在是执行任务
    int key=0,lock=0; while(true){
        key=0;
        for(i=0;i<4;i++){
          for(j=0;j<10;j++){
            if(peoples[i].state[j]==0){
              key=1;
              //具体任务是随机单挑,遇到比其大的数,算任务失败
              if(peoples[i].event_rand[j]<rand.nextInt(80)){//这个SB本次任务执行不成功,给他记过一次
                  peoples[i].f[i]++;
                  //这里还可以记录更多的信息哦,比如具体件事
                  continue;
              }else {
                  peoples[i].state[j]=1;   // 这个SB本次任务执行成功  ,打个标记怕忘记了
                  continue;
              }
            }
          }
         
        }//for1
        if(key==0)break;
        if(lock>32700)break;
        else lock++;
        A dlay=new A();
        dlay.delays(30000);//大家都累了休息分钟算了!^^
        
    }//end while 
    ///下边是任务搞完了,善后工作
      if(key==0){
          System.out.println("很好,这几个SB最终完成了任务");
          for(i=0;i<4;i++)     
          System.out.println("第"+(i+1)+"位失败了"+peoples[i].f[i]+"次");
      }
      else 
      System.out.println("不是任务难,是SB没用!");}//end main
    }//end classclass people{
      int  event_rand[]=new int[10];
      int  state[]=new int[10];
      int  f[]=new int[4];
    }
      

  6.   

    那个注食写错了点应该是:“people peoples[]=new people[4];//找到这样四个SB
    //下面这几句是给这几个SB 分配任务 
    ”呵呵
      

  7.   

    不要用线程 ,这样搭这个程序的框架
    甲乙丙丁各自实现比如Human这个接口,然后在这个接口实现一个特定的方法,比如dowork(),然后在甲乙丙丁中有个doneNum之类的变量表示做完的事情,十件事,也就是1-10这10个值表示,没有做事,就是0然后有个控制类Control,这个类里有甲乙丙丁这四个实现了接口的类,这个control类中有一个doWork()类似的方法,里面主要是循环10次
    for(int i =0; i < 10; i++)
    {
       甲.dowork();
        乙.dowork();
        丙.dowork();
       丁.dowork(); 
       休息一分钟的方法();
    }对于扩展要求也好解决。
    扩展要求1,每个类复杂自己的异常,报了异常就停止做事就好了,然后记录日志什么的
    2.记录时间什么的可以让这个control类来做,当然最好是交给别的辅助类来做
      

  8.   

    class People
    {
    public:
        People():m_pName(NULL),m_iDoThing(0){}
        People(char* pName,int iDoThing = 10)
        {
            m_pName = new char[strlen(pName)+1];
            strcpy(m_pName,pName);        m_iDoThing = iDoThing;
        }    ~People()
        {
            if (NULL !=  m_pName) 
            { 
                delete [] m_pName;
                m_pName = NULL;
            }
            m_iDoThing = 0;
        }    bool DoWork()
        {
            if (1 > m_iDoThing) 
            {
                return true;
            }        if (IsFailed()) 
            {
                // 打印错误日志,再写一个LOG类,写日志
                return false;
            }        --m_iDoThing;
            return true;
        }    bool IsFailed()
        {
            return true;
        }
    private:
        char* m_pName;
        int m_iDoThing;
    };后果循环调dowork 为真就清出循环,直到所有人被清掉为止,可以继续改善
      

  9.   

    这个问题用ABCD启动四个线程是一种方案.我想的另外一种方案是用三个线程来作.主线程来处理ABCD的任务.一个线程来作数据的统计.一个线程做timer.
    每个任务结束后将下次开始的时间queue进timer里,queue进timer的struct里应该包含timer,
    以及这是谁的任务等信息.
    .timer到时后会触发主线程来作某件事情.
    如果生成错误主线成会queue struct到数据统计线程里去.
    数据统计线程最保持错误数据的逻辑.
    最后结束任务的时候的数据统计也是交给数据统计线程来作.
      

  10.   

    之前那个实在写得太难看了,后来来了灵感,又弄了个简单的,既然你想看,那我只好现丑了啦,主要代码如下: /**
     * @param args
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException
    {
    String[] jobs = new String[40];//每人都要做十件事,四个人总共40件,就定义得40长度的数组吧
    int a = 0,b = 0,c = 0,d = 0;//分别为每人正在做第几件事
    int failA = 0,failB = 0,failC = 0,failD = 0;//记录每人做事失败的次数(统计用的)

    for (int i = 0; i < jobs.length; i++)
    {
        if (i % 4 == 0)
        {
         try
    {
         System.out.println("甲正在做的第 " + (++a) + " 件事成功了!");

         catch (Exception e)
    {
               System.out.println("甲正在做的第 " + (++a) + " 件事失败了!");
               failA++;
    }
        }
        else if (i % 4 == 1)
        {
         try
    {
         System.out.println("乙正在做的第 " + (++b) + " 件事成功了!");

         catch (Exception e)
    {
               System.out.println("乙正在做的第 " + (++b) + " 件事失败了!");
               failB++;
    }
        }
        else if (i % 4 == 2)
        {
         try
    {
         System.out.println("丙正在做的第 " + (++c) + " 件事成功了!");

         catch (Exception e)
    {
               System.out.println("丙正在做的第 " + (++c) + " 件事失败了!");
               failC++;
    }
        }
        else if (i % 4 == 3)
        {
         try
    {
         System.out.println("丁正在做的第 " + (++d) + " 件事成功了!");

         catch (Exception e)
    {
               System.out.println("丁正在做的第 " + (++d) + " 件事失败了!");
               failD++;
    }
        
         Thread.sleep(60000);//丁做完后,休息一分钟(我是用线程休眠来"休息"的)
        }
    }

    System.out.println("甲做事成功率:"+ (a - failA) / (0.01 * a));
    System.out.println("乙做事成功率:"+ (b - failB) / (0.01 * b));
    System.out.println("丙做事成功率:"+ (c - failC) / (0.01 * c));
    System.out.println("丁做事成功率:"+ (d - failD) / (0.01 * d)); }代码太简单了(这若都看不懂那也不会路过此地了啦,我就不多解释了),由于只是做些"简单的事"--打印工作,当然极少出现异常,即做事失败的情况,所以,这四个人成功率都是100%的.有时我们往往问题想得太复杂了,要是这个类那个类啊,想太多了,反而把简单问题复杂化了.本人觉得这个效率还行吧(自已鼓励下自己吧),当然楼上的各位方法也不错.
    这贴看来也该结了,那明天结吧
      

  11.   

    8楼的
    /////////////////
     甲doing No.1 
    takes 5 mins 
    success!!! 
    ----pause-----1min---- 
    乙doing No.1 
    takes 2 mins 
    fail!! 
    //////////////////
    怎么知道甲花5分钟,乙花两分钟哦?
       很希望帮忙回答下
      

  12.   

    呵呵 这个是随机产生的 时间在1-5分钟之间 取整 就是这段代码
    int cost=(int)(Math.random()*5+1);
      

  13.   

     /**
         * @param args
         * @throws InterruptedException 
         */
        public static void main(String[] args) throws InterruptedException
        {
            String[] jobs = new String[40];//每人都要做十件事,四个人总共40件,就定义得40长度的数组吧
            int a = 0,b = 0,c = 0,d = 0;//分别为每人正在做第几件事
            int failA = 0,failB = 0,failC = 0,failD = 0;//记录每人做事失败的次数(统计用的)
            
            for (int i = 0; i < jobs.length; i++)
            {
                if (i % 4 == 0)
                {
                    try
                    {
                        System.out.println("甲正在做的第 " + (++a) + " 件事成功了!");
                    } 
                    catch (Exception e)
                    {
                           System.out.println("甲正在做的第 " + (++a) + " 件事失败了!");
                           failA++;
                    }
                }
                else if (i % 4 == 1)
                {
                    try
                    {
                        System.out.println("乙正在做的第 " + (++b) + " 件事成功了!");
                    } 
                    catch (Exception e)
                    {
                           System.out.println("乙正在做的第 " + (++b) + " 件事失败了!");
                           failB++;
                    }
                }
                else if (i % 4 == 2)
                {
                    try
                    {
                        System.out.println("丙正在做的第 " + (++c) + " 件事成功了!");
                    } 
                    catch (Exception e)
                    {
                           System.out.println("丙正在做的第 " + (++c) + " 件事失败了!");
                           failC++;
                    }
                }
                else if (i % 4 == 3)
                {
                    try
                    {
                        System.out.println("丁正在做的第 " + (++d) + " 件事成功了!");
                    } 
                    catch (Exception e)
                    {
                           System.out.println("丁正在做的第 " + (++d) + " 件事失败了!");
                           failD++;
                    }
                    
                    Thread.sleep(60000);//丁做完后,休息一分钟(我是用线程休眠来"休息"的)
                }
            }
            
            System.out.println("甲做事成功率:"+ (a - failA) / (0.01 * a));
            System.out.println("乙做事成功率:"+ (b - failB) / (0.01 * b));
            System.out.println("丙做事成功率:"+ (c - failC) / (0.01 * c));
            System.out.println("丁做事成功率:"+ (d - failD) / (0.01 * d));    }我觉得这个想法很好,只是如果能够将判断是否成功的方法放在人做事的函数里就更好了
      

  14.   

    78 楼的snakegod应该仔细分析下那段乱码,只怕不是你所认为的那样,告诉你个秘密,continue这那里作怪,呵呵,一般人我不告诉他!
      

  15.   

    这段代码最大的问题在 “for (int i = 0; i < jobs.length; i++)”,你只让程序做四十件事,但是假如失败了,你得让程序再做,直到所有的做成功为止,你这是每件事只做一次,成功与否不管,反正统计就行了,但是到最后不一定所有事情都做完了。当然其它方面肯定也是有问题的,不过都是由于这个问题所引来的。
      

  16.   

    php,每一件事平均消耗时间为1-5分钟,默认成功率为75%<?php
    $record = array(
    'a'=>array('num'=>0,'total_time'=>0,'success'=>0),
    'b'=>array('num'=>0,'total_time'=>0,'success'=>0),
    'c'=>array('num'=>0,'total_time'=>0,'success'=>0),
    'd'=>array('num'=>0,'total_time'=>0,'success'=>0),
    'total_time'=>0
    );$record['a']['num'] = rand(5,15);
    $record['b']['num'] = rand(5,15);
    $record['c']['num'] = rand(5,15);
    $record['d']['num'] = rand(5,15);for($i=0;$i<15;$i++){
    for($j=0;$j<4;$j++){
    $people = substr('abcd',$j,1);
    if($i<$record[$people]['num']){
    _do($people,$record);
    if($i<$record[$people]['num']-1) $record['total_time'] += 4;
    }
    }
    }
    print("-----<br />");
    print("total cost {$record['total_time']} minutes.<br />");
    _print('a',$record);
    _print('b',$record);
    _print('c',$record);
    _print('d',$record);function _do($people,&$record){
    $cost_time = rand(1,5);
    $is_success = rand(0,3);
    print("user $people: cost $cost_time minute(s), ".($is_success>0?'success':'failure')."!<br />");
    $record['total_time'] += $cost_time;
    $record[$people]['total_time'] += $cost_time;
    if($is_success>0) $record[$people]['success'] += 1;
    }function _print($people,$record){
    print("user $people: total cost {$record[$people]['total_time']} minutes, success rate {$record[$people]['success']}/{$record[$people]['num']}<br />");
    }
    ?>
    输入结果:user a: cost 1 minute(s), success!
    user b: cost 3 minute(s), failure!
    user c: cost 4 minute(s), success!
    user d: cost 4 minute(s), success!
    user a: cost 5 minute(s), success!
    user b: cost 2 minute(s), success!
    user c: cost 1 minute(s), success!
    user d: cost 2 minute(s), success!
    user a: cost 5 minute(s), success!
    user b: cost 3 minute(s), success!
    user c: cost 4 minute(s), failure!
    user d: cost 1 minute(s), success!
    user a: cost 1 minute(s), failure!
    user b: cost 2 minute(s), success!
    user c: cost 4 minute(s), failure!
    user d: cost 4 minute(s), success!
    user a: cost 4 minute(s), failure!
    user b: cost 4 minute(s), success!
    user c: cost 1 minute(s), success!
    user d: cost 2 minute(s), failure!
    user a: cost 2 minute(s), success!
    user b: cost 2 minute(s), success!
    user c: cost 2 minute(s), success!
    user d: cost 1 minute(s), success!
    user a: cost 2 minute(s), success!
    user b: cost 5 minute(s), success!
    user c: cost 4 minute(s), success!
    user d: cost 3 minute(s), success!
    user a: cost 5 minute(s), success!
    user b: cost 4 minute(s), success!
    user c: cost 5 minute(s), failure!
    user d: cost 2 minute(s), success!
    user a: cost 2 minute(s), failure!
    user b: cost 1 minute(s), success!
    user c: cost 3 minute(s), success!
    user d: cost 3 minute(s), success!
    user a: cost 2 minute(s), success!
    user b: cost 1 minute(s), success!
    user c: cost 3 minute(s), failure!
    user d: cost 1 minute(s), success!
    user a: cost 3 minute(s), success!
    user b: cost 4 minute(s), success!
    user c: cost 4 minute(s), success!
    user d: cost 1 minute(s), success!
    user a: cost 1 minute(s), success!
    user c: cost 2 minute(s), failure!
    user d: cost 5 minute(s), success!
    user c: cost 4 minute(s), success!
    user d: cost 3 minute(s), success!
    user c: cost 4 minute(s), failure!
    user d: cost 3 minute(s), failure!
    user c: cost 5 minute(s), success!
    -----
    total cost 341 minutes.
    user a: total cost 33 minutes, success rate 9/12
    user b: total cost 31 minutes, success rate 10/11
    user c: total cost 50 minutes, success rate 9/15
    user d: total cost 35 minutes, success rate 12/14
      

  17.   

    呵呵,PHP这个我喜欢,我之前使用了四年。不过这些东西是各有各的领域,各有各的所长,总之都可以用来描述算法。