总结
前三次作业总结
前言
一. 第一次题目集
第一次题目集中题目的数目为八个题目,题目数目适中,这八大题的题目具体内容分别为7-1计算两个数的和,7-2电话键盘字母数字转换,7-3成绩分级管理,7-4计算税率,7-5计算钱币,7-6使用一维数组求平均值,7-7对多个整数进行排序,7-8判断三角形类型。这八道题的题目难度为适中。这八道题目中所涉及的知识点具体为数值数据类型和操作,表达式求值,if-else语句,字符数据类型,switch语句,操作符的优先级和结合规则,自增和自减操作符,一维数组中的创建数组,声明数组变量,foreach循环,将数组传递给方法,处理数组,数组初始化简写方式,,选择中的boolea数据类型,自增和自减操作符,从控制台读取字符,从控制台读取字符串,数值数据类型和操作中的数值类型,从键盘读取数值,数值操作符,数值型字面值的整形字面值,浮点型字面值,方法中的得以方法,调用方法,按值传参,数组的排序或arrays类,常用的数学函数和字符,charat方法。
一. 第二次题目集
第二次题目集中题目的数量为五个题目,题目数目适中,这五道题的题目具体内容分别为7-1ip地址转换,7-2合并两个有序数组为新的有序数组,7-3判断闰年及星期几,7-4求下一天,7-5求前N天。这五道题的题目的难度为适中。这五道题目中所涉及的知识点具体为字符与字符串中的字符数据类型和操作的字符数据与数值型数据之间的转换与string类型中的获取字符串长度,从字符串中获取字符串,字符串和数字间的转换,从控制台读取字符,从控制台读取字符串,循环中的for循环,选择中的if-else语句,数组的排序或arrays类,一维数组中的书名数组变量,创建数组,数组大小和默认值,访问数组元素,数组初始化,处理数组,数组的合并,选择中的boolea数据类型,自增和自减操作符,嵌套循环,数值数据类型和操作中的数值类型,从键盘读取数值,数值操作符,数值型字面值的整形字面值,浮点型字面值
三.第三次题目集
第三次题目集中题目的数目为三道题目,题目数比较少,这三道题目的具体题目内容分别为7-1创建账户类account,7-2定义日期类,7-3一元多项式求导(类设计)。这三道题目相比与前面的第一次题目集和第二次题目集的题目的难度提升了,难度我认为是偏难的。这三道题目的所涉及的具体知识点为string类型中的获取字符串长度,从字符串中获取字符串,字符串和数字间的转换,从控制台读取字符,从控制台读取字符串,循环中的for循环,选择中的if-else语句,方法中的定义方法,调用方法,void方法与返回值方法,对象和类中的为对象定义类和创建对象,使用构造方法构造对象,通过引用变量访问对象,Java库中的类,静态变量,常量和方法,数据域封装,this引用,string类中的替换和拆分字符串,使用模式匹配替换和拆分,字符串与数组之间的转换,将字符和数值转换为字符串,正则关系式。
具体分析建议与心得
题目集一的7-8
7-7 对多个整数进行排序 (16 分)
先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
输入格式:
先从键盘输入一个整数n,之后回车 再从键盘输入n个整数,整数之间用一个或多个空格分隔
输出格式:
按如下示例输出排序后的数据:The sorted numbers are:排序后的n个数,每个输出的整数之后有一个空格作为分隔符
输入样例:
在这里给出一组输入。例如:
10
3 5 2 4 76 89 56 4 3 8
输出样例:
在这里给出相应的输出。例如:
The sorted numbers are:2 3 3 4 4 5 8 56 76 89
代码为
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int num = input.nextInt();
int [] list = new int[num];
int temp;
for(int i=0;i<num;i++)
list[i] = input.nextInt();
for(int q=0;q < num;q++ ) {
for(int p=0;p < num - q -1;p++) {
if(list[p+1] < list[p]) {
temp = list[p+1];
list[p+1] = list[p];
list[p] = temp;
}
}
}
System.out.print("The sorted numbers are:" );
for(int i = 0;i < num;i++)
System.out.print( list[i] + " ");
input.close();
}
}
这个题目的要求为输入数字个数和数后对所输入的数从小到大进行升序排序。刚开始学习Java使用输入时可能会忘记import java.util.Scanner;或把它写在了主类中,在写Scanner input = new Scanner(System.in);时可能把system.in忘记写,或在调用方法时忘记“.”我在写这题时利用了数组和冒泡排序,先用input输入所需排序的数目,后创建数组用for循环将将具体的数字输入数组中。下面来说明冒泡排序,冒泡排序法是最经典,最基础的排序算法之一。冒泡排序法是每个编程学习者很容易掌握且必须掌握的算法之一。以从小到大排序为例,它的思想为遍历原始数据,从第一个数开始,两两相邻的数进行比较,如果前者大于后者则两数进行交换继续比较,如果前者小于后者则不要交换。直至所有数从小到大排序好。冒泡排序后即可输出答案。这题其实可以直接用arraylist类中的sort方法直接进行排序而不要用冒泡排序。
题目集一的7-8
7-8 判断三角形类型 (20 分)
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
输入样例1:
在这里给出一组输入。例如:
50 50 50.0
输出样例1:
在这里给出相应的输出。例如:
Equilateral triangle
输入样例2:
在这里给出一组输入。例如:
60.2 60.2 80.56
输出样例2:
在这里给出相应的输出。例如:
Isosceles triangle
输入样例3:
在这里给出一组输入。例如:
0.5 20.5 80
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
此题代码为
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
if(((a < 1) || (a > 200))||((b < 1 )|| (b > 200))||((c < 1) || (c > 200))) {
System.out.println("Wrong Format");
System.exit(0);
}
else {
if(((a+b)<c)||((a+c)<b)||((b+c)<a)) {
System.out.println("Not a triangle");
System.exit(0);
}
else {
if((a==b) && (b==c) && (a==c)) {
System.out.println("Equilateral triangle");
System.exit(0);
}
if(((a==b)&&(c*c==a*a+b*b))||((a==c)&&(b*b==a*a+c*c))||((c==b)&&(a*a==b*b+c*c))) {
System.out.println("Isosceles right-angled triangle");
System.exit(0);
}
if((a==b)||(a==c)||(b==c)) {
System.out.println("Isosceles triangle");
System.exit(0);
}
if(((c*c)==(a*a+b*b))||((b*b)==(a*a+c*c))||((a*a)==(b*b+c*c))) {
System.out.println("Right-angled triangle");
System.exit(0);
}
System.out.println("General triangle");
}
}
}
}
这题要求为输入三个数判断是否能构成三角形,如果能所构成的三角形是什么三角形。按题目要求先要判断输入的数值是否合法,即是否在0~200之间。如果数据合法则在判断能否构成三角形,判断构成三角形的依据为三角形两边之差小与第三边。如果可以构成,则根据三便关系判断属于什么三角形,判断后输出相应的结果。
题目集二的7-4
7-4 求下一天 (30 分)
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
publicstaticvoidmain(String[] args);//主方法
publicstaticbooleanisLeapYear(intyear) ;//判断year是否为闰年,返回boolean类型
publicstaticbooleancheckInputValidity(intyear,intmonth,intday);//判断输入日期是否合法,返回布尔值
publicstaticvoidnextDate(intyear,intmonth,intday) ;//求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
输入样例1:
在这里给出一组输入。例如:
2020 3 10
输出样例1:
在这里给出相应的输出。例如:
Next date is:2020-3-11
输入样例2:
在这里给出一组输入。例如:
2025 2 10
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
代码为
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
boolean n=checkInputValidity(year,month,day);
if(n==false) {
System.out.println("Wrong Format");
System.exit(0);
}
nextDate( year, month, day);
}
public static boolean isLeapYear(int year) {
if((year % 4 == 0) && (year % 100 != 0) ||( year % 400 == 0))
return true;
else
return false;
}
public static boolean checkInputValidity(int year,int month,int day) {
boolean a=true;
boolean b=true;
if((year<1820)||(year>2020)) {
a=false;
}
if((month<1)||(month>12)) {
a=false;
}
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day>31)) {
a=false;
}
if(((month==4)||(month==6)||(month==9)||(month==11))&&(day>30)) {
a=false;
}
if((year % 4 == 0) && (year % 100 != 0) ||( year % 400 == 0)) {
if((month==2)&&(day>29)) {
a=false;
}
}
else {
if((month==2)&&(day>28)) {
a=false;
}
}
if(a==true) {
b=a;
}
else {
b=false;
}
return b;
}
public static void nextDate(int year,int month,int day) {
boolean num=isLeapYear(year);
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day<31)) {
day=day+1;
}
if(((month==4)||(month==6)||(month==9)||(month==11))&&(day<30)) {
day=day+1;
}
if((num==true)&&(month==2)&&(day<29)) {
day=day+1;
}
if((num==true)&&(month==2)&&(day==29)) {
month=3;
day=1;
}
if((num==false)&&(month==2)&&(day<28)) {
day=day+1;
}
if((num==false)&&(month==2)&&(day==28)) {
month=3;
day=1;
}
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10))&&(day==31)) {
day=1;
month=month+1;
}
if((month==12)&&(day==31)) {
day=1;
month=1;
year=year+1;
}
if(((month==4)||(month==6)||(month==9)||(month==11))&&(day==30)) {
day=1;
month=month+1;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
}
这题为求下一天的日期,具体为输入合法日期后得到下一天。输入时间区间为1820到2020,一月,三月,五月,七月,八月,十月,十二月为三十一天,四月,六月,九月,十一月为三十天,闰年的二月为二十九天,非闰年的二月为二十八天,不符和以上要求的数据为非法。判断闰年的方法为此年能被四整除不能被一百整除或者能被四百整除,如果符合要求则为闰年,这题主要处理好该年的最后一天,年月日改怎么处理。错误的是判断边界值时少了等于。
题目集二的7-5
7-5 求前N天 (30 分)
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12]
,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“n days ago is:年-月-日”
输入样例1:
在这里给出一组输入。例如:
2018 6 19 8
输出样例1:
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
输入样例2:
在这里给出一组输入。例如:
2018 6 19 -8
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
int moveday=input.nextInt();
boolean n=checkInputValidity(year,month,day,moveday);
if(n==false) {
System.out.println("Wrong Format");
System.exit(0);
}
nextDate(year,month,day,moveday);
}
public static boolean isLeapYear(int year) {
if((year % 4 == 0) && (year % 100 != 0) ||( year % 400 == 0))
return true;
else
return false;
}
public static boolean checkInputValidity(int year,int month,int day,int moveday) {
boolean a=true;
boolean b=true;
if((moveday<-10)||(moveday>10)) {
a=false;
}
if((year<1820)||(year>2020)) {
a=false;
}
if((month<1)||(month>12)) {
a=false;
}
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day>31)) {
a=false;
}
if(((month==4)||(month==6)||(month==9)||(month==11))&&(day>30)) {
a=false;
}
if((year % 4 == 0) && (year % 100 != 0) ||( year % 400 == 0)) {
if((month==2)&&(day>29)) {
a=false;
}
}
else {
if((month==2)&&(day>28)) {
a=false;
}
}
if(a==true) {
b=a;
}
else {
b=false;
}
return b;
}
public static void nextDate(int year,int month,int day,int moveday) {
moveday=-moveday;
boolean num=isLeapYear(year);
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&((31-day)>=moveday)&&(moveday>=0)) {
day=day+moveday;
}
else
if((month==12)&&((31-day)<moveday)&&(day>=0)) {
day=day+moveday-31;
month=1;
year=year+1;
}
else
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10))&&(((31-day)<moveday)&&(moveday>=0))) {
day=day+moveday-31;
month=month+1;
}
else
if(((month==4)||(month==6)||(month==9)||(month==11))&&((30-day)>=moveday)&&(moveday>=0)) {
day=day+moveday;
}
else
if(((month==4)||(month==6)||(month==9)||(month==11))&&((30-day)<moveday)&&(moveday>=0)) {
day=day+moveday-30;
month=month+1;
}
if((num==true)&&(month==2)&&((29-day)>=moveday)&&(moveday>=0)) {
day=day+moveday;
}
if((num==true)&&(month==2)&&((29-day)<moveday)&&(moveday>=0)) {
day=day+moveday-29;
month=3;
}
if((num==false)&&(month==2)&&((28-day)>=moveday)&&(moveday>=0)) {
day=day+moveday;
}
if((num==false)&&(month==2)&&((28-day)<moveday)&&(moveday>=0)) {
day=day+moveday-28;
month=3;
}
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day>(-moveday))&&(moveday<0)) {
day=day+moveday;
}
else
if((month==1)&&(day<=(-moveday))&&(moveday<0)) {
day=31+day+moveday;
month=12;
year=year-1;
}
else
if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day<=(-moveday))&&(moveday<0)) {
day=31+day+moveday;
month=month-1;
}
else
if(((month==4)||(month==6)||(month==9)||(month==11))&&(day>(-moveday))&&(moveday<0)) {
day=day+moveday;
}
else
if(((month==4)||(month==6)||(month==9)||(month==11))&&(day<=(-moveday))&&(moveday<0)) {
day=30+day+moveday;
month=month-1;
}
if((num==true)&&(month==2)&&(day>(-moveday))&&(moveday<0)) {
day=day+moveday;
}
if((num==true)&&(month==2)&&(day<=(-moveday))&&(moveday<0)) {
day=29+day+moveday;
}
if((num==false)&&(month==2)&&(day>(-moveday))&&(moveday<0)) {
day=day+moveday;
}
if((num==false)&&(month==2)&&(day<=(-moveday))&&(moveday<0)) {
day=28+day+moveday;
}
System.out.println(-moveday+" days ago is:"+ year+"-"+month+"-"+day);
}
}
这题为求前后十天内的日期。想法与上一题相似,同样是要注意年月日的变化。格外要注意的是几天前输入是负数,几天后输入是正数,不能搞反了。用if-else而不要一直if。
题目集三的7-2
7-2 定义日期类 (28 分)
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
在这里给出一组输入。例如:
1912 12 25
输出样例1:
在这里给出相应的输出。例如:
Next day is:1912-12-26
输入样例2:
在这里给出一组输入。例如:
2001 2 30
输出样例2:
在这里给出相应的输出。例如:
Date Format is Wrong
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
Data data=new Data(year,month,day);
boolean check=data.checkInputValidity();
if(check==false) {
System.out.println("Date Format is Wrong");
System.exit(0);
}
data.getNextData();
System.out.println("Next day is:"+data.year+"-"+data.month+"-"+data.day);
input.close();
}
}
class Data{
int day;
int month;
int year;
Data(){
}
Data(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
public boolean isLeapyear(int year){
boolean a;
if((year % 4 == 0) && (year % 100 != 0) ||( year % 400 == 0))
a=true;
else
a=false;
return a;
}
public boolean checkInputValidity(){
boolean a=true;
boolean leapYear=isLeapyear(this.year);
if(this.year>2000||this.year<1900||this.month>12||this.month<=0||this.day>31||this.day<=0)
a=false;
else
if(((this.month==1)||(this.month==3)||(this.month==5)||(this.month==7)||(this.month==8)||(this.month==10)||(this.month==12))&&(this.day>31))
a=false;
else
if(((this.month==4)||(this.month==6)||(this.month==9)||(this.month==11))&&(this.day>30))
a=false;
else
if((this.month==2)&&(this.day>29)&&(leapYear==true))
a=false;
else
if((this.month==2)&&(this.day>28)&&(leapYear==false))
a=false;
return a;
}
public void getNextData() {
boolean leapYear=checkInputValidity();
if(((this.month==1)||(this.month==3)||(this.month==5)||(this.month==7)||(this.month==8)||(this.month==10)||(this.month==12))&&(this.day<31))
this.day=this.day+1;
else
if(((this.month==1)||(this.month==3)||(this.month==5)||(this.month==7)||(this.month==8)||(this.month==10))&&(this.day==31)) {
this.day=1;
this.month=this.month+1;
}
else
if((this.month==12)&&(this.day==31)) {
this.day=1;
this.month=1;
this.year=this.year+1;
}
else
if(((this.month==4)||(this.month==6)||(this.month==9)||(this.month==11))&&(this.day<30))
this.day=this.day+1;
else
if(((this.month==4)||(this.month==6)||(this.month==9)||(this.month==11))&&(this.day==30)) {
this.month=this.month+1;
this.day=1;
}
else
if((this.month==2)&&(this.day<29)&&(leapYear==true))
this.day=this.day+1;
else
if((this.month==2)&&(this.day==29)&&(leapYear==true)) {
this.day=1;
this.month=3;
}
else
if((this.month==2)&&(this.day<28)&&(leapYear==false))
this.day=this.day+1;
else
if((this.month==2)&&(this.day==28)&&(leapYear==false)) {
this.day=1;
this.month=3;
}
}
}
这题与题目集二的7-4相似。不同的是这题用了类而不是将大量代码放入主方法中。如创建Data类,检查数据输入是否合法用checkInputValidity()方法,检测是否是闰年用isLeapyear(int year)方法,求下一天用getNextData()方法,用类来处理可以使代码更加简洁清晰,而不是大量代码冗杂在主方法中。要注意的是调用类中的数据和方法要创造类的实例后用对象名加点。
题目集三7-5
7-3 一元多项式求导(类设计) (50 分)
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
输出样例1:
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
输入样例2:
在这里给出一组输入。例如:
2*x^6-0*x^7+5
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
这题我没有写出来。这题要用正则表达式和spilt对字符串进行提取,拆分等操作。对正则表达式我不能正确的运用。这题的数据的封装后,在除此类外不能用修改它的值,除非创建get和set函数才能用被封装的值和修改。

浙公网安备 33010602011771号