OO第一阶段实验报告

一、     前言

  1. 1.    知识点

(1)输入与输出

输入:1.使用Scanner类:

(1)使用java.util包。 import java.util.*;

(2)构造Scanner类对象,它附属于标准输入流System.in。 Scanner s = new Scanner(System.in);

(3)常用的next()方法系列: nextInt():输入整数 nextLine():输入字符串 nextDouble():输入双精度数 next():输入字符串(以空格作为分隔符)。

输出:Java中的输出语句有以下四种:

System.out.println(1111);//换行打印

System.out.print(1111);//不换行打印

System.out.write(2222);//字节输出

System.out.printf("%+8.3f\n", 3.14);//按格式输出

System.out.println();是最常用的输出语句,它会把括号里的内容转换成字符串输出到输出窗口(控制台),并且换行,当输出的是一个基本数据类型时,会自动转换成字符串,如果输出的是一个对象,会自动调用对象的toString();方法,将返回值输出到控制台

System.out.print(); 与第一个很相似,区别就是上一个输出后会换行,而这个命令输出后并不换行。

System.out.printf(); 这个方法延续了C语言的输出方式,通过格式化文本和参数列表输出。

(2)选择

If语句:if语句也称为单分支if语句,表达格式是:
if(boolean){
具体表达式;
};

If…else…语句:if…else…也称为双分支if-else语句。表达格式是:
if(boolean){
具体表达式1;
}else{
具体表达式2;
};

多分支if…else…语句:if语句可以在另外一个if语句中,形成嵌套的if语句,所以也被称为嵌套if语句或多分支if-else语句。表达格式是:

if(boolean条件1){

具体表达式1;

if(boolean条件2){

具体表达式2;

}else{

具体表达式3;

}

}else{

具体表达式4;

}

Switch…case…语句:switch语句基于变量或者表达式的值来执行语句。表达格式是:
switch(参数){
case 选项1:
执行语句1;
break;
case 选项2:
执行语句2;
break;
…
default:
执行语句n+1;
break;
}

switch语句遵从下述规则:

①switch表达式必须能计算出一个char、byte、 short、 int 或者String型值。

②当switch表达式的值与case语可的值相匹配时,执行从该case开始的语可,直到遇到一个break语句或到达该switch语句的结束。

③默认情况(default)是可选的,当没有一个给出的case与switch表达式匹配时,用来执行该操作。

④     关键字break是可选的。break语句会立即终止switch语句。

(3)字符和字符串

字符类型:字符类型 char 是基本数据类型,它是 character 的缩写。一个 char 保存一个 Unicode 字符。

字符串类型:和char类型不同,字符串类型 String 是引用类型,我们用双引号 “…” 表示字符串。一个字符串可以存储0个到任意个字符。Java的编译器对字符串做了特殊照顾,可以使用 + 连接任意字符串和其他数据类型

(4)循环

1、while循环语句

1、语法:

①初始化

while(②循环条件){

③循环体;

④累加器;

}

2、执行流程:

①加载初始化变量,执行一次

②根据循环条件进行判断如果判断结果为true,执行循环体,执行累加器,再回来执行循环条件判断,以此类推,直到循环条件判断为false,结束循环。

//1.创建初始化变量

Int num=1;

//2,循环条件

While(num<=10){

//循环体;

Syso(抄课文);

//每抄完一次,次数加一

num++;

}

2、do while语句

1、语法

①初始化变量

do{

②循环体;

③累加器;

}while(③循环条件);

2、执行顺序

①初始化变量

②执行do中的循环体和累加器,执行完成以后执行判断条件,如果为ture继续执行do……直到循环条件为false结束循环。

3、while和do while的区别

1、while:先判断后执行

2、do while:先执行后判断,至少会执行一次循环体。

4、for循环语句

for循环是我们使用最多的一种,为我们专门提供了一个位置存放三个表达式:

初始化表达式、循环条件表达式、累加器

1、for循环语法

