第一次博客作业总结

一.前言

作业感悟

  经过三次java实验作业,我的java技术有了很大的提升,渐渐从c语言的思想转变为java的思想,java的功能要优于c语言许多c语言难以实现的功能在java中变的容易实现,c语言是面向过程的一门语言,java就是一门面向对象的语言,虽然思路有很多的转变,但是通过几次实验让我逐渐熟悉了这种语言。

  从实验一到实验三作业难度逐渐增加,从最开始只需要十多分钟就能解决的问题,变为仅仅一道题就需要几个小时才能解决,并且需要查阅大量的资料,学习更多新知识,虽然这些知识羞涩难懂但是只要能付出时间与精力,也会获得很大的提高,每次作业都要在pta上提交多次通过pta上的报错一步一步改正,然后慢慢获得提升,现在才学习java一个月还有许多知识没有掌握,还需要自己慢慢去探索。

(1)第一次概括

第一次题目集:

  第一次题目集的题目较为基础,目的是让我们更好的适应java的编程思路,实现从C语言到java的改变,虽然大体思路与c语言的语句相差不大,但是却也有很多不同,通过网课等一系列方式,运用大量if-else语句和for循环,完成此次作业,并且发现java许多与c语言不同的地方。

第二次题目集:

第二次题目集的题目较第二次题目难度有很大提升,第一次是简单的输入输出运算,而第二次则要运用数组等,例如字符串的存储、字符串的转换、数组的运用,第一次接触到封装性调用方法来完成(面向对象)经过两次作业,能力有了很大提升。

第三次题目集:

第三次作业题目十分难,虽然只有三道题,但是却使用了十天时间去完成,第三次作业需要很多知识,复杂程度也十分高,查阅了许多资料才完成,得分不是很高,因为所需知识范围很广泛,有许多知识还没有完全掌握,尤其是第三题,需要用到正则表达式,但我却掌握的不是很好,所以导致第三道题没有完成。

2)自我总结

没有完全掌握java,许多思考还是基于c语言的层面,没有能够好好掌握面向对象的程序设计,自学能力较差没有完全掌握大部分知识,自主完成作业的能力不是很好,很多时候都是作业截至前三至四天才开始写作业,导致很多时候不能够很好地完成作业,并且容易因为题目难度过高放弃思考,这些都是我需要改进的地方。

二、设计与分析

第一次题目集:

第八题

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
float a=sc.nextFloat(),b=sc.nextFloat(),c=sc.nextFloat();
if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200)
{
if(a+b>c&&a+c>b&&c+b>a)
{
if(a==b&&b==c)
System.out.println("Equilateral triangle");

else if((a==c||b==c||a==b)&&(a*a+b*b-c*c<0.1||a*a+c*c-b*b<0.1||c*c+b*b-a*a<0.1))
System.out.println("Isosceles right-angled triangle");

else if(a==c||b==c||a==b)
System.out.println("Isosceles triangle");

else if(a*a+b*b==c*c||a*a+c*c==b*b||c*c+b*b==a*a)
System.out.println("Right-angled triangle");

else
System.out.println("General triangle");
}
else
System.out.println("Not a triangle");
}
else
System.out.println("Wrong Format");
}
}

初次对于直角三角形的判断不准确,因为判断是否为直角三角形用的勾股定理,c^2 == a^2+b^2 因为计算机用的是用16进制存储浮点数,在16进制转化为十进制的时候有可能会出现精度丢失,导致一些误差的出现。在eclipse中输入3.4*3.4结果11.560000001没有达到预期效果。解决方法在我和室友讨论中逐渐浮现解决方法有很多,其中一种就是判断相减是否小于某精度。在圈复杂度建议if-else换成switch能减少复杂度。

第二次题目集

第四题

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

输入样例1:

在这里给出一组输入。例如:

2020 3 10
 

输出样例1:

在这里给出相应的输出。例如:

Next date is:2020-3-11
 

输入样例2:

在这里给出一组输入。例如:

2025 2 10
 

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

 

 

 完成代码

import java.util.Scanner;
public class Main {
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0)
return true;
else
return false;
}


