BLOG_3

发布时间 2023-12-09 22:55:50作者: 21207312

(1)前言:在pta第7,8次大作业和期末考试所包含的知识点主要有:

题目的难度根据题目不同也有所不同。

(2)  设计与分析

:定义课程(Course)、课程集合(Courses)、班级(Classx)、班级集合(Classes)以及学生(Student)这几个类来进行数据的存储和管理。

通过Scanner从标准输入读取数据,根据输入的内容进行不同的处理:

当输入为课程信息时,调用AddCourse方法添加课程到课程集合中。

当输入为学生成绩信息时,调用AddCoursegrades方法添加学生成绩,并调用AddStudent方法添加学生信息到班级集合中。

在处理完所有输入后,按照一定的规则对课程和学生成绩进行统计和输出:

遍历学生成绩列表,输出学生的成绩信息。

对课程列表进行排序,计算每门课程的平均成绩并输出。

对班级列表进行排序,计算每个班级学生的平均成绩并输出。

 程序的主函数中,使用了Scanner类从用户的输入读取输入信息,并根据Match判断的返回值判断其输入格式是否正确后转入相应的if语句中执行相应的操作。通过调用相关类的各种方法,结合课程的信息和学生的列表,可以进行课程的注册、查看学生列表、查找学生/教师信息等操作。最后,根据课程的计算方式和学生的信息,计算课程的成绩或教师的评价。通过将不同的功能分别封装在不同的类中,可以使得程序结构更加清晰,并且易于扩展和维护。

3)踩坑心得:在对输入数据的处理过程中,一定要选择合适的输入数据判断方法,一定要能够兼顾完成对正常数据的输入和异常数据的判断和处理输出,以应对题目需求。对于

(4)主要困难以及改进建议:对于对输入数据的处理与判别尤其需要细心并且细致讨论各类情况,防止非法输入导致程序无法正常运行。

(5)总结:关于此次解题经验,我总结了部分要点:

1.明确题目要求与意义:根据题目说明和所提供的示例输入输出等辅助信息理解题目要求与目的。

2.理清解题思路再写代码:在理解了题意后,先理清题目的解题思路,避免在编写代码的过程中出现错误。

3.考虑边界条件和异常情况:在编写题目时要考虑到各种可能的输入情况,包括边界值和异常情况,以保证代码的稳定性。

4.不断学习更新知识:题目的编写过程也是对自己知识的回顾和巩固,通过编写题目可以不断学习并更新自己的知识体系,只有这样才能适应多变的题型。

总的来说,这次写题目对我来说是一次很有收获的经历。通过这次写题目,我锻炼了自己的问题设计和解决能力,并提高了对编程知识的理解和应用能力。希望在以后的学习和实践中能够继续加油,不断提升自己的技术水平。

 

以下是课程成绩统计程序-3的源代码:

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Scanner;

public class Main {

    public static class Course

    {

        String name= "";

        String Access=" ";

        String AccessMode= "";

        int judgecount=0,stucount=0;

        double[] judge= new double[10];

        Student[] stu=new Student[40];

 

    }

    public static class Courses

    {

        int count=0;

        ArrayList<Integer>  arry=new ArrayList<>();

        Course[] cour=new Course[20];

        public int SearchCourse(String namex)

        {

            int rex=-1;

            if(this.count!=0)

            {

                for (int i = 0; i < this.count; i++)

                {

                    if(namex.equals(cour[i].name))

                    {

                        rex=i;

                        break;

                    }

                }

            }

            return rex;

        }

 

        public double AddCoursegrades(String  str)

