oop题目集1~3的总结性Blog

发布时间 2023-05-24 21:56:25作者: .寂

1)前言

第一次作业:7-1主要是从控制台输入问题,和嵌套循环。7-2的要点是数据的精确度,严格的输出。7-3是数组的调用,循环的使用。7-4要点在与if和else的使用和标准的输入和输出。7-5主要是switch方法的使用7-6主要是substring的调用和字符串长度的判断length()和.equals()的使用7-7主要是精确度的问题,一个容错double·error·=·1E-7;循环嵌套的问题。7-8要点是if和else的使用以及Math.abs的使(Math.abs(lastGuessnextGuess)>=1E-5)。7-9考察对输入数据(字符串)的分析substring(0,end)和charAt(i)和contains("-1")和indexOf("-1")方法的使用。

第二次作业:7-1,7-2考察了类和对象的使用,类的声明和对象的创建,数组列表的使用(private static List<Record> records = new ArrayList<>();//保存订单上每一道的记录),(int·orderNum·=·Integer.parseInt(lineArray[0]);)不同数据类型的转换,类类型的方法,this的使用,Math方法的使用(Math.round((unit_price·*·b[portion·-·1]));),split("·");方法的使用,7-3考察了Date类的相关用法,以及判断是否是闰月的逻辑,split("\\-");的相关用法,.调用parseDate方法解析第一行日期字符串,调用parseDate方法解析开始日期和结束日期字符串,调用Java 8中的ChronoUnit类的静态方法between计算开始日期和结束日期相差的天数、月数、年数,并输出结果,7-4考察快读快写,和数据类型的转换(int orderNum = Integer.parseInt(lineArray[0]);)和split("·");方法的调用。

第三次作业:7-1要点是异常类,SimpleDateFormat类,time类中的Instant类和LocalDateTime类,ZoneI类getHour()和getMinute()和Math.round(sum*0.8)和time.getDayOfWeek()和LocalDateTime.ofInstant(instant, zone)方法Date类。7-2考察哈希表,7-3考察Set·<Integer>·hs·=new·LinkedHashSet<>();7-4考察字符串列表,和正则表达式,和排序方法。7-5要点是对数据进行封装,7-6要点是输出的格式标准化,7-7考察Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。

三次题目集总体题目量还算比较正常,题量和难度成反比,在日期的相关方法的调用比较难,以及数组列表的使用上有难度,以及各个类之间的相互调用,有难度。除了菜单系列的题目集还算简单的。

2)

设计与分析:

第一次作业

二进制数值提取:

首先判断输入,将其用split()进行分隔,利用if和else判断是否字符为-1,是即为结束

三角形类型:

首先得分析是否是三角形,如果是再判断直角关系和两边是否相等的关系将三角形的范畴压缩,再判断是否是等腰直角三角形,和等边即可。这里在判断三角形采用if和else时,需注意,return.

第二次作业

jmu-java-日期类的基本使用分析:

首先可以通过split方法将日期分隔为时分秒,然后根据年来判断是否是闰年,日期是否合法可以采用日历类来写。也可以通过Date类来写代码

小明走格子时分析:

 

import java.io.*;
public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer r = new StreamTokenizer(re);
        StreamTokenizer r1 = new StreamTokenizer(re);
        r.nextToken();int m = (int)r.nval;
        int line[]=new int[m];
        int sum[]=new int[32];
        for(int j = 0;j< m;j++)
        {
            r1.nextToken();
            line[j] = (int)r1.nval;
        }
        for(int i = 0;i<32;i++)
        {
            if(i==0)
                sum[i] = 1;
            else if(i==1)
                sum[i] = 2;
            else if(i==2)
                sum[i] = 4;
            else if(i==3)
                sum[i] = 8;
            else
                sum[i] = sum[i-1]+sum[i-2]+sum[i-3]+sum[i-4];
        }
        for(int j = 0;j<m;j++)
        {
            System.out.println(sum[line[j]-1]);
        }
    }
}

 

 

 

可以通过递归来写,但是经过实操发现运行超时,只能通过动态规划来写,然后数据的输入使用快读快写继续减少运行时间。

心得:可以通过多种方法来写代码,但是符合要求的可能需要更加充足的知识储备了。

第三次作业:

7-1,7-2都是利用哈希表对重复数据的处理,在面对数据输入效率上使用快读快写。

7-3中利用正则表达式将字符串分析后利用排序算法实现功能7-4对成员进行封装。普通成员方法:提供setXxx和getXxx方法。(注意:setAge()方法中需要对年龄进行判定)

菜单程序设计-1设计:有以下四个类菜品类:Dish对应菜谱上一道菜的信息,有计算菜品价格的方法int getPrice(int portion),有菜品名,单价两个数据成员,Menu菜谱类:对应菜谱,包含饭店提供的所有菜的信息。存在查找菜品信息的方法Dish searthDish(String dishName),Dish[] dishs ;//菜品数组,保存所有菜品信息;Record点菜记录类:保存订单上的一道菜品记录,有int getPrice()//计价,计算本条记录的价格方法订单类:Order保存用户点的所有菜的信息。int getTotalPrice()//计算订单的总价,Record addARecord(String dishName,int portion)的方法,根据所输入的订单计算出价格。

解释与心得:第一次代码还算简单,不需要太多的只是,只需要掌握基本类的相互调用即可利用类来调用各个个对象,可以让意思更为明确,订单中创建了菜品的相关数据,将点餐数据存储与记录实现。

 

 

 

 

