(1)前言:
目前发布了三次pta作业,第一次作业的题量适中,较为简单,主要了解了substring函数,math类,charAt方法的使用;在第二次作业中,首次出现了菜单计价程序编写的题目,题目量少但难度高,其中主要学习了StreamTokenizer快速输入的方法,类与类之间的调用联系,equal方法的使用等等;而在第三次的作业中题量适中,而难度在不断加大,任然有菜单计价程序的升级作业,以及时间类函数的使用,HashSet方法(无序插入不可重复);
(2)设计与分析:
题目集2:7-1 菜单计价程序-1:
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); Menu m = new Menu(); Order o = new Order(); String n = null; int i = 0; int j = 0; while(!"end".equals(n)){//判断菜单最后是否时end,使用equals直接比较数组n内的内容 n = sc.nextLine(); if(n.equals("end")){ break; } String[] tem1 = n.split(" "); o.records[i] = new Record(); o.records[i] = o.addARecord(tem1[0],Integer.parseInt(tem1[1]));//进制转换 i++; j++; } Dish x; for(i=0;i<j;i++){ x = m.searthDish(o.records[i].d.name); if(x==null){ System.out.println(o.records[i].d.name+" "+"does not exist");//判断所点菜是否在菜谱上存在 } else{ o.records[i].d.unit_price = x.unit_price; } } System.out.println(o.getTotalPrice()); } } class Dish{ String name; int unit_price; int getPrice(int portion){//设置菜价,根据不同份额计算价格 int price = 0; if(portion==1) { price = (int)unit_price; } else if(portion==2) { price = Math.round((float)(unit_price*1.5)); } else if(portion==3) { price = (int)(unit_price*2); } return price; } } class Menu{ Dish[] dishs = new Dish[4]; Dish searthDish(String dishName){//设置菜名与单价 dishs[0] = new Dish(); dishs[1] = new Dish(); dishs[2] = new Dish(); dishs[3] = new Dish(); dishs[0].name ="西红柿炒蛋"; dishs[1].name = "清炒土豆丝"; dishs[2].name = "麻婆豆腐"; dishs[3].name = "油淋生菜"; dishs[0].unit_price = 15; dishs[1].unit_price = 12; dishs[2].unit_price = 12; dishs[3].unit_price = 9; for(int i=0;i<4;i++){ if(dishName.equals(dishs[i].name)){//判断菜品是否存在 return dishs[i]; } } return null; } } class Record{ Dish d = new Dish(); int portion; int getPrice(){ return d.getPrice(portion); } } class Order{ Record[] records = new Record[10000];//设置菜单上限 int count = 0; int getTotalPrice(){ int tprice = 0; for(int i = 0;i < count;i++){ tprice = tprice + records[i].getPrice(); } return tprice; } Record addARecord(String dishName,int portion){ Record a = new Record(); a.d.name = dishName; a.portion = portion; count++; return a; } }
心得:
写此题时开始没啥思路,但是先把类都写出来大致体系,再根据类与类之间联系,一步一步写出其中的相关的步骤与关系,理清调用关系,便可以一点一点写出每个类的关系与每种类中的方法,属性。但是写此题需有一定的java基础,了解语法使用,才能够有一定的思路写出题目。本人因基础不扎实,所以常常出现基础错误,甚至没有思路写程序。期间遇到错误大多也是为类与类之间的联系逻辑出现错误,无法正常调用。
题目集2:7-2:此题因自身原因未及时写完,因此源代码无。
但是此题对于7-1只加了一个删除程序,只需比对点菜记录中的菜的序号,然后删除即可。
题目集3:7-1:
题目集3:7-2:
import java.util.HashSet; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); sc.nextLine(); String str = sc.nextLine(); String[] a = str.split(" "); HashSet<String> b = new HashSet<String>();//利用hasset类进行无序不重复输入 for(int i=0;i<n;i++) { b.add(a[i]); } int size = b.size(); if(size==n)//因重复无法输入所以根据size与n是否相等判断有无重复字母 { System.out.println("NO"); } else{ System.out.println("YES"); } } }
心得:hasset的使用及其方便判断此题,因为只需要判断是否有重复字母无需考虑其他,一个简单的比较就可以完成判断。
(3)采坑心得:
a. 对于第一次作业中多个题目需要进行强制类型转换,否则题目测试点无法通过。如下题要将结果从double转化为float类型,否则报错。
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); int n = input.nextInt(); int f = input.nextInt(); int p = input.nextInt(); float s = input.nextFloat(); double y = (double)f*10000*0.0005; double j = (double)s*3.0; double c = (double)s*1.36; double q; if(n==1) { if(s<=90) q =(double) p*0.01*10000; else if(s<=144&&s>90) q =(double) p*0.015*10000; else //if(s>144) q =(double) p*0.03*10000; } else //if(n>1) { q =(double) p*0.03*10000; } System.out.print((float)q+" "+(float)y+" "+(float)j+" "+(float)c); } }
b. print与println之间的区别会影响到输出结果的判定。如下题,输出结果应考虑最后一行不能多输出一行空行,否则无法通过测试点,所以加else判定最后一行用print输出。
import java.util.*; import java.io.*; public class Main{ public static void main(String[] args)throws IOException{ int[] a = new int[10001]; long[] b = new long[1000]; b[0] = 1;b[1] = 1;b[2] = 2;b[3] = 4;b[4] = 8; StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); re.nextToken(); int m = (int)re.nval; for(int i=1;i<=m;i++){ re.nextToken(); a[i] = (int)re.nval; } for(int i=1;i<=m;i++){ if(a[i]==0) System.out.println(0); else if(a[i]<5){ if(i!=m) System.out.println(b[a[i]]); else System.out.print(b[a[i]]); } else{ for (int j = 5; j <= a[i]; j++){ b[j] = 2 * b[j - 1] - b[j - 5]; } if(i!=m) System.out.println(b[a[i]]); else System.out.print(b[a[i]]); } } } }
c. 在写java程序时,其实比较方便因为它自带许多内部文件库十分方便使用,如math类,hasset类,string类,时间类等等,使用十分方便。如时间类:
d. 在同事调用有参构造与无参构造函数时,出现覆盖问题,在构造了有参函数后,仍然要将无参构造函数写出,否则有参函数会覆盖无参函数,造报错,如下题:
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{ private String sid; private String name; private int age; private String major; public Student(String sid2,String name2,int age2,String major2){ sid = sid2; name = name2; age = age2; major = major2; } public Student(){}; public void setSid(String sid1){ this.sid = sid1; } public void setName(String name1){ this.name = name1; } public void setAge(int age1){ this.age = age1; } public void setMajor(String major1){ this.major = major1; } public void print(){ System.out.println("学号:"+sid+",姓名:"+name+",年龄:"+age+",专业:"+major); } }
(4)主要困难以及改进建议:
a. 初写作业时,许多基础语法不会使用,致使写题较慢且思路不清,对于数组的使用,相关java自带文件库的利用等等都不熟悉,应先花较多时间去学习java的基础语法,了解java的各种语法及自带文件库的内容,可以更加熟练地运用便能轻松的写出代码。
b. 对于作业的练习不够,做的题目量太少,导致熟练度不够,在学习网课之余应去做一些课外知识的巩固练习题,加大训练量;
c. 自我认知出现问题,花费时间在java上不够,并且不够自觉去学习java,所以应提高自身自律性,主动花时间去学习java;
d. 注重自我反省,每次写完一道题目后应该及时反省题目中发现的错误,了解自身缺陷,然后及时弥补不足。
(5)总结:
对于此三次作业,我了解到自身对于java学习的许多缺陷,时间花费不足,基础语法学习不足,对于类与类之间的关系调用,类中属性,方法的使用编写有许多不足,但是通过此次作业我也学习了解了许多java知识,查漏补缺以及学习了许多知识要点;对于线上课程的学习需要花费更多的时间,主动去学去看,而线下课则希望老师对于题目的讲解能够更加细致,能多讲一些已经写过的题,因为这样有过记忆,实验课则希望老师能略微讲解一些实验中题目的要求及要点,稍微提醒。
标签:总结性,java,String,int,PTA,Blog,sc,new,public From: https://www.cnblogs.com/xxyzdz/p/17279702.html