for(初始表达式;条件表达式;迭代表达式){

循环体;

}

2、执行流程

①执行初始化表达式

②执行条件表达式,如果满足为ture执行循环体执行累加器再执行条件表达式,以此类推,直到条件不满足结束循环。

5、while和for的适用范围

while:循环次数不固定的场合

for:循环次数固定的场合

6、break语句:一旦执行,整个循环立即结束

continue:跳过当次循环,继续执行下一次

(5)函数

函数格式:修饰符    返回值类型    函数名  (  [    参数类型1 参数名1,参数类型2 参数名2....    ]  ){

//   [    ]    里面表示可选项,即参数不是必须的

执行语句...

return  返回值;    //返回值的类型必须与返回值类型一致

 }

说明:

修饰符:可以是访问修饰符,也可以说是函数修饰符(abstract、final、 static、synchronized),还可以是两者的组合。

返回值类型:用于限定函数返回值的数据类型。

参数类型:用于限定调用函数时传递的数据类型。

参数名:是一个变量,用来接收调用方法时传递的数据。

return:用来接收方法以及返回函数指定类型的值。

返回值:这个值会返回给函数的调用者。

(6)数组

定义数组:

int[] n = new int[4];//使用方括号,使用圆括号会报错

接下来可以将控制台取得的输入输入数组里面,需要调用Scanner对象的nextInt()方法:

for(int i=0;i<4;i++) {

n[i] = scanner.nextInt();

 }

scanner.close();//结束输入的时候不要忘了关闭输入流,调用Scanner对象的close方法即可

最后将输入的数组打印出来,需要调用Arrays.toString(“parameter”)方法,参数为数组声明的名称,不用带[]:

System.out.println("You input is:" + Arrays.toString(n));

//需要导入java.util.Arrays;

(7)对象和类

类与对象的基本概念

 

类与对象时整个面向对象中最基础的组成单元。

 

类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);

对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。

 

可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。

 

三、类与对象的定义和使用

在Java中定义类,使用关键字class完成。语法如下:

class 类名称 {

         属性 (变量) ;

         行为 (方法) ;

}

范例:定义一个Person类

class Person {     // 类名称首字母大写

    String name ;

    int age ;

    public void tell() {        // 没有static

          System.out.println("姓名:" + name + ",年龄:" + age) ;

         }

}

类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,所以对象的产生格式(两种格式)如下:

(1)格式一:声明并实例化对象

类名称 对象名称 = new 类名称 () ;

(2)格式二:先声明对象,然后实例化对象:

类名称 对象名称 = null ;

对象名称 = new 类名称 () ;

引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。

当一个实例化对象产生之后,可以按照如下的方式进行类的操作:

对象.属性:表示调用类之中的属性;

对象.方法():表示调用类之中的方法。

 

  1. 2.    题量

前三次题目集题量适中,根据题目难度决定时间和题目数量。

  1. 3.    难度情况

前两次题目集难度适宜,且基础性强,第三次题目集难度上升,需要学生有更好的逻辑思维和编译能力。

二、     设计与分析

题目集一7-8

 

import java.util.Scanner;

public class Main{

    public static void main(String[] args){

    Scanner input=new Scanner(System.in);

    double a=input.nextDouble();

    double c=input.nextDouble();

    double b=input.nextDouble();

    if(a<1||a>200||b<1||b>200||c<1||c>200)

       System.out.print("Wrong Format");

        else{

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

       System.out.print("Not a triangle");

            else{

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

                    if(a*a+b*b-c*c<0.00001||a*a+c*c-b*b<0.00001||b*b+c*c-a*a<0.00001)

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

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

               System.out.print("Equilateral triangle");

                    else

                     System.out.print("Isosceles triangle");

             }

            else if(a*a+b*b-c*c<0.00001||a*a+c*c-b*b<0.00001||b*b+c*c-a*a<0.00001)

                 System.out.print("Right-angled triangle");

            else

              System.out.print("General triangle");

        }

        }

    }

}

 

 

 

