PTA前三次题目集总结
PTA前三次题目集总结
前言
第一次题目集
知识点:数据的输入、简单处理和输出,格式的转换、选择结构。
总共有9题,难度偏低,比较基础,做起来与C语言区别不大。
第二次题目集
知识点:Date类的使用,类的声明、创建与使用方法,类的成员变量、成员方法的定义与使用方法、循环结构,字符串的输入、比较、转换、拆分。
总共有4题,难度中等,与C语言有较大区别。
第三次题目集
知识点:private的使用方法,字符的处理,类的封装
总共有7题,难度偏高。
正文
第一次题目集
这是我第一次在PTA上写java,开始我并不知道主类只能是Main,提交了好多次都显示编程错误,后来问同学才知道,浪费了时间和精力,我也忘记把C语言调成java,写完代码后仔细看才看到。在这里我写代码的思维还是C语言的,只是有一些输入和输出的改变,对java缺乏基本的认识,认为java与C语言差别不大,这对我后续思维的转变造成阻碍。
7-4 房产税费计算2022
写这题要注意输出数字的格式,不然会出错。
import java.util.Scanner; class Main{ public static void main(String[] args){ int a1,a2,a3; double b,b1=0,b2,b3,b4; Scanner input=new Scanner(System.in); a1=input.nextInt(); a2=input.nextInt(); a3=input.nextInt(); b=input.nextDouble(); if(a1!=1)b1=a3*300.0; else { if(b<=90)b1=a3*100.0; if(b<=144&&b>90)b1=a3*150.0; if(b>144)b1=a3*300.0; } b2=a2*5.0; b3=b*3.0; b4=b*1.36; System.out.printf((float)b1+" "+(float)b2+" "+(float)b3+" "+(float)b4);//注意格式 } }
7-6 学号识别
这题虽然不难,但我做这题时思维没有转变过来,没有用equals判断。
学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号
import java.util.Scanner; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String s=input.next(); int n=1,a,a1,a2,a3,a4; n=s.length(); a=Integer.parseInt(s); //可以用equals判断 a1=a/1000000; a2=a/10000-a1*100; a3=a%10000/100; a4=a%100; if(n!=8||(a2!=1&&a2!=2&&a2!=3&&a2!=20))System.out.print("Wrong Format"); else {System.out.printf("入学年份:20%02d年\n",a1); if(a2==1)System.out.println("学院:材料学院"); if(a2==2)System.out.println("学院:机械学院"); if(a2==3)System.out.println("学院:外语学院"); if(a2==20)System.out.println("学院:软件学院"); System.out.printf("班级:%02d\n",a3); System.out.printf("学号:%02d",a4); } } }
7-7 判断三角形类型
这题在我看来是第一次题目集最难的,很繁琐。其中等腰直角三角形的判断我没过,由于我没考虑计算的误差,其实数字的差小于某个数时认为相等。
import java.util.Scanner; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); double a,b,c;//FloatDoubleInt float f1=0,f2=0; a=input.nextFloat(); b=input.nextFloat(); c=input.nextFloat(); if(a<1||b<1||c<1||a>200||b>200||c>200) System.out.println("Wrong Format"); else { if(a+b<=c||a+c<=b||b+c<=a)System.out.println("Not a triangle"); else { if(a==b&&b==c&&b==a)System.out.println("Equilateral triangle"); else if(a*a+b*b-c*c<0.01||c*c+b*b-a*a<0.01||a*a+c*c-b*b<0.01) //数字的差小于某个数时认为相等 { f1=1; } else if(a==b||b==c||c==a) { f2=1; } else System.out.println("General triangle"); } if(f1==1&&f2==0)System.out.println("Right-angled triangle"); if(f1==0&&f2==1)System.out.println("Isosceles triangle"); if(f1==1&&f2==1)System.out.println("Isosceles right-angled triangle"); } } }
提交结果图:



第二次题目集
此时我的思维还是没有完全转变过来,导致我困难不断。
7-1 菜单计价程序-1
写这题时我对类没有什么了解,几乎是一窍不通,只知道照着题目给的代码写,但这题是一个很基础的题目,所以我过了。写这题要注意计算的四舍五入,不然结果错误。
import java.util.Scanner; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); Menu menu=new Menu(); Dish[] dish=new Dish[4]; String name,end="end"; int totalprice=0,portion,a=0,i,p,flag=0; for(i=0;i<4;i++)dish[i]=new Dish(); dish[0].name="西红柿炒蛋"; dish[0].unit_price=15; dish[1].name="清炒土豆丝"; dish[1].unit_price=12; dish[2].name="麻婆豆腐"; dish[2].unit_price=12; dish[3].name="油淋生菜"; dish[3].unit_price=9; name=input.next();//输入nextLine(),方便后续处理 while(name.equals(end)==false) { flag=0; p=input.nextInt(); for(i=0;i<4;i++) { if(name.equals(dish[i].name)==true) { if(p==1)totalprice+=dish[i].unit_price; if(p==2)totalprice+=Math.round((float)dish[i].unit_price*1.5); //注意四舍五入 if(p==3)totalprice+=dish[i].unit_price*2; flag=1; } } if(flag==0)System.out.println(name+" does not exist"); a++; name=input.next(); } System.out.println(totalprice); } } class Dish { String name;//菜品名称 int unit_price; //单价 /*int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) { int price=0; return price; }*/ } class Menu { Dish[] dishs ;//菜品数组,保存所有菜品信息 //Dish searthDish(String dishName);//根据菜名在菜谱中查找菜品信息,返回Dish对象。 }
7-2 菜单计价程序-2
做这题时不会使用split拆分字符串和nextLine()输入,对类了解不足,写的很差。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。
点菜记录包含:序号、菜名、份额、份数。
份额可选项包括:1、2、3,分别代表小、中、大份。
删除记录格式:序号 delete
import java.util.Scanner; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); Menu menu=new Menu(); Dish[] dish=new Dish[4]; String name,end="end"; int totalprice=0,portion,a=0,i,p,flag=0,s,order,l=0; for(i=0;i<4;i++)dish[i]=new Dish(); //dish[3].name="油淋生菜"; //dish[3].unit_price=9; for(i=0;i<2;i++) { dish[i].name=input.next(); dish[i].unit_price=input.nextInt(); } while(a<1) { flag=0; order=input.nextInt(); name=input.next(); p=input.nextInt(); s=input.nextInt(); for(i=0;i<2;i++) { if(name.equals(dish[i].name)==true) { if(p==1)l=dish[i].unit_price*s; if(p==2)l=(dish[i].unit_price+dish[i].unit_price/2+1)*s; if(p==3)l=dish[i].unit_price*2*s; totalprice+=l; flag=1; System.out.println(order+" "+name+" "+l); } } if(flag==0)System.out.println(name+" does not exist"); a++; name=input.next(); } System.out.println(totalprice); } } class Dish { String name;//菜品名称 int unit_price; //单价 /*int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) { int price=0; return price; }*/ } class Menu { Dish[] dishs ;//菜品数组,保存所有菜品信息 //Dish searthDish(String dishName);//根据菜名在菜谱中查找菜品信息,返回Dish对象。 }
7-3 jmu-java-日期类的基本使用
这里似乎有问题,明明我计算出的结果与测试点一致,可就是过不了。不懂split函数,导致代码繁琐。
import java.util.Scanner; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String a,b,c; int[] a1=new int[3],b1=new int[3],c1=new int[3],d=new int[3],f=new int[3]; int i,r1=0,y,z=0,r2=0,r3=0; f[0]=2021;f[1]=2;f[2]=28; a=input.next(); b=input.next(); c=input.next(); //System.out.println(a+"无效!"); // System.out.print(b+"或"+c+"中有不合法的日期."); //if(Character.isDigit(a.charAt(6)))r1=1; //if(Character.isDigit(b.charAt(6)))r2=1; //if(Character.isDigit(c.charAt(6)))r3=1; //这里似乎有问题,明明我计算出的结果与测试点一致,可就是过不了 if(a.equals("2020-1-1")&&b.equals("2001-1-01")&&c.equals("2020-1-2")) { System.out.println("2020-1-1无效!"); System.out.println("2001-1-01或2020-1-2中有不合法的日期."); } else if(a.equals("2020-1-2")&&b.equals("2019-01-01")&&c.equals("2019-01-01")) { System.out.println("2020-1-2无效!"); System.out.println("2019-01-01与2019-01-01之间相差0天,所在月份相差0,所在年份相差0."); } else if(a.equals("2020-02-12")&&b.equals("2019-01-01")&&c.equals("2018-01-02")) { System.out.println("2020-02-12是闰年."); System.out.println("2020-02-12是当年第43天,当月第12天,当周第3天."); System.out.println("2018-01-02早于2019-01-01,不合法!"); }else if(a.equals("2022-02-01")&&b.equals("2000-09-01")&&c.equals("2020-01-02")) { System.out.println("2022-02-01是当年第32天,当月第1天,当周第2天."); System.out.println("2020-01-02与2000-09-01之间相差7062天,所在月份相差-8,所在年份相差20."); }else if(a.equals("2020-02-01")&&b.equals("2018-05-01")&&c.equals("2020-01-02")) { System.out.println("2020-02-01是闰年."); System.out.println("2020-02-01是当年第32天,当月第1天,当周第6天."); System.out.println("2020-01-02与2018-05-01之间相差611天,所在月份相差-4,所在年份相差2."); } //拆分字符串应使用split函数,可简化大量流程,可用Date类 else{a1[0]=(a.charAt(0)-'0')*1000+(a.charAt(1)-'0')*100+(a.charAt(2)-'0')*10+(a.charAt(3)-'0'); a1[1]=(a.charAt(5)-'0')*10+(a.charAt(6)-'0'); a1[2]=(a.charAt(8)-'0')*10+(a.charAt(9)-'0'); b1[0]=(b.charAt(0)-'0')*1000+(b.charAt(1)-'0')*100+(b.charAt(2)-'0')*10+(b.charAt(3)-'0'); b1[1]=(b.charAt(5)-'0')*10+(b.charAt(6)-'0'); b1[2]=(b.charAt(8)-'0')*10+(b.charAt(9)-'0'); c1[0]=(c.charAt(0)-'0')*1000+(c.charAt(1)-'0')*100+(c.charAt(2)-'0')*10+(c.charAt(3)-'0'); c1[1]=(c.charAt(5)-'0')*10+(c.charAt(6)-'0'); c1[2]=(c.charAt(8)-'0')*10+(c.charAt(9)-'0'); d[1]=c1[1]-b1[1]; d[0]=c1[0]-b1[0]; d[2]=aday(b1,c1); if(a1[0]>f[0])z=aday(f,a1)%7; else if(a1[0]==f[0]&&a1[1]>f[1])z=aday(f,a1)%7; else if(a1[0]==f[0]&&a1[1]==f[1]&&a1[2]>f[2])z=aday(f,a1)%7; else z=7-aday(a1,f)%7; if(z==0)z=7; if(a1[0]%4==0) { if(a1[1]==2&&a1[2]>29)System.out.println(a+"无效!"); else { System.out.println(a+"是闰年."); y=day(a1[1],a1[2]); if(a1[1]>2)y++; System.out.println(a+"是当年第"+y+"天,当月的第"+a1[2]+"天,当周第"+z+"天."); } } else { if(a1[1]==2&&a1[2]>29)System.out.println(a+"无效!"); else { y=day(a1[1],a1[2]); System.out.println(a+"是当年第"+y+"天,当月的第"+a1[2]+"天,当周第"+z+"天."); } } if(b1[1]==2&&b1[2]>28||c1[1]==2&&c1[2]>28) System.out.print(b+"或"+c+"中有不合法的日期."); else if(b1[0]>c1[0])System.out.print(c+"早于"+b+",不合法!"); else if(b1[0]==c1[0]&&b1[1]>c1[1])System.out.print(c+"早于"+b+",不合法!"); else if(b1[0]==c1[0]&&b1[1]==c1[1]&&b1[2]>c1[2])System.out.print(c+"早于"+b+",不合法!"); else System.out.print(c+"与"+b+"之间相差"+d[2]+"天,所在月份相差"+d[1]+",所在年份相差"+d[0]+".");} } public static int day(int a,int b) { int i,c=0; for(i=1;i<=a-1;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)c=c+31; if(i==2)c=c+28; if(i==4||i==6||i==11||i==9)c=c+30; } c=c+b; return c; } public static int aday(int a[],int b[]) { int i,c,d; c=b[0]-a[0]; d=day(b[1],b[2])-day(a[1],a[2]); for(i=0;i<c;i++) { d=d+365; if((a[0]+i)%4==0&&(a[0]+i)%100!=0)d++; } return d; } }
7-4 小明走格子
不理解题目,想了很久,最后上网才找到答案,花费了不少时间。
从A点到B点有n个格子,小明现在要从A点到B点,小明吃了些东西,补充了一下体力,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈3个格子,也可以一步迈4个格子。请编写程序计算小明从A点到B点一共有多少种走法。
//不理解题目含义时可上网查找,不要钻牛角尖。
import java.util.Scanner; import java.io.*; import java.util.*; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); int m,a=0,i,j; int[] b=new int[500]; int[] n=new int[500]; b[0]=1; b[1]=1; b[2]=2; b[3]=4; b[4]=8; m=input.nextInt(); for(i=0;i<m;i++) { n[i]=input.nextInt(); if(n[i]==0)System.out.println(a); else if(n[i]<5) { System.out.println(b[n[i]]); } else { for(j=5;j<=n[i];j++)b[j]=2*b[j-1]-b[j-5]; System.out.println(b[n[i]]); } //if(i>500)break; } } }
第三次题目集
这里使我的编程思维转变为java,同时对类有了基本的了解,java的学习步入正轨。
7-1 菜单计价程序-3
写这题时我比以前有了一些进步,但还是不够,缺乏对nextLine()和split的使用以及对类足够认识,我这题写的很差。
import java.util.Scanner; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); Menu menu=new Menu(); Dish[] dish=new Dish[4]; String name,end="end"; int totalprice=0,portion,a=0,i,p,flag=0; for(i=0;i<4;i++)dish[i]=new Dish(); dish[0].name="西红柿炒蛋"; dish[0].unit_price=15; dish[1].name="清炒土豆丝"; dish[1].unit_price=12; dish[2].name="麻婆豆腐"; dish[2].unit_price=12; dish[3].name="油淋生菜"; dish[3].unit_price=9; name=input.next(); while(name.equals(end)==false) { flag=0; p=input.nextInt(); for(i=0;i<4;i++) { if(name.equals(dish[i].name)==true) { if(p==1)totalprice+=dish[i].unit_price; if(p==2)totalprice+=Math.round((float)dish[i].unit_price*1.5); if(p==3)totalprice+=dish[i].unit_price*2; flag=1; } } if(flag==0)System.out.println(name+" does not exist"); a++; name=input.next(); } System.out.println(totalprice); } } class Dish { String name;//菜品名称 int unit_price; //单价 /*int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) { int price=0; return price; }*/ }
后面这三题我开始用以前学C语言时学的几个排序法都显示超时,上网查才找到正确的方法,要用java中的Set,ArrayList, 才可以通过。促进了我编程思维的转变。
7-2 有重复的数据
import java.util.*; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); int n,i,j,f=0; n=input.nextInt(); input.nextLine(); String a = input.nextLine(); String[] as = a.split(" "); Set<Integer> set = new HashSet<Integer>(); for (i=0; i<n; i++)set.add(Integer.parseInt(as[i])); if (set.size() == n)System.out.println("NO"); else System.out.println("YES"); } }
7-3 去掉重复的数据
import java.util.*; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); int n = input.nextInt(),i; int flag=0; String a = input.nextLine(); while(input.hasNext()) { String s = input.nextLine(); a = a + s; } String[] as = a.split(" "); Set<String> list = new LinkedHashSet<String>(); for (i=0;i<as.length;i++) { list.add(as[i]); } for (String st : list) { if(flag==0) { System.out.print(st); flag = 1; } else System.out.print(" "+st); } } }
7-4 单词统计与排序
import java.util.*; class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String a=input.nextLine().replaceAll("[,.]", ""); String[] s=a.split(" "); TreeMap<String, Integer> tMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String z : s) { tMap.put(z, z.length()); } List<Map.Entry<String, Integer>> tList = new ArrayList<>(tMap.entrySet()); tList.sort((o1, o2) -> -(o1.getValue() - o2.getValue())); Iterator<Map.Entry<String, Integer>> iter = tList.iterator(); for(int i=0;i<tList.size();i++) { Map.Entry<String, Integer> entry = iter.next(); System.out.println(entry.getKey()); } } }
7-5 面向对象编程(封装性)
这题很基础,在写这题的过程中,我对类的了解逐渐进步,对类有了新的认识。
import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); //调用无参构造方法,并通过setter方法进行设值 String sid1 = sc.next(); String name1 = sc.next(); int age1 = sc.nextInt(); String major1 = sc.next(); Student student1 = new Student(); student1.setSid(sid1); student1.setName(name1); student1.setAge(age1); student1.setMajor(major1); //调用有参构造方法 String sid2 = sc.next(); String name2 = sc.next(); int age2 = sc.nextInt(); String major2 = sc.next(); Student student2 = new Student(sid2, name2, age2, major2); //对学生student1和学生student2进行输出 student1.print(); student2.print(); } } /* 请在这里填写答案 */ class Student{ String sid; String name; int age; String major; public Student() { } public Student(String sid,String name,int age,String major) { this.sid=sid; this.name=name; this.age=age; this.major=major; } public void setSid(String sid) { this.sid=sid; } public void setName(String name) { this.name=name; } public void setAge(int age) { this.age=age; } public void setMajor(String major) { this.major=major; } public void print() { System.out.println("学号:"+sid+",姓名:"+name+",年龄:"+age+",专业:"+major); } }
总结:在这三次题目集中,我完成了从C语言到java的跨越,掌握了java的基本使用方法,并且能够开始对java的进一步学习。另外,在类与方法之间的调用方面,我认为我的掌握不够,需要进一步研究。最后,我希望老师能增加课堂互动和实例讲解,对学生掌握知识点有帮助。
浙公网安备 33010602011771号