public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();


if((year < 1820 || year > 2020) || (month < 1 || month > 12) || (day < 1 || day > 31)){
System.out.print("Wrong Format");
}
else if(isLeapYear(year)&& month == 2 && day > 29){
System.out.print("Wrong Format");
}
else if(!isLeapYear(year)&& month == 2 && day > 28)
System.out.print("Wrong Format");

else
{
day=day+1;

if(month==1||month==3||month==5||month==7||month==8||month==10){
if(day>31){
month=month+1;
day=1;
}
}
else if(isLeapYear(year)&&month==2){
if(day>29){
month=month+1;
day=1;
}
}
else if(!isLeapYear(year)&&month==2){
if(day>28){
month=month+1;
day=1;
}
}
else if(month==12) {
if(day>31){
month=1;
day=1;
year=year+1;
}
}
else{
if(day>30){
month=month+1;
day=1;
}
}
System.out.print("Next date is:"+ year + "-" + month + "-" + day);
}

}
}

 总结 对于这道题思路十分繁琐,运用了大量if eles语句

改进建议:分类:将日期分为一个类。isLeapYear()、numOfDays()、checkInputValidity()、nextDate()作为该类的方法进行封装。

 第五题

输入年月日的值(均为整型数),同时输入一个取值范围在[-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:年-月-日”

输入样例1:

在这里给出一组输入。例如:

2018  6 19 8 
 

输出样例1:

在这里给出相应的输出。例如:

8 days ago is:2018-6-11
 

输入样例2:

在这里给出一组输入。例如:

2018  6 19 -8 
 

输出样例2:

在这里给出相应的输出。例如:

-8 days ago is:2018-6-27

 

 

import java.util.Scanner;
public class Main {
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0)
return true;
else
return false;
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
int j = input.nextInt();
int sum=0;
if((year < 1820 || year > 2020) || (month < 1 || month > 12) || (day < 1 || day > 31)){
System.out.print("Wrong Format");
}
else if(isLeapYear(year)&& month == 2 && day > 29){
System.out.print("Wrong Format");
}
else if(!isLeapYear(year)&& month == 2 && day > 28)
System.out.print("Wrong Format");
else nextdate(year,month,day,j);
}
public static void nextdate(int year,int month,int day,int j){
int i = 0;

if(month==5||month==7||month==8||month==10){
if(day-j>=1&&day-j<=31) {
day=day-j;
month=month;}
if(day-j>31){
day=day-j-31;
month=month+1;}
if(day-j<1&&month==8){
day=31+(day-j);
month=month-1;}
if(day-j<1&&month==7){
day=30+(day-j);
month=month-1;}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);
}


else if(month==4||month==6||month==9||month==11){
if(day-j>=1&&day-j<=30) {
day=day-j;
month=month;
}
if(day-j>30) {
day=day-j-30;
month=month+1;}
if(day-j<1){
day=31+(day-j);
month=month-1;}

System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);
}
else if(month==1&&isLeapYear(year)){
if(day-j>1&&day-j<31) {
day=day-j;
month=month;
}
if(day-j>31){
day=day-j-31;
month=month+1;}
if(day-j<1) {
day=31+(day-j);
month=12;
year=year-1;
}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);

}
if(month==2&&isLeapYear(year)) {
if(day-j>1&&day-j<29) {
day=day-j;
month=month;
}
if(day-j>29) {
day=day-j-29;
month=month+1;
}
if(day-j<1) {
day=31+(day-j);
month=month-1;
}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);
}
if(month==3&&isLeapYear(year)){
if(day-j>1&&day-j<31) {
day=day-j;
month=month;
}
if(day-j<1){
day=29+(day-j);
month=month-1;}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);

}
if(month==1&&!isLeapYear(year)){
if(day-j>1&&day-j<31) {
day=day-j;
month=month;

}
if(day-j>31){
day=day-j-28;
month=month+1;}
if(day-j<1) {
day=31+(day-j);
month=12;
year=year-1;
}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);
}
if(month==2&&!isLeapYear(year)) {
if(day-j>1&&day-j<28) {
day=day-j;
month=month;
}
if(day-j>28) {
day=day-j-28;
month=month+1;
}
if(day-j<1) {
day=31+(day-j);
month=month-1;
}

System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);
}
if(month==3&&!isLeapYear(year)){
if(day-j>1&&day-j<31) {
day=day-j;
month=month;

}
if(day-j<1){
day=28+(day-j);
month=month-1;
}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);
}
if(month==12){
if(day-j>1&&day-j<31) {
day=day-j;
month=month;
}
if(day-j>31){
day=day-j-31;
month=1;
year=year+1;
}
if(day-j<1){
day=30+(day-j);
month=month-1;}
System.out.println(j +" days ago is:"+year + "-"+month+"-"+day);
System.exit(0);

}

}

}

