OO第一阶段实验报告
一、 前言
- 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来分配内存空间。
当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性;
对象.方法():表示调用类之中的方法。
- 2. 题量
前三次题目集题量适中,根据题目难度决定时间和题目数量。
- 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");
}
}
}

解释:本题尚未书写完成,部分代码通过对字符串的输入然后运用正则表达式进行对指数为零、系数为零和常数的判断,从而输出。
心得:需了解正则表达式的使用方法,并对本题有很好的逻辑能力,自己的知识储备有待提高。
三、 踩坑心得

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

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

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

本题因引用方法而忘记书写相应的头文件从而编译错误。
![]()
本题因忘记对类大括号的书写,从而导致编译错误。
心得:要打好自己的基础,从而使得编译的错误减少,进行算法计算时,要有好的逻辑思维,从而使代码的正确性提高。
四、 改进建议
- 要增加自己书写的规范性。
- 对于题目集二7-3、4、5和题目集三7-2的算法进行简化,从而使代码的长度得到优化和所见。
- 对于题目集二7-5的判断,可以将天数相同的月归到一起进行判断,从而有效缩短代码长度,节省时间,优化算法。
- 对于题目集三7-3认真研习正则表达式,从而完善代码,达到要求。
- 遵循对代码的书写规则,使代码的书写有一定的逻辑性,简洁易懂。
五、 总结
通过本阶段的三次题目集,使我开始接触Java,并学到了一些基础的语法,对类的使用和正则表达式需要进一步学习,本人基础尚未打牢,需对基础语法进一步学习和锻炼。老师课上风趣幽默,认真负责,带动同学学习的积极性,并且课下与同学交流,位同学答疑解惑,是一位认真负责的好老师。课程的安排为线上线下同时教学,这需要学生花费大部分时间学习java,这就使同学需要有一定的积极主动性,我建议线上的教学可以通过比如以打卡的形式规定时间进行学习。课程作业布置的非常有针对性,使学生可以对学习的知识进行运用,老师也可以根据学生的作业情况进行针对性的改进。实验课方面,老师通过布置实验和要求书写实验报告,使同学更好的提高编译能力,并且可以很好的使用编译器,通过书写实验报告,使同学更好的掌握知识并提高能力。线上和线下的组织方式,线下老师对我们的要求很严厉,能够带动同学的积极性,课上的组织方式虽有很多课程,但同学容易遗忘,需经常提醒,进行学习。

浙公网安备 33010602011771号