PTA习题集1~3总结与心得体会(JAVA)
前言:
各位童鞋大佬们,这是小园同学的第一篇博客,主要内容为分享自己在学习PTA习题集1~3的心得体会和反思,为的是和大家一起进行相互学习和交流实现共同进步。因为是第一次写博客所以内容有不足之处欢迎大家进行指正,当然好的东西我也会和大家一起分享。(JAVA)
知识点涉及:基本程序的设计,选择结构,字符和字符串,循环,基本方法调用,数组,对象和类。
难度:一般~中等
题目集目录: 1.PTA题目集1-7
2.PTA题目集1-8
3.PTA题目集2-4
4.PTA题目集2-5
5.PTA题目集3-2
6.PTA题目集3-3
正文:
题目要求如下:先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
输入格式:
先从键盘输入一个整数n,之后回车 再从键盘输入n个整数,整数之间用一个或多个空格分隔
输出格式:
按如下示例输出排序后的数据:The sorted numbers are:排序后的n个数,每个输出的整数之后有一个空格作为分隔符
输入样例:
在这里给出一组输入。例如:
10
3 5 2 4 76 89 56 4 3 8
输出样例:
在这里给出相应的输出。例如:
The sorted numbers are:2 3 3 4 4 5 8 56 76 89
题目分析:题目要求先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。可根据用户输入的数字进行数组的创建然后把需要排序的数字通过用户输入数组当中,再调用
sort方法对数组进行排序即可。
代码如下:
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int num = input.nextInt(); int array[] = new int[num]; for(int i=0;i<num;i++){ array[i] = input.nextInt(); } Arrays.sort(array); System.out.print("The sorted numbers are:"); for(int n:array) System.out.print(n+" "); input.close(); } }
注意点:按格式输出,类的导入。
1-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”。
输入样例1:
在这里给出一组输入。例如:
50 50 50.0
输出样例1:
在这里给出相应的输出。例如:
Equilateral triangle
输入样例2:
在这里给出一组输入。例如:
60.2 60.2 80.56
输出样例2:
在这里给出相应的输出。例如:
Isosceles triangle
输入样例3:
在这里给出一组输入。例如:
0.5 20.5 80
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
题目分析:题目要求输入三角形三条边,判断该三角形为什么类型的三角形,如果输入数据非法,则输出“Wrong Format”,如果输入的数据可构成相应的三角形则输出相应的指令,则需通过if语句进行多次判断且为层次递进的即可。
代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); float num1=input.nextFloat(); float num2=input.nextFloat(); float num3=input.nextFloat(); if((num1>=1&&num1<=200)&&(num2>=1&&num2<=200)&&(num3>=1&&num3<=200)) { if((num1+num2<=num3)||(num1+num3<=num2)||(num3+num2<=num1)) System.out.println("Not a triangle"); else if(num1==num2&&num1==num3) System.out.println("Equilateral triangle"); else if((num1==num2&&num1*num1+num2*num2-num3*num3<0.00001)||(num1==num3&&num1*num1+num3*num3-num2*num2<0.00001)||(num3==num2&&num3*num3+num2*num2-num1*num1<0.00001)) System.out.println("Isosceles right-angled triangle"); else if((num1==num2)||(num1==num3)||(num3==num2)) System.out.println("Isosceles triangle"); else if((num1*num1+num2*num2-num3*num3<0.00001)||(num1*num1+num3*num3-num2*num2<0.00001)||(num3*num3+num2*num2-num1*num1<0.00001)) System.out.println("Right-angled triangle"); else System.out.println("General triangle"); } else System.out.println("Wrong Format"); } }
注意点:所有情况都应该进行判断,且为递进的。
2-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:年-月-日
输入样例1:
在这里给出一组输入。例如:
2020 3 10
输出样例1:
在这里给出相应的输出。例如:
Next date is:2020-3-11
输入样例2:
在这里给出一组输入。例如:
2025 2 10
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
题目分析:题目要求输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31]不允许使用Java中和日期相关的类和方法。
需按题目要求设计相应的方法来实现对应的功能,首先我们得考虑输入的数据是否合法,但是这里的合法可不仅仅是满足年份在规定范围[1820,2020] ,月份在[1,12],天数在[1,31]就完了,还要分析用户输入的月份是否有31天,
对于2月来说是否有29天,所以并不是如此简单的。
用户输入了年月日,我们需要判断用户输入的年份是否为闰年,闰年2月就有29天,平年28天。
其次判断用户输入的月份,月份分为大小月,大月:1,3,5,7,8,10,12;
小月:4,6,9,11;2月的天数与闰年有关,所以我们需要把它拿出来进行单独讨论。
在2月,闰年的情况下,如果用户输入的为29日,那么下一天就是3月1日,月份加1,天数变为1;
在其他大月里,同理,天数为31,则下一天月数加一,天数变为1,小月也是如此。
在其他天数里,下一天存在在该月份里,就直接加一就行了,有一点要注意的是跨年,当用户输入的为12月31日时,年数也要加1,月数和天数变为1。按此推理即可!
代码如下:
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();
checkInputValidity(year,month,day);
nextDate(year,month,day);
}public static boolean isLeapYear(int year)
{
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)
{
boolean i=true;
if((day<1||day>31)||(month<1||month>12)||(year<1820||year>2020))
{
System.out.print("Wrong Format");
i=false;
System.exit(1);
}
else
{
switch(month)
{
case 4:
case 6:
case 9:
case 11:
{
if(day>30)
{
System.out.print("Wrong Format");
i= false;
System.exit(1);
}
break;
}
case 2:
{
if (isLeapYear(year) == true)
{
if (day> 29)
{
System.out.print("Wrong Format");
i=false;
System.exit(1);
}
}
else
{
if (day> 28)
{
System.out.print("Wrong Format");
i=false;
System.exit(1);
}
break;
}
}
}
}
return i;
}
public static void nextDate(int year,int month,int day)
{
switch(month)
{
case 4:
case 6:
case 9:
case 11:
{
if(day==30)
{
month+=1;
day=1;
}
else
{
day+=1;
}
break;
}
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
if(day==31)
{
month+=1;
day=1;
}
else
{
day+=1;
}
break;
}
case 12:
{
if(day==31)
{
month=1;
day=1;
year=year+1;
}
else
{
day+=1;
}
break;
}
case 2:
{
if (isLeapYear(year) == true)
{
if(day==29)
{
day=1; month+=1;
}
else
{ day+=1;
}
}
else
{
if(day==28)
{
day=1;
month+=1;
}
else
{
day+=1;
}
}
break;
}
}
System.out.print("Next date is:"+year+"-"+month+"-"+day);
}
}
注意点:各月分与天数之间的联系,和是否是闰年的判断!
2-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:年-月-日”
输入样例1:
在这里给出一组输入。例如:
2018 6 19 8
输出样例1:
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
输入样例2:
在这里给出一组输入。例如:
2018 6 19 -8
输出样例2:
在这里给出相应的输出。例如:
-8 days ago is:2018-6-27
题目分析:此题与上一题有许多相同之处,题目要求输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
不允许使用Java中任何与日期有关的类或方法。只需要注意月份和日期之间的关联,闰年的特点即可。
代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int a,b,c,d; y = input.nextInt(); m = input.nextInt(); d = input.nextInt(); n = input.nextInt(); if (checkInputValidty(a,b,c,d) == false) { System.out.print("Wrong Format"); System.exit(0); } whatDate(a,b,c,d); input.close(); } public static boolean isLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return true; else return false; } public static boolean checkInputValidty(int year, int month, int day, int n) { boolean i = false; if (Math.abs(n) > 10) { i = false; return i; } if ((year < 1820 || year > 2020) || (month < 1 || month > 12) || (day < 1 || day > 31)) { i = false; return i; } switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: { if (day > 31) { i = false; } else { i = true; } break; } case 4: case 6: case 9: case 11: { if (day > 30) { i = false; } else { i = true; } break; } case 2: { if (isLeapYear(year) == true) { if (day > 29) { i = false; } else { i = true; } } else { if (day > 28) { i = false; } else { i = true; } } break; } } return i; } public static void whatDate(int year, int month, int day, int i) { int j = Math.abs(i); if (i > 0) { for (; j > 0; j--) { if (day == 1) { if (month == 1) { year--; month = 12; day = 31; } else { month--; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: { day = 31; break; } case 4: case 6: case 9: case 11: { day = 30; break; } case 2: { if (isLeapYear(year) == true) { day = 29; } else { day = 28; } break; } } } } else { day--; } } } else { for (; j > 0; j--) { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: { if (day == 31) { if (month == 12) { year++; month = 1; day = 1; } else { month++; day = 1; } } else { day++; } break; } case 4: case 6: case 9: case 11: { if (day == 30) { month++; day = 1; } else { day++; } break; } case 2: { if (isLeapYear(year) ) { if (day == 29) { month++; day = 1; } else { day++; } } else { if (day == 28) { month++; day = 1; } else { day++; } } break; } } } } System.out.print(i + " days ago is:" + year + "-" + month + "-" + day); System.exit(1); } }
注意点:
各月分与天数之间的联系,和是否是闰年的判断!(可与上题结合思考)
3-2 定义日期类
题目要求:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
在这里给出一组输入。例如:
1912 12 25
输出样例1:
在这里给出相应的输出。例如:
Next day is:1912-12-26
输入样例2:
在这里给出一组输入。例如:
2001 2 30
输出样例2:
在这里给出相应的输出。例如:
Date Format is Wrong
题目分析:题目要求定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法
可根据题目给出的类图设计相应的方法,相关月份日期方法可参考上面的例题。
代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); Date date=new Date(input.nextInt(),input.nextInt(),input.nextInt()); if(date.check()==false) System.out.println("Date Format is Wrong"); else { date.getNextDate(); System.out.println("Next day is:"+date.getyear()+"-"+date.getmonth()+"-"+date.getday()); } input.close(); } } class Date { private int year; private int month; private int day; private int[] mon_maxnum = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public Date() { ; } public Date(int year,int month,int day) { this.year=year; this.month=month; this.day=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 boolean isYear(int year) { if(year%400==0||(year%4==0&&year%100!=0)) return true; else return false; } public boolean check() { if((year>=1900&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31)) { if(isYear(year)) { mon_maxnum[2]=29; if(mon_maxnum[month]<day) return false; else return true; } else { if(mon_maxnum[month]<day) return false; else return true; } } else { return false; } } public void getNextDate() { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: { if (day == 31) { if (month == 12) { year++; month = 1; day = 1; } else { month++; day = 1; } } else { day++; } break; } case 4: case 6: case 9: case 11: { if (day == 30) { month++; day = 1; } else { day++; } break; } case 2: { if (isYear(year)) { if (day == 29) { month++; day = 1; } else { day++; } } else { if (day == 28) { month++; day = 1; } else { day++; } } break; } } } }
注意点:成员中的数组需根据是否为闰年进行赋值处理。
3-3 一元多项式求导
题目要求:
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
输出样例1:
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
输入样例2:
在这里给出一组输入。例如:
2*x^6-0*x^7+5
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
注意:此题小园有些问题还未解决所以无法提供代码,如果有会的童鞋可以与我进行交流一起学习探讨。
谢谢友友们的观看啦!
浙公网安备 33010602011771号