三次题集总结

对于我来说java一点也不陌生,很遗憾吧。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2]  。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。他在当今的社会也是非常的使用,我看了下今年程序员相关工作,java工程师则是占了35%,则也是相当大的占比,所以这也是体现了其的重要性。可能是有点内卷,但是一点也不妨碍我们去学好他。

 

 前言:观察所有的1-3的题集,因为老师通知晚,所以选课也较晚的原因,第一次题集我们也是错过了,不过我们看题目以后,相对而言,第一次的题目可能简单一些,也可能时刚入门学习java的原因,题目量和代码量也不是很多。而题集二和题集三则相对而言要复杂一点点,第一次时给我们练练手,提点学java的兴趣,第二则是让我们学会分析问题,考虑问题,从不同的角度去解决问题。而题集三则是在前面的基础下,让我们学会对一些类的结合使用,加深我们都类的理解和运用。

1. 题目集一

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

分析与心得: 先给输入的三条边排好序,可以减少很多判断。 使用x2+y2=z2x2+y2=z2判断直角三角形时,若为浮点数会出现浮点误差无法相等。如2–√2

核心代码:

package 软件测试1;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
import java.lang.Math;
public class triangle {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
System.out.println("输入三角形的三边");
System.out.println("第一条边为:");
String a=input.nextLine();
if(!check(a))
{
System.out.println("输入数据非法");
System.exit(0);
}

System.out.println("第二条边为:");
String b=input.nextLine();
if(!check(b))
{
System.out.println("输入数据非法");
System.exit(0);
}
System.out.println("第三条边为:");
String c=input.nextLine();
if(!check(c))
{

System.out.println("输入数据非法");
System.exit(0);
}


float num1 = Float.parseFloat(a);
float num2 = Float.parseFloat(b);
float num3 = Float.parseFloat(c);
if((num1+num2<=num3)||(num1+num3<=num2)||(num2+num3<=num1)){
System.out.println("这不是三角形!");
}else if(num1==num2 && num2==num3){
System.out.println("这是正三角形!");
}else if(num1==num2||num2==num3||num1==num3){
System.out.println("这是等腰三角形!");
}else if(num1*num1==num2*num2+num3*num3 || num2*num2==num1*num1+num3*num3 || num3*num3==num1*num1+num2*num2){
System.out.println("这是直角三角形!");
}else if((num1*num1+num2*num2>num3*num3)||(num1*num1+num3*num3>num2*num2)||(num2*num2+num3*num3>num1*num1)){
System.out.println("这是普通三角形!");
}else if((num1*num1+num2*num2<num3*num3)||(num1*num1+num3*num3<num2*num2)||(num2*num2+num3*num3<num1*num1)){
System.out.println("这是普通三角形!");
}
}


public static boolean check(String d) {
if(isNum(d))
{
float num = Float.parseFloat(d);
if(num<200&&num>0)

return true;}

return false;

}
public static boolean isNum(String str){
Pattern pattern = Pattern.compile("([1-9]\\d*)|([1-9]\\d*\\.\\d*)|(0\\.\\d*[1-9]\\d*)");
Matcher isNum = pattern.matcher(str);
if( !isNum.matches() ){
return false;
}
return true;
}
}

分析:因为发放这道题目的时候,我们当时还没选课,可能有点遗憾,但是还是写过类似的题目,其代码如上,这道题目总的来说则是利用三角判定公式,对输入的三角形三边进行判定是哪一种三角形,前提当然也是在数据合理的情况下,对于数据的合法判定我则是利用了正则表达式来判定,也是相当方便的。

 

                                                                                                                                                                 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;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.*;
