Blog作业01
题目集01-03总结
1.前言
①题目集01:共有7题。其中第一题计算两个数的和属于简单题目,简单的输入两个整型的数进行计算输出,初步使用Scanner输入的知识点。第二至四题属于初学时的中等题目难度,分别是电话键盘字母数字转换,成绩分级管理,计算税率,三题都使用了if-else语句 ,其中第二题使用了输入字符的知识点。第五题为计算钱币,属于和第一题相同难度的题目,使用简单的Scanner输入。第六题和第七题和第八题也属于简单题目,分别为用数组求平均值,对多个整数排序,判断三角形类型。前两题使用了for语句的知识点,最后一题使用了if-else语句的知识点。
②题目集02:共有5题。其中第一题是IP地址转换,难度中等,使用了字符串的知识,substring函数,以及Math里的函数。第二题合并两个有序数组为新的有序数组,属于简单题目,写法和c语言差不多。后面三题是和计算时间日期有关的,第三题为判断闰年和星期几,第四题为求下N天,第五天为求前N天,这三题都使用了isLeapYear,checkInputValidity的方法。都是将日期存进数组中。
③题目集03:共有三题。都属于难度较高的题目,第一题为创建账户类Account,该题对类中的属性有较多要求,并要求使用getter,setter方法,该题还使用到了小数点的保留,和c语言一样的使用方法。第二题为定义日期类,该题和题目集02中的后三题一样使用到了isLeapYear,checkInputValidity的方法,我还使用到了swith语句,该题相较于前一题难度略高一些,也要使用到封装。第三题是一元多项式求导,该题难度是这些题目里最高的,用的知识点也是最多的,包括新学的正则表达式。
2.设计与分析
本段将题目集中难度相对较高的题目分析一下。
①题目集01中的7-8判断三角形类型。题目要求如下:
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据 合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
以下为代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner m=new Scanner(System.in);
double a=m.nextDouble();
double b=m.nextDouble();
double c=m.nextDouble();
if(a>0&&b>0&&c>0){
if((a+b)<=c||(a+c)<=b||(b+c)<=a) {
System.out.print("Not a triangle");
}
else if(a==b&&b==c) {
System.out.print("Equilateral triangle");
}
else if((a==b)&&(a*a)+(b*b)==(c*c)||(a==c)&&(a*a)+(c*c)==(b*b)||(b==c)&&(b*b)+(c*c)==(c*c)) {
System.out.print("Isosceles right-angled triangle");
}
else if(a==b||a==c||b==c) {
System.out.print("Isosceles triangle");
}
else if((a*a)+(b*b)==(c*c)||(a*a)+(c*c)==(b*b)||(b*b)+(c*c)==(c*c)){
System.out.print("Right-angled triangle");
}
else if((a+b)>c||(a+c)>b||(b+c)>a) {
System.out.print("General triangle");
}
}
else {
System.out.print("Wrong Format");
}
}
}
这里我使用if-else语句对输入的数据进行不同判断。使用逻辑运算符判断输入的数据。
这是运行的结果



