PTA前三次题目集总结

PTA前三次题目集总结

前言

第一次题目集

知识点:数据的输入、简单处理和输出,格式的转换、选择结构。

总共有9题,难度偏低,比较基础,做起来与C语言区别不大。

第二次题目集

知识点:Date类的使用,类的声明、创建与使用方法,类的成员变量、成员方法的定义与使用方法、循环结构,字符串的输入、比较、转换、拆分。

总共有4题,难度中等,与C语言有较大区别。

第三次题目集

知识点:private的使用方法,字符的处理,类的封装

总共有7题,难度偏高。

正文

第一次题目集

这是我第一次在PTA上写java,开始我并不知道主类只能是Main,提交了好多次都显示编程错误,后来问同学才知道,浪费了时间和精力,我也忘记把C语言调成java,写完代码后仔细看才看到。在这里我写代码的思维还是C语言的,只是有一些输入和输出的改变,对java缺乏基本的认识,认为javaC语言差别不大,这对我后续思维的转变造成阻碍。

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的进一步学习。另外,在类与方法之间的调用方面,我认为我的掌握不够,需要进一步研究。最后,我希望老师能增加课堂互动和实例讲解,对学生掌握知识点有帮助。

 

posted @ 2023-05-24 22:51  hanling  阅读(63)  评论(0)    收藏  举报