第一次blog
Blog1
前言:
经过前三次的pta作业,我总结出前三次的知识点有:
- 如何从键盘输入数据,并传输给所写程序。
- 通过if else等语句,实现多轮输出。
3.学会如何使用float语句,进行对题目所要求的金额进行计算。
4.学习通过System.out语句进行输出。
5.使用一维数组,实现对数据的存储,进行计算平均值。
6.通过多重if语句,实现对不同数据的判断。
7.初步学会使用类和方法。
8.使用对类的使用实现对main()的实例化。
9.使用private函数对数据进行声明以及初始化。
设计与分析:
题目集1 (7—8):
题目:输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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) {
Scanner x=new Scanner(System.in);
double a,b,c,temp;
a=x.nextFloat();b=x.nextFloat();c=x.nextFloat();
if(a>b)
{
temp=a;a=b;b=temp;
}
if(b>c)
{
temp=b;b=c;c=temp;
}
if(a>c)
{
temp=a;a=c;c=temp;
}
if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200)
{
if(a+b>c)
{
if(a==b&&b==c)
System.out.println("Equilateral triangle");
else if(a*a+b*b-c*c<0.000001&&a==b)
System.out.println("Isosceles right-angled triangle");
else if(a*a+b*b-c*c<0.000001)
System.out.println("Right-angled triangle");
else if((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a))
System.out.println("Isosceles triangle");
else
System.out.println("General triangle");
}
else
System.out.println("Not a triangle");
}
else
System.out.println("Wrong Format");
}
}
该题目要求我们根据输入的三个数字判断是否能构成三角形且能构成什么三角形。这对于我来说,无非是基础语法的判断语句 if else 的使用。 先判断是否能构成三角形,在进行等边,等腰直角,等腰,直角,普通三角形的判断。最开始时,我首先判断的是等腰,在判断它是否为直角三角形,但是这样后面很麻烦,还要进行直角三角形的判断,代码行数多,且思路复杂,结构乱。于是重新改写后使用以下代码,结构相对简单。这道题我遇到最大的问题为double类型数精度的判定,这道题目doubel类型数进行了平方运算,导致了精度问题,最开始时,我的思路为直接相等,但是测试点过不去,经过查询后得知,判断double超多位小数时,应考虑精度问题,及默认为两数相减小于0.000001时为相等,这是因为double为二进制计数,会产生精度丢失。第一次遇到这种精度问题,对我帮助很大。
题目集2 (7—4,7—5)
题目7—4:输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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) ; //求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
源代码:import java.util.Scanner;
public class Main {
public static boolean isLeapYear(int year) {
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public static void nextDate(int year,int month,int day) {
int[] aa=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
aa[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==aa[month]) {
a = year+1;
b = 1;
c = 1;}
if(day>0&&day<aa[month])
{a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==aa[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<aa[month])
{a = year;
b = month;
c = day+1;
}
}
System.out.println("Next date is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
public static boolean checkInputValidity(int year,int month,int day) {
int[] aa=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
aa[2] = 29;
boolean checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=aa[month]&&day>0);
return checkInputValidity;
}
public static void main(String[] args) {
Scanner LJY = new Scanner(System.in);
Main ljy = new Main();
int year = LJY.nextInt();
int month = LJY.nextInt();
int day = LJY.nextInt();
ljy.nextDate(year,month,day);
}
}
分析:该题要求我们进行对所输入日期的下一天进行求解,这就意味着我们需要考虑多种特殊情况。类似与闰年,跨年,各种不同月份的输出日期需要不同情况的考虑,在我的眼中,如果使用ifelse语句将会使程序变得特别复杂,所以我使用数组,对大量数据进行存储,我将每一天的数据都存入数组之中,这样在后期的使用中可以直接调用数组进行输出。如果要判断下一天的日期,就不得不考虑月份的天数。跨月份和跨年分是我们必须得考虑的地方。
题目(7—5)
输入年月日的值(均为整型数),同时输入一个取值范围在[-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) {
int i=0,a=0,b=0,c=0,n=0,f=0,g=0;
Scanner sc = new Scanner(System.in);
a=sc.nextInt();
if(!(a>=1820&&a<=2020))
{
System.out.println("Wrong Format");
}
else
{
b=sc.nextInt();
if(!(b>=1&&b<=12))
{
System.out.println("Wrong Format");
}
else
{
c=sc.nextInt();
switch(b)
{
case 12:
case 10:
case 8:
case 7:
case 5:
case 3:
case 1:
if(!(c>=1&&c<=31))
g=1;
break;
case 11:
case 9:
case 6:
case 4:
if(!(c>=1&&c<=30))
g=1;
break;
case 2:
if((a%4==0&&a%100!=0)||a%400==0)
{
if(!(c>=1&&c<=29))
g=1;
}
else
{
if(!(c>=1&&c<=28))
g=1;
}
break;
}
if(g==1)
{
System.out.println("Wrong Format");
}
else
{
n=sc.nextInt();
if(!(n>=-10&&n<=10))
{
System.out.println("Wrong Format");
}
else
{
if(n>0)
{
if(n<c)
{
System.out.println(n+" days ago is:"+a+"-"+b+"-"+(c-n));
}
else if(n==c)
{
if((a%4==0&&a%100!=0)||a%400==0)
f=1;
switch(b)
{
case 1:
System.out.println(n+" days ago is:"+(a-1)+"-"+12+"-"+31);
break;
case 11:
case 9:
case 8:
case 6:
case 4:
case 2:
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+31);
break;
case 3:
if(f==1)
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+29);
else
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+28);
break;
case 12:
case 10:
case 7:
case 5:
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+30);
break;
}
}
else
{
if((a%4==0&&a%100!=0)||a%400==0)
f=1;
switch(b)
{
case 1:
System.out.println(n+" days ago is:"+(a-1)+"-"+12+"-"+(31-n+c));
break;
case 11:
case 9:
case 8:
case 6:
case 4:
case 2:
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+(31-n+c));
break;
case 3:
if(f==1)
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+(29-n+c));
else
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+(28-n+c));
break;
case 12:
case 10:
case 7:
case 5:
System.out.println(n+" days ago is:"+a+"-"+(b-1)+"-"+(30-n+c));
break;
}
}
}
else if(n==0)
{
System.out.println(n+" days ago is:"+a+"-"+b+"-"+(c-n));
}
else
{
if(c-n<=31)
{
if((a%4==0&&a%100!=0)||a%400==0)
f=1;
switch(b)
{
case 12:
case 10:
case 8:
case 7:
case 5:
case 3:
case 1:
System.out.println(n+" days ago is:"+a+"-"+b+"-"+(c-n));
break;
case 2:
if(f==1)
{
if(c-n<=29)
{
System.out.println(n+" days ago is:"+a+"-"+b+"-"+(c-n));
}
else
{
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-29));
}
}
else
{
if(c-n<=28)
{
System.out.println(n+" days ago is:"+a+"-"+b+"-"+(c-n));
}
else
{
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-28));
}
}
break;
case 11:
case 9:
case 6:
case 4:
if(c-n<=30)
{
System.out.println(n+" days ago is:"+a+"-"+b+"-"+(c-n));
}
else
{
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-30));
}
break;
}
}
else
{
if((a%4==0&&a%100!=0)||a%400==0)
f=1;
switch(b)
{
case 10:
case 8:
case 7:
case 5:
case 3:
case 1:
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-31));
break;
case 2:
if(f==1)
{
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-29));
}
else
{
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-28));
}
break;
case 11:
case 9:
case 6:
case 4:
System.out.println(n+" days ago is:"+a+"-"+(b+1)+"-"+(c-n-30));
break;
case 12:
System.out.println(n+" days ago is:"+(a+1)+"-"+1+"-"+(c-n-31));
break;
}
}
}
}
}
}
}
}
}
第五题与第四题区别不大,但是得考虑是否会产生负数的情况,得注意是否会回到上一年的情况,如果存在,就得更改情况进行输出。
题目集3:
题目(7—2):定义一个类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);
Main ma=new Main();
ma.year=in.nextInt();
ma.month=in.nextInt();
ma.day=in.nextInt();
if(checkInputValidity(ma.year,ma.month,ma.day)==true&&1900<=ma.year&&2000>=ma.year)
{
System.out.printf("Next day is:");
getnextDate(ma.year,ma.month,ma.day);
}
else
System.out.println("Date Format is Wrong");
}
private int year;
private int month;
private int day;
public int getyear()
{
return year;
}
public void setYear(int year)
{
this.year=year;
}
public int getMonth()
{
return month;
}
public void setMonth(int month)
{
this.month=month;
}
public int getDay()
{
return day;
}
public void setDay(int day)
{
this.day=day;
}
public static boolean checkInputValidity(int year,int month,int day)
{
boolean result=true;
int commonMonth []=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
int leapMonth []=new int[] {0,31,29,31,30,31,30,31,31,30,31,30,31};
if(1900>year||year>2000||month<1||month>12||day<1||day>31)
return false;
if(isLeapYear(year)==true)
if(leapMonth[month]<day)
result=false;
if(isLeapYear(year)==false)
if(commonMonth[month]<day)
result=false;
return result;
}
public static boolean isLeapYear(int year)
{
boolean result;
if(year%400==0||(year%4==0&&year%100!=0))
result=true;
else
result=false;
return result;
}
public static void getnextDate(int year,int month,int day)
{
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
if(day==31)
{
month++;day=1;System.out.println(year+"-"+month+"-"+day);
}
else
{
day++;
System.out.println(year+"-"+month+"-"+day);
}
}
else if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
month++;day=1;System.out.println(year+"-"+month+"-"+day);
}
else
{
day++;System.out.println(year+"-"+month+"-"+day);
}
}
if(month==2&&isLeapYear(year)==true)
{
if(day==29)
{
month++;day=1; System.out.println(year+"-"+month+"-"+day);
}
else
{ day++;System.out.println(year+"-"+month+"-"+day);}
}
if(month==2&&isLeapYear(year)==false)
{
if(day==28)
{
month++;day=1;System.out.println(year+"-"+month+"-"+day);
}
else
{day++; System.out.println(year+"-"+month+"-"+day);}
}
if(month==12)
{
if(1<=day&&day<=30)
{
day++;
System.out.println(year+"-"+month+"-"+day);
}
else
{
month=1;year++;day=1;
System.out.println(year+"-"+month+"-"+day);
}
}
}
}
做着一体的要求就必须得学会如何使用类,得先声明date类,并且得在主类中进行生名day month year,是为定义私有属性。使用ifelse语句与题目集7—4相同,但却与其不相同,因为使用了类,所以得在主函数中实现对其的实例化。
踩坑心得:
因为是第一次接触java类函数,我还是有许多不会的地方,类似于测试点中小数点的问题我时常缺漏,经常会导致测试中的无效边界测试点过不了,虽然我对类的使用还是不熟练,但我体会到了Java类中的方便之处。
改进意见:
Java编程十分的快捷与易理解,但是对于过于复杂的函数,我任然无法学会,以我们现在的学习精度,无法处理过于难的函数问题。我任然要学会如何对类的使用,才能对Java程序的方便快捷的编辑。
总结:
- 初步学会对java程序的编程。
- 做题目时不能轻易放弃,需要对题目进行更加深刻的思考。
- 任然要加强对正则表达式的学习。
- 建议老师出一些较为简单的题目集,让我们这类基础薄弱的学生可以解决。

浙公网安备 33010602011771号