一,前言
在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;
}
}
}
这次只完成了其中的一部分功能,