public class Main {
public static void main(String[] args) {
while(true) {
Scanner input = new Scanner(System.in);
String date = input.nextLine();
String[] time = date.split(" ");
int[] arr2 = new int[3];
int[] arr3 = new int[3];
int[] arr = new int[3];
boolean flag = true;
// ArrayList arr3= new ArrayList();
if (time.length != 3) {
System.out.println("Wrong Format");
flag = false;}
for (int i = 0; i < 3 && flag == true; i++) {
if (isNum(time[i]) == false) {
System.out.println("Wrong Format");
flag = false; }}
if (flag == true) {
for (int i = 0; i < 3; i++) {
arr[i] = Integer.parseInt(time[i]);}
if (check(arr) == false) {
System.out.println("Wrong Format");
flag = false; }}
if (flag == true) {
arr3 = numOfDays(arr);
System.out.println("Next date is:" +arr3[0] + "-" + arr3[1] + "-" + arr3[2] );
} } }
public static boolean isLeapYear(String year)
{Pattern pattern = Pattern.compile("([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])");
Matcher isNum = pattern.matcher(year);
if (!isNum.matches()) {
return false;}
return true;}
public static int []numOfDays(int arr[])
{
int[] arr2 = new int[3];
int nextYear ,nextMonth, nextDay;
if (((arr[0] % 4 != 0 || arr[0] % 100 == 0 && arr[0] % 400 != 0) && (arr[1] == 2 && (arr[2] == 28))
|| (arr[0] % 4 == 0 && arr[0] % 100 != 0 || arr[0] % 400 == 0) && ((arr[1] == 2) && (arr[2] == 29)))) {
nextYear = arr[0]; nextMonth = arr[1] + 1; nextDay = 1;
} else if (arr[1] == 12 && arr[2] == 31) {
nextYear = arr[0] + 1;nextMonth = 1;nextDay = 1;
}
else if ((arr[1] == 1 || arr[1] == 3 || arr[1] == 5 || arr[1] == 7 || arr[1] == 8 || arr[1] == 10)&& arr[2] == 31) {
nextYear = arr[0];nextMonth = arr[1] + 1;nextDay = 1;
} else if ((arr[1] == 4 || arr[1] == 6 || arr[1] == 9 || arr[1] == 11) && arr[2] == 30) {
nextYear = arr[0];
nextMonth = arr[1] + 1;
nextDay = 1;
} else {
nextYear = arr[0];
nextMonth = arr[1];
nextDay = arr[2] + 1; }
arr2[0] = nextYear;arr2[1] = nextMonth; arr2[2] = nextDay;
return arr2;
}
public static boolean check(int[] arr) {
if (arr[0] > 2020 || arr[0] < 1820)
return false;
if (arr[1] > 12 || arr[1] < 1)
return false;
if (arr[2] > 31 || arr[2] < 1)
return false;
if ((arr[1] == 2 && ( arr[2] == 30 || arr[2] == 31)
|| (arr[1] == 4 || arr[1] == 6 || arr[1] == 9 || arr[1] == 11) && arr[1] == 31)
|| (arr[0] % 4 != 0 || arr[0] % 100 == 0 && arr[0] % 400 != 0)
&& ((arr[1] == 2) && (arr[2] == 29||arr[2] == 30 || arr[2] == 31))) {
System.out.println("Wrong Format");
return false; } return true;}
public static boolean isNum(String str) {
Pattern pattern = Pattern.compile("([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])");
// return pattern.matcher(str).matches();
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;}
return true;}}、

 

分析总结:对于这次求下一天,我首先想到的则是对3个数据进行处理,我也是将其存入数组中,对其进行一一输入,同时也是利用多个方法,对输入的数据合法性进行了判定,主要也是利用了布尔类型进行返回值,从而进行下一步的运行判定,我对于下一天的判定则是分大小月,闰年的二月和非闰年的二月,进行一一分开进行计算,然后再将year,month,day进行一一处理。但是题目集中还是一直存在平年29的错误,但是再Eclipse上并不会显示错误。

改进建议:一定要写注释,不只是写一个方法的作用,还要写清楚每一个通过名字看不出含义的变量的作用,以及一些重要判断,循环的作用,既让其他人更容易阅读,也让自己在代码出现问题时更好的查找,容易更正,提高效率。本题考查了平闰年的知识及逻辑的严密程度,该题涉及到多种情况需要我们考虑,对我们的细心程度是一极大考验。本题涉及到了方法的相关知识,本人认为java中的方法与c语言中的函数相似,都是拥有专一原则(即一个函数/方法只承担一个作用)。

                                                                                                                                                        7-5 求前N天 (30 分)
 

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“n days ago is:年-月-日”

部分代码如下

