初衷
疫情期间,奶奶种的大白菜熟了,于是家里大大小小的人一起去帮忙收大白菜。我在帮忙收白菜时就想,能不能自己编写一个计算收指定白菜数量所会花费多少时间的小程序。这个程序疫情期间便已经酝酿了,后来由于种种原因暂时放下了,直到最近我才重新拾起。这几天我只要有时间就酝酿着写一些,在今天终于写完了。我也常常想着怎样让学习更有效率,怎样用自己所学的应用到工作、生活中,如此才会学有所成。
程序说明
1、这个程序设计的尚不完美,不过计划所要达到的效果却已达到了。此外,当一分钟装菜的颗数小于一分钟运菜的总数时,这个程序便不适用了。我没有写这一些情况的代码,除了时间因数外,还有就是现实收菜我没有遇到过这样的情况。
2、这是经过了两三个月没碰代码后编写的,很多技巧还需慢慢补回来。
3、问题、说明什么的我已放在代码里,直接看源码便可。
源码
/**所想:
* 今天去帮家里下地收了下大白菜,做一个小程序与之有关的。
* 稍微考虑多一点的程序,满足多方面的要求。
* 收菜:
目的:收三行大白菜,每行有150颗。
人数:两个小孩,7个大人。
分工:
1.两个大人需要用工具将菜切割下来放到一旁。每切完一颗菜耗时10s。
2.一个大人在车子旁等候运菜的人过来接过菜装上车。接过一颗菜装车要3s,运菜的人这时需要等待装车完才继续运菜。
3.剩下的6个人则运菜。运菜每次平均来回的过程1分(minute)。
运菜方式:
运菜的人是等待3分钟后开始运菜。
1.小孩一次只拿一颗菜。
2.大人一次拿3颗菜。
问题:
花费多少分可以完成收菜任务呢?
解决的一些思路:
1.割菜的人会先去割一段时间的菜,当收菜的去运菜时也花来回时间的一半走到放菜的地方,这个时间段内已经割好了一定
数量的菜,然后考虑一下收这波菜所用的时间大不大于割完所有菜所用的时间。大于或等于收完这波菜的时间则从取菜人的速度。当小于收完
这波菜的时间,再比较一下收菜速和割菜速。
2.割菜速和收菜速取总共的速度,几个人合一起的速度。
*/
import java.util.Scanner; //需要输入字符,引入Scanner
class Demo{
public static void main(String[] args){ //主方法
Scanner scanner=new Scanner(System.in); //变量scanner
//输入菜有多少行
System.out.print("需要收菜的行数:");
float row_1=scanner.nextFloat();
//输入行菜有多少颗
System.out.print("每行菜的颗数:");
float row_total_1=scanner.nextFloat();
//输出菜的总颗数(行*每行的颗数),多加一空行(\n)
System.out.println("菜的总颗数为:"+row_1*row_total_1+"\n");
//确定人数
//装菜
System.out.print("装菜的人数:");
float person_install_1=scanner.nextFloat();
System.out.print("装一颗菜的时间(s):"); //装一颗菜所花时间
float install_time_one_1=scanner.nextFloat();
System.out.println(); //空一行
//运菜,小孩和大人分开
System.out.println("分别输入大人和小孩的运菜人数");
System.out.print("大人人数:");
float person_carry_max_1=scanner.nextFloat(); //输入大人运菜人数
System.out.print("小孩人数:");
float person_carry_min_1=scanner.nextFloat(); //输入小孩运菜人数
System.out.print("运菜来回所花时间(分):");
float carry_time_1=scanner.nextFloat(); //输入来回所花费时间
float greens_go_come_1=person_carry_max_1*3+person_carry_min_1*1; //来回时间总运菜数
float v_carry_1=greens_go_come_1/carry_time_1; //一分时间运菜的总速度
System.out.println("运菜的总速度为:"+v_carry_1);
System.out.println(); //空一行
//割菜
System.out.print("割菜的人数:");
float person_cut_1=scanner.nextFloat();
System.out.print("割一颗菜所花时间(s):");
float cut_time_1=scanner.nextFloat(); //输入割一颗菜所花的时间
float cut_one_1=60/cut_time_1; //一人一分钟所可以割的菜颗数
System.out.print("割菜的人先割几分钟(分):");
float t_cut_first_1=scanner.nextFloat(); //输入割人先割指定时间的菜
float v_cut_total_1=cut_one_1*person_cut_1; //割菜的总速度
System.out.println("割菜的总速度为:"+v_cut_total_1);
System.out.println(); //空一行
/**
* 比较割菜和运菜的总速度
* 如果割菜的总速度大于运菜的总速度,运菜的人不用等割菜的人
* 如果割菜的总速度小于运菜的总速度,可能会造成前面存的菜搬完而割菜人还没割完菜
*/
//当割菜的总速度大于等于运菜的总速度,只需要考虑运菜的人搬完所有菜便可。
if(v_cut_total_1>=v_carry_1){
//先割的时间+运菜来回时间的一半+运完所有菜的时间
float t_carry_total_1=t_cut_first_1+carry_time_1/2+row_1*row_total_1/v_carry_1;
System.out.println("完成收菜任务所花的时间(分):"+t_carry_total_1);
System.exit(0);
}
/**
* 因为在运菜人运菜之前,割菜人已去割菜一段时间了,在运菜人等待的这段时间里割的菜这里取名“堆数1”。
*则那么在割菜的总速度小于运菜总速度时,我们用“堆数1”的颗速除以这两个速度差得到一个时间,当这个时间
*大于或等于割完全部菜的时间时,则计算方法和上一步一样(先割的时间+运菜来回时间的一半+运完所有菜的时间)。
*当这个时间小于割完全部菜的时间,计算方法应该为way1(这个时间+(菜总数-堆数1)*割菜的总速度+运菜来回时间的一半)。
*加运菜时间的一半是因为,当割完最后一颗菜时,运菜的人还要将这颗菜运到装菜的地方,花费时间就是运菜人 来回时间的一半。
*/
//当割菜的总速度小于运菜总速度时
else{
//堆数1,等于 割菜的总速度*先割的分钟数+来回运菜时间的一半*运菜的总时间。
float greens_cut_first_1=v_cut_total_1*t_cut_first_1+v_cut_total_1*carry_time_1/2;
System.out.println("===在运菜人等待的这段时间里割的菜这里取名“堆数1”===");
System.out.println("[堆数1]的数量为:"+greens_cut_first_1);
//到这里时,运菜总速度减割菜总速度为正值
//用速度差运完“堆数1”所花时间
float t_carry_cut_1=greens_cut_first_1/(v_carry_1-v_cut_total_1);
System.out.println("用运菜总速与割菜总速的速度差运完“堆数1”所花时间(分):"+t_carry_cut_1);
//比较运完堆数1所花时间和运完所有菜的时间
if(t_carry_cut_1>=row_1*row_total_1/v_carry_1){ //row_1*row_total_1/v_carry_1为运完所有菜的时间
float t_carry_total_2=t_cut_first_1+carry_time_1/2+row_1*row_total_1/v_carry_1; //完成堆数1所花时间大于等于运完所有菜的时间时的运菜结果
System.out.println("完成收菜任务所花的时间(分):"+t_carry_total_2);
System.exit(0); //程序正常退出
}
else{
float t_carry_total_3=t_cut_first_1+(row_1*row_total_1-greens_cut_first_1)/v_cut_total_1+carry_time_1/2;
System.out.println("完成收菜任务所花的时间(分):"+t_carry_total_3);
}
}
}
}
运行结果
无关紧要的感想
因为疫情大白菜并不好卖,奶奶损失了很多,还是有些难受的。不过,中国还是很好的,疫情现在也渐渐稳定下来了,你看外国很多地方都乱套了。