BLOG-1
前言
知识点
第一次作业:前八章Java语法相关内容。
第二次作业:练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构;练习数据的输入与输出;理解抽象类与子类的关系。
第三次作业:代码聚合性的调试。
题量
第一次作业:9题
第二次作业:4题
第三次作业:7题
难度等情况
第一次作业:简单
第二次作业:中等
第三次作业:较难
设计与分析
第一次作业:
7-1 身体质量指数(BMI)测算
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。
输入格式:两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;
输出格式:
输入数值超出范围 :输出“input out of range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。
输入样例0:
在这里给出一组输入。例如:
-2 8
输出样例0:
在这里给出相应的输出。例如:
input out of range
输入样例1:
在这里给出一组输入。例如:
70 1.75
输出样例1:
在这里给出相应的输出。例如:
fit
import java.util.Scanner; public class Main { public static void main(String[] args) { double h,w,b; Scanner input =new Scanner(System.in); w=input.nextDouble(); h=input.nextDouble(); b=w/h/h; if(w<=0||h<=0||w>727||h>2.72) System.out.print("input out of range"); else if(b<18.5) System.out.print("thin"); else if(b<24) System.out.print("fit"); else if(b<28) System.out.print("overweight"); else System.out.print("fat"); } }
7-2 长度质量计量单位换算
长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。
输入格式:
两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。
输出格式:
两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。
输入样例:
在这里给出一组输入。例如:
0.45359237 0.0254
输出样例:
在这里给出相应的输出。例如:
1.0 1.0
import java.util.Scanner; public class Main { public static void main(String[] args) { double m,l; Scanner input =new Scanner(System.in); m=input.nextDouble(); l=input.nextDouble(); m=m/0.45359237; l=l/0.0254; System.out.print((float)m+" "+(float)l); } }
7-3 奇数求和
计算一个数列中所有奇数的和。
输入格式:
十个整数,以空格分隔。例如:1 2 3 4 5 6 7 8 9 0。
输出格式:
输入数列中所有奇数之和。例如:25。
输入样例:
在这里给出一组输入。例如:
1 2 3 4 5 6 7 8 9 0
输出样例:
在这里给出相应的输出。例如:
25
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input =new Scanner(System.in); int a; int Sum=0; for(int i=0;i<10;i++) { a=input.nextInt(); if(a%2!=0) Sum=Sum+a; } System.out.print(Sum); } }
7-4 房产税费计算2022
房屋交易在日常生活中非常常见的事情,房屋交易时要额外支付各种税费,按2022年房产交易新政策的规定买房人应缴纳税费包括:
1、契税:首次购房评估额90平(含)内1%、90平-144平(含)内1.5%,超过144平或非首 次3%,买方缴纳。
2、印花税:房款的0.05%。
3、交易费:3元/平方米。
4、测绘费:1.36元/平方米。
5、权属登记费及取证费:一般情况是在200元内。
输入格式:
四个数据,以空格分隔:
1、第几次购房(整数)
2、房款(整数/单位万元)
3、评估价(整数/单位万元)
4、房屋面积(浮点数/单位平方米)。
例如:1 100 100 90。
输出格式:
契税、印花税、交易费、测绘费(以元为单位),以空格分隔。例如:10000.0 500.0 270.0 122.4
输入样例:
在这里给出一组输入。例如:
1 100 100 90
输出样例:
在这里给出相应的输出。例如:
10000.0 500.0 270.0 122.4
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); int number =input.nextInt(); int house=input.nextInt(); int appraise=input.nextInt(); double S=input.nextDouble(); double a=0; if(number==1){ if(S<=90) a=appraise*0.01*10000; else if(S>90&&S<=144) a=appraise*0.015*10000; else a=appraise*0.03*10000; } else if(number>1){ a=appraise*0.03*10000; } double b=house*0.0005*10000; double c=3*S; double d=1.36*S; System.out.println((float)a+" "+(float)b+" "+(float)c+" "+(float)d); } }
7-5 游戏角色选择
一款网游中包括4个种族:人类、精灵、兽人、暗精灵,每个种族包含三种角色:战士、法师、射手。玩家新建人物时需要选择种族和角色。请编写角色选择程序。
输入格式:
两个整数:游戏种族、角色的选项,以空格分隔。例如:1 2。
种族选项设定为:1、人类 2、精灵 3、兽人 4、暗精灵
角色选项设定为:1、战士 2、法师 3、射手
输出格式:
所选择的种族、角色的名称,以空格分隔。例如:人类 法师
若输入数值超出选项范围,输出“Wrong Format”
输入样例1:
在这里给出一组输入。例如:
1 2
输出样例1:
在这里给出相应的输出。例如:
人类 法师
输入样例2:
在这里给出一组输入。例如:
1 6
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner; public class Main { public static void main(String[] args) { int a,b; Scanner input =new Scanner(System.in); a=input.nextInt(); b=input.nextInt(); if((a==1||a==2||a==3||a==4)&&(b==1||b==2||b==3)) { if(a==1) { if(b==1) System.out.print("人类"+" "+"战士"); if(b==2) System.out.print("人类"+" "+"法师"); if(b==3) System.out.print("人类"+" "+"射手"); } if(a==2) { if(b==1) System.out.print("精灵"+" "+"战士"); if(b==2) System.out.print("精灵"+" "+"法师"); if(b==3) System.out.print("精灵"+" "+"射手"); } if(a==3) { if(b==1) System.out.print("兽人"+" "+"战士"); if(b==2) System.out.print("兽人"+" "+"法师"); if(b==3) System.out.print("兽人"+" "+"射手"); } if(a==4) { if(b==1) System.out.print("暗精灵"+" "+"战士"); if(b==2) System.out.print("暗精灵"+" "+"法师"); if(b==3) System.out.print("暗精灵"+" "+"射手"); } } else System.out.print("Wrong Format"); } }
7-6 学号识别
学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号
输入格式:
8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入
输出格式:
学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03
注意:如非法输入,输出“Wrong Format"
输入样例:
在这里给出一组输入。例如:
18011103
输出样例:
在这里给出相应的输出。例如:
入学年份:2018年 学院:材料学院 班级:11 学号:03
输入样例1:
在这里给出一组输入。例如:
18013
输出样例1:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input =new Scanner(System.in); String id=input.next(); if(id.length()!=8) { System.out.print("Wrong Format"); return; } String nf=id.substring(0,2); String xy=id.substring(2,4); String bj=id.substring(4,6); String xh=id.substring(6,8); if(xy.equals("01")) xy="材料学院"; else if(xy.equals("02")) xy="机械学院"; else if(xy.equals("03")) xy="外语学院"; else if(xy.equals("20")) xy="软件学院"; else { System.out.print("Wrong Format"); return; } System.out.println("入学年份:20"+nf+"年"); System.out.println("学院:"+xy); System.out.println("班级:"+bj); System.out.print("学号:"+xh); } }
7-8 巴比伦法求平方根近似值
巴比伦法求n的近似值可以用以下公式:
nextGuess = (lastGuess+n/lastGuess)/2
程序初始运行时lastGuess可赋予一个最初的猜测值。当由公式求得的nextGuess和lastGuess相差较大时,把nextGuess的值赋给lastGuess,继续以上过程,直至nextGuess和lastGuess几乎相同,此时lastGuess或者nextGuess就是平方根的近似值。
本题要求:nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同
输入格式:
1、两个浮点数,以空格分隔,第一个是n,第二个是lastGuess最初的猜测值。例如:2 1。
2、若输入的两个数中包含负数或者lastGuess初始输入为0,认定为非法输入
输出格式:
1、输出n的平方根近似值:lastGuess。例如:1.4142157
2、非法输入时输出:"Wrong Format"
输入样例:
在这里给出一组输入。例如:
2 1
输出样例:
在这里给出相应的输出。例如:
1.4142157
输入样例1:
在这里给出一组输入1。例如:
2 -1
输出样例:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input =new Scanner(System.in); float nextGuess; float n=input.nextFloat(); float lastGuess=input.nextFloat(); if(n<0||lastGuess<=0) { System.out.print("Wrong Format"); return; } nextGuess = (lastGuess+n/lastGuess)/2; while(Math.abs(nextGuess-lastGuess)>=0.00001) { lastGuess = nextGuess; nextGuess = (lastGuess+n/lastGuess)/2; } System.out.print(lastGuess); } }
7-9 二进制数值提取
在一个字符串中提取出其中的二进制数值序列,。
输入格式:
一个由0、1构成的序列,以-1为结束符,非0、1字符视为正常输入,但忽略不计,未包含结束符的序列视为非法输入。例如:abc00aj014421-1
输出格式:
将输入的序列去掉非0、1字符以及结尾符的数据内容,
注:结束符-1之后的0\1字符忽略不计。
例如:00011。
输入样例:
在这里给出一组输入。例如:
abc00aj014421-1
输出样例:
在这里给出相应的输出。例如:
00011
输入样例1:
在这里给出一组输入。例如:
a0571-1k001y
输出样例1:
在这里给出相应的输出。例如:
01
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String a = input.nextLine(); int k=0; for(int i=0;i<a.length();i++) { if(a.charAt(i)=='-'&&a.charAt(i+1)=='1') { k=i; break; } } for(int j=0;j<k;j++) { if(a.charAt(j)=='0'||a.charAt(j)=='1') { System.out.print(a.charAt(j)); } } if(a.indexOf("-1")==-1) { System.out.print("Wrong Format"); } } }
第二次作业:
7-1 菜单计价程序-1
某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9
设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)
不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格2。
如果计算出现小数,按四舍五入的规则进行处理。
参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}
点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}
输入格式:
每条点菜记录的格式:
菜名+空格(英文)+份额
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
最后一条记录以“end”结束。
输出格式:
订单上所有菜品的总价(整数数值),每份菜
如果订单中包含不能识别的菜名,则在总价之前输出“** does not exist”,**是不能识别的菜名
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 2 西红柿炒蛋 3 end
输出样例:
在这里给出相应的输出。例如:
48
输入样例1:
订单中包含不存在的菜品记录。例如:
麻婆豆腐 2 炒脆肚 2 西红柿炒蛋 3 end
输出样例1:
在这里给出相应的输出。例如:
炒脆肚 does not exist
48
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Dish[] arr=new Dish[4]; Dish menu0 = new Dish("西红柿炒蛋", 15.0); Dish menu1 = new Dish("清炒土豆丝", 12.0); Dish menu2 = new Dish("麻婆豆腐", 12.0); Dish menu3 = new Dish("油淋生菜", 9.0); arr[0] = menu0; arr[1] = menu1; arr[2] = menu2; arr[3] = menu3; Dish[] menu = new Dish[20]; int i = 0; while (true) { String name = input.next(); if (name.equals("end")) break; int portion = input.nextInt(); Dish temp=new Dish(name,portion); menu[i]=temp; i++; } Compare(menu,arr); int sum=Calculate(menu,arr); System.out.println(sum); } public static void Compare(Dish[] menu,Dish[]arr){ for (int i = 0; i < menu.length; i++) { int cont=0; if(menu[i]==null){ break; } for (int j = 0; j < arr.length; j++) { if(menu[i].getName().equals(arr[j].getName())){ cont++; } } if(cont==0) System.out.println(menu[i].getName()+" does not exist"); } } public static int Calculate(Dish[] menu,Dish[]arr){ int sum=0; for (int i = 0; i < menu.length; i++) { if(menu[i]==null){ break; } for (int j = 0; j < arr.length; j++) { if(menu[i].getName().equals(arr[j].getName())){ sum=sum+arr[j].getUnit_price(menu[i].getPortion()); } } } return sum; } } class Dish { String name;//菜品名称 double unit_price; //单价 int portion;//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) Dish(){}; Dish(String name,double unit_price){ this.name=name; this.unit_price=unit_price; } Dish(String name,int portion){ this.name=name; this.portion=portion; } void setName(String name) { this.name = name; } String getName() { return name; } void setUnit_price(double unit_price) { this.unit_price=unit_price; } void setPortion(int portion) {//读入份量 this.portion = portion; } int getUnit_price(int a) { double temp = unit_price; int t=0; if (a == 1) t = (int)temp; else if (a == 2) { t = (int)(temp * 1.5); if(t%10==3||t%10==2) t++; } else if (a == 3) t = (int)(temp * 2); return t; } int getPortion() { return portion; } }
7-2 菜单计价程序-2
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。
点菜记录包含:序号、菜名、份额、份数。
份额可选项包括:1、2、3,分别代表小、中、大份。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格2。
如果计算出现小数,按四舍五入的规则进行处理。
参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\
Dish d;//菜品\
int portion;//份额(1/2/3代表小/中/大份)\
int getPrice()//计价,计算本条记录的价格\
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
输入格式:
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:
序号+英文空格+菜名+英文空格+份额+英文空格+份数
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
最后一条记录以“end”结束。
输出格式:
按顺序输出每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品*份数,序号是之前输入的订单记录的序号。
如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后输出订单上所有菜品的总价(整数数值),
本次题目不考虑其他错误情况,如:菜单订单顺序颠倒、不符合格式的输入、序号重复等。
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 end
输出样例:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 63
输入样例1:
订单中包含删除记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 1 delete end
输出样例1:
在这里给出相应的输出。例如:
1 麻婆豆腐 36 2 油淋生菜 27 27
输入样例2:
订单中包含不存在的菜品记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 end
输出样例2:
在这里给出相应的输出。例如:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
63
输入样例3:
订单中包含删除信息以及不存在的菜品记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 1 delete 7 delete end
输出样例3:
在这里给出相应的输出。例如:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
27
输入样例4:
订单中包含删除信息以及不存在的菜品记录。例如:
麻婆豆腐 12 油淋生菜 9 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 5 delete 7 delete end
输出样例4:
在这里给出相应的输出。例如:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
63
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Dish[] arr=new Dish[4]; Dish menu0 = new Dish("西红柿炒蛋", 15.0); Dish menu1 = new Dish("清炒土豆丝", 12.0); Dish menu2 = new Dish("麻婆豆腐", 12.0); Dish menu3 = new Dish("油淋生菜", 9.0); arr[0] = menu0; arr[1] = menu1; arr[2] = menu2; arr[3] = menu3; Dish[] menu = new Dish[20]; int i = 0; while (true) { String name = input.next(); if (name.equals("end")) break; int portion = input.nextInt(); Dish temp=new Dish(name,portion); menu[i]=temp; i++; } Compare(menu,arr); int sum=Calculate(menu,arr); System.out.println(sum); } public static void Compare(Dish[] menu,Dish[]arr){ for (int i = 0; i < menu.length; i++) { int cont=0; if(menu[i]==null){ break; } for (int j = 0; j < arr.length; j++) { if(menu[i].getName().equals(arr[j].getName())){ cont++; } } if(cont==0) System.out.println(menu[i].getName()+" does not exist"); } } public static int Calculate(Dish[] menu,Dish[]arr){ int sum=0; for (int i = 0; i < menu.length; i++) { if(menu[i]==null){ break; } for (int j = 0; j < arr.length; j++) { if(menu[i].getName().equals(arr[j].getName())){ sum=sum+arr[j].getUnit_price(menu[i].getPortion()); } } } return sum; } } class Dish { String name; double unit_price; int portion; Dish(){}; Dish(String name,double unit_price){ this.name=name; this.unit_price=unit_price; } Dish(String name,int portion){ this.name=name; this.portion=portion; } void setName(String name) { this.name = name; } String getName() { return name; } void setUnit_price(double unit_price) { this.unit_price=unit_price; } void setPortion(int portion) {//读入份量 this.portion = portion; } int getUnit_price(int a) { double temp = unit_price; int t=0; if (a == 1) t = (int)temp; else if (a == 2) { t = (int)(temp * 1.5); if(t%10==3||t%10==2) t++; } else if (a == 3) t = (int)(temp * 2); return t; } int getPortion() { return portion; } }
7-3 jmu-java-日期类的基本使用
- 给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天、。
- 给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、念书。
输入格式:
第一行输入一个日期字符串,格式为"YYYY-MM-dd"
第二行输入两个日期字符串,中间使用空格隔开。分别代表开始日期与结束日期。
输出格式:
如果第一行日期字符串非法,输出自定义的错误信息。
如果第一行日期有效,输出相关信息,如果是闰年要输出是闰年。
如果第二行两个日期,只要有一个无效。就输出相关错误信息。
如果第二行两个日期有效且结束日期不早于开始日期,输出相关信息。
输入样例1:
第一行日期非法、第二行有日期非法
2020-02-30 2020-02-30 2020-01-02
输出样例1:
2020-02-30无效! 2020-02-30或2020-01-02中有不合法的日期.
输入样例2:
均有效且合法
2021-02-28 2019-08-01 2020-01-02
输出样例2:
2021-02-28是当年第59天,当月第28天,当周第7天.
2020-01-02与2019-08-01之间相差154天,所在月份相差-7,所在年份相差1.
输入样例3:
日期均有效,但结束日期早于开始日期
2020-02-28 2020-02-02 2020-02-01
输出样例3:
2020-02-28是闰年. 2020-02-28是当年第59天,当月第28天,当周第5天. 2020-02-01早于2020-02-02,不合法!
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Scanner; public class Main { public static void main(String[] args) throws ParseException { Scanner input = new Scanner(System.in); String[] a = new String[3]; String[] b = new String[3]; for (int i = 0; i < a.length; i++) { a[i] = input.next(); } for (int i = 0; i < a.length; i++) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(a[i]); b[i] = sdf.format(date); } Judge1(a[0], b[0]); Judge2(a, b); } public static void Judge1(String a, String b) throws ParseException//判断第一行输入的第一个日期是否合法 { if (a.equals(b)) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(a); Calendar c = Calendar.getInstance(); c.setTime(date); int year = c.get(Calendar.YEAR); int run = Run(year); if (run == 1) System.out.println(b + "是闰年."); int a1 = c.get(Calendar.DAY_OF_YEAR); int a2 = c.get(Calendar.DAY_OF_MONTH); int a3 = c.get(Calendar.DAY_OF_WEEK); a3 = GetWeekday(a3); System.out.println(b + "是当年第" + a1 + "天,当月第" + a2 + "天,当周第" + a3 + "天."); } else System.out.println(a + "无效!");//测试点五 } public static void Judge2(String[] a, String[] b) throws ParseException //判断第二三个日期 { boolean flag = false; if ((a[1].equals(b[1])) && (a[2].equals(b[2])))//判断第二三个日期是否合法 flag = true; if (flag) { int[] year = new int[2]; int[] month = new int[2]; int[] day = new int[2]; for (int i = 1; i < a.length; i++) //从数组的第二个元素开始 { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(b[i]); Calendar c = Calendar.getInstance(); c.setTime(date); year[i-1] = c.get(Calendar.YEAR); month[i-1] = c.get(Calendar.MONTH); day[i-1] = c.get(Calendar.DAY_OF_YEAR); } if(year[0] > year[1]) System.out.println(a[2]+"早于"+a[1]+",不合法!"); else if ((year[0] == year[1])) { if(month[0] > month[1]) { System.out.println(a[2]+"早于"+a[1]+",不合法!"); } else if(month[0] == month[1]&&day[0] > day[1]) { System.out.println(a[2]+"早于"+a[1]+",不合法!"); } else if ((month[0] == month[1]) && (day[0] == day[1])) { System.out.println(a[2]+"与"+a[1]+"之间相差0天,所在月份相差0,所在年份相差0."); } } else { int months=month[1]-month[0]; int years=year[1]-year[0]; int sum = Caulate(year, day); System.out.println(a[2]+"与"+a[1]+"之间相差"+sum+"天,所在月份相差"+months+",所在年份相差"+years+"."); } } if(!flag) System.out.println(a[1] + "或" + a[2] + "中有不合法的日期."); } public static int Caulate(int[] year, int[] day)//计算两年份之间相差天数 { int sum = 0; if (year[0] == year[1]) sum = day[1] - day[0]; else { int jude =Run(year[0]); int t = 0; if (jude==1) t = 366 - day[0]; else t = 365 - day[0]; sum = t + day[1]; for (int i = year[0] + 1; i < year[1]; i++) { int flag = Run(i); if (flag == 1) sum += 366; else sum += 365; } } return sum; } public static int Run(int year)//判断闰年 { int a = 0; if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) a = 1; return a; } public static int GetWeekday(int a)//判断是当周第几天 { String[] weeks = {"7", "1", "2", "3", "4", "5", "6"}; String s = weeks[a-1]; int weekday=0; if (s.equals("1")) weekday=1; if (s.equals("2")) weekday=2; if (s.equals("3")) weekday=3; if (s.equals("4")) weekday=4; if (s.equals("5")) weekday=5; if (s.equals("6")) weekday=6; if (s.equals("7")) weekday=7; return weekday; } }
7-4 小明走格子
从A点到B点有n个格子,小明现在要从A点到B点,小明吃了些东西,补充了一下体力,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈3个格子,也可以一步迈4个格子。请编写程序计算小明从A点到B点一共有多少种走法。
输入格式:
输入包含多组数据,第一行为一个整数m,m不超过10000,表示输入数据组数。接下来m行,每行为一个整数n(保证对应的输出结果小于231),表示从A点到B点的格子数。
输出格式:
输出为m个整数,表示对于每组数据小明从A点到B点的走法数。
输入样例:
2 5 3
输出样例:
15 4
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); int n= input.nextInt(); long[] b=new long[1000]; int[] a=new int[200]; b[0]=1; b[1]=1; b[2]=2; b[3]=4; b[4]=8; for(int i=1;i<=n;i++) { if(i<n) { a[i]=input.nextInt(); if(a[i]<5) System.out.println(b[a[i]]); else { for(int j=5;j<=a[i];j++) b[j]=2*b[j-1]-b[j-5]; System.out.println(b[a[i]]); } } if(i==n) { a[i]=input.nextInt(); if(a[i]<5) System.out.print(b[a[i]]); else { for(int j=5;j<=a[i];j++) b[j]=2*b[j-1]-b[j-5]; System.out.print(b[a[i]]); } } } } }
第三次作业:较难
7-1 菜单计价程序-3
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish\[\] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record\[\] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2023/3/22 12/2/3 1 麻婆豆腐 2 2 2 油淋生菜 1 3 end
输出样例:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 table 1: 38
输入样例1:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2023/3/22 17/0/0 1 麻婆豆腐 2 2 2 油淋生菜 1 3 1 delete end
输出样例1:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 table 1: 22
输入样例2:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2023/3/22 16/59/59 1 麻婆豆腐 2 2 2 油淋生菜 1 3 1 delete end
输出样例2:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 table 1 out of opening hours
输入样例3:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2022/12/5 15/03/02 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 5 delete 7 delete table 2 2022/12/3 15/03/02 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 7 delete end
输出样例3:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist delete error; delete error; table 2: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist delete error; table 1 out of opening hours table 2: 63
输入样例4:
在这里给出一组输入。例如:
麻婆豆腐 12 油淋生菜 9 table 1 2022/12/3 19/5/12 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 table 2 2022/12/3 15/03/02 1 麻婆豆腐 2 2 2 油淋生菜 1 3 3 麻辣鸡丝 1 2 1 4 麻婆豆腐 1 1 7 delete end
输出样例4:
在这里给出相应的输出。例如:
table 1: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist table 2: 1 麻婆豆腐 36 2 油淋生菜 27 麻辣鸡丝 does not exist 4 table 2 pay for table 1 12 delete error; table 1: 63 table 2: 75
7-2 有重复的数据
在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES
”这三个字母;如果没有,则输出“NO
”。
输入格式:
你的程序首先会读到一个正整数n,n∈[1,100000],然后是n个整数。
输出格式:
如果这些整数中存在重复的,就输出:
YES
否则,就输出:
NO
输入样例:
5 1 2 3 1 4
输出样例:
YES
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); int [] a = new int[n]; int flag=0; for(int i=0;i<n;i++){ a[i]=input.nextInt(); for(int j=0;j<i;j++){ if(a[i]==a[j]){ flag=1; break; } } } if(flag==1) System.out.print("YES"); else System.out.print("NO"); } }
7-4 单词统计与排序
从键盘录入一段英文文本(句子之间的标点符号只包括“,”或“.”,单词之间、单词与标点之间都以" "分割。
要求:按照每个单词的长度由高到低输出各个单词(重复单词只输出一次),如果单词长度相同,则按照单词的首字母顺序(不区分大小写,首字母相同的比较第二个字母,以此类推)升序输出。
输入格式:
一段英文文本。
输出格式:
按照题目要求输出的各个单词(每个单词一行)。
输入样例:
Hello, I am a student from China.
输出样例:
student
China
Hello
from
am
a
I
import java.util.Scanner; public class Main{ public static void main(String [] args){ Scanner input = new Scanner(System.in); String a = input.nextLine(); String[]b = a.split("\\ |\\.|\\, "); for (int i = 0; i < b.length; i++) { int length1 = b[i].length(); for (int j = 0; j < i; j++) { int length2 = b[j].length(); if (length1 > length2) { String t = ""; t = b[i]; b[i] = b[j]; b[j] = t; } } } for (int i=0; i<b.length;i++) { if(i==b.length-1) { break; } int length1 = b[i].length(); int length2 = b[i+1].length(); if (length1 == length2) { char f=b[i].charAt(0); char e=b[i+1].charAt(0); if(f>e||(f<e&&(f>='A'&&f<='Z')&&(e>='a'&&e<='z'))) { String t = ""; t = b[i]; b[i] = b[i+1]; b[i+1] = t; } } } for(int i=0;i<b.length;i++){ System.out.println(b[i]); } } }
从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。
预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。
输入格式:
输入两行,每行输入一个日期,日期格式如:2022-06-18
输出格式:
第一行输出:第一个日期比第二个日期更早(晚)
第二行输出:两个日期间隔XX天
第三行输出:两个日期间隔XX周
输入样例1:
2000-02-18 2000-03-15
输出样例1:
第一个日期比第二个日期更早
两个日期间隔26天
两个日期间隔3周
输入样例2:
2022-6-18 2022-6-1
输出样例2:
第一个日期比第二个日期更晚
两个日期间隔17天
两个日期间隔2周
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Scanner; import java.util.Calendar; import java.util.Date; public class Main { public static void main(String[] args) throws ParseException { Scanner in = new Scanner(System.in); String[] r = new String[2]; for (int i = 0; i < r.length; i++) r[i] = in.nextLine(); int[] year = new int[2]; int[] day = new int[2]; int[] week = new int[2]; int[] month = new int[2]; for (int i = 0; i < r.length; i++) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(r[i]); Calendar a = Calendar.getInstance();//(获取日历对象)Date对象转换成Calendar对象 a.setTime(date); year[i] = a.get(Calendar.YEAR);//表示年份 day[i] = a.get(Calendar.DAY_OF_YEAR);//本年中第几天 week[i] = a.get(Calendar.WEEK_OF_YEAR);//本年中的第几个星期 month[i] = a.get(Calendar.MONTH);//表示月份 } int tian = 0; int zhou = 0; if (year[0] > year[1]) { System.out.println("第一个日期比第二个日期更晚"); tian = days(year,day); zhou = tian/7; } else if (year[0] == year[1]) { if (month[0] > month[1]) { System.out.println("第一个日期比第二个日期更晚"); tian = day[0] - day[1]; zhou = tian/7; } else if(month[0] == month[1]) { if(day[0] > day[1]) { System.out.println("第一个日期比第二个日期更晚"); tian = day[0] - day[1]; zhou = tian/7; } else { System.out.println("第一个日期比第二个日期更早"); tian = day[1] - day[0]; zhou = tian/7; } } } }
采坑心得
看题要看完全,考虑完全,不然到后面都不知道自己错哪。
主要困难以及改进建议
1、代码除了能否运行之外,还要注重代码本身的稳定性和健壮性,在相应题目的编码改进方面,我觉得可以考虑通过优化算法、增加注释、精简代码等方式来提高代码质量和可读性。另外,在提交源码之前,要仔细检查代码的逻辑和精度,确保答案的正确性。
2、在解题过程中我会由于对知识点的不熟悉导致无从下手,得反复翻看Java书本内容才能上手,尤其是7-1 菜单计价程序-1、7-2 菜单计价程序-2、菜单计价程序-3,在类与类之间属性与方法之间的相互调用会让我弄不清。
总结
1、这三次作业包含的知识点很广泛,极大的补充了我的知识库,让我对java这门语言有了更深入的了解,也让我学会了更好的自主学习,自我学习。
2、要多花一点时间在学习java上,java中的已经定义的类是非常多的,仅仅是写题目的时候用一次只能有一个粗略映像,需要花其他时间去巩固。此外,在写题目时,自己需要更有耐心一点,不要急于求成,也不要不带脑子写代码,使得写出的代码不仅得分不高,质量还低。