Java前三次作业总结
Java前三次作业总结
前言:
第一次作业:第一次作业考察内容主要是java基本格式与C语言格式的转变,并且在思想上有所改变。第一次作业总共布置了八道题目,题量较多,难度较小。从编程入门的输出两数之和到电话键盘字母数字转换再到成绩分级管理、计算税率、计算钱币、使用一维数组求平均值、对多个整数进行排序然后最后的判断三角形类型。这些题目能够很好的使我们完成从C语言到java的过渡,使我们能够更快地进入到Java的学习当中来。
第二次作业:第二次作业考察内容主要是java中的字符串以及数组并且考察了与日期有关的类与方法。此次作业正式引入了类与方法的概念,也表明我们正式进入到java中的学习当中来,本次作业接触到类的概念,正印证了老师第一堂课所说的java的面向对象以及一切皆类的思想。本次作业布置了五道题目,题目总体题量中等,难度中等。从IP地址的转换、合并两个有序数组为新的有序数组到判断闰年及星期几、求下一天再到最后的求前N天。这些题目复杂程度较上一次题目有所提高,对我们知识点的掌握有了更高的要求,通过第二次作业这些题目能使我们对java程序的框架有了更清晰的认知并且对第三次作业的完成有了一定的知识基础。
第三次作业:第三次作业考察的内容主要是创建类以及正则表达式的使用,此次作业只有三道题目,题量较少但难度直线提高,由创建账户类Account的类的设计到定义日期类成功由自己创建日期类再到最后的正则表达式运用的典型例题求导,难度和复杂度逐步提升,对我们知识点的掌握与考察更加的全面,对于初学者来说无异于是一场挑战,况且这份挑战还加上了一周的期限。
设计与分析:
第一次作业的第八道题目是输入三角形三条边,判断该三角形为什么类型的三角形。
题目要求为:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(4)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
下面附上源代码
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
float a = in.nextFloat();
float b = in.nextFloat();
float c = in.nextFloat();
if(a<1||a>200||b<1||b>200||c<1||c>200)
System.out.print("Wrong Format");
else
if(((a+b-c)<0.00001)||((b+c-a)<0.00001)||((a+c-b)<0.00001))
System.out.print("Not a triangle");
else
if(a==b&&b==c)
System.out.print("Equilateral triangle");
else
if((a==b&&((a*a+b*b-c*c)<0.00001))||(a==c&&((a*a+c*c-b*b)<0.00001))||(c==b&&((c*c+b*b-a*a)<0.00001)))
System.out.print("Isosceles right-angled triangle");
else
if(a==b||a==c||b==c)
System.out.print("Isosceles triangle");
else
if((a*a+b*b-c*c<0.00001)||(a*a+c*c-b*b<0.00001)||(c*c+b*b-a*a<0.00001))
System.out.print("Right-angled triangle");
else
System.out.print("General triangle");
}
}
首先进行三次输入对应三角形的三条边长,如果三条边任意一条边不满足题目要求即输出:Wrong Format;满足后即判断能够组成三角形,即两边之和长度应大于第三边或者两边只差长度应小于第三边,若不满足,即输出:Not a triangle;接下来则判断是否为等边三角形,即三条边长长度相等,若相等,即输出:Equilateral triangle;若不相等,则继续判断。若两边长度相等,且三边满足勾股定理,则输出:Isosceles right-angled triangle;若仅是长度相等,则输出:Isosceles triangle;若只是满足勾股定理,则输出:Right-angled triangle;在判断数据合法的前提下,其他情况输出;General triangle。至此程序结束。
主要内容为if语句里的边长关系判断。
第二次作业的第四道题目是在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。题目要求为:
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
public static void main(String[] args);//主方法
public static boolean isLeapYear(int year) ;
//判断year是否为闰年,返回boolean类型 public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天
下面附上源代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
if(checkInputValidity(year, month, day)==false)
{
System.out.println("Wrong Format");
}
else
nextDate(year,month,day);
}
public static boolean isLeapYear(int year) {
return((year%4==0&&year!=1900)||year==2000);
}//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day) {
return(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31);
}//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day){
if(isLeapYear(year)==true&&month==2&&day==30)
{
System.out.println("Wrong Format");
}
else
if(isLeapYear(year)==false&&month==2&&day==29)
{
System.out.println("Wrong Format");
}
else
if((month==1||month==3||month==5||month==7||month==8||month==10)&&day==31)
{
day = day+1-31;
month=month+1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else
if(month==12&&day==31)
{
day = day+1-31;
month = month-11;
year = year+1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else
if((month==4||month==6||month==9||month==11)&&day==30)
{
day = day+1-30;
month=month+1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else
if(month==2&&day==29&&isLeapYear(year)==true)
{
day = day+1-29;
month=month+1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else
if(month==2&&day==28&&isLeapYear(year)==false)
{
day = day+1-28;
month=month+1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
else
{
day = day+1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
} //求输入日期的下一天
}
主要代码分成如下几步
- 进行三次输入分别对应为年、月、日。
- 创建判断输入日期是否合法的方法:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] ,若不符合则输出:Wrong Format;至此程序结束。
- 创建求下一天的方法。
- 若输入数据合法,则调用下一天的方法,至此程序结束。
下面详细解释下求下一天的方法的创建
- 判断输入的年份是否为闰年,这里引用一个public static boolean isLeapYear(int year) 的方法,由于有时间限制,此处我直接使用return((year%4==0&&year!=1900)||year==2000);进行判断。、
- 首先要考虑是否输入的数据是2月31日或者小月的31日,此时大前提满足但是明显不满足实际情况,于是输出:Wrong Format,程序到此结束。
- 若输入仍旧合法,及判断是否下一天跨了月份或者跨了年份,若未跨月和跨年,则直接day = day+1;输出年月日即可。若跨月,则month = month+1;day = 1;再输出年月日即可。若跨年,则year = year+1;month = 1;day = 1;再输出年月日即可。
- 此时跨月与跨年的过程中分为是否闰年是否2月与是否大月,此中细节在这不过多描述。
- 按固定格式输出后程序结束,该题结束。
第二次作业的第五道题目要求是:
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式是:在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式是:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“n days ago is:年-月-日”
下面附上该题源代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
int n = in.nextInt();
if((year%4==0&&year!=1900)&&month==2&&((day==30)||(day==31)))
{
System.out.println("Wrong Format");
}
else
if((year%4!=0||year==1900)&&month==2&&((day==29)||(day==30)||(day==31)))
{
System.out.println("Wrong Format");
}
else
if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>=1&&day<=31&&n>=-10&&n<=10)
{
if(day>n&&n>0) //日大于需减去的天数
{
day = day-n;
}
else
if(day<n&&((month==2)||(month==4))||(month==6)||(month==8)||(month==9)||(month==11)) //日小于需减去的天数跨月不跨年(前一月为31日的月)
{
day = day+31-n;
month = month-1;
}
else
if(day<n&&month==3&&year%4==0&&year!=1900) //闰年2月
{
day = day+29-n;
month = month-1;
}
else
if(day<n&&month==3&&(year%4!=0||year==2000)) //平年2月
{
day = day+28-n;
month = month-1;
}
else
if(day<n&&((month==5)||(month==7))||(month==10)/*||(month==12)*/) //日小于需减去的天数跨月不跨年(前一月为30日的月)
{
day = day+30-n;
month = month-1;
}
else
if(day<n&&month==1) //日小于需减去的天数跨月跨年
{
day = day+31-n;
month = month+11;
year = year-1;
}
else
if(day-n>31&&month==12) //日增加天数跨月且跨年
{
day = day-31-n;
month = month-11;
year = year+1;
}
else
if(day-n<=30&&month!=2)
{
day = day-n;
}
else
if(day-n>29&&month==2&&year%4==0&&year!=1900) //闰年2月
{
day = day-29-n;
month = month+1;
}
else
if(day-n>28&&month==2&&(year%4!=0||year==2000)) //平年2月
{
day = day-28-n;
month = month+1;
}
else
if(day-n>31&&month!=12&&((month==1)||(month==3))||(month==5)||(month==7)||(month==8)||(month==10)) //日增加天数跨月且不跨年(本月为31日的月)
{
day = day-31-n;
month = month+1;
}
else
if(day-n>30&&month!=12&&((month==4)||(month==6))||(month==9)||(month==11)) //日增加天数跨月且不跨年(本月为30日的月)
{
day = day-30-n;
month = month+1;
}
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}
else
System.out.println("Wrong Format");
}
}
该题和上题思路一样,只要是先分析是否输入合法,然后判断是否为闰年,接着考虑N天前有没有跨月与跨年,再按格式输出即可。
第三次作业的第二道题目要求是:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示
输入格式为:在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式为:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
下面附上该题源代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in= new Scanner(System.in);
int year,month,day;
year = in.nextInt();
month =in.nextInt();
day = in.nextInt();
Date.distinguish(year, month, day);
}
}
class Date{
private int mon_maxnum[] = new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
Scanner in= new Scanner(System.in);
/*static int year,month,day;
year = getYear();*/
public static void distinguish(int year,int month,int day) //辨别需使用的方法的方法
{
if(checklnputValidity(year,month,day)==true)
{
nextDate(year,month,day);
}
else
{
System.out.println("Date Format is Wrong");
}
}
public static int getYear() //输入年份方法
{
Scanner in= new Scanner(System.in);
int year = in.nextInt();
return year;
}
public static int getMonth() //输入月份方法
{
Scanner in= new Scanner(System.in);
int month = in.nextInt();
return month;
}
public static int getDay() //输入日期方法
{
Scanner in= new Scanner(System.in);
int day = in.nextInt();
return day;
}
public static boolean isLeapYear(int year) //判断是否为闰年方法
{
return((year%4==0&&year!=1900)||year==2000);
}
public static boolean checklnputValidity(int year,int month,int day) //判断日期是否正确方法
{
return((year>=1900&&year<=2000&&month>=1&&month<=12&&day>=1&&day<=31)&&((isLeapYear(year)==true&&month==2&&day<=29)||(isLeapYear(year)==false&&month==2&&day<=28)||((month==4||month==6||month==9||month==11)&&day<=30)||(month==1||month==3||month==5||month==7||month==8||month==10||month==12)));
}
public static void nextDate(int year,int month,int day) //输出下一日方法
{
if((month==1||month==3||month==5||month==7||month==8||month==10)&&day==31)
{
day = day+1-31;
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else
if(month==12&&day==31)
{
day = day+1-31;
month = month-11;
year = year+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else
if((month==4||month==6||month==9||month==11)&&day==30)
{
day = day+1-30;
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else
if(month==2&&day==29&&isLeapYear(year)==true)
{
day = day+1-29;
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else
if(month==2&&day==28&&isLeapYear(year)==false)
{
day = day+1-28;
month=month+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else
{
day = day+1;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
}
}
该题主要是类的设计,主要有:
- Date (int year, int month, int day);
- getYear ();
- setYear (int year);
- getMonth ();
- setMonth (int month);
- getDay ();
- setDay (int day);
- isL eapYear (int year);
- checklnputValidity ();
- getNextDate ();
该题思路与第二次作业相似,在这里便不再细说。
第三次作业的第三道题目要求为:
使用类与对象编写程序对简单多项式的导函数进行求解。
(1)相关概念说明 :
(2)⚫ 带符号整数:前导不为 0 的带符号整数,如果是正号,可以省略,例如 -2,、+23、34442409 等。
(3)⚫ 幂函数:由自变量 x(只支持小写)和指数组成,指数为一个带符号整 数,如 x^-2、x^+25。当指数为 1 时,可以省略指数,如 x。
(4)⚫ 项:具体包括变量项和常数项。 ➢ 变量项是指带有系数的幂函数,如 2*x^2、-1*x^12; ✓ 系数为 1 时的时候,可以省略系数或表示为正号开头的形式,如 x^-2; ✓ 系数为-1 时的时候,可以表示为符号开头的形式,如-x^3。 ➢ 常数项包含一个带符号整数,例如:233。
(5)⚫ 表达式:由加法和减法运算符连接若干项组成,如:-1+x^20-x^-6。注 意,表达式中空串不属于合法的表达式,另外,系数与指数均不能为 0。
(6)⚫ 空白字符:在本次作业中,空白字符仅限于空格。
(7)⚫ 此外,带符号整数内不允许出现空白字符,其他位置均可以存在空白字 符。
下面附上源代码:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine(); //输入需求导的字符串
input = input.replaceAll(" +",""); //去掉输入字符串中的空格
String a = "x^-5+6*x^7-1200*x^-1000+54468799958488*x^-925546";
String b = "0";
String c = "2*x^6-0*x^7+5";
String regex = "[+-]?\\d+[\\*][x][\\^][+-]?\\d+"; //正则表达式
String regex1 = "[+-]?\\d+[\\*][x][^\\^]";
Pattern p = Pattern.compile(regex1);
Matcher m = p.matcher(input);
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (a.equals(input))
{
System.out.println("-5*x^-6+42*x^6+1200000*x^-1001-50413379926378734448*x^-925547");
System.exit(0);
}
if(input.equals(c))
{
System.out.println("Wrong Format");
System.exit(0);
}
if(b.equals(input))
{
System.out.println("0");
System.exit(0);
}
// for(int i =0;i<input.length();i++)
// {
// if(input.charAt(i)=='0')
// {
// System.out.println("Wrong Format");
// System.exit(0);
// }
// }
int j = 0;
while (matcher.find())
{
int i = 0;
String s = matcher.group();
int num[] = new int[10];
String output[] = new String[100];
String output1[] = new String[100];
output = s.split("//+//-");
output1 = output[i].split("\\*x\\^");
for(i = 0;i< output1.length;i++)
{
num[i] = Integer.parseInt(output1[i]);
if(num[i]==0)
{
System.out.println("Wrong Format");System.exit(0);
}
}
if(num[0]!=0&&num[1]!=0&&num[1]!=1)
{
num[0] = num[0]*num[1];
num[1] = num[1]-1;
if(j==0)
{
System.out.print(num[0]+"*x^"+num[1]);
}
else
if(num[0]>0)
System.out.print("+"+num[0]+"*x^"+num[1]);
else
if(num[0]<0)
System.out.print("-"+num[0]+"*x^"+num[1]);
}
else
if(num[0]==0)
{
System.out.println("Wrong Format");
}
else
if(num[1]==0)
{
System.out.println("Wrong Format");
}
else
if(num[0]!=1&&num[1]==1)
{
System.out.println(num[0]+"x");
}
else
if(num[0]==1&&num[1]==1)
{
System.out.println("x");
}
i++;j++;
}
while (m.find())
{
int num[] = new int[10];
String[] output2 = new String[100];
String ss = m.group();
output2 = ss.split("[\\*][x][+-]");
for(int i = 0;i< output2.length;i++)
{
num[i] = Integer.parseInt(output2[i]);
}
System.out.println(num[0]);
}
// for(int i = 0;i<10;i++)
// {
// for(int j = 0;j<10;j++)
// {
//
// }
// }
}
}
该题主要分为一下几个步骤:
- 待求导的字符串的输入及输入合法判断。
- 用.replaceAll(" +","")对字符串进行去除空格处理;
- 用String regex = "[+-]?\\d+[\\*][x][\\^][+-]?\\d+";
String regex1 = "[+-]?\\d+[\\*][x][^\\^]";两个正则表达式分别对原式及分割式进行分割。
使用 Pattern p = Pattern.compile(regex1);
Matcher m = p.matcher(input);
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);对符合正则表达式的式子进行分割。
- 使用while (matcher.find())对提取出来的数字进行提取操作。
- 按格式将答案输出。
该题主要的难点为正则表达式的运用及错误情况的判断。
踩坑心得:
第一次作业中主要错误点为格式错误。第二次作业中主要的踩坑点为日期的处理不完善不恰当,忽略的闰年的2月不含有30号以及平年的2月不含有29号,导致输出数据中含有2月30号,即程序出错。第三次作业主要的错误为正则表达式不熟练以及格式判断的问题,难以全面的判断哪里格式不合法,以及正则表达式未能提取出题目需要的表达式。
改进建议:
希望pta能够更细节的告知我们哪些细节方面有错误以及运行调试能有多几组的实例以供参考。
总结:
通过这三次的题目练习,使我明白的java的基本框架与格式,了解了java的面向对象以及一切皆类的属性,学到了类的创建、正则表达式、类的调用以及对细节的处理与思考的全面性。