(2022级)成都工业学院软件构造实验三:面向数据的软件构造

写在前面

1、基于2022级软件工程实验指导书

2、代码仅提供参考

3、如果代码不满足你的要求,请寻求其他的途径

运行环境

window11家庭版

IntelliJ IDEA 2023.2.2

jdk17.0.6

实验要求

任务:

‍一、构造任务4:批量产生习题并用文件存储。

二、构造任务6:批改练习并存储

三、构造任务5:生成100以内加法/减法的算式

以下为详细说明:

一、构造任务4:批量产生习题并用文件存储。

构造任务4.2.1:以第3章面向对象的版本为基础,完成构造任务4,建议新加一个类ExerciseFiles、增加方法,批量产生并存储习题(CSV文件格式)。

要求:

截屏和.txt文件,内容是CSV格式的练习题(20~50题),加、减、混合题各一套;

构造任务4.2.2:复用BinaryOperation, Exercise, ExerciseSheet,建议新加一个类ExerciseFiles、在其中增加方法,从CSV格式的文件中读入习题。

下面是4个CSV加法、减法练习文件,有的文件格式无任何多余符号、有的文件中有无关符号

文件1:exercise_add_50_1

文件2:exercise_add_70_2

文件3:exercise_sub_50_1

文件4:exercise_sub_60_2

要求:读入教师指定的上述4套CSV格式的练习文件并相应处理,按照3~5列:

2.1 屏幕显示读到的文件内容。

2.2 在上述基础上添加运算结果,例如33+22=55,屏幕显示,要求复用第三章的算式类;

技术考核点:

1. 防御性编程

1.1 异常的使用和处理,比如不存在的文件、数值超出范围或者不满足约束条件;

1.2 练习文件中包含无关符号、要用正则表达式处理;

2. junit的使用

2.1 测试异常,成功和失败各一次

2.2 参数化测试

2.3 测试套件

二、构造任务6:批改练习并存储。

练习结果以CSV格式写入一个练习文件;程序读入该文件,与相应习题中的每个算式答案比较;统计批改,屏幕显示,同时存入CSV格式的批改文件。练习结果文件的参考格式:

文件名:answers_add_50_19

76,65,61, 58,78,42,45,-1, 56, 63,

要求练习答案的顺序和数目与对应的习题一致。对于没有做出的算式,录入到CSV文件时,用1表示。批改、统计练习后,存储文件的参考格式:

练习题:文件名

算式总数:50

正确:45

错误:5

得分:90

dd_50_3   exercise_add_50_3

Test2: answers_mix_70_3   exercise_ mix _70_3

功能考核点:

1. 读入CSV格式的练习exercise文件,简单防御性处理:两者数量不一致,文件不存在,打不开文件(或者不是CSV格式);

屏幕输出读入的文件、截屏显示

2. 从exercise中计算每一个算式的结果,要求复用第三章的算式类

屏幕输出每一个算式的结果、截屏显示

3. 批改练习:检查结果是否正确,记录统计结果,屏幕输出或存入CSV格式的文件,给出证据

三、构造任务5:生成100以内加法/减法的算式基。

新加一个类BinaryOperationBase,产生算式基、存储到文件,从算式基随机选择算式组成练习,

考核点及验证:

  1. 分别生产正确的加法算式基、减法算式基;验证:2个截屏(数值范围可以是20)。
  2. 要求复用第三章的类,否则本题不得分。

加法算式基、减法算式基分别存入CSV格式的文件;

验证:CSV格式的2个文件。​

从CSV格式的读入算式基、并分别组成一定数量练习;

验证:35道加法算式、48道减法算式,截屏。

3. 把加法算式基和减法算式基合并在一个数据结构,存入CSV格式的文件,并且从中组成一定数量练习;验证:一个截屏和CSV格式的文件,50题混合算式的练习,截屏。

不完成3个任务、要求复用第三章的类,否则本题不得分。

源代码

BinaryOperation.java

import java.util.*;abstract class BinaryOperation {protected int operand1;protected int operand2;protected int result;public BinaryOperation() {// 生成操作数和计算结果Random rand = new Random();operand1 = rand.nextInt(101); // 生成0到100的随机数operand2 = generateOperand2();result = operate(operand1, operand2);}protected abstract int operate(int operand1, int operand2);// 生成第二个操作数protected abstract int generateOperand2();public String getExpression() {return operand1 + "\t" + getOperator() + "\t" + operand2 + "\t" + " = ";}protected abstract String getOperator();public int getResult() {return result;}
}// 加法类
class Addition extends BinaryOperation {@Overrideprotected int operate(int operand1, int operand2) {return operand1 + operand2;}@Overrideprotected int generateOperand2() {Random rand = new Random();return rand.nextInt(101 - operand1); // 第二个操作数不能超过100减去第一个操作数}@Overrideprotected String getOperator() {return " + ";}
}// 减法类
class Subtraction extends BinaryOperation {@Overrideprotected int operate(int operand1, int operand2) {return operand1 - operand2;}@Overrideprotected int generateOperand2() {Random rand = new Random();return rand.nextInt(operand1 + 1); // 第二个操作数不能超过第一个操作数}@Overrideprotected String getOperator() {return " - ";}
}

Exercise.java

//构造要求2:实现Exercise
class Exercise {private BinaryOperation operation;public Exercise(BinaryOperation operation) {this.operation = operation;}public String getExpression() {return operation.getExpression();}public int getResult() {return operation.getResult();}
}

ExerciseSheet.java

import java.util.HashSet;
import java.util.Set;//构造要求2:实现ExerciseSheet
class ExerciseSheet {private Exercise[] exercises;public ExerciseSheet(int numExercises, Class<? extends BinaryOperation> operationType) {exercises = new Exercise[numExercises];try {Set<String> expressions = new HashSet<>(); // 使用集合来确保题目不重复for (int i = 0; i < numExercises; i++) {BinaryOperation operation = operationType.newInstance();String expression = operation.getExpression();// 如果集合中已经有了相同的表达式,则重新生成直到不重复为止while (expressions.contains(expression)) {operation = operationType.newInstance();expression = operation.getExpression();}expressions.add(expression);exercises[i] = new Exercise(operation);}} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}}public Exercise[] getExercises() {return exercises;}
}

ExerciseFIles.java

import java.io.*;
import java.util.Random;
//构造任务1:批量产生习题并用文件存储
public class ExerciseFiles {private static final int NUM_EXERCISES = 50;// 生成加法练习题并写入CSV文件public static void generateAdditionCSV(String filename) {generateCSV(filename, Addition.class);}// 生成减法练习题并写入CSV文件public static void generateSubtractionCSV(String filename) {generateCSV(filename, Subtraction.class);}// 生成加减混合练习题并写入CSV文件public static void generateMixedOperationCSV(String filename) {try (PrintWriter writer = new PrintWriter(new FileWriter(filename))) {Random rand = new Random();for (int i = 0; i < NUM_EXERCISES; i++) {Class<? extends BinaryOperation> operationType = rand.nextBoolean() ? Addition.class : Subtraction.class;ExerciseSheet sheet = new ExerciseSheet(1, operationType);Exercise[] exercises = sheet.getExercises();writer.println(exercises[0].getExpression());}System.out.println("CSV文件已生成:" + filename);} catch (IOException e) {e.printStackTrace();}}// 生成CSV文件private static void generateCSV(String filename, Class<? extends BinaryOperation> operationType) {try (PrintWriter writer = new PrintWriter(new FileWriter(filename))) {ExerciseSheet sheet = new ExerciseSheet(NUM_EXERCISES, operationType);Exercise[] exercises = sheet.getExercises();for (Exercise exercise : exercises) {writer.println(exercise.getExpression());}System.out.println("CSV文件已生成:" + filename);} catch (IOException e) {e.printStackTrace();}}// 读取并计算CSV文件中的算式public static void calculateAndPrintCSV(String filename) {try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {String line;int count = 0; // 记录已输出的算式数量while ((line = reader.readLine()) != null) {// 对每一行数据进行预处理,去除可能存在的额外空格line = line.trim().replaceAll("\\s+", "\t");String[] parts = line.split("\t");int operand1 = Integer.parseInt(parts[0]);int operand2 = Integer.parseInt(parts[2]);String operator = parts[1];int result;// 判断运算符并进行相应的计算switch (operator) {case "+":result = operand1 + operand2;break;case "-":result = operand1 - operand2;break;default:System.out.println("警告:不支持的运算符:" + operator);continue; // 跳过本次循环,继续处理下一个算式}// 输出算式及其结果System.out.printf("%-10s", line + result + "\t\t");count++;if (count % 5 == 0) // 每行五个算式System.out.println();}} catch (IOException e) {e.printStackTrace();}}public static void generateAll() {// 生成加法练习题CSV文件ExerciseFiles.generateAdditionCSV("addition_exercises.csv");// 生成减法练习题CSV文件ExerciseFiles.generateSubtractionCSV("subtraction_exercises.csv");// 生成加减混合练习题CSV文件ExerciseFiles.generateMixedOperationCSV("mixed_operation_exercises.csv");}public static void calculateAndPrintAll() {// 读取并计算加法练习题CSV文件System.out.println("读取并计算加法练习题CSV文件:");ExerciseFiles.calculateAndPrintCSV("addition_exercises.csv");// 读取并计算减法练习题CSV文件System.out.println("\n读取并计算减法练习题CSV文件:");ExerciseFiles.calculateAndPrintCSV("subtraction_exercises.csv");// 读取并计算加减混合练习题CSV文件System.out.println("\n读取并计算加减混合练习题CSV文件:");ExerciseFiles.calculateAndPrintCSV("mixed_operation_exercises.csv");}}

ExerciseCorrection.java

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//构造任务2:批改练习并存储
public class ExerciseCorrection {// 从文件中读取习题private static List<String> readExercisesFromFile(String filename) throws IOException {List<String> exerciseList = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {String line;while ((line = reader.readLine()) != null) {exerciseList.add(line);}}return exerciseList;}// 获取用户输入的答案private static List<Integer> getUserAnswers(List<String> exerciseList) {List<Integer> userAnswers = new ArrayList<>();Scanner scanner = new Scanner(System.in);for (int i = 0; i < exerciseList.size(); i++) {String exercise = exerciseList.get(i);System.out.println("第 " + (i + 1) + " 题:" + exercise);String userInput = scanner.nextLine();try {int answer = Integer.parseInt(userInput);userAnswers.add(answer);} catch (NumberFormatException e) {userAnswers.add(-1);}}return userAnswers;}// 写入用户答案到文件private static void writeAnswersToFile(List<Integer> userAnswers, String filename) throws IOException {try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {for (Integer answer : userAnswers) {writer.write(answer + ",");}writer.newLine();}}// 批改并统计结果private static void correctAndReport(List<String> exerciseList, List<Integer> answersList, List<Integer> userAnswersList) {int totalExercises = exerciseList.size();if (totalExercises == 0 || answersList.size() == 0 || userAnswersList.size() == 0) {System.out.println("习题文件或答案文件为空,请检查文件内容。");return;}int correctCount = 0;for (int i = 0; i < totalExercises; i++) {int correctAnswer = evaluateExpression(exerciseList.get(i));int userAnswer = userAnswersList.get(i);if (userAnswer == correctAnswer) {correctCount++;}}// 统计结果int incorrectCount = totalExercises - correctCount;int score = (int) ((double) correctCount / totalExercises * 100);System.out.println("算式批改结果已存入文件");// 写入批改结果到文件try (BufferedWriter writer = new BufferedWriter(new FileWriter("correction_results.csv"))) {writer.write("练习题:" + "user_answers.csv");writer.newLine();writer.write("算式总数:" + totalExercises);writer.newLine();writer.write("正确:" + correctCount);writer.newLine();writer.write("错误:" + incorrectCount);writer.newLine();writer.write("得分:" + score);} catch (IOException e) {e.printStackTrace();}}// 计算表达式的值private static int evaluateExpression(String expression) {// 使用正则表达式匹配数字和运算符,忽略不可见的空白字符Pattern pattern = Pattern.compile("\\s*(\\d+)\\s*([-+])\\s*(\\d+)\\s*=\\s*");Matcher matcher = pattern.matcher(expression);if (matcher.matches()) {int operand1 = Integer.parseInt(matcher.group(1));String operator = matcher.group(2);int operand2 = Integer.parseInt(matcher.group(3));if (operator.equals("+")) {return operand1 + operand2;} else if (operator.equals("-")) {return operand1 - operand2;}}return 0;}public static void menu() {Scanner scanner = new Scanner(System.in);// 用户选择习题文件类型System.out.println("请选择习题文件类型:");System.out.println("1. 加法习题");System.out.println("2. 减法习题");System.out.println("3. 混合运算习题");System.out.print("请选择:");int choice = scanner.nextInt();String exerciseFilename = "";switch (choice) {case 1:exerciseFilename = "addition_exercises.csv";break;case 2:exerciseFilename = "subtraction_exercises.csv";break;case 3:exerciseFilename = "mixed_operation_exercises.csv";break;default:System.out.println("无效选择。");System.exit(-1);}String answersFilename = "user_answers.csv";try {List<String> exerciseList = readExercisesFromFile(exerciseFilename);// 获取用户输入答案List<Integer> userAnswersList = getUserAnswers(exerciseList);// 写入用户答案到文件writeAnswersToFile(userAnswersList, answersFilename);// 从文件中读取正确答案List<Integer> answersList = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(answersFilename))) {String line = reader.readLine();if (line != null) {String[] answersArray = line.split(",");for (String answer : answersArray) {answersList.add(Integer.parseInt(answer));}}}// 批改并统计结果correctAndReport(exerciseList, answersList, userAnswersList);} catch (IOException e) {e.printStackTrace();}}
}

BinaryOperationBase.java

import java.io.*;
import java.util.*;
//构造任务3:生成100以内加法/减法的算式
public class BinaryOperationBase {private List<String> additionBase;private List<String> subtractionBase;public BinaryOperationBase() {this.additionBase = new ArrayList<>();this.subtractionBase = new ArrayList<>();}// 生成加法算式基public void generateAdditionBase(int numOperations) {for (int i = 0; i < numOperations; i++) {BinaryOperation addition = new Addition();additionBase.add(addition.getExpression() + addition.getResult());}}// 生成减法算式基public void generateSubtractionBase(int numOperations) {for (int i = 0; i < numOperations; i++) {BinaryOperation subtraction = new Subtraction();subtractionBase.add(subtraction.getExpression() + subtraction.getResult());}}// 生成混合算式基public void generateMixedOperationBase(int numOperations) {generateAdditionBase(numOperations / 2);generateSubtractionBase(numOperations / 2);}// 将加法算式基存储到文件public void saveAdditionBaseToFile(String filename) {saveBaseToFile(additionBase, filename);}// 将减法算式基存储到文件public void saveSubtractionBaseToFile(String filename) {saveBaseToFile(subtractionBase, filename);}// 将算式基存储到文件private void saveBaseToFile(List<String> base, String filename) {try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {for (String operation : base) {writer.write(operation);writer.newLine();}} catch (IOException e) {e.printStackTrace();}}// 从加法算式基中随机选择指定数量的算式public List<String> getRandomAdditionOperations(int numOperations) {return getRandomOperations(additionBase, numOperations);}// 从减法算式基中随机选择指定数量的算式public List<String> getRandomSubtractionOperations(int numOperations) {return getRandomOperations(subtractionBase, numOperations);}// 从混合算式基中随机选择指定数量的算式public List<String> getRandomMixedOperationOperations(int numOperations) {List<String> mixedOperations = new ArrayList<>();mixedOperations.addAll(additionBase);mixedOperations.addAll(subtractionBase);Collections.shuffle(mixedOperations);return mixedOperations.subList(0, numOperations);}// 从算式基中随机选择指定数量的算式private List<String> getRandomOperations(List<String> base, int numOperations) {List<String> randomOperations = new ArrayList<>();Random rand = new Random();for (int i = 0; i < numOperations; i++) {int index = rand.nextInt(base.size());randomOperations.add(base.get(index));}return randomOperations;}public static void menu() {BinaryOperationBase base = new BinaryOperationBase();// 生成加法算式基并存储到文件base.generateAdditionBase(100);System.out.println("加法算式基已生成");base.saveAdditionBaseToFile("addition_base.csv");System.out.println("加法算式基已存入文件");// 生成减法算式基并存储到文件base.generateSubtractionBase(100);System.out.println("减法算式基已生成");base.saveSubtractionBaseToFile("subtraction_base.csv");System.out.println("减法算式基已存入文件");// 生成混合算式基并存储到文件base.generateMixedOperationBase(100);System.out.println("混合算式基已生成");base.saveSubtractionBaseToFile("mixed_operation_base.csv");System.out.println("混合算式基已存入文件");// 从随机抽取的算式基中随机选择50个算式List<String> randomAdditionOperations = base.getRandomAdditionOperations(50);List<String> randomSubtractionOperations = base.getRandomSubtractionOperations(50);List<String> randomMixedOperations = base.getRandomMixedOperationOperations(50);// 将随机抽取的算式存入对应的CSV文件中base.saveBaseToFile(randomAdditionOperations, "addition_exercises.csv");base.saveBaseToFile(randomSubtractionOperations, "subtraction_exercises.csv");base.saveBaseToFile(randomMixedOperations, "mixed_operation_exercises.csv");}
}

Main.java

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int choice = -1;while (choice != 0) {System.out.println("请输入你的选择:");System.out.println("1、批量产生习题并用文件存储");System.out.println("2、读入习题并添加答案");System.out.println("3、批改练习并储存");System.out.println("4、生成算式基并用文件储存");System.out.println("0、退出");System.out.printf("你的选择是:");if (scanner.hasNextInt()) {choice = scanner.nextInt();switch (choice) {case 1:ExerciseFiles exerciseFiles = new ExerciseFiles();exerciseFiles.generateAll();break;case 2:ExerciseFiles exerciseFiles1 = new ExerciseFiles();exerciseFiles1.calculateAndPrintAll();break;case 3:ExerciseCorrection exerciseCorrection = new ExerciseCorrection();exerciseCorrection.menu();break;case 4:BinaryOperationBase binaryOperationBase = new BinaryOperationBase();binaryOperationBase.menu();break;case 0:System.out.println("程序已退出。");break;default:System.out.println("无效的选项,请重新输入。");break;}} else {System.out.println("输入无效,请重新输入数字选项。");scanner.next(); // 消耗无效输入}}}
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/303141.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 2024.1安装与激活[破解]

一&#xff1a;IDEA官方下载 ①如题&#xff0c;先到IDEA官方下载&#xff0c;简简单单 ②IDEA官方&#xff1a;IntelliJ IDEA – the Leading Java and Kotlin IDE 二&#xff1a;获取脚本 &#x1f31f;网盘下载&#xff1a;jetbra (密码&#xff1a;lzh7) &#x1f31f;获取…

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

物联网农业四情在线监测系统

TH-Q2随着科技的飞速发展和信息化时代的来临&#xff0c;物联网技术在各个领域都取得了显著的应用成果。其中&#xff0c;物联网农业四情在线监测系统作为农业现代化的重要组成部分&#xff0c;正在为农业生产带来革命性的变革。 一、物联网农业四情在线监测系统的概念 物联网…

大模型笔记:Prompt tuning

1 NLP模型的几个阶段 1.1 第一阶段&#xff08;在深度学习出现之前&#xff09; 通常聚焦于特征工程&#xff08;feature engineering&#xff09;利用领域知识从数据中提取好的特征 1.2 第二阶段&#xff08;在深度学习出现之后&#xff09; 特征可以从数据中习得——>…

使用 kaggle api 实现 kaggle 数据快速下载

在下载kaggle数据集时&#xff0c;以猫狗数据集举例子&#xff0c;有两种方法&#xff1a; Dogs vs. Cats | Kaggle 1&#xff1a;直接浏览器下载&#xff0c;较慢&#xff0c;不推荐。 2&#xff1a;使用kaggle API下载&#xff0c;很快。本文重点介绍。详情可以&#xff1…

Web前端-Ajax

Ajax 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 1.数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等…

ARM嵌入式控制器带HDMI为制造业注入智能动力

工业自动化技术的飞速发展&#xff0c;IT与OT的融合已成为推动工业进步的关键力量。在这个背景下&#xff0c;ARM工业计算机凭借其强大的功能和灵活性&#xff0c;成为了边缘自动化领域的一颗新星。今天&#xff0c;我们将深入探讨这款设备如何通过其独特的特性&#xff0c;助力…

Scrapy 爬取m3u8视频

Scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址&#xff1a;[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…

【C语言】“vid”Microsoft Visual Studio安装及应用(检验内存泄露)

文章目录 前言安装包获取配置VLD完成 前言 我们在写代码时往往容易存在内存泄漏的情况&#xff0c;所以存在这样一个名为VLD的工具用来检验内存泄漏&#xff0c;现在我来教大家安装一下 安装包获取 vld下载网址&#xff1a;https://github.com/KindDragon/vld/releases/tag/…

三支冲突分析介绍

Pawlak最早通过观察一组智能体对一组问题的意见&#xff0c;提出了冲突分析模型。U表示对象集&#xff0c;V表示属性集&#xff0c;R表示对象集和属性集之间的二元关系&#xff0c;这样一个刻画冲突分析的信息系统通过三元组&#xff08;U&#xff0c;V&#xff0c;R&#xff0…

物理服务器与云服务器的租用对比

​ 物理服务器&#xff1a;每个基于 Web 的应用程序都依赖于一个服务器&#xff0c;该服务器提供网络中的数据存储&#xff0c;并可根据请求提供给客户端。例如&#xff0c;用户使用浏览器访问 Web 应用程序。服务器可确保托管客户端可以使用该硬件组件。与其他托管可能性相比&…

LeetCode 2529. 正整数和负整数的最大计数——每日一题

上一篇博客&#xff1a;LeetCode 993. 二叉树的堂兄弟节点——每日一题 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.…

【黑马头条】-day07APP端文章搜索-ES-mongoDB

文章目录 今日内容1 搭建es环境1.1 拉取es镜像1.2 创建容器1.3 配置中文分词器ik1.4 测试 2 app文章搜索2.1 需求说明2.2 思路分析2.3 创建索引和映射2.3.1 PUT请求添加映射2.3.2 其他操作 2.4 初始化索引库数据2.4.1 导入es-init2.4.2 es-init配置2.4.3 导入数据2.4.4 查询已导…

Elastisearch、Kibana安装

Elastisearch简介 全文搜索属于最常见的需求&#xff0c;开源的 Elasticsearch &#xff08;以下简称 Elastic&#xff09;是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。 Elastic 的底层是开源库 Lucene。但是&#xff0c;你没法直接用 Lucene&#xff0…

[网鼎杯 2020 玄武组]SSRFMe

[网鼎杯 2020 玄武组]SSRFMe 源码 <?php function check_inner_ip($url) {$match_resultpreg_match(/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/,$url);if (!$match_result){die(url fomat error);}try{$url_parseparse_url($url);}catch(Exception $e){die(url foma…

真实世界的映照-DDD实体

什么是实体&#xff1f; 实体&#xff0c;官方的解释是&#xff1a;实体&#xff08;Entity&#xff0c;又称为Reference Object&#xff09;很多对象不是通过他们的属性定义的&#xff0c;而是通过一连串的连续事件和标识定义的。主要由标识定义的对象被称为ENTITY。 但&…

RTThread studio 驱动开发

rtthread 驱动使用的两种情况 rtthread studio 自动生成 由 RT Thread Studio 自动生成&#xff0c;无需修改任何文件或者简单定义几个宏即可直接使用的驱动&#xff0c;如 GPIO&#xff0c;UART&#xff0c;I2C&#xff0c;SPI&#xff0c;SDIO 和 ETH 等。 使用 RT-Thread S…

嵌入式硬件中常见的面试问题与实现

1 01 请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌) ▶电阻 美国:AVX、VISHAY威世 日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK 台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMT…

STM32学习和实践笔记(6):自己进行时钟配置的思路

在《STM32学习和实践笔记&#xff08;4&#xff09;: 分析和理解GPIO_InitTypeDef GPIO_InitStructure (d)-CSDN博客》 中&#xff0c;我了解到&#xff0c;在程序执行我们写的main函数之前&#xff0c;实际上先执行了一个汇编语言所写的启动文件&#xff0c;以完成相应的初始…

TCP协议简单总结

TCP&#xff1a;传输控制协议 特点&#xff1a;面向连接、可靠通信 TCP的最终目的&#xff1a;要保证在不可靠的信道上实现可靠的传输 TCP主要有三个步骤实现可靠传输&#xff1a;三次握手建立连接&#xff0c;传输数据进行确认&#xff0c;四次挥手断开连接 三次握手建立可靠…