中小学数学卷子自动生成程序

【基于C++分析队友代码】中小学数学卷子自动生成程序 【分析队友代码】中小学数学卷子自动生成程序 分析对于同样用C++完成的出题系统,两相比较,取长补短,有所增益。 阅读详情

本来是不打算写这个课程作业的博客的,但是后续结队编程又需要和队友相互交流代码,而我当时写代码的时候也没有过多的注释,为了我的结队队友“、、”能够更轻松的(至少不会想捶我)完成课程任务,我还是准备写篇博客简单介绍一下课程项目。
PS:也附上“、、”的博客网站,也是关于这次的项目的

程序要求

点击下载需求文件

程序架构

使用java实现程序,总有5个类,并使用数据库来查重

1.Main

程序运行的地方,主要处理逻辑,程序状态和用户交互之类的

2.User抽象类

代表出题者的一个抽象类,拥有登录(连接数据库),出题,检查题目是否重复的功能

3.Primary,JuniorHigh,High三个实例用户类

继承User,并实现出题的具体方法

4.mysql数据库

实现题目的查重功能和用户信息存储功能


下面将从Main类开始介绍整个程序

Main类

变量

private int state = LOGIN;//代表程序状态,初始状态为登录状态
private static final int LOGIN = 0;//定义宏LOGIN
private static final int LOGGED_IN = 1;//定义宏LOGGED_IN
private User user;//当前程序的使用用户
private static Scanner scanner = new Scanner(System.in);//实例化输入对象

main方法,程序入口

public static void main(String[] args) throws SQLException, ClassNotFoundException {
    System.out.println("中小学数学卷子自动生成程序");
    Main main = new Main();
    while (true) {
        //根据程序状态实现不同功能
        switch (main.state) {
            case LOGIN:
                //实现登录功能
                main.processLogin();
                break;
            case LOGGED_IN:
                //实现登录后功能
                main.processLoggedIn();
                break;
        }
    }
}

processLogin()

private void processLogin() throws SQLException, ClassNotFoundException {
    System.out.println("请输入用户名、密码");
    String account = scanner.next();
    String password = scanner.next();
    //根据输入的账号密码获取用户实例对象
    user = User.login(account, password);
    if (user == null) {
        System.out.println("请输入正确的用户名、密码");
    } else {
        System.out.println("当前选择为" + user.getDifficultyType() + "出题");
        //将状态更新为已登录
        state = LOGGED_IN;
    }
}

processLoggedIn()

private void processLoggedIn() {
    System.out.println("准备生成" + user.getDifficultyType() + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):");
    //接收用户输入
    String scannerContent = scanner.next();
    //监测用户输入是否为int型数据
    try {
        int questionsNumber = Integer.parseInt(scannerContent);
        //-1为退出登录,将状态重置为登录状态,并将用户对象置为null
        if (questionsNumber == -1) {
            state = LOGIN;
            user = null;
        } else if (questionsNumber >= 10 && questionsNumber <= 30) {
            System.out.println("指令正确");
            //开始生产题目,传入的参数为:用户的难度类型,题目数量
            user.generateQuestionsByType(user.getDifficultyType(), questionsNumber);
        } else {
            System.out.println("请输入正确的指令");
        }
    }
    //用户输入为非int型,监测是否为“切换为”指令
    catch (Exception NumberFormatException) {
        if (scannerContent.startsWith("切换为")) {
            String type = scannerContent.substring(3);
            //重置用户的难度类型
            if (type.equals("小学") || type.equals("初中") || type.equals("高中")) {
                user.setDifficultyType(type);
            } else {
                System.out.println("请输入正确的指令");
            }
        } else {
            System.out.println("请输入正确的指令");
        }
    }
}

User类

变量

    private String type;//用户类型
    private String account;//用户账号
    private String password;//用户密码
    private String difficultyType;//难度类型
    //下面的变量需要设置为自己的数据库数据
    private static final String URL = "jdbc:mysql://localhost:3306/testgeneration?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";//数据库连接地址
    private static final String USER = "root";//数据库用户名
    private static final String PASSWORD = "1234";//数据库密码

构造器,getter,setter不再赘述

但是需要注意保护用户隐私,不比设置密码的getter和setter

login

public static User login(String account, String password) throws SQLException, ClassNotFoundException {
    //1.加载驱动程序
    Class.forName("com.mysql.cj.jdbc.Driver");
    String searchedType;//从数据库获取到的类型
    String sql = "SELECT identity from user where account=? and password=?";
    //数据库的运行很耗费资源,所以需要及时关闭
    try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) {
        //下面使用的是PreparedStatement,用法会贴在下面
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setObject(1, account);
            preparedStatement.setObject(2, password);
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                if (resultSet.next()) {
                    //从数据库获取类型
                    searchedType = resultSet.getString("identity");
                    //返回实例对象
                    switch (searchedType) {
                        case "小学":
                            return new Primary(account, password, searchedType);
                        case "初中":
                            return new JuniorHigh(account, password, searchedType);
                        case "高中":
                            return new High(account, password, searchedType);
                    }
                }
                //查询失败,返回null
                else {
                    return null;
                }
            }
        }
    }
    return null;
}

statement 、prepareStatement的用法和解释,转自优快云

getQuestionsArray

//由子类实现的抽象方法
public abstract String[] getQuestionsArray(int number);

generateQuestions

//根据输入的题目数量生成题目,并将其添加到数据库
public void generateQuestions(int number) {
    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    try {
        //测试重复问题,addQuestionsToDatabase会返回添加失败的个数,getQuestionsArray是根据不同类型的对象生成的,也就是不同难度的题目生成方法
        int failNum = addQuestionsToDatabase(getQuestionsArray(number), timestamp);
        while (failNum != 0) {
            failNum = addQuestionsToDatabase(getQuestionsArray(failNum), timestamp);
        }
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

addQuestionsToDatabase

//返回添加失败的问题的个数
protected int addQuestionsToDatabase(String[] questions, Timestamp time) throws ClassNotFoundException, SQLException {
    int count = 0;
    //1.加载驱动程序
    Class.forName("com.mysql.cj.jdbc.Driver");
    String sql = "INSERT INTO testgeneration.questions (question, account, created_time) VALUES (?, ?, ?);";
    try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) {
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            //创建文件对象
            File file = new File("questionsData/" + account);
            //如果没有用户的文件就创建文件夹
            if (!file.exists()) {
                file.mkdir();
            }
//                System.out.println(file.getPath());
            //创建文件写入对象
            try (FileWriter fileWriter = new FileWriter(file.getPath() + "/" + new SimpleDateFormat("yyyy年-MM月-dd日-HH时-mm分-ss秒").format(time) + ".txt", true)) {
                //在多次写入时preparedStatement就能大大降低运行成本
                for (int i = 0; i < questions.length; i++) {
                    preparedStatement.setObject(1, questions[i]);
                    preparedStatement.setObject(2, account);
                    preparedStatement.setObject(3, time);
                    try {
                        preparedStatement.executeUpdate();
                        fileWriter.write(questions[i] + "\r\n");
                    }
                    //如果重复则会报错,并将重复的题目数量+1
                    catch (SQLException e) {
                        System.out.println("'" + questions[i] + "'" + "与之前的题目重复,准备重新出题");
                        count++;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    return count;
}

User子类

User的子类主要介绍生成题目的方法

Primary

//符号集
private static final String[] symbols = {"+", "-", "*", "/"};
@Override
public String[] getQuestionsArray(int number) {
    String[] questions = new String[number];
    //StringBuilder在操作变换的字符串的时候效率更高
    StringBuilder question = new StringBuilder();
    //以当前时间作为随机种子
    Random random = new Random(System.currentTimeMillis());
    for (int index = 0; index < number; index++) {
        //随机生成操作数数量,最少为两个
        int operandsNumber = random.nextInt(4) + 2;
        //随机生成左括号的位置
        int bracketStart = random.nextInt(operandsNumber);
        //随机生成右括号的位置
        int bracketEnd = random.nextInt(operandsNumber);
        //判断括号位置是否合法
        boolean isBracketIllegal = bracketStart < bracketEnd;
        int[] operands = new int[operandsNumber];
        for (int i = 0; i < operandsNumber; i++) {
            //操作数为1~100
            operands[i] = random.nextInt(100) + 1;
            //括号位置合法,并且当前为左括号位置
            if (isBracketIllegal && i == bracketStart) {
                question.append("(");
            }
            question.append(operands[i]);
            //操作数合法并且当前为右括号位置
            if (isBracketIllegal && i == bracketEnd) {
                question.append(")");
            }
            if (i < operandsNumber - 1) {
                //随机从符号集里抽取一个符号
                int symbolIndex = random.nextInt(symbols.length);
                question.append(symbols[symbolIndex]);
            }
            //最后一个操作数后面为=号
            else {
                question.append("=");
            }
        }
        questions[index] = question.toString();
        System.out.println(question);
        //重新设置问题
        question.delete(0, question.length());
    }
    return questions;
}

JuniorHigh

//符号集
private static final String[] symbols = {"+", "-", "*", "/"};
@Override
public String[] getQuestionsArray(int number) {
    String[] questions = new String[number];
    StringBuilder question = new StringBuilder();
    Random random = new Random(System.currentTimeMillis());
    for (int index = 0; index < number; index++) {
        //操作数数量,1到5个
        int operandsNumber = random.nextInt(5) + 1;
        //括号起始点
        int bracketStart = random.nextInt(operandsNumber);
        //括号终止点
        int bracketEnd = random.nextInt(operandsNumber);
        //初中符号个数
        int juniorSymbolNum = operandsNumber == 1 ? 1 : random.nextInt(operandsNumber) + 1;
        //根号个数
        int RadicalNum = random.nextInt(juniorSymbolNum + 1);
        //平方个数
        int squareNum = juniorSymbolNum - RadicalNum;
        //是否有括号
        boolean isBracketIllegal = bracketStart < bracketEnd;
        int[] operands = new int[operandsNumber];
        for (int i = 0; i < operandsNumber; i++) {
            //是否加根号
            boolean addRadical = operandsNumber == 1 ? RadicalNum == 1 : random.nextBoolean();
            //是否加平方
            boolean addSquare = operandsNumber == 1 ? !addRadical : !addRadical && random.nextBoolean();
            operands[i] = random.nextInt(100) + 1;
            if (isBracketIllegal && i == bracketStart) {
                //在括号外加根号
                boolean outsideRadical = random.nextBoolean();
                if (outsideRadical && RadicalNum > 0) {
                    question.append("√");
                    RadicalNum--;
                }
                question.append("(");
            }
            //普通根号
            if (addRadical && RadicalNum > 0) {
                question.append("√");
                RadicalNum--;
            }
            question.append(operands[i]);
            //普通平方
            if (addSquare && squareNum > 0) {
                question.append("²");
                squareNum--;
            }
            if (isBracketIllegal && i == bracketEnd) {
                boolean outsideSquare = random.nextBoolean();

                question.append(")");
                //括号外平方
                if (outsideSquare && squareNum > 0) {
                    question.append("²");
                    squareNum--;
                }
            }
            if (i < operandsNumber - 1) {
                int symbolIndex = random.nextInt(symbols.length);
                question.append(symbols[symbolIndex]);
            }
            //最后一个操作数后面为=号
            else {
                question.append("=");
            }
        }
        questions[index] = question.toString();
        System.out.println(question);
        question.delete(0, question.length());
    }
    return questions;
}

High

//符号集
private static final String[] symbols = {"+", "-", "*", "/"};
private static final String[] highSymbols = {"sin", "cos", "tan"};
@Override
public String[] getQuestionsArray(int number) {
    String[] questions = new String[number];
    StringBuilder question = new StringBuilder();
    Random random = new Random(System.currentTimeMillis());
    for (int index = 0; index < number; index++) {
        //操作数数量,1到5个
        int operandsNumber = random.nextInt(5) + 1;
        //括号起始点
        int bracketStart = random.nextInt(operandsNumber);
        //括号终止点
        int bracketEnd = random.nextInt(operandsNumber);
        //初中符号个数
        int juniorSymbolNum = random.nextInt(operandsNumber) + 1;
        //根号个数
        int RadicalNum = random.nextInt(juniorSymbolNum + 1);
        //平方个数
        int squareNum = juniorSymbolNum - RadicalNum;
        //高中符号个数
        int highSymbolNum = operandsNumber == 1 ? 1 : random.nextInt(operandsNumber) + 1;

        //是否有括号
        boolean isBracketIllegal = bracketStart < bracketEnd;
        int[] operands = new int[operandsNumber];
        for (int i = 0; i < operandsNumber; i++) {

            //是否加高中符号
            boolean addHighSymbol = operandsNumber == 1 || random.nextBoolean();
            //是否加根号
            boolean addRadical = !addHighSymbol && random.nextBoolean();
            //是否加平方
            boolean addSquare = !addRadical && random.nextBoolean();
            operands[i] = random.nextInt(100) + 1;
            if (isBracketIllegal && i == bracketStart) {
                //在括号外加根号
                boolean outsideRadical = random.nextBoolean();
                //在括号外加高中符号
                boolean outsideHighSymbol = !outsideRadical && random.nextBoolean();
                if (outsideRadical && RadicalNum > 0) {
                    question.append("√");
                    RadicalNum--;
                }
                if (outsideHighSymbol && highSymbolNum > 0) {
                    question.append(highSymbols[random.nextInt(highSymbols.length)]);
                    highSymbolNum--;
                }
                question.append("(");
            }
            //普通根号
            if (addRadical && RadicalNum > 0) {
                question.append("√");
                RadicalNum--;
            }
            if (addHighSymbol && highSymbolNum > 0) {
                question.append(highSymbols[random.nextInt(highSymbols.length)]);
                highSymbolNum--;
            }
            question.append(operands[i]);
            //普通平方
            if (addSquare && squareNum > 0) {
                question.append("²");
                squareNum--;
            }
            if (isBracketIllegal && i == bracketEnd) {
                boolean outsideSquare = random.nextBoolean();

                question.append(")");
                //括号外平方
                if (outsideSquare && squareNum > 0) {
                    question.append("²");
                    squareNum--;
                }
            }
            if (i < operandsNumber - 1) {
                int symbolIndex = random.nextInt(symbols.length);
                question.append(symbols[symbolIndex]);
            }
            //最后一个操作数后面为=号
            else {
                question.append("=");
            }
        }
        questions[index] = question.toString();
        System.out.println(question);
        question.delete(0, question.length());
    }
    return questions;
}

数据库

user用户信息

create table user
(
    account  varchar(12) not null
        primary key,
    password varchar(15) null,
    identity varchar(5)  null
);

questions题目信息

将question和account设置为键,使添加时,同一个用户不能重发添加一个题,实现题目查重

create table questions
(
    q_id         int auto_increment
        primary key,
    question     varchar(30) null,
    account      varchar(8)  null,
    created_time timestamp   null,
    constraint questions_pk
        unique (question, account),
    constraint questions_fk
        foreign key (account) references user (account)
);

完整程序代码

项目完整文件已经上传到github,仅供参考

更多

欢迎来访我的个人网站

题库及组卷系统(数学).rar 题库及组卷系统(数学),不是源代码,可以用作设计题库的参考!转载网上的,不是本人写的! 立即下载

相关推荐

小学生数学练习题自动生成器

自己编写的一个用来自动生成小学生数学练习题的工具,支持加减乘除及混合运算,可指定几位数和几个数参与的连续加减乘除,自动保证计算结果总是整数,不会出现除不尽小数的问题。生成习题的同时还能自动同步生成答案。每次自动生成18页A4大小的习题,并同时生成2页答案方便家长批改习题,无需编辑可直接打印出来。

使用Python为小学生批量生成数学题

作者小明的老师布置了一项作业,要求学生每天坚持做20道乘法和加减法混合运算题目。为了满足这个需求,作者决定使用Python批量生成符合要求的数学题。文章通过具体的代码和步骤,生动地展示了作者是如何使用Python解决实际问题的。这种方法不仅提高了效率,还能够满足特定的需求,为学生提供更有趣、个性化的学习体验。

一键难忘的博客 7135

个人项目:中小学数学卷子自动生成程序

个人编程项目源码-Java,本资源主要是某哥课程的个人编程题目,主要是实现如下功能: 1.输入与用户数据库对应的用户名密码即可登录,否则重新输入 2.登录之后可以输入题目数量,然后就可以生成对应难度的题目了 3.登录过程可以切换难度 4.试卷会按照相应格式保存为txt文件

python实现随机生成小学数学题目并输出到word

这个程序使用了Python的random模块来生成随机数和随机运算符,然后根据不同的运算符生成不同的数学题目。这些题目和答案使用Python的docx模块输出到Word文档中。您可以根据需要修改程序中的字体样式和题目数量。要运行程序,请将它保存为.py文件并在命令行中输入python filename.py命令。程序将在当前目录下创建一个名为math_questions.docx的Word文档,其中包含生成的数学题目。

yechuanhui的专栏 1166

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6085

矢量网络分析仪(矢网)组成和原理简介

一、概述 矢量网络分析仪是一种常见的射频测量仪器,主要用来测量高频器件、电路及系统的性能参数,如线性参数、非线性参数、变频参数等。 1.1 分类 矢量网络分析仪一般以频率来划分,截止频率越高,价格也越贵; 根据测试端口的数量可分为:双端口、 3 端口、 4 端口、 6 端口; 常见的厂家有:美国的安捷伦( Agilent)、德国的罗德与施瓦茨( R&S) , 国内的有南京普纳和中电 41 所。 1.2 常用功能 常用的测试器件有:功分器、合路器、滤波器、衰减器、天线、电缆、放大器、混频器、双工器、耦

大音希声 5万+

word置顶_一款word插件,函数图像,数学符号一键生成

这款办公插件是专门为数学老师量身定做的,用于编写数学试卷、教学文档、电子备课,试题编辑,课件制作的通用工具软件。该工具弥补了WORD编辑过程中输入各种数学图形、符号、公式等不方便的遗憾,减少了编写数学试卷等工作中的大量重复劳动,极大地提高了工作效率。该工具软件作为word 的一个插件,所以你的电脑必须安装word软件才可正常使用,包括平面几何、立体几何、函数图形、图像等大量图形和符号,其中“函数图...

weixin_39939665的博客 1212

高效敏感词检测API平台对比与选型指南

本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

weixin_29325955的博客 347

python试卷生成_python生成试题库和界面 (python generate test database and layout)

1 import tkinter #Tkinter模块是python的标准Tk GUI工具包的接口2 #from tkinter import *3 #from tkinter.messagebox import *4 from tkinter importmessagebox5 importsqlite3678 #调用下一道题目函数9 defcallNext():10 #设置k和sco...

weixin_39883091的博客 530

机器学习发展历史及现状(重要的期刊,会议,大牛总结)

1 引言 机器学习是指通过计算机学习数据中的内在规律性信息,获得新的经验和知识,以提高计算机的智能性,使计算机能够像人那样去决策。随着各行业对数据的需求量增多,对处理和分析数据的效率要求变高,一系列机器学习算法应运而生。机器学习算法主要是指通过数学及统计方法求解最优化问题的步骤和过程。针对不同的数据和不同模型需求,选择和使用适当的的机器学习算法可以更高效地解决一些实际问题。本文将从机器学习的起源...

Oscar2018的博客 5万+

source tree clone error:fatal remote error: Repository not found

source tree clone error:fatal remote error: Repository not found

Linda的前端开发路 3077

软件工程导论个人项目 -- 中小学数学卷子自动生成程序

中小学数学卷子自动生成程序1. 项目需求1.1 项目名称1.2 用户1.3 功能2. 程序分析2.1 Teacher类 1. 项目需求 1.1 项目名称 中小学数学卷子自动生成程序。 1.2 用户 小学、初中、高中老师。 1.3 功能 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入 正确的用户名、密码”,重新输入用户名、密码; 登录

weixin_43320890的博客 1597

【实战指南】RF-DETR目标检测全流程:从数据准备到工业部署

本文详细介绍了RF-DETR目标检测模型的全流程应用,从数据准备、模型训练到工业部署。RF-DETR作为基于Transformer的先进模型,在COCO基准测试中表现优异,推理速度超越YOLOv8,特别适合工业场景。文章还提供了数据标注、COCO格式转换、超参数调优及边缘设备部署的实用技巧,帮助开发者高效实现目标检测任务。

weixin_29081101的博客 421

结对编程分析——中小学数学卷子自动生成程序

中小学数学卷子自动生成程序分析 本次课程任务要求我们在规定时间内完成一个可以自动生成中小学数学题目卷子的程序,用户为老师。主要是实现账户名密码的验证,账户的切换,根据账户类型生成不同难度的试题并查重。在此简单分析一下搭档小梁的项目代码。 程序流程 小梁的程序流程图如下图所示,可以看到她的程序编写逻辑十分清晰,将程序总体分为登录和题目创建两个模块,在模块内部对各个方法进行封装实现各细节功能。 优点 变量命名清晰规范,很好的遵循了编码规则。且仅有一个成员变量,节省了内存空间。 主函数中只调用了两个方法

qq_43425914的博客 603

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 472

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

中小学数学卷子自动生成程序——结队编程队友互相评价

中小学数学卷子自动生成程序——结队编程队友互相评价 评价方面中小学数学卷子自动生成程序——结队编程队友互相评价基本功能实现一.功能要求:二.登录要求的实现三,优缺点分析:代码分析一.代码整体分析:二.代码格式与规范三.优缺点分析 基本功能实现 一.功能要求: 1、命令行输入用户名和密码,核对是否正确。根据账户类型显示,否则系统提示错误信息,重新输入用户名、密码。 2、登录后,系统提示,用户输入选择,用户手动输入题目数量,按下-1退出 3、程序根据输入生成符合的题目的卷子。同一个老师的卷子中的题目不能与以前的

qq_45653461的博客 555

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

中小学数学卷子自动生成程序:队友代码分析

本次的个人项目是——中小学数学卷子自动生成程序,同学的程序基本实现了个人项目的几点要求,我觉得还是不错的:D 优点一:代码编程风格统一,增加开发过程代码的可读性和易维护性。 优点二:函数及变量命名规范准确,具有自我描述性,可以让人一眼看出是什么功能。 优点三:多个不同功能函数分离,虽然没有分包管理,但是日后要实现的话也便于分离。 优点四:和之前的卷子查重部分写得挺...

dhbtt5812的博客 285

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

中小学数学卷子自动生成程序--对G同学的代码分析

前几天,在课程要求下完成了个人项目的项目工程编写,即一个中小学数学卷子自动生成程序。 程序主要功能是用户预设账户登录后可以选择等级进行对应的小中高的数学卷子对应出题生成txt文本。 本文针对partner G 的工程进行分析,讲解这个项目的一些过程得失。 据需求分析,项目难点在于 1.文件流的使用,包括文件夹的生成,试卷txt的生成 2.随机出题已经保证出的题目不会重复 3.题目的数学...

青城墨白的 399

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

个人项目:中小学数学卷子自动生成程序——队友代码点评

个人项目:中小学数学卷子自动生成程序——队友代码点评 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进

ohh-hl的博客 579

结对编程——中小学数学卷子自动生成程序互评

结对编程——中小学数学卷子自动生成程序互评 优点: 1、程序分为五个类,Demo,HighSchool,MiddleSchool,PrimarySchool,UserDate类,分别对应程序运行,高中题目生成,初中题目生成,小学题目生成和用户账号密码初始化,程序结构明确,便于设计和修改。 2、用户体验很好,输入时有很多提示,不会导致用户输入错误,便于用户使用。 3、代码使...

ZHANGQING2016的博客 302

中小学数学卷子自动生成程序--对郭同学的代码分析

前几天,在课程要求下完成了个人项目的项目工程编写,即一个中小学数学卷子自动生成程序。 程序主要功能是用户预设账户登录后可以选择等级进行对应的小中高的数学卷子对应出题生成txt文本。 本文针对partner G 的工程进行分析,讲解这个项目的一些过程得失。 据需求分析,项目难点在于 1.文件流的使用,包括文件夹的生成,试卷txt的生成 2.随机出题已经保证出的题目不会重复 3....

aiqiang7851的博客 292

【java】个人项目:中小学数学卷子自动生成程序

用户: 小学、初中和高中数学老师。 功能: 1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码; 2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行

小梁说代码的博客 5297

个人项目——中小学数学卷子自动生成程序

个人项目 第一次接触这种项目,感觉很难却又有点好玩;第二次写博客,感觉这是一个好习惯,希望后面能够继续坚持,加油! ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019091920103284.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly...

qq_44937699的博客 4512

中小学数学卷子自动生成程序——与Creddit同学的结对编程项目分析

1.简单介绍 项目名称:中小学数学卷子自动生成程序 主要功能:a.登陆 通过命令行输入账号和密码进行登陆,成功后出现提示 否则需要重新输入 b.切换难度 可以输入“切换为XX”,修改生成题目的类型,如小学,初中,...

313
上一篇: 中秋节在女友手上p了一个超级漂亮的月亮
下一篇: Spring/IoC、DI、Bean
南懿烨曦
博客等级 码龄6年 108粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值