public static void getDate(int year,int month,int day,int n)
{
if(n>0)
{
if(day>n)
{
day=day-n;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day<n&&(month==2||month==4||month==6||month==8||month==9||month==11))
{
month=month-1;
day=31-n+day;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day<n&&(month==5||month==7||month==10||month==12))
{
month=month-1;
day=30-n+day;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day<n&&isLeapYear(year)==true&&month==3)
{
month=month-1;
day=29-n+day;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day<n&&isLeapYear(year)==false&&month==3)
{
month=month-1;
day=28-n+day;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else
{
year=year-1;
month=12;
day=31-n+day;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}

}
else
{
if(day+Math.abs(n)<=28)
{
day=day+Math.abs(n);
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day+Math.abs(n)>31&&month==1||month==3||month==5||month==7||month==8||month==10)
{
month=month+1;
day=Math.abs(n)+day-31;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day+Math.abs(n)>31&&month==4||month==6||month==9||month==11)
{
month=month+1;
day=Math.abs(n)+day-30;
}
else if(day+Math.abs(n)>29&&isLeapYear(year)==true&&month==2)
{
month=month+1;
day=Math.abs(n)+day-29;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else if(day+Math.abs(n)>28&&isLeapYear(year)==false&&month==2)
{
month=month+1;
day=Math.abs(n)+day-28;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}
else
{
year=year+1;
month=1;
day=Math.abs(n)+day-31;
System.out.println(n+" "+"days ago is:"+year+"-"+month+"-"+day);
}

 

分析:这道题目很显然,在上面题目的基础上,我的思路是设置一个量k,然后分k的正负,同时对年份和月份的区分,以及是否当前日期的月份天数是否大于K,然后在对数据进行处理,个人感觉还是有点复杂,这些数据处理起来.

总结:一些对多数据的处理问题,还是得保持清晰的头脑,细心的对数据进行处理。

 

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

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

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

类图.jpg

部分代码:

class Account {
private int id=0;
private double balance=0;
private double annuallnterstRate=0;
private LocalDate dataCreated=LocalDate.parse("2020-07-31");

public Account(int id,double balance) {
this.id=id;
this.balance=balance;
}

public double deposit(double posit) {
if((posit>20000)||(posit<0))
System.out.println("Deposit Amount Wrong");
else {
balance=balance+posit;}
return balance;

}
Account() {
}
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

public double getAnnuallnterstRate() {
return annuallnterstRate;
}

public void setAnnuallnterstRate(double annuallnterstRate) {
this.annuallnterstRate = annuallnterstRate;
}

public LocalDate getDataCreated() {
return dataCreated;
}

分析:这道题目写起来还是挺清晰的,主要是在前面写了题目的基础上,添加一些类的使用,学会一些setter和getter的使用,对数据的传输以及类的依赖使用.

类图如下

总结:还是得多多学习对类与类之间关系的使用

 

 

 

部分源码如下

  public static void main(String[] args){
          Scanner sc=new Scanner(System.in);
           String str="";
           int len=0,i=0,j=0,error=0,location=0,z=0,i1=0,location1=0,key=0,n=0,max;
           str=sc.nextLine();
           len=str.length();
          
          for(i=0;i<len-1;i++){
             if((int)str.charAt(i)>=48&&(int)str.charAt(i)<=57&&str.charAt(i+1)==' ')
                  for(j=i+1;j<len-1;j++)
                      if(str.charAt(j)==' '&&(int)str.charAt(j+1)>=48&&(int)str.charAt(j+1)<=57){
                         error=1;
                          break;
                      }         }      

              str = str.replaceAll(" ", "");     
              //重置长度
 len=str.length(); 
              //计算x的个数
              for(j=0;j<len;j++)
                      if(str.charAt(j)=='x')
                          n++;
             //判断是否为常数输入
             if(n==0)
                 error=2;
             //初始化一个二维数组用来储存系数和指数
             long[][] num=new long[n][2];
             BigInteger[][] num1=new BigInteger[n][2];         
             BigInteger big=new BigInteger("1");   
             BigInteger zero=new BigInteger("0");
         

分析:这道题目给我感觉还是挺复杂的,首先是对字符的分割,这最简便的应该是正则但是对正则的使用也没有那么的熟悉,所以还是有一些问题的处理相对较难,我也只是对一些数据进行了判定分割,并没有完整的完善这一道题目,还是挺失败的,以后还是得多多练习,抓紧时间。
主要是对一些字符^等一些的分割有些困难,以至于自己没能完成,希望以后能继续加油。

踩坑心得:对于一些作业心得,还是感觉pta对一些数据的输出太严格了,感觉一些题目明明可以得分,但是就是答案错误,一些边界值的测试,因为也没有具体写出哪些,所以自己也是花很多时间去进行调试,但是在提交的时候还是会出现错误,也是有点无语的。明明画了很多时间但是还是得不了满分,希望可以改进。同时自己对一些代码的编写可能还不是很规范,这也是自己得问题。
对于这些题集,前面一些题目还是比较好写,可能求下一天得我得构思用了数组,给人感觉还是有点复杂,看起来,可能直接用数据还是会更加方便一些。同时自己还是得多多学习一些对字符的
操作函数,否则用别的硬方法会浪费很多时间。
改进意见:自己还是希望自己以后编码能够看清题目,不要又和之前一样写到一半发现题目看错了,细心。同时在自己编程时,希望可以多花花时间在研究代码上,如何实现最简单的方法,最简便的去完成一些题目,完成题目的需求,而不是一味的去增加代码的长度,用死方法去解决问题。
总结:自己还时得多多加油,因为自己的原因落下了一门课程,同时让自己花了很多时间,以至于在其他课程上时间比较紧迫,可能由于要复习备考的原因,对这门作业花费太多时间还是有点可惜,当然这也是我自己的原因,所以还是得抓紧时间,多多学习,加快自己编程速度,提高自己编程能力。


 

posted on 2021-04-04 23:51  Yuzz1  阅读(90)  评论(0)    收藏  举报

导航