解释:本题先进行对三遍的输入,然后判断三遍的正确性是否可以构成三角形,然后再根据本人设计的算法进行对三角形类型的判断从而输出。

心得:本题主要运用判断语句进行代码的书写,通过自己的逻辑能力运用判断语句书写算法机型判断,很好的锻炼了语句的运用能力和自己的逻辑思维。

题目集二7-4

 

import java.util.Scanner;

public class Main {

public static void main(String[] args){//主方法

     Scanner input = new Scanner(System.in);

        int year=input.nextInt();

        int month=input.nextInt();   

        int day=input.nextInt();

    nextDate(year,month,day);

}

    public static boolean isLeapYear(int year){//判断year是否为闰年,返回boolean类型

     int a;

          if((year%4==0&&year%100!=0||year%400==0))

          {

                  return true;

          }

          else

          {

                  return false;

          }

}

public static boolean checkInputValidity(int year,int month,int day){//判断输入日期是否合法,返回布尔值

    int a[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};

    if(isLeapYear(year))

        a[2]=29;

        if(year>=1820&&year<=2020&&month>0&&month<=12&&day>=1&&day<=a[month])

            return true;

    else

        return false;

}

public static void nextDate( int year,int month,int day){ //求输入日期的下一天

    int c;

    if(checkInputValidity(year,month,day)){

    if(month==1||month==3||month==5||month==7||month==8||month==10){

        if(day!=31)

            System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next date is:"+year+"-"+(month+1)+"-1");

    }

    else  if (month==4||month==6||month==9||month==11){

     if(day!=30)

            System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next date is:"+year+"-"+(month+1)+"-1");  

    }

    else if(month==12){

      if(day!=31)

            System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next date is:"+(year+1)+"-1-1"); 

    }

    else if(month==2){

        if(isLeapYear(year)){

            if(day!=29)

            System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next date is:"+year+"-"+(month+1)+"-1");

 }

         else{

             if(day!=28)

            System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next date is:"+year+"-"+(month+1)+"-1");

}

    }

    }

        else

           System.out.print("Wrong Format");                  

 

}

}

 

 

解释:根据题目要求要用方法进行书写,在主方法中进行输入年月日和调用方法,定义了三个方法分别用于判断是否为闰年、数值的合法性和计算下一天,方法中由本人书写算法进行编译。

心得:学会了方法的调用,并用自己的逻辑思维能力定义算法进行编程,锻炼了自己的编程能力。

题目集二7-5

 

import java.util.Scanner;

public class Main {

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 n=input.nextInt();

        agonextDate(year,month,day,n);

}

    public static boolean isLeapYear(int year){//判断year是否为闰年,返回boolean类型

     int a;

          if((year%4==0&&year%100!=0||year%400==0))

          {

                  return true;

          }

          else

          {

                  return false;

          }

}

public static boolean checkInputValidity(int year,int month,int day,int n){//判断输入日期是否合法,返回布尔值

    int a[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};

    if(isLeapYear(year))

        a[2]=29;

        if(year>=1820&&year<=2020&&month>0&&month<=12&&day>=1&&day<=a[month]&&n>=-10&&n<=10)

            return true;

    else

        return false;

}