        {

            String[]  temp=str.split("\\s");

            int x=this.SearchCourse(temp[2]);

 

            double tem=0;

            if(x==-1)

            {

                System.out.println(temp[2]+" does not exist");//temp[0]+" "+temp[1]+" :"+

                return -1;

            }

 

            if(cour[x].AccessMode.equals("实验"))

            {

                if(cour[x].judgecount==temp.length-3)

                {

                    for (int i = 0; i < temp.length-3; i++) {

                        tem=tem+cour[x].judge[i]*Double.parseDouble(temp[i+3]);

                    }

 

                    if(cour[x]==null)

                    {cour[x]=new Course();}

                    if(  cour[x].stu[cour[x].stucount]==null)

                    {  cour[x].stu[cour[x].stucount]=new Student();}

                    cour[x].stu[cour[x].stucount].Id=temp[0];

                    cour[x].stu[cour[x].stucount].Name=temp[1];

                    cour[x].stu[cour[x].stucount].grade=(int) Math.floor(tem);

                    cour[x].stucount++;

                    return (int) Math.floor(tem);

                }

                else

                {

                    System.out.print(temp[0]+" "+temp[1]+" : access mode mismatch\n");

                    return -1;

                }

            }

            else if(cour[x].AccessMode.equals("考试"))

            {

                if(temp.length==5)

                {

                tem=cour[x].judge[0]*Double.parseDouble(temp[3])+cour[x].judge[1]*Double.parseDouble(temp[4]);

 

                if(cour[x].stu[cour[x].stucount]==null)

                {

                    cour[x].stu[cour[x].stucount]=new Student();

                }

                cour[x].stu[cour[x].stucount].Id=temp[0];

                cour[x].stu[cour[x].stucount].Name=temp[1];

                cour[x].stu[cour[x].stucount].grade=(int) Math.floor(tem);

 

                cour[x].stucount++;

                return  (int) Math.floor(tem);

                }

                else

                {

                    System.out.print(temp[0]+" "+temp[1]+" : access mode mismatch\n");

                    return -1;

                }

 

            }

            else if(cour[x].AccessMode.equals("考察"))

            {

                if(temp.length==4)

                {

                    if(cour[x].stu[cour[x].stucount]==null)

                    {

                        cour[x].stu[cour[x].stucount]=new Student();

                    }

                    cour[x].stu[cour[x].stucount].Id=temp[0];

                    cour[x].stu[cour[x].stucount].Name=temp[1];

                    cour[x].stu[cour[x].stucount].grade=Integer.parseInt(temp[3]);

 

                    cour[x].stucount++;

                    return cour[x].stu[cour[x].stucount-1].grade;

                }

                else

                {

                    System.out.print(temp[0]+" "+temp[1]+" : access mode mismatch\n");

                    return -1;

                }

 

            }

 

            return -1;

        }

 

 

        public void AddCourse(String  str)

        {

          String[]  temp=str.split("\\s");

 

            if(this.SearchCourse(temp[0])!=-1)

            {

                return;

            }//排除重复课程信息

 

            if (temp[1].equals("实验"))//实验课的成绩必须为实验。

            {

                int n=Integer.parseInt(temp[3]);

                if(temp[2].equals("实验")) {

                    if (temp.length - 4 != n) {

                        System.out.println(temp[0] + " : number of scores does not match");

                        return;

                    }

                    else {

                        double weightSum = 0;

 

                        for (int i = 4; i < n+4;i++) {

                            weightSum =weightSum+Double.parseDouble(temp[i]);

                        }

                        weightSum=Math.floor(weightSum);

                        if (weightSum!=1) {

                            System.out.println(temp[0]+" : weight value error");

                            return;

                        }

                        else if(weightSum==1)

                        {

                            if( cour[this.count]==null)

                            {

                                cour[this.count]=new Course();

                            }

                            cour[this.count].name=temp[0];

                            cour[this.count].Access=temp[1];

                            cour[this.count].AccessMode=temp[2];

                            cour[this.count].judgecount=n;

                            for (int i = 4; i < n + 4; i++) {

                                cour[this.count].judge[i-4]=Double.parseDouble(temp[i]);

                            }

                            this.count++;

                        }

 

                    }

                }

                else//考核方式错误

                {

                    System.out.println(temp[0] + " : course type & access mode mismatch");

                    return;

                }

            }

            else if (temp[1].equals("必修")) //必修课的考核方式必须为考试。

            {

                if(temp[2].equals("考试"))

                {

                    if(temp.length==5)

                    {

                        double weightSum = 0;

                        weightSum=Double.parseDouble(temp[3])+Double.parseDouble(temp[4]);

                        if (weightSum != 1) {

                            System.out.println(temp[0] + " : weight value error");

                            return;

                        }

                        if( cour[this.count]==null)

                        {

                            cour[this.count]=new Course();

                        }

 

                        cour[this.count].name=temp[0];

                        cour[this.count].Access=temp[1];

                        cour[this.count].AccessMode=temp[2];

                        cour[this.count].judgecount=2;

                        cour[this.count].judge[0]= Double.parseDouble(temp[3]);

                        cour[this.count].judge[1]= Double.parseDouble(temp[4]);

 

                        this.count++;

                    }

                    else

                    {

                        System.out.print("wrong format\n");

                        return;

                    }

                }

                else//考察或实验//考核方式错误

                {

                    System.out.print(temp[0]+" : course type & access mode mismatch\n");

                    return;

                }

 

            }

            else if (temp[1].equals("选修"))//,选修课可以选择考试、考察任一考核方式。

            {

                if(temp[2].equals("考试"))

                {

                    if(temp.length==5)

                    {

                        double weightSum = 0;

                        weightSum=Double.parseDouble(temp[3])+Double.parseDouble(temp[4]);

                        if (weightSum != 1) {

                            System.out.println(temp[0] + " : weight value error");

                            return;

                        }

 

                        cour[this.count].name=temp[0];

                        cour[this.count].Access=temp[1];

                        cour[this.count].AccessMode=temp[2];

                        cour[this.count].judgecount=2;

                        cour[this.count].judge[0]= Double.parseDouble(temp[3]);

                        cour[this.count].judge[1]= Double.parseDouble(temp[4]);

 

                        this.count++;

                    }

                    else

                    {

                        System.out.print("wrong format\n");

                        return;

                    }

 

                }

                else if(temp[2].equals("考察"))

                {

                    if(temp.length==3)

                    {

 

                        if( cour[this.count]==null)

                        {

                            cour[this.count]=new Course();

                        }

                        cour[this.count].name=temp[0];

                        cour[this.count].Access=temp[1];

                        cour[this.count].AccessMode=temp[2];

                        cour[this.count].judgecount=1;

                        cour[this.count].judge[0]=1;

 

                        this.count++;

                    }

                    else

                    {

                        System.out.print("wrong format\n");

                        return;

                    }

 

                }

                else//实验//考核方式错误

                {

                    System.out.print(temp[0]+" : course type & access mode mismatch\n");

                    return;

                }

 

            }

 

        }//addcourse

 

    }//class course

