首页 > 编程语言 >java题目集1~3的总结性Blog

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

时间:2023-04-01 23:24:01浏览次数:29  
标签:总结性 题目 String int str1 Blog 日期 java

一、前言

  经历前三次java题目集的话,应该也算是相对了解了java这门语言了,因为有了c语言的基础在里面,所以一部分基础的语法部分就理解来说的话不算是很困难,但从面向过程到面向对象的一个思想观念的改变让我有些不适应。如果把编写代码比作下棋的话,那么面向过程就是一步一步的下棋,想到什么写什么,所以写起来就感觉很顺畅,有种一气呵成的感觉;但面向对象是以功能来划分问题,而不是以步骤解决,就需要多费一点脑筋了,但面向对象的话,代码结构会更加清晰,而且代码重用率高,相较于面向过程而言后期修改会更加方便。总之就是很厉害的感觉。

  这三次的题目也是在逐渐锻炼一种面向对象的能力,第一次的作业,可能是考虑到刚入门的原因,题目并不是很难(虽然我还是有没写出来的,但我相信大部分同学肯定都写出来了),一共有9题,第一次的作业就让我们忘记它吧,因为从第二次作业开始,就会出现无法忘记的题目,我的梦魇,菜单计价系列题目,即题目集2的7-1、7-2以及题目集3的7-1。难度我就不做评价了,我不好评价了,只能说懂得都懂,不懂的我也不好多说。其他的题目难度都似乎都在这一系列的题目难度下黯然失色。

二、设计与分析

  

  第一次的题目的话都是比较基础的,感觉也没有很能体现面向对象的地方,而且也由于是刚接触面向对象,所以在完成其实也没有运用很多面向对象的思想,基本就是使用c的思想,然后换成了java的语法来完成,所以就赘述了。

 

 

  接下来就是梦到开始,第二次题目集了。先把又爱又恨的菜单计价程序放在一边,简单讲下7-3和7-4。

 

 

  

 

 

   首先是7-3,就和它的名字一样,是关于日期类的基本使用的。类是java中一个重要的概念。类是一个模板,它描述一类对象的行为和状态。类的定义在我看来有些复杂,我也不能很好的理解,所以我暂时将这里的日期类理解为一种工具。在对日期类不了解的情况下,我看见这道题基本是一脸懵逼的。这道题也让我知道的类的作用之大。

  

 

  7-4的话也是有一个测试点一直没过,在问了同学之后发现同学是使用了一个BufferedReader来替换掉Scanner才解决掉运行超时的问题的,很神奇好吧,只能说。学不明白看啥都像魔法。后来去查了一下,结果也没很整明白,但测试点过了。我先写着吧,说不定以后回头看的时候就能整明白了。

  

 

   接下来就有请重量级登场7-1,梦的序章,菜单计价系统一

代码分析图

菜单计价系统一系列的题目其实我是蛮喜欢的(大概,很好的体现出了java面对对象这一特性,除了写不来以外都很完美。

题目主要是围绕以下几个类来进行的

菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}

订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}

题目要求很明确,分工和功能方面都很明确。

至于7-2以及题目集3的7-1 都是再次基础上添加了几个功能。

 

 

 

三、采坑心得

第三次作业集的7-7虽然不是很难的题目但我还是存在一些错误。

以下为7-7题目

从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。

预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。

输入格式:

输入两行,每行输入一个日期,日期格式如:2022-06-18

输出格式:

第一行输出:第一个日期比第二个日期更早(晚)
第二行输出:两个日期间隔XX天
第三行输出:两个日期间隔XX周

以下为源代码

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
LocalDate date1 = null;
LocalDate date2 = null;
boolean validInput = false;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");
while (!validInput) {
String dateStr1 = sc.nextLine();
String dateStr2 = sc.nextLine();
try {
date1 = LocalDate.parse(dateStr1, formatter);
date2 = LocalDate.parse(dateStr2, formatter);
validInput = true;
} catch (DateTimeParseException e) {
}
}
if (date1.isBefore(date2)) {
System.out.println("第一个日期比第二个日期更早");
} else {
System.out.println("第一个日期比第二个日期更晚");
}
long days = Math.abs(date1.until(date2, ChronoUnit.DAYS));
long weeks = days / 7;
System.out.println("两个日期间隔" + days + "天");
System.out.println("两个日期间隔" + weeks + "周");
}
}

题目的输入样例有俩种格式,这就导致了直接使用相关时间类函数时会出现错误。

根据查询资料使用DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");来调整格式。

代码分析图

 

 

然后就是第三次作业的7-4

 

 以下为题目源代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
str = str.replaceAll("[,.]", " ");
String[] str1 = str.split(" ");
for (int i = 0; i < str1.length - 1; i++) {
for (int j = 0; j < str1.length - 1 - i; j++) {
if (bijiao(str1[j], str1[j + 1])) {
StringBuilder temp = new StringBuilder(str1[j]);
str1[j] = str1[j + 1];
str1[j + 1] = temp.toString();
}
}
}
for (int i = 0; i < str1.length-1; i++) {
System.out.println(str1[i]);
}
}
public static boolean bijiao(String a, String b) {
if (a.length() < b.length()) {
return true;
} else if (a.length() == b.length()) {
for (int i = 0; i < a.length(); i++) {
char ac = a.charAt(i);
char bc = b.charAt(i);
if (ac >= 'a' && ac <= 'z') {
ac -= 32;
}
if (bc >= 'a' && bc <= 'z') {
bc -= 32;
}
if (ac > bc) {
return true;
} else if (ac < bc) {
return false;
}
}
}
return false;
}
}

