基本需求如下:
1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情要做,但每人每次只允许做一件,并且从第一件开始做.2.等到丁做完一件事后,休息1分钟,然后又从甲开始做剩下的事情,以此循环,直到四人都做完自己的所有事情.以上为基本要求,附加扩展需求如下:
1.如果一件事做失败了,则记录它的做事者,以及失败原因,失败时间等,再输入到c:/note.txt,然后再跳过该件事,其它人继续进行.2.当四人完成所有事情后,记录每人完成事情的所需的总时间以及成功率(或失败率),最好能用图表显示统计.我想方法可能不少,但效率可能有别,此算法看似简单,但要运用的知识点却不少,线程,异常处理,循环应用,文件操作等等,
对一般人练练手应该还是有意义的啦.大家有兴趣也来露两手如何?附加要求可以不考虑.本人的就不贴上去献丑了,呵最后说下,本人认为该需求用于面试也不错,如果有人能在30分钟内完成,水平应该是相当不错的(使用时间越少,正确率越高,相对来说被面试者水平越高)
当然如果你认为是这是作业题或太简单了而不屑一顾的话,那你可以绕路了(此处已难以展现你才能了,人各有志吧,水平不同当然目标不同了,可以理解的,呵.)
1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情要做,但每人每次只允许做一件,并且从第一件开始做.2.等到丁做完一件事后,休息1分钟,然后又从甲开始做剩下的事情,以此循环,直到四人都做完自己的所有事情.以上为基本要求,附加扩展需求如下:
1.如果一件事做失败了,则记录它的做事者,以及失败原因,失败时间等,再输入到c:/note.txt,然后再跳过该件事,其它人继续进行.2.当四人完成所有事情后,记录每人完成事情的所需的总时间以及成功率(或失败率),最好能用图表显示统计.我想方法可能不少,但效率可能有别,此算法看似简单,但要运用的知识点却不少,线程,异常处理,循环应用,文件操作等等,
对一般人练练手应该还是有意义的啦.大家有兴趣也来露两手如何?附加要求可以不考虑.本人的就不贴上去献丑了,呵最后说下,本人认为该需求用于面试也不错,如果有人能在30分钟内完成,水平应该是相当不错的(使用时间越少,正确率越高,相对来说被面试者水平越高)
当然如果你认为是这是作业题或太简单了而不屑一顾的话,那你可以绕路了(此处已难以展现你才能了,人各有志吧,水平不同当然目标不同了,可以理解的,呵.)
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;
}
}
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
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];
}
//下面这几句是给这几个SB 分配任务
”呵呵
甲乙丙丁各自实现比如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类来做,当然最好是交给别的辅助类来做
{
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 为真就清出循环,直到所有人被清掉为止,可以继续改善
每个任务结束后将下次开始的时间queue进timer里,queue进timer的struct里应该包含timer,
以及这是谁的任务等信息.
.timer到时后会触发主线程来作某件事情.
如果生成错误主线成会queue struct到数据统计线程里去.
数据统计线程最保持错误数据的逻辑.
最后结束任务的时候的数据统计也是交给数据统计线程来作.
* @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%的.有时我们往往问题想得太复杂了,要是这个类那个类啊,想太多了,反而把简单问题复杂化了.本人觉得这个效率还行吧(自已鼓励下自己吧),当然楼上的各位方法也不错.
这贴看来也该结了,那明天结吧
/////////////////
甲doing No.1
takes 5 mins
success!!!
----pause-----1min----
乙doing No.1
takes 2 mins
fail!!
//////////////////
怎么知道甲花5分钟,乙花两分钟哦?
很希望帮忙回答下
int cost=(int)(Math.random()*5+1);
* @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)); }我觉得这个想法很好,只是如果能够将判断是否成功的方法放在人做事的函数里就更好了
$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