②题目集02中的7-4求下一天,题目要求如下:
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
public static void main(String[] args);//主方法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
以下为代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner m = new Scanner(System.in);
Main op = new Main();
int year = m.nextInt();
int month = m.nextInt();
int day = m.nextInt();
op.nextDate(year,month,day);
}
public static boolean isLeapYear(int year) {
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public static boolean checkInputValidity(int year,int month,int day) {
int[] g=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
g[2] = 29;
boolean checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=g[month]&&day>0);
return checkInputValidity;
}
public static void nextDate(int year,int month,int day) {
int[] g=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
g[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==g[month]) {
a = year+1;
b = 1;
c = 1;}
if(day>0&&day<g[month])
{
a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==g[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<g[month])
{
a = year;
b = month;
c = day+1;
}
}
System.out.println("Next date is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
}
该题我使用了isLeapYear和checkInputValidity的方法先判断输入的年份日期再写nextDate方法用if-else语句对输入的不同年份日期进行判断求下一天。
这是运行的结果:


③题目集02中的7-5为求前N天,题目要求如下:
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
- 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
- 当输入数据合法时,输出“n days ago is:年-月-日”
以下为代码;
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner m = new Scanner(System.in);
Main op = new Main();
int year = m.nextInt();
int month = m.nextInt();
int day = m.nextInt();
int x = m.nextInt();
op.nextDate(year,month,day,x);
}
public static boolean isLeapYear(int year)
{
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public static boolean checkInputValidity(int year,int month,int day,int n)
{
int[] g=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
g[2] = 29;
boolean checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=g[month]&&day>0&&Math.abs(n)<=10&&Math.abs(n)>=0);
return checkInputValidity;
}
public static void nextDate(int year,int month,int day,int n)
{
int[] g=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
g[2] = 29;
int a = 0;
int b = 0;
int c = 0;
if(checkInputValidity(year,month,day,n))
{
if (n==0) {
a = year;
b = month;
c = day;
}
if(month==12&&n>0) {
if(day-n<=g[month]&&day-n>0) {
a = year;
b = month;
c = day-n;}
if(day-n<=g[month]&&day-n<0) {
a = year;
b = month-1;
c = g[b]-n+day;
}
if(day-n<=g[month]&&day-n==0) {
a = year;
b = month-1;
c =g[b]-n+day;
}
}
if(month==12&&n<0) {
if(day-n>g[month]) {
a = year +1;
b = 1;
c =day - n -g[month];
}
if(day-n<=g[month]) {
a = year;
b = month;
c =day - n;
}
}
if(month>1&&month<12&&n>0) {
if(day-n<=g[month]&&day-n>0) {
a = year;
b = month;
c = day-n;}
if(day-n<=g[month]&&day-n<0) {
a = year;
b = month-1;
c = g[b]-n+day;
}
if(day-n<=g[month]&&day-n==0) {
a = year;
b = month-1;
c = g[b]-n+day;
}
}
if(month<12&&month>1&&n<0) {
if(day-n>g[month]) {
a = year;
b = month+1;
c =day - n -g[month];
}
if(day-n<=g[month]) {
a = year;
b = month;
c =day - n;
}
}
if(month == 1&&n>0) {
if(day-n<=g[month]&&day-n>0) {
a = year;
b = month;
c = day-n;
}
if(day-n<=g[month]&&day-n<0) {
a = year-1;
b = 12;
c = g[b]-n+day;
}
if(day-n<=g[month]&&day-n==0) {
a = year-1;
b = 12;
c = g[b]-n+day;
}
}
if(month==1&&n<0) {
if(day-n>g[month]) {
a = year;
b = month+1;
c =day - n -g[month];
}
if(day-n<=g[month]) {
a = year;
b = month;
c =day - n;
}
}
System.out.println(n+" days ago is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
}
该题同样使用了isLeapYear和checkInputValidity的方法,通过if-else语句判断输入的数据,再通过输入的N天求出日期。
以下为运行结果:


④题目集03中的7-2 定义日期类 ,该题要求如下:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

以下为代码:
import java.util.Scanner;
public class Main {
static private int year;
static private int month;
static private int day;
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public static boolean isLeapYear(int year) {
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public static boolean checkInputValidity(int year,int month,int day) {
boolean checkInputValidity;
if(isLeapYear(year)) {
if(month==2) {
checkInputValidity = (1900<=year&&year<=2000&&1<=month&&month<=12&&1<=day&&day<=29);
}
else {
checkInputValidity = (1900<=year&&year<=2000&&1<=month&&month<=12&&1<=day&&day<=31);
}
}
else {
if(month==2) {
checkInputValidity = (1900<=year&&year<=2000&&1<=month&&month<=12&&1<=day&&day<=28);
}
else {
checkInputValidity = (1900<=year&&year<=2000&&1<=month&&month<=12&&1<=day&&day<=31);
}
}
return checkInputValidity;
}
public static void main(String[] args) {
Scanner m = new Scanner(System.in);
int a = m.nextInt();
int b = m.nextInt();
int c = m.nextInt();
Main mm=new Main();
mm.setYear(a);
mm.setMonth(b);
mm.setDay(c);
getNextDate(year,month,day);
}
public static void getNextDate(int year,int month,int day) {
if(checkInputValidity(year,month,day)) {
switch(month) {
case 1: if(day==31) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 2: if(isLeapYear(year)) {
if(day==29) {
month=month+1;
day=1;
}
else {
day=day+1;
}
}
else {
if(day==28) {
month=month+1;
day=1;
}
else {
day=day+1;
}
}
break;
case 3:if(day==31) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 4:if(day==30) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 5:if(day==31) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 6:if(day==30) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 7:if(day==31) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 8:if(day==31) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 9:if(day==30) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 10:if(day==31) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 11:if(day==30) {
month=month+1;
day=1;
}
else {
day=day+1;
}
break;
case 12:if(day==31) {
year=year+1;
month=1;
day=1;
}
else {
day=day+1;
}
break;
}
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else {
System.out.println("Date Format is Wrong");
}
}
}
该题目定义了日期的类,使用了switch语句来进行运算,也使用了isLeapYear和checkInputValidity方法来判断输入的年份日期。
以下为运行结果:


⑤题目集03中的7-3由于没有设计出来,这里就不做分析。
3.采坑心得
pta运行的主类必须是Main,在使用Eclipse编译器时注意使用的规则,特别是缩进,Eclipse编译器能够帮你自动缩进,不许要特别加空格之类的。
对于编译时遇到的错误,用编译器的提示慢慢解决,不要心急,如果是逻辑错误,尝试换一个角度去思考。面向对象程序设计非常考验设计者的心态和思考能力。
4.总结
在学习面向对象程序设计这门课程时,需要有很强的逻辑思考能力,在编辑代码时,一定要先理好逻辑,在下手,适当时可以先画流程图再编写代码。
这三次题目集对于我初学java有了很大的进步,学习到了各种类的使用方法。
希望老师讲课时可以更有提示一些,将课堂活跃起来!

浙公网安备 33010602011771号