在进行输入样例测试的时候,多次输出样例a与I位置相反,在调试相同长度比较的同时忘记了“无视大小写”这一重要条件,导致我这道题目卡了多个小时。而后通过添加一个判断大小写并根据ASCII值的计算来进行大小写数值的相对统一,再进行比较来完成“无视大小写”这一条件。

代码分析图

 

 

 

 

 

 

 

 

 

 

四、主要困难以及改进建议

  困难太多了,以至于一时间找不出主要困难,真要说的话困难是类的设计和相应的引用吧,关于菜单计价系统的类的大概已经设计好了,但我在具体设计和使用的时候还是会出现很多问题,比如类之间冲突和引用失效的情况。这也直接的导致了我菜单计价系列题目的后续几题未成功完成,后续添加的类总是会与先前的类产生一定的冲突,感觉不能很好的放在一起使用。

改进建议的话有以下几点。

1、还是要多使用面向对象的思维来解决问题,有的时候还是下意识的使用面向过程,导致部分类过长或是主函数过于复杂。

2、多标注注释,对无论是其他人阅读自己的代码,还是自己对自己的代码进行修改都有好处。

3、if else以及循环语句最好少用,会使代码复杂度大幅度提升。

4、可以多使用java中自带的函数,多数可以使自己编写代码的效率大幅度提升。

 五、总结

  总的来说这三次练习还是学到了很多东西,虽然入门java的过程不是很顺利,但也是很开心能够学习这样一门语言,并可以用这种语言完成一些简单的功能,虽然有的功能暂时用不上,但成功运行的时候还是有一种成就感的。关于面向对象的思维锻炼方面,以及类的设计方面我也都需要多加练习,有的时候类与类之间的互动总能把我的思维搞乱。老师的上课我觉得还是非常风趣幽默的,有时候上的好好的总能给我整的绷不住笑出声来,所以我还是很有兴趣继续学习Java的(如果平常作业能稍微简单一点,少一点的话就更好了)。

 

标签:总结性,题目,String,int,str1,Blog,日期,java
From: https://www.cnblogs.com/vyseven/p/17279669.html

相关文章

  • Java创建线程的三种方式
    创建线程的三种方式1.继承Thread类,重写run方法publicclassMyThreadextendsThread{publicvoidrun(){System.out.println("HellofromMyThread!");}}publicclassMain{publicstaticvoidmain(String[]args){MyThreadthread......
  • java 中required_通过实例学习Spring @Required注释原理
    @Required注释应用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在XML配置文件中,否则容器就会抛出一个BeanInitializationException异常。下面显示的是一个使用@Required注释的示例。示例:让我们使EclipseIDE处于工作状态,请按照下列步骤创建一个......
  • java 中required_通过实例学习Spring @Required注释原理
    @Required注释应用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在XML配置文件中,否则容器就会抛出一个BeanInitializationException异常。下面显示的是一个使用@Required注释的示例。示例:让我们使EclipseIDE处于工作状态,请按照下列步骤创建一个......
  • 每日总结--2023/3/31(解决了数据库连接不正常的问题,完成了javaweb暂时的配置)
    今天耗费一天的时间总算是找到了问题所在.问题出在mysqlServlet的版本上。在重装系统前,我所装的mysqlSevlet版本是5.0左右的,所以连接数据库的驱动也是5.0,包括url,而在重装系统后我的mysqlSevlet版本是8.0以上的,所以用原来的语句是不正确的,要修改为8.0版本的才能够运行,同......
  • Java面向对象--接口和多态
    final关键字最终修饰符可以修饰类方法变量被final修饰后不能被继承重写二次赋值修饰类时该类不可以被继承修饰方法时该方法不能被重写修饰变量时,该变量只能赋值一次,不可以二次赋值是常量修饰引用变量时,地址值不能改变但对象中的属性值可以改变修饰成员变......
  • 装疯卖傻总结性blog
    前言1.    Scannerin=newScanner(System.in);Scanner是一个类,in是一个实例或者说是对象,new是一个创建对象的方法2.(float)(x/0.45359237)强制数据类型转换的写法3.String[]race=newString[]{"人类","精灵","兽人","暗精灵"};创建数组格式likethis,与c不一样要......
  • Java线程:wait()和notify()
    一、wait()和notify()含义二、标准代码示例创建两个线程Thread0和Thread1。代码实现:运行流程详解三、什么时候释放锁—wait()、notify()四、用生活故事讲懂线程的等待唤醒1.老王和老李(专家程序员):2.王哥和李哥(普通程序员):3.小王和小李(新手程序员):五、问题理解1、执行wait()的......
  • 别逛了,送你一份2023年Java核心篇JVM(虚拟机)面试题整理
    Java内存区域说一下JVM的主要组成部分及其作用?JVM包含两个子系统和两个组件,两个子系统为Classloader(类装载)、Executionengine(执行引擎);两个组件为Runtimedataarea(运行时数据区)、NativeInterface(本地接口)。●Classloader(类装载):根据给定的全限定名类名(如:java.......
  • JS基础《JavaScript精粹》笔记摘录
    基础概念和语法基本类型、null、undefined、NaNJavaScript定义了一小批基本类型(primitivetype),它们包括字符串类型(string,单引号或双引号包起来)、数值类型(number,整数和小数都用这个类型)和布尔类型(boolean,值仅有true和false)。JavaScript使用两个特殊的值来表示不存在有意义的值—......
  • 红黑树及JAVA实现
     红黑树在Java中的应用红黑树在Java中有很多应用。例如,Java8中的HashMap容器和TreeMap容器都有红黑树的具体应用。HashMap在插入和查找时都需要对键进行哈希,而TreeMap则是按照键的自然顺序进行排序。因此,当需要对键进行排序时,可以使用TreeMap;当不需要排序时,可以使用HashMap......