public static void agonextDate( int year,int month,int day,int n){ //求输入日期的前n天

    if(checkInputValidity(year,month,day,n)){

         if(n>=0){

    if(month==1){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+(year-1)+"-12-"+(31+day-n));

    }

    }

        if(month==2){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-1-"+(31-day+n));

    }

        }

      if(month==3){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

        if(isLeapYear(year))

            System.out.print(n+" days ago is:"+year+"-2-"+(29+day-n));

        else

            System.out.print(n+" days ago is:"+year+"-2-"+(28+day-n));

    }

      }

     if(month==4){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-3-"+(31-day+n));

    }

     }

         if(month==5){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-4-"+(30-day+n));

    }

         }

             if(month==6){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-5-"+(31-day+n));

    }

             }

                 if(month==7){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-6-"+(30-day+n));

    }

                 }

         if(month==8){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-7-"+(31-n+day));

    }

         }

             if(month==9){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-8-"+(31-n+day));

    }

             }

                 if(month==10){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-9-"+(30-day+n));

    }

                 }

         if(month==11){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-10-"+(30-day+n));

    }

         }

             if(month==12){

    if(day-n>=1){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-11-"+(31-day+n));

    }

             }

         }

        else{

              if(month==1){

    if(day-n<=31){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-2-"+(day-n-31));

    }

    }

        if(month==2){

    if(isLeapYear(year)){

        if(day-n<=29)

        System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        else

            System.out.print(n+" days ago is:"+year+"-3-"+(day-n-29));

    }

            else{

            if(day-n<=28)

        System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        else

            System.out.print(n+" days ago is:"+year+"-3-"+(day-n-28));   

            }

        }

       if(month==3){

    if(day-n<=31){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-4-"+(31-day-n));

    }

    }

             if(month==5||month==7||month==8||month==10){

    if(day-n<=31){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-"+(month+1)+"-"+(31-day+n));

    }

     }

         if(month==4||month==6||month==9||month==11){

    if(day-n<=30){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+year+"-10-"+(30-day+n));

    }

     }

         if(month==12){

    if(day-n<=31){

                System.out.print(n+" days ago is:"+year+"-"+month+"-"+(day-n));

        }

    else{

            System.out.print(n+" days ago is:"+(year+1)+"-1"+(31-day+n));

    }

     }

        }

    }

    else{

        System.out.print("Wrong Format");

    }

}

}

 

 

解释:根据题目要求要用方法进行书写,在主方法中进行输入年月日和调用方法,定义了三个方法分别用于判断是否为闰年、数值的合法性和计算日期的前N天,方法中由本人书写算法进行编译。

心得:进一步了方法的调用,并用自己的逻辑思维能力定义算法进行编程,并且可以对复杂的判断语句进行书写,提高了自己的编译能力。

 

题目集三7-2

 

 

import java.util.Scanner;

class Date{

private int year;

private int month;

private int day;

public      void date(int year,int month,int day){

          this.year=year;

          this.month=month;

        this.day=day;

}

     int getyear(){

       return year;

    }

public void setYear(int year){

          this.year=year;

}

 int getMonth(){

           return month;

           

}

public void setMonth(int month){

          this.month=month;

}

 int getDay(){

           return day;

}

public void  setDay(int day){

          this.day=day;

}

public boolean  isLeapYear(){

          if((year%4==0&&year%100!=0||year%400==0))

          {

                  return true;

          }

          else

          {

                  return false;

          }

}

public boolean checkInputValidity(){

    int mon_maxnum[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};

    if(isLeapYear()==true){

      mon_maxnum[2]=29;

    }

        if(year>=1900&&year<=2000&&month>0&&month<=12&&day>=1&&day<=mon_maxnum[month]){

            return true;

           

        }

    else {

        return false;

    }    

}

 public void getNextDate() {

     if(checkInputValidity()==true){

    if(month==1||month==3||month==5||month==7||month==8||month==10){

        if(day!=31)

            System.out.print("Next day is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next day is:"+year+"-"+(month+1)+"-1");

    }

    else  if (month==4||month==6||month==9||month==11){

     if(day!=30)

            System.out.print("Next day is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next day is:"+year+"-"+(month+1)+"-1");  

    }

    else if(month==12){

      if(day!=31)

            System.out.print("Next day is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next day is:"+(year+1)+"-1-1"); 

    }

    else if(month==2){

        if(isLeapYear()==true){

            if(day!=29)

            System.out.print("Next day is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next day is:"+year+"-"+(month+1)+"-1");

 }

         else{

             if(day!=28)

            System.out.print("Next day is:"+year+"-"+month+"-"+(day+1));

        else

            System.out.print("Next day is:"+year+"-"+(month+1)+"-1");

}

    }

    }

        else{

           System.out.print("Date Format is Wrong");                  

        }

}

}

