前三次作业blog

一:前言

这学期才接触java,面向对象其实是没怎么听过,也不是很理解的词,对于初学者来说怎么写,java语法有点不太适应。好在Java的入门并不是想象的那么复杂,在一番网课的学习以及老师的讲解后,对Java有了初步的了解,对一些简单的代码能够读懂并且解决一些题目,这是前三次的主要收获了。

前三次作业主要涉及了java的一些基础应用,如简单加减运算,字符的输入,对应的输出,格式的判断,整型浮点型字符串等的输入,简单的排序和判断,二进制转化为十进制,Java中数组的合并,年份日期的判断,正则表达式等。

三次作业难度慢慢变大,第一次非常基础,第二次稍稍难度上升,第三次难度更大但是总体来说还需要像我这样的初学者慢慢提升,慢慢适应Java面向对象。

二:题目分析

 

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”。

 

 

 

设计与分析:拿到这题首先没注意到字符的类型,简单的以为是整型,导致出现点过不去。之后是三角形判断的顺序,必须按照最特殊的再到普通的进行判断,不然也会有一些特别的情况出错,之后是在判断直角三角形的时候,由于有浮点数产生的误差,导致无法相等,找了很久也没也没有找出错误,上网找了一下发现浮点数误差的问题。改成

else if ( (a==b&&a*a+b*b-c*c<0.0001)  ||  (c==b&&c*c+b*b-a*a<0.0001) || (a==c&&a*a+c*c-b*b<0.0001)  ) 

问题解决

 

 

 


import java.util.Scanner;


public class Main {

public static void main(String[] args) {


Scanner input = new Scanner (System.in);


double a = input.nextDouble();

double b = input.nextDouble();

double c = input.nextDouble();

if(a<=200&&1<=a&&b<=200&&1<=b&&c<=200&&1<=c) {

if(a+b<=c || a + c <= b || b + c <= a) {

System.out.println("Not a triangle");
}

else if(a==b&&b==c) {

System.out.println("Equilateral triangle");
}


else if ( (a==b&&a*a+b*b-c*c<0.0001) || (c==b&&c*c+b*b-a*a<0.0001) || (a==c&&a*a+c*c-b*b<0.0001) ) {

System.out.println("Isosceles right-angled triangle");

}


else if (a==b||b==c||a==c) {

System.out.println("Isosceles triangle");
}

else if (a*a+c*c==b*b||b*b+a*a==c*c||a*a+b*b==c*c) {

System.out.println("Right-angled triangle");
}


else {
System.out.println("General triangle");
}


}
else System.out.println("Wrong Format");

}
}

                                  7-4 求下一天 (30 分)

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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) ; //求输入日期的下一天
 

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  1. 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
  2. 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日

 

 设计与分析:这题要注意判断日期是否合法,是否为闰年,每个月的实际天数。其他的就是主要一下输入的格式什么的。

 

 

 

 

import java.util.Scanner;
class Main {
//主函数
public static void main(String[] args) {
Scanner x = new Scanner(System.in);
int year = x.nextInt();
int month = x.nextInt();
int day = x.nextInt();
nextDate(year,month,day);
}
//判断year是否为闰年,返回boolean类型
public static boolean isLeapYear(int year) {
boolean isLeapYear;
isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
//判断输入日期是否合法,返回布尔值
public static boolean checkInputValidity(int year,int month,int day) {
boolean checkInputValidity;
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(!isLeapYear(year))
a[2] = 28;
checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0);
return checkInputValidity;
}
//求输入日期的下一天
public static void nextDate(int year,int month,int day) {
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int d=0,m=0;
if(!isLeapYear(year))//如果不是闰年
a[2] = 28;
if(checkInputValidity(year,month,day)) {//如果输入的数字合法
if(month==12) {//如果是12月
if(day==a[month]) {//如果是12月的最后一天
year = year+1;
m = 1;
d=1;
}
else{//如果不是12月的最后一天
m=month;
d =day +1;
}
}
else {//如果不是12月
if(day==a[month]) {//如果是该月的最后一天
m = month + 1;
d = 1;
}
else{//如果不是该月的最后一天
m=month;
d = day+1;
}
}
System.out.println("Next date is:"+year+"-"+m+"-"+d);
}
else//如果输入的数字非法
System.out.println("Wrong Format");
}
}

 

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:年-月-日”

 

 

设计与分析:

首先是要符合实际情况,前n天要主要是否在前一个月,前一年。存在特殊情况要另外处理。

import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean f=true;
int y=0,m=0,d=0,n=0;
if (sc.hasNextInt())
y= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
m= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
d= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
n= sc.nextInt();
else
f=false;

if (checkInputValidity(y,m,d,n)&&f){
nextDate(y,m,d,n);
}else
System.out.println("Wrong Format");

}