菜单程序设计-2设计:任然创建了dish,menu,record,order,四个类,但是在Dish类中怎加了Dish addDish(String dishName,int unit_price)//添加一道菜品信息方法 Order类增加了delARecordByOrderNum(int orderNum)//根据序号删除一条记录 findRecordByNum(int orderNum)//根据序号查找一条记录提供记录的增删,让记录更加完备。心得:通过增加,减少订单,顾客可以在后续的点餐中更为的方便。还要考虑输出如果订单中包含不能识别的菜名,则输出“** does not exist”,**是不能识别的菜名如果删除记录的序号不存在,则输出“delete error”最后输出订单上所有菜品的总价(整数数值)。

 

菜单程序设计-3设计再原来基础上怎加了带点菜信息,代点菜信息包含:桌号 序号 菜品名称 份额 分数代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。还怎加了折扣时间段,周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。周末全价,营业时间:9:30-21:30订单分:桌号标识、点菜记录和删除信息、代点菜信息

分析:通过输入的时间段,可以判定该时间段是否营业,是否打折,先通过 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH/mm/ss");将时间规范化,将营业时间的判断写成一个方法boolean isOpen()(需要调用时间类和date类方法)来调用。tables[table_count].od(menu,menu_count,str1,str2,portion,quota);用该方法对删除后桌号的修改。

 

 for(i=0;i<table_count;i++) {
            if(tables[i].isOpen()) {
            System.out.println("table "+(i+1)+": "+tables[i].sum);
            }
            else System.out.println("table " + (i+1)+ " out of opening hours");
        } 

诸多代码实现输出格式的标准化。

增加订单

 for(i=0;i<menu_count;i++){
                if(menu.dishs[i].name.equals(str1)){menu.dishs[i].unit_price=Integer.parseInt(str2);
                                                    flag++;
                                                    break;
                                                   }
            }
            if(flag==0){menu.dishs[menu_count] = new Dish();
                        menu.dishs[menu_count] = menu.addDish(str1,Integer.parseInt(str2));
                        menu_count++;
                       }
            flag=0;

 

 

 

 

 

心得:这次的难度比前两次要难得多,首先在判断输入时间段是否符合折扣段有难度,再删减订单时,排号也要进行相应的改变。在实现帮他人点单时,计算价格也要发生相应的改变。也变得复杂了。

3)采坑心得

在第一次作业7-2,7-4时输出没有进行强制转换,导致代码一直无法通过测试 ,应该System.out.print((float)(quality2)+" "+(float)(length2));

·System.out.print((float)deedTax+"·"+(float)stampTax+"·"+(float)transactionFee+"·"+(float)mappFee);

在7-6     

 if(studentNum.length()!=8||(!college.equals("01")&&!college.equals("02")&&!college.equals("03")&&!college.equals("20")))

{

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

return;

}

 

没有加return,一直答案错误。在7-7中没有进行误差的判断导致精度出现了问题(应补充·double·error·=·1E-7;)

在第二次作业:

菜单第一次在增加订单的时候出现了不懂的地方

 

public Record addARecord(String dishName, int portion) {
    Menu menu = new Menu();
    Dish dish = menu.searchDish(dishName);
    if (dish == null) {
        System.out.println(dishName + " does not exist");
        return null;
    }
    Record record = new Record(dish, portion);
    records[count++] = record;
    return record;
}

 

 

 

每每运行一直报错。

7-4中使用scanner输入一直运行超时,在使用下述才得以解决

BufferedReader·re·=·new·BufferedReader(new·InputStreamReader(System.in));

StreamTokenizer·r·=·new·StreamTokenizer(re);

········StreamTokenizer·r1·=·new·StreamTokenizer(re);

········r.nextToken();int·m·=·(int)r

4)主要困难以及改进建议

我发现自己在理解题意时有时候会出现偏差,导致最终的编码结果与题目要求不符。其次,我在编码时有时候会出现逻辑错误,导致程序无法正常运行。最后,我发现自己在处理一些复杂的算法时,会出现思路不清晰的情况,导致编码效率低下。

例如:在面对小明走格子这一个问题中,当时并没有第一时间想到使用快读,快写,和动态规划。

为了改进这些问题,我认为可以采取以下措施。首先,我需要更加仔细地阅读题目,理解题意,确保自己对题目的理解与要求一致。其次,我需要更加仔细地审查自己的代码,避免逻辑错误的出现。最后,我需要更加深入地学习一些复杂的算法,加强自己的编码能力。

5)总结

在完成本阶段的三次题目集后,我深刻地认识到了编程的重要性和必要性。首先要掌握最简单if,else,循环的使用,了解一些特殊类的相关方法的使用。通过这些题目的编程实践,我不仅掌握了基本的编程语法和算法,也提升了自己的逻辑思维和解决问题的能力。同时,我也发现了自己在编程过程中的不足之处,需要进一步学习和研究。

首先,我认为需要进一步学习和研究的是算法和数据结构方面的知识。在完成题目集的过程中,我发现自己对于一些复杂的算法和数据结构的理解还不够深入,需要加强学习和练习。其次,我也需要更加熟练地掌握编程语言的使用,特别是一些常用的库和框架的使用。

对于教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见,我认为可以从以下几个方面进行改进。首先,可以增加一些实际应用场景的案例,帮助学生更好地理解和掌握编程知识。其次,可以加强编程实践的环节,让学生更多地进行实际的编程练习。最后,可以增加一些与编程相关的讨论和交流活动,促进学生之间的交流和合作