    public static class Classx

    {

 

        String classnum=" ";

        int  classgrade=0,stucount=0;

 

        Student[] stu =new Student[40];

 

 

    }

 

    public static class Classes

    {

       int clacount=0;

       Classx[] cla =new Classx[10];

 

       public  int SearchClass(String str)

       {

           int rex=-1;

           String temp=str.substring(0,6);

          // System.out.print("\n测试  :  "+temp+"\n");

           for (int i = 0; i < clacount; i++){

               if(cla[i].classnum.equals(temp))

               {

                   return i;

               }

           }

           return  rex;

       }

 

        public  void AddStudent(String str,int grade)

        {

            String[]  temp=str.split("\\s");

            int x=this.SearchClass(temp[0]);

            if(x==-1)//新的班级号

            {

                if(cla[this.clacount]==null)

                {

                    cla[this.clacount]=new Classx();

                }

                if(cla[this.clacount].stu[cla[this.clacount].stucount]==null)

                {

                    cla[this.clacount].stu[cla[this.clacount].stucount]=new Student();

                }

 

                cla[this.clacount].classnum=temp[0].substring(0,6);

                cla[this.clacount].stu[cla[this.clacount].stucount].Id=temp[0];

                cla[this.clacount].stu[cla[this.clacount].stucount].Name=temp[1];

                cla[this.clacount].stu[cla[this.clacount].stucount].grade=grade;

 

                if(grade!=-1){

                cla[this.clacount].stucount++;}

 

                this.clacount++;

            }

            else//存在的班级号

            {

                if(cla[x]==null)

                {

                    cla[x]=new Classx();

                }

                if(cla[x].stu[cla[x].stucount]==null)

                {

                    cla[x].stu[cla[x].stucount]=new Student();

                }

                cla[x].stu[cla[x].stucount].Id=temp[0];

                cla[x].stu[cla[x].stucount].Name=temp[1];

                cla[x].stu[cla[x].stucount].grade=grade;

 

                if(grade!=-1){

                cla[x].stucount++;}

            }

 

        }

 

 

 

    }//Classes

 

    public static class Student

    {

        String Name=" ";

        String Id=" ";

        int grade=-1;

 

    }

 

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

 

        Courses courses=new Courses();

        Classes classes=new Classes();

        Student[] students=new Student[50];

 

        ArrayList<Classx>  arryclass=new ArrayList<>();

        ArrayList<Student> arrystu=new ArrayList<>();

 

        int stucout=0;

        String line =scan.nextLine();

        while(!line.equals("end"))