public static boolean isLeapYear(int year) {
boolean ret=false;
if ((year%100!=0&&year%4==0)||(year%400==0)){
ret=true;
}
return ret;
}

public static boolean checkInputValidity(int year,int month,int day,int n){
boolean ret=false;
int[] mm={31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[1]=29;
if ((year>=1820&&year<=2020)&&(month>=1&&month<=12)&&(day>=1&&day<=mm[month-1])){//此处的month-1用来判断不同年份的不同月份的数据是否合法
ret=true;
}
return ret;
}

public static void nextDate(int year,int month,int day,int n) {
int[] mm={0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[2]=29;
day-=n;
if (n>0){
while (day<=0){

month--;
if (month==0){//这边因为是mm有0的索引,因此要提前判断是否等于0
month+=12;
year--;
}
day+=mm[month];
}
}else if (n<0){
while (day>mm[month]) {
day-=mm[month];
month++;
if (month==13){
month-=12;
year++;
}
}
}
System.out.printf("%d days ago is:%d-%d-%d\n",n,year,month,day);
}
}

 

7-2 定义日期类 (28 分)

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:
当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

设计与分析:这题从面向过程转变为面向对象,依旧是要注意边界的问题,跨月或者跨年都要考虑。

 

 

import java.util.Scanner;
//Date类
class Date{
static int year;
static int month;
static int day;
int[] maxnum=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
//创建年月日的构造方法
public Date(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}

public Date() {
int year,month,day;
}

//getter
public int getYear(){
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
//setter
public void setYear(int year) {
this.year = year;
}
public void setMonth(int month) {
this.month = month;
}
public void setDay(int day) {
this.day = day;
}
//判断year是否为闰年
public static boolean isLeapYear(int year) {
boolean isLeapYear;
isLeapYear = ((year % 4 == 0 && year % 100 !=0 )||year % 400 == 0);
return isLeapYear;
}
//判断输入日期是否合法
public static boolean checkInputValidity(int year, int month, int day) {
boolean checkInputValidity;
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(!isLeapYear(year))
a[2] = 28;
checkInputValidity = (year>=1900&&year<=2000&&month>0&&month<=12&&day<=a[month]&&day>0);
return checkInputValidity;
}
//得到下一天
public static void getnextDate(int year,int month,int day) {
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int d=0,m=0;
if(!isLeapYear(year))//如果不是闰年
a[2] = 28;
if(checkInputValidity(year,month,day)) {//如果输入的数字合法
if(month==12) {//如果是12月
if(day==a[month]) {//如果是12月的最后一天
year = year+1;
m = 1;
d=1;
}
else{//如果不是12月的最后一天
m=month;
d =day +1;
}
}
else {//如果不是12月
if(day==a[month]) {//如果是该月的最后一天
m = month + 1;
d = 1;
}
else{//如果不是该月的最后一天
m=month;
d = day+1;
}
}
System.out.println("Next day is:"+year+"-"+m+"-"+d);
}
else//如果输入的数字非法
System.out.println("Date Format is Wrong");
}
}
//主类
public class Main {
//主函数
public static void main(String[] args) {
Scanner x=new Scanner(System.in);
Date rq=new Date();
rq.setYear(x.nextInt());//得到年份
rq.setMonth(x.nextInt());//得到月份
rq.setDay(x.nextInt());//得到天

rq.getnextDate(rq.getYear(), rq.getMonth(),rq.getDay());

}

}

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
 
 
设计与分析:这题一眼看上去就很复杂,结果自己写了 问题很大,
主要学到了正则表达式。进行多项式求倒如果来看的话不难,但是如果要把
思想变成编程语言并且正确解答的话却是非常南的一件事了,首先我们
先要把需要输入的数据输入一个字符串当中然后利用正则表达式把其中
的数字截取出来但是当遇到前面为x时他的系数是不会显示出来的那么
怎么办呢?我就认为可以把这个多项式那里面不显现出来的所有一都
变为1*x^1的形式那么这个问题就解决了但是测试中的大数是不可能
用int、float、double、longlong来进行存储的,那么这是我们就要用
到 BigInteger构造器 了只有这样我们才能进行大数的加减乘除了最后把答案输出。
 
没怎么写出来。
 

四、改进建议

 

7-2 7-5自己写的代码过于复杂,(废话很多)复杂度高,而且看起来很费劲,

即便自己写过一次阅读起来也很麻烦。

多学习一些网上比较好的写法。

尽量减少if else,改用case,这样看起来会比较清晰。

正则表达式没有记住很多,还要多多学习这方面的东西。

写题目要更加仔细,减少一些小错误。

五、总结

 

通过本阶段的学习学到了java的基本语法,(方法,类)学到了正则表达式。。

对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。没有意见

 

posted on 2021-10-15 22:55  192072  阅读(42)  评论(0编辑  收藏  举报