public class Main {

public static void main(String[] args){

Date p = new Date();

Scanner input = new Scanner(System.in);

    int year=input.nextInt();

    int month=input.nextInt();   

    int day=input.nextInt();

    p.date(year,month,day);

   p.getNextDate();

}

 }

 

 

解释:本题通过主函数进行定义和调用类,然后通过类方法进行输入年月日、闰年的判断、输入的合法性和计算下一天,类中计算方法由本人进行编译书写。

心得:学会了类的基本使用方法,进一步加深了对判断语句的使用。

题目集三7-3

        

import java.util.Scanner;

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class Main {

public static void main(String[] args) {

          Scanner  input = new Scanner(System.in);

          String a=new String();

          a=input.nextLine();

          String b = "([-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[0-9]+)?)+";

          String c = "[-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[0-9]+)?";

        String d = "[+-]?[0-9]+";

          boolean e=Pattern.matches(b, a);

        boolean f=Pattern.matches(c, a);

        boolean g=Pattern.matches(d, a);

        if(g==false){

            System.out.print("Wrong Format");

            System.exit(0);

        }

         if(f==false){

            System.out.print("Wrong Format");

            System.exit(0);

        }

        if(g=true){

        System.out.print("0");   

        }

}

}

 

 

解释:本题尚未书写完成,部分代码通过对字符串的输入然后运用正则表达式进行对指数为零、系数为零和常数的判断,从而输出。

心得:需了解正则表达式的使用方法,并对本题有很好的逻辑能力,自己的知识储备有待提高。   

三、     踩坑心得

 

本题因为自己的逻辑思维混乱导致对算法的书写紊乱,从而使程序不能判断全面导致编译错误。

 

本题对于进行年月日输入判断合理性忘记了对特殊的二月进行判断,从而使得题目无法测试正确而部分正确。

 

本题忘记对输出进行保留两位小数从而使得输出错误而部分正确。

 

本题因引用方法而忘记书写相应的头文件从而编译错误。

 

本题因忘记对类大括号的书写,从而导致编译错误。

心得:要打好自己的基础,从而使得编译的错误减少,进行算法计算时,要有好的逻辑思维,从而使代码的正确性提高。

 

四、     改进建议

  1. 要增加自己书写的规范性。
  2. 对于题目集二7-3、4、5和题目集三7-2的算法进行简化,从而使代码的长度得到优化和所见。
  3. 对于题目集二7-5的判断,可以将天数相同的月归到一起进行判断,从而有效缩短代码长度,节省时间,优化算法。
  4. 对于题目集三7-3认真研习正则表达式,从而完善代码,达到要求。
  5. 遵循对代码的书写规则,使代码的书写有一定的逻辑性,简洁易懂。

五、     总结

通过本阶段的三次题目集,使我开始接触Java,并学到了一些基础的语法,对类的使用和正则表达式需要进一步学习,本人基础尚未打牢,需对基础语法进一步学习和锻炼。老师课上风趣幽默,认真负责,带动同学学习的积极性,并且课下与同学交流,位同学答疑解惑,是一位认真负责的好老师。课程的安排为线上线下同时教学,这需要学生花费大部分时间学习java,这就使同学需要有一定的积极主动性,我建议线上的教学可以通过比如以打卡的形式规定时间进行学习。课程作业布置的非常有针对性,使学生可以对学习的知识进行运用,老师也可以根据学生的作业情况进行针对性的改进。实验课方面,老师通过布置实验和要求书写实验报告,使同学更好的提高编译能力,并且可以很好的使用编译器,通过书写实验报告,使同学更好的掌握知识并提高能力。线上和线下的组织方式,线下老师对我们的要求很严厉,能够带动同学的积极性,课上的组织方式虽有很多课程,但同学容易遗忘,需经常提醒,进行学习。

posted @ 2021-04-03 23:04  愤怒的老煎饼  阅读(87)  评论(0)    收藏  举报