第三次题目总结

发布时间 2023-06-27 17:13:11作者: dgzs

一,前言


在10-16周的题目中,我们学习了很多有用的方法和技巧,比如使用set和map来解决一些查找和去重的问题。此外,我们还学习了一些高级数据结构,如树和图,并学会了如何使用它们来解决一些复杂的算法问题。 虽然有些内容可能比较陌生,但我们可以通过练习来掌握它们。在练习过程中,我们也会发现一些常见的模式和技巧,进一步提高我们的解题能力。 总之,通过这段时间的学习和练习,我们可以掌握到更多的算法和数据结构知识,并在实践中提高我们的解题能力。这些技能不仅在竞赛和面试中有用,也可以帮助我们更好地理解和处理实际问题。

二,设计与分析

本次主要以课程成绩计算系统为主,加上了一些其他偏向训练的题。

7-1 统计Java程序中关键词的出现次数

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

本题的做法基本上就是构建正则表达式,将输入的源码处理好,按照关键字的表达式来统计关键字出现的次数

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import java.util.Map;

import java.util.TreeMap;

public class Main {

    public static void main(String[] args) {

        Scanner code = new Scanner(System.in);

        StringBuilder str1 = new StringBuilder();

        Map<String, Integer> map = new TreeMap<>();

        String[] keyword = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "void", "volatile", "while"};

        String search;

        int num = 0;

        search = code.nextLine();

        while( !search.equals("exit")) {

            str1.append(search.replaceAll("//.*", " ").replaceAll("\".*\"", " ").replaceAll("/\\*\\s*.*\\s*\\*/", " "));

            search = code.nextLine();

            num = 1;

        }

        String str2 = str1.toString().replaceAll("/\\*\\s*.*\\s*\\*/", " ");

        if(num == 0) {

            System.out.println("Wrong Format");

            return;

        }

        int n;

        for (String s : keyword) {

            Pattern pattern = Pattern.compile("\\b" + s + "\\b");

            Matcher matcher = pattern.matcher(str2);

            n = 0;

            while (matcher.find()) {

                n++;

                if (n != 0) {

                    map.put(s, n);

                }

            }

        }

            String map1 = String.valueOf(map);

            String map2 = map1.replace("{","").replace("}","");

            String[] map3 = map2.split(", ");

        for (String s : map3) {

            String[] map4 = s.split("=");

            System.out.println(map4[1] + "\t" + map4[0]);

        }

        }

}

这其中有些情况下我的代码并不能完美的统计关键字,具体情况可能是某种情况下的代码并不能正确处理。

 

7-1 课程成绩统计程序-1

某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

课程性质输入项:必修、选修

考核方式输入选项:考试、考察

课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

3)学号由8位数字组成

4)姓名不超过10个字符

5)课程名称不超过10个字符

6)不特别输入班级信息,班级号是学号的前6位。

这次题目和之前的菜单类的大致情况相同,但难度上应该比菜单类简单,同样的我选择用ArraryList来处理输入的数据。并按空格将数据分开,并根据每组数据的长度来判断是课程信息还是成绩信息,后续再通过相应的类来处理。

import java.util.ArrayList;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int i, j,a = 0;

        ArrayList<Object> courses = new ArrayList<>();

        ArrayList<Object> students = new ArrayList<>();

        ArrayList<Object> examScores = new ArrayList<>();

        String[] n = new String[10];

        for (i = 0; true; i++) {

            String[] m = input.nextLine().split(" ");

            if (m[0].equals("end")) {

                break;

            }

            if (m.length == 3) {

                Course course = new Course();

                Course.setCourseName(m[0]);

                Course.setNature(m[1]);

                Course.setMethod(m[2]);

                courses.add(course);

                n[i] = m[0];

            }

            if (m.length == 4) {

                Student student = new Student();

                Student.setCode(m[0]);

                Student.setName(m[1]);

                students.add(student);

                ExamScores score = new ExamScores();

                ExamScores.setNormalScore(m[2]);

                ExamScores.setScore(m[3]);

                examScores.add(score);

            }

            if(m.length == 3&&Course.getNature() == "考察"){

                Student student = new Student();

                Student.setCode(m[0]);

                Student.setName(m[1]);

                students.add(student);

                ExamineScores.getScore();

            }

            a = i;

        }

        input.close();

        if(ChooseCourse.judge()){

                for(i = 0;i <= a;i ++){

                    System.out.println(n[i] + " has no grades yet");

                }

        }

        if(ExamineScores.judge()){

            System.out.println("wrong format\n" + Course.getCourseName() + " has no grades yet");

        }

        }

    }

class ChooseCourse {

    private Course course;

    private Student student;

    private Score score;

 

    ChooseCourse() {

        course = new Course();

        student = new Student();

    }

    public static boolean judge(){

        return Student.getCode() == null;

    }

}

class Student{

    private static String name ;

    private static String code;

    public static String getCode() {

        return code;

    }

    public static void setCode(String code) {

        Student.code = code;

    }

    public static String getName() {

        return name;

    }

    public static void setName(String name) {

        Student.name = name;

    }

 

}

class Class{

String classNumber = Student.getCode();

public int number(){

    int number = Integer.parseInt(classNumber);

    return number/100;

}

}

class Course{

    private static String courseName;

    private static String nature;

    private static String method;

    public static String getNature() {

        return nature;

    }

 

    public static void setNature(String nature) {

        Course.nature = nature;

    }

 

    public static String getMethod() {

        return method;

    }

 

    public static void setMethod(String method) {

        Course.method = method;

    }

    public static String getCourseName() {

        return courseName;

    }

 

    public static void setCourseName(String courseName) {

        Course.courseName = courseName;

    }

}

abstract class Score{

    public double score(){

        double score;

        score = Double.parseDouble(String.valueOf(Integer.parseInt(ExamScores.getScore()) * 0.3 + Integer.parseInt( ExamScores.getNormalScore())* 0.7));

        return  score;

    }

}

class ExamScores extends Score{

    public static String getScore() {

        return score;

    }

 

    public static void setScore(String score) {

        ExamScores.score = score;

    }

 

    private static String score;

 

    public static String getNormalScore() {

        return normalScore;

    }

 

    public static void setNormalScore(String normalScore) {

        ExamScores.normalScore = normalScore;

    }

 

    private static String normalScore;

}

class ExamineScores extends Score{

    public static String getScore() {

        return score;

    }

 

    public void setScore(String score) {

        ExamineScores.score = score;

    }

 

    private static String score;

    public static boolean judge(){

        int sc = Integer.parseInt(getScore());

        if(sc > 100){

            return true;

        }

        else {

            return false;

        }

    }

}

这次只完成了其中的一部分功能,