第三次题目集

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

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

类图.jpg

输入格式:

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

输出格式:

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

输入样例1:

在这里给出一组输入。例如:

1912 12 25
 

输出样例1:

在这里给出相应的输出。例如:

Next day is:1912-12-26
 

输入样例2:

在这里给出一组输入。例如:

2001 2 30
 

输出样例2:

在这里给出相应的输出。例如:

Date Format is Wrong

 实现代码

import java.util.Scanner;
public class Main{
public static void main (String[] args){
Scanner sc=new Scanner(System.in);
int year,day,month;

year=sc.nextInt();
month=sc.nextInt();
day=sc.nextInt();
Date date = new Date(day,year,month);

if(date.checklnputValidity()){
date.getNextDay();
System.out.print("Next day is:"+ date.getYear() + "-" + date.getMonth() + "-" +date.getDay());
}else{
System.out.print("Date Format is Wrong");
}

}
}

class Date{
private int day,year;
private int month;
public Date(){
}
public Date(int day,int year,int month){
this.day=day;
this.year=year;
this.month=month;
}
public int getDay(){

return this.day;
}
public void setDay(){
this.day=day;
}
public int getYear(){

return this.year;
}
public void setYear(){
this.year=year;
}
public int getMonth(){

return this.month;
}
public void setMonth(){
this.month=month;
}

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

}
return false;
}

public void getNextDay(){
day = day +1;
if(month==1||month==3||month==5||month==7||month==8||month==10){
if(day>31){
month=month+1;
day=1;
}
}
else if(isLeapYear(year)&&month==2){
if(day>29){
month=month+1;
day=1;
}
}
else if(!isLeapYear(year)&&month==2){
if(day>28){
month=month+1;
day=1;
}
}
else if(month==12) {
if(day>31){
month=1;
day=1;
year=year+1;
}
}
else{
if(day>30){
month=month+1;
day=1;
}
}

}

public boolean checklnputValidity(){

if((year < 1900 || year > 2000) || (month < 1 || month > 12) || (day < 1 || day > 31)){
return false;
}
if((month == 4 || month == 6 || month == 9 || month == 11 )&& day > 30){
return false;
}
if(isLeapYear(year)){
if( month == 2 && day > 29){
return false;
}
}else{
if( month == 2 && day > 28){
return false;
}


}
return true;
}
}

 

 心得:对月份和天数也是if-else的嵌套使用

(三)总结

通过三次的作业练习我发现,自己对JAVA还不是很了解,存在的问题很大,C的思维一直都在,每次遇到问题都是想应用之前学过的知识去处理问题,没有想过应该去学习新的知识去解决新的问题。这是我学习上欠缺的地方也是我日后应该加强的地方,以后的题目集中我应该降低自己的圈复杂度,对JAVA的面向对象有了初步的理解,封装性目前也知道应该如何去实现,JAVA语言较之前学C有很大的不同,它真的是从个性化的方式去实现生活中遇到的问题,这三次题目集有很多我们日常生活中所面临的实际问题,更贴近生活。在以后的题目中我应该更加严格要求自己,不能只是局限在完成作业为目的,更应该从实际问题出发,考虑多个方面来完善自己的代码,未来的路很长,

。
 
posted @ 2021-04-04 21:47  鲨鱼小辣椒  阅读(43)  评论(0)    收藏  举报