一.前言
学期伊始,面向对象的程序设计课程的老师就利用PTA平台陆续发布了三次训练集。
这三次训练集所涉及知识点与课上所学知识点有关,具体知识点如下:
训练集01:此训练集所考察知识点为Java语言的基础语法,其中的要求并无面向对象相关内容,掌握了Java的变量类型与规则以及循环结构和选择结构即可较轻松完成,可见难度为Java的基础了,稍加调试即可拿到高分。正因如此,该题目集的题量较多,但鉴于其难度低,故整体所需时间并不会太长。
训练集02:此训练集所考察知识点与训练集01并无太大差别,不同的是题目7-8与题目7-9中增加了较深层次的知识点考察,如题目7-8中学生需要明白经运算后的浮点数可能存在精度丢失的情况,比较时需指定两者之差不大于某个阈值方可判断为相等;而题目7-9中则稍稍增加了学生对于求下一天日期的算法设计的考察,需要学生具备一定的逻辑思考能力才可胜任。相应的,题量也相对于训练集01减少了不少。
训练集03:此训练集开始,要求中有了“使用类”的要求,也就是说从此开始,我们的题目终于与面向对象沾边了!虽然所考察知识点仍然是面向对象中最简单的部分,但起码我们已经开始探索了面相对象这一“神秘”的概念。观察其中题目的题干,发现题干中已经给出了所需class的结构,我们只需将给出的结构“翻译”成Java语言,再依据之前的知识点写出其中的算法即可。其中题目7-3与题目7-4为同类型的题目,都像训练集02中7-9一样,为日期类设计,这两题也是这三个训练集中最难以解决的题目。
二.设计与分析
这三个训练集中,我将挑一些我个人认为最值得分析的题目的提交源码并逐一进行分析。
训练集01:
7-1
作为三个训练集中第一个训练集的第一个题目,并不是我们所想的 Hello World 级别,而是实实在在的有特定输入,有输出,还能解决实际问题的有头有脸的一段代码。
题目如下
基本年利率
7.7%
- 如果一年以内利率给
5
折- 如果三年以内利率为
7
折- 如果五年以内利率为
100%
- 如果五年以上利率为
1.1
倍输入一个
年份
,计算这个年份下的实际利率
是多少?
我给的代码如下
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double base = 7.7;
double rate = 0;
int year = input.nextInt();
if(year < 1)rate=0.5;
else if(year <= 3)rate=0.7;
else if(year <= 5)rate=1;
else rate = 1.1;
if(year <= 0) System.out.println("error");
else System.out.printf("实际利率=%.2f%%",base * rate);
}
}
这段代码中,除了固定的input
变量用于输入外,我共设置了三个变量:
基础利率
base
,double
类型利率的倍数比例
rate
,double
类型年份
year
,int
类型
然后使用简单的if - else
链后输出即可达到题目要求。
在输出的语句中,为了格式化输出,我使用了System.out.printf()
语句。
其中第一个参数"实际利率=%.2f%%"
为字符串,含有由该语句定义的两个转义字符串%.2f
和%%
,前者表示转义为一个带有两位小数的浮点数,而由于%
本身为转义字符串的起始,故若要输出该符号,需使用表示一个百分号的转义字符串%%
来进行输出。
7-7
在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“
YES
”这三个字母;如果没有,则输出“NO
”。
这题如果单论是否能得出正确答案,则其实算法并不算复杂,只需要在输入了一个新字符时将之前的字符全部扫描一遍即可。但若如此,他的时间复杂度将达到O(n2),从而导致倒数第一第二个测试点出现超时的情况,因此我使用了HashMap
来记录之前的内容,这样当出现新的数据时,直接看map里有没有就好。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
Map nums = new HashMap();
for(int i = 0; i < n; i++){
int num = input.nextInt();
if(nums.containsKey(num)){
System.out.println("YES");
return;
}
nums.put(num, true);
}
System.out.println("NO");
return;
}
}
训练集02:
7-1 长度质量计量单位换算
长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。
这道题看起来简单,但实际操作过程中却出现了一些问题。
以下是我所提交的源码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double mKg = input.nextDouble();
double sM = input.nextDouble();
System.out.print((float)(mKg / 0.45359237) + " " + (float)(sM / 0.0254));
return;
}
}
可以看到print
一行中对于计算结果使用了(float)
强制类型转换。或许是因为测试用例中结果是float
类型的精度,而计算出来的为double
类型的精度,两者存在一定的差异,故若将其删去,总会有一个测试用例无法通过。所以我加上(float)
将计算结果强制转换为float
类型,从而可通过全部测试用例。
个人认为若不加上(float)
,代码也既无语法错误也无逻辑错误,而却要为此花费大量时间与精力来调试,有点不值。希望能对此进行优化。
。
标签:知识点,总结性,题目,Scanner,训练,double,blog,input From: https://www.cnblogs.com/dreamLXJ/p/17259250.html