        {

            String[] temp = line.split("\\s");

 

            if(temp[1].equals("实验")||temp[1].equals("选修")||temp[1].equals("必修"))

            {

              //  System.out.print("\n     "+line+"    为课程输入"+"\n");

                courses.AddCourse(line);

 

            }

            else if(temp[0].matches("\\d{8}"))

            {

              //  System.out.print("     "+line+"    为学生与成绩输入"+"\n");

 

 

                int grade=(int)Math.round(courses.AddCoursegrades(line));

 

                classes.AddStudent(line,grade);

 

                if(students[stucout]==null)

                {

                    students[stucout]=new Student();

                }

                int t=Integer.parseInt(temp[0]);

                students[stucout].Id=temp[0];

                students[stucout].Name=temp[1];

                students[stucout].grade=grade;

                if(stucout==0)

                {

                    arrystu.add(students[stucout]);

                }

                else

                {

                   Student stux=new Student();

                    for (int i = 0; i < arrystu.size(); i++)

                    {

                        stux=arrystu.get(i);

 

                        if(Integer.parseInt(stux.Id)>Integer.parseInt(temp[0]))

                        {

                            arrystu.add(i,students[stucout]);

                            break;

                        }

                        else if(Integer.parseInt(stux.Id)<Integer.parseInt(temp[0])&&i+1==arrystu.size())

                        {

                            arrystu.add(students[stucout]);

                            break;

                        }

                        else if(Integer.parseInt(stux.Id)==Integer.parseInt(temp[0]))

                        {

                            i=i+1;

                            arrystu.add(i,students[stucout]);

                            break;

                        }

                    }//for

 

                }

                    stucout++;

            }//学生成绩输入

 

 

            line= scan.nextLine();

        }//while

        //end以后

 

        for (int i = 0; i < stucout; i++) {

            Student stux=new Student();

            stux=arrystu.get(i);

            if(stux.grade==-1) {

                System.out.print(stux.Id+" ");

                System.out.print(stux.Name+" did not take any exams\n");

            }

            else

            {

                System.out.print(stux.Id+" "+stux.Name+" "+stux.grade+"\n");

            }

        }//学生成绩输出

 

 

        String[] cou =new String[courses.count];

        for (int i = 0; i < courses.count; i++) {

            cou[i]=courses.cour[i].name;

        }

        Arrays.sort(cou);

 

        for(int i = 0; i < courses.count; i++) {

            double tempx=0;

            int tempy=0;

            int sear=courses.SearchCourse(cou[i]);

 

            for (int j = 0; j < courses.cour[sear].stucount; j++)

            {

                tempx=tempx+courses.cour[sear].stu[j].grade;

          //      System.out.print("\n    "+tempx+"\n");

            }

 

            if(tempx==-1||tempx==0)

            {

                System.out.print(courses.cour[sear].name+" has no grades yet\n");

            }

            else

            {

                tempy=(int)Math.floor(tempx/courses.cour[sear].stucount);

                System.out.print(courses.cour[sear].name+" "+tempy+"\n");

            }

 

        }//课程输出

 

        String[] st=new String[classes.clacount];

        for (int i = 0; i < classes.clacount; i++) {

            st[i]=classes.cla[i].classnum;

        }

        Arrays.sort(st);

 

        for (int i = 0; i < classes.clacount;i++)

        {

            double tempx=0;

            int tempy=0;

 

            String temp=" ";

 

            for (int j = 0; j < stucout; j++) {

                temp=arrystu.get(j).Id.substring(0,6);

                if(st[i].equals(temp))

                {

                    if(arrystu.get(j).grade!=-1)

                    tempx=tempx+arrystu.get(j).grade;

                }

            }

 

            int num=classes.SearchClass(st[i]);

 

            if(tempx==-1||tempx==0)

            {

                System.out.print(classes.cla[num].classnum+" has no grades yet\n");

            }

            else

            {

                tempy=(int)Math.floor(tempx/classes.cla[num].stucount);

                System.out.print(classes.cla[num].classnum+" "+tempy+"\n");

            }

        }//班级输

    }//main

}//Main

在程序中,使用了面向对象的编程思想,定义了课程、班级和学生这几个类,并且提供了对应的方法来处理相关操作。同时,程序还使用了数组、ArrayList 和基本的输入输出操作来实现功能。

需要注意的是,程序中存在一些功能逻辑判断和数据处理的地方,例如添加课程时对课程类型和考核方式的匹配判断、对学生成绩的处理和计算等。此外,程序中还有一些排序和搜索的操作,用于输出结果时的数据整理。

总体来说,这个程序是一个简单的学生成绩管理系统的雏形,通过对课程、班级和学生信息的管理和处理,实现了一些基本的功能。如果需要进一步完善,可能需要考虑更多的输入验证、异常处理、用户交互界面等方面的功能。