题集1—3的总结性Blog
好的,这是我第一次在博客这种大型网站上发布我对于java的认知和感悟,新手上路,请多关照,若有错误之处,望君谅解并指出。废话不多说,现在就总结一下从开学以来部分做过的题及遇到的困难。
题目集1 7-8
1.这到在题目集压轴的题。咋一看不难,写起来确实也不难,但还是在一些细节上总是过不去。我的大致思路是筛选掉不符合三角形定理任意两边大于第三边的输入数据,之后通过边的相等条数对输入数值的三角形进行判断,三边相等为等边、两边相等且两边的平方之和等于第三边平方为直角等腰,两边平方之和等于第三边平方为直角,不符合上述的为普通三角形,用 if else 语句层层筛选。谁能想到想法没错,但输入的数据为float类型,比较两个数是否相等不能直接用等号比较(应该是精度问题),提交后会错误百出,在c语言里可是没这种情况的,那该怎么办,我在网上查怎么比较两个浮点数的大小,发现要用两数进行相减,并判断两数的差值小于0.000001,但最终我还是有三个答案错误,只得了17分。


下面为源码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
float a=input.nextFloat();
float b=input.nextFloat();
float c=input.nextFloat();
if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200)
{
if(a+b<c || a+c<b || c+b<a)
{
System.out.println("Not a triangle");
return ;
}
else if(a==b&&a==c&&b==c)//等边
{
System.out.println("Equilateral triangle");
return ;
}
else if((a==b&&a*a+b*b-c*c<0.0000010) || (a==c&&a*a+c*c-b*b<0.0000010) || (b==c&&b*b+c*c-a*a<0.0000010))//等腰直角
{
System.out.println("Isosceles right-angled triangle");
return ;
}
else if((a*a+b*b-c*c<0.0000010)||(a*a+c*c-b*b<0.0000010)||(b*b+c*c-a*a<0.0000010))//直角
{
System.out.println("Right-angled triangle");
return ;
}
else if(a==b||a==c||b==c)
{
System.out.println("Isosceles triangle");
return ;
}
else{
System.out.println("General triangle");
return ;}
}
else
{
System.out.println("Wrong Format");
return ;
}
}
}
题目集1 7-2
1、刚刚看了一下题目集一,发现这题也让我学到了一些东西,就像这个char inputChar =scan.next().charAt(0);它能任意获得输入字符串的对应位数的字符,但是写这道题首先的想法就是根据判断输入字符的范围输出相应的数字,但是看到输入多个位数只能去第一位时我傻了,输入的是字符串我怎么能像数组一样取它第一位呢,在查阅相关资料后我找到了上面的函数和char[] arr=line.toCharArray();两个函数,开始为了简单就选了第一个,不得不说java中有太多特殊作用的函数了,了解的话做题太方便了。

下面是这道题的源码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
char inputChar =scan.next().charAt(0);
if((inputChar>='a'&&inputChar<='z')||(inputChar>='A'&&inputChar<='Z'))
{
if(( inputChar>='A'&& inputChar<='C')||(inputChar>='a'&&inputChar<='c'))
System.out.println("2");
else if((inputChar>='D'&&inputChar<='F')||(inputChar>='d'&&inputChar<='f'))
System.out.println("3");
else if((inputChar>='G'&&inputChar<='I')||(inputChar>='g'&&inputChar<='i'))
System.out.println("4");
else if((inputChar>='J'&&inputChar<='L')||(inputChar>='j'&&inputChar<='l'))
System.out.println("5");
else if((inputChar>='M'&&inputChar<='O')||(inputChar>='m'&&inputChar<='o'))
System.out.println("6");
else if((inputChar>='P'&&inputChar<='S')||(inputChar>='p'&&inputChar<='s'))
System.out.println("7");
else if((inputChar>='T'&&inputChar<='V')||(inputChar>='t'&&inputChar<='v'))
System.out.println("8");
else
System.out.println("9");
}
else
System.out.println(inputChar+" is an invalid input");
scan.close();
}
}
题集2. 7-4
1、这题写了我挺久时间的,它要把所有下一天的情况考虑进来,它可能跳出当前月份,也可能跨年,由于输入的年份有可能是闰年或平年,2月的天数不同,每个月的天数也不尽相同,故需要生成两个数组各自保存闰年和平年一年12个月的天数,根据输入的月份和天数进行对应的变换。遇到困惑是在判断是否为闰年的函数public static boolean isLeapYear(int year) //判断闰年 这里,当时我不知道返回布尔类型是啥,上网一查发现布尔值只有 ture 和 false两种,才知道返回它们就好,另外我也顺便学习了 if( isLeapYear( year))这个语句相当与 if(isLeapYear(year)==ture)。

下面为源码:
import java.util.Scanner;
public class Main{
public static boolean isLeapYear(int year) //判断闰年
{
if( (year%4==0&&year%100!=0)||year%400==0 )//true;false;
return true;
else
return false;
}
public static boolean checkInputValidity(int year,int month,int day) //是否合法
{
int d1[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int d2[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
{
if(year<1820||year>2020||month<1||month>12||day<1||day>31||day>d2[month])
return false;
else
return true;
}else{
if(year<1820||year>2020||month<1||month>12||day<1||day>31||day>d1[month])
return false;
else
return true;
}
}
public static void nextDate(int year,int month,int day)
{
int d3[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int d4[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int a,b;
if( isLeapYear( year))
{
if(day<d4[month])
{
a=day+1;
System.out.println("Next date is:"+year+"-"+month+"-"+a);
}
else if(day==d4[month]&&month!=12)
{
b=month+1;
System.out.println("Next date is:"+year+"-"+b+"-1");
}
else
{
a=year+1;
System.out.println("Next date is:"+a+"-"+"1-1");
}
}
else
{
if(day<d3[month])
{
a=day+1;
System.out.println("Next date is:"+year+"-"+month+"-"+a);
}
else if(day==d3[month]&&month!=12)
{
b=month+1;
System.out.println("Next date is:"+year+"-"+b+"-1");
}
else
{
a=year+1;
System.out.println("Next date is:"+a+"-"+"1-1");
}
}
}
public static void main(String[] args)
{
Scanner input =new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
int c=input.nextInt();
if( checkInputValidity(a,b,c))//合法
{
nextDate(a,b,c);
}
else//不合法
{
System.out.println("Wrong Format");
}
}
}
题目集2. 7-5
这道题和7-4有很多相同之处,可以说大部分把复制过来,将求下一天的函数修改一下即可,因为它分为得到前n天的日期和后n天的日期,一要考虑1月和12月这两个特殊的月份,在这两个月的前n天、后n天都可能会跨年,另外还要考虑后n天或前n天天数少于或多与当前月份的情况,可以说详细一条条写出来这些真的要有耐心和细心,但有上一道题垫底,难度下降了很多。

下面为该题代码:
import java.util.Scanner;
public class Main{
public static boolean isLeapYear(int year) //判断闰年
{
if( (year%4==0&&year%100!=0)||year%400==0 )//true;false;
return true;
else
return false;
}
public static boolean checkInputValidity(int year,int month,int day) //是否合法
{
int d1[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int d2[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
{
if(year<1820||year>2020||month<1||month>12||day<1||day>31||day>d2[month])
return false;
else
return true;
}else{
if(year<1820||year>2020||month<1||month>12||day<1||day>31||day>d1[month])
return false;
else
return true;
}
}
public static void nextDate(int year,int month,int day,int shu)
{
int d3[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int d4[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int a,b;
if( isLeapYear( year))//闰年
{
if(shu<0)//往后
{
if((day-shu)<=d4[month])//小于当月
{
a=day-shu;
System.out.println(shu+" days ago is:"+year+"-"+month+"-"+a);
}
else if((day-shu)>d4[month]&&month!=12)//跨月但不跨年
{
a=month+1;
b=day-d4[month]-shu;
System.out.println(shu+" days ago is:"+year+"-"+a+"-"+b);
}
else//跨年又跨月
{
a=year+1;
b=day-d4[month]-shu;
System.out.println(shu+" days ago is:"+a+"-1-"+b);
}
}
else//往前
{
if((day-shu)>0)//没跨月
{
a=day-shu;
System.out.println(shu+" days ago is:"+year+"-"+month+"-"+a);
}
else if((day-shu)<=0&&month!=1)//跨月但不跨年
{
a=month-1;//月份
b=d4[month-1]+day-shu;//天数
System.out.println(shu+" days ago is:"+year+"-"+a+"-"+b);
}
else//跨年又跨月
{
a=year-1;
b=d4[12]+day-shu;
System.out.println(shu+" days ago is:"+a+"-12-"+b);
}
}
}
else//平年
{
if(shu<0)//往后
{
if((day-shu)<=d3[month])//小于当月
{
a=day-shu;
System.out.println(shu+" days ago is:"+year+"-"+month+"-"+a);
}
else if((day-shu)>d3[month]&&month!=12)//跨月但不跨年
{
a=month+1;
b=day-d3[month]-shu;
System.out.println(shu+" days ago is:"+year+"-"+a+"-"+b);
}
else//跨年又跨月
{
a=year+1;
b=day-d3[month]-shu;
System.out.println(shu+" days ago is:"+a+"-1-"+b);
}
}
else//往前
{
if((day-shu)>0)//没跨月
{
a=day-shu;
System.out.println(shu+" days ago is:"+year+"-"+month+"-"+a);
}
else if((day-shu)<=0&&month!=1)//跨月但不跨年
{
a=month-1;//月份
b=d3[month-1]+day-shu;//天数
System.out.println(shu+" days ago is:"+year+"-"+a+"-"+b);
}
else//跨年又跨月
{
a=year-1;
b=d3[12]+day-shu;
System.out.println(shu+" days ago is:"+a+"-12-"+b);
}
}
}
}
public static void main(String[] args)
{
Scanner input =new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
int c=input.nextInt();
int d=input.nextInt();
if( checkInputValidity(a,b,c)&&d>=(-10)&&d<=10)//合法
{
nextDate(a,b,c,d);
}
else//不合法
{
System.out.println("Wrong Format");
}
}
}
题目集3. 7-2
1、刚看到这题时有点懵,被这一大堆的函数给震住了,题目要求创建个类,类是什么?为了了解这个“类”我查阅了csdn上关于类的专栏,原来类是个对象,它有很多属性,要修改或得到这些属性需要getter() 和 setter() 两个函数共同协作,在main()函数里需要它时要创建一个新的类new+类名 ,之后对它进行赋值或者其他操作,另外在类中set 或 get 某个属性信息时要用到this.属性名,否则系统可能报错,含static的函数不能和main()放在一起,因为static在main中只能存在一个。

以下为该题代码:
import java.util.Scanner;
public class Main{
private int year;
private int month;
private int day;
public void setYear(int year){
this.year=year;
}
public int getYear(){
return year;
}
public void setMonth(int month){
this.month=month;
}
public int getMonth(){
return month;
}
public void setDay(int day){
this.day=day;
}
public int getDay(){
return day;
}
public static boolean isLeapYear(int year) //判断闰年
{
if( (year%4==0&&year%100!=0)||year%400==0 )//true;false;
return true;
else
return false;
}
public static boolean checkInputValidity(int year,int month,int day) //是否合法
{
int d1[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int d2[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
{
if(year<1900||year>2000||month<1||month>12||day<1||day>31||day>d2[month])
return false;
else
return true;
}else{
if(year<1900||year>2000||month<1||month>12||day<1||day>31||day>d1[month])
return false;
else
return true;
}
}
public static void nextDate(int year,int month,int day)
{
int d3[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int d4[]=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int a,b;
if( isLeapYear( year))
{
if(day<d4[month])
{
a=day+1;
System.out.println("Next day is:"+year+"-"+month+"-"+a);
}
else if(day==d4[month]&&month!=12)
{
b=month+1;
System.out.println("Next day is:"+year+"-"+b+"-1");
}
else
{
a=year+1;
System.out.println("Next day is:"+a+"-"+"1-1");
}
}
else
{
if(day<d3[month])
{
a=day+1;
System.out.println("Next day is:"+year+"-"+month+"-"+a);
}
else if(day==d3[month]&&month!=12)
{
b=month+1;
System.out.println("Next day is:"+year+"-"+b+"-1");
}
else
{
a=year+1;
System.out.println("Next day is:"+a+"-"+"1-1");
}
}
}
public static void main(String[] args)
{
Scanner input =new Scanner(System.in);
Main date=new Main();
int a=input.nextInt();
date.setYear(a);
int b=input.nextInt();
date.setMonth(b);
int c=input.nextInt();
date.setDay(c);
if( checkInputValidity(date.getYear(),date.getMonth(),date.getDay()))//合法
{
nextDate(date.getYear(),date.getMonth(),date.getDay());
}
else//不合法
{
System.out.println("Date Format is Wrong");
}
}
}
题目集3. 7-3
1.这是最难的一题,因为这道题的题目要求让我眼花缭乱,我本想从用户输入下手但是想到输入的字符串含空格,我需要把字符串toArray后用for遇到空格就将后面的提前一格,但输入的格式我不知道该怎么判断,当时确实不知道什么正则表达式,只在想将输入的字符一个个匹配,但想了一下输入位数未知根本不可能的,所以我没写这题。

小结:通过这几次的作业,在java方面学到了很多,学到了它的一些基本的语法,算法,一些含有特定功能的函数,Java的类的结构,类的用法等。但是我觉得我自己没有对这些函数进行相关的练习,所以要用他们的时候记不得了、打不出了,只是脑中有这个函数。另外在写java程序时总觉的有种照葫芦画瓢的感觉,只是对着写过的程序代码来写,对java语句表示的概念和结构的理解有些朦胧,应该自己多练习多了解吧。
老师方面:感觉老师讲的理论的东西太枯燥了也可能讲的太专业了,我有些听不来,但我还是想建议老师布置作业的时候如果有比较难的题能提前讲下它的关键,像前面的正则表达式,提一下也行。不然我都不知道有这个东西,我也清楚程序这个东西根本靠老师讲是不太容易理解的 ,自己得动手实践,mooc和其它网站上的优质视频有很多,不能居于一隅不是,慢慢积累的过程才重要。
浙公网安备 33010602011771号