Java实现加权平均分计算程序WeightedAverageCalculator

成绩加权平均分计算程序,带UI界面和输入保存功能。

因为本人对成绩的加权均分有所关注,但学校的教务系统查分时往往又不显示个人的加权均分,加之每次手动敲计算器计算很麻烦就花了点时间写了一个加权均分计算程序自用,顺便开源。

UI界面通过Java的Swing类实现。

代码分享:

WeightedAverageCalculatorGUI.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Objects;

public class WeightedAverageCalculatorGUI extends JFrame {
    private JTextField numSubjectsField;
    private JButton enterButton;
    private JScrollPane scrollPane;
    private JPanel inputPanel;
    private JButton calculateButton;
    private JLabel resultLabel;
    private JTextField filePathField;
    private JButton saveButton;

    public WeightedAverageCalculatorGUI() {
        setTitle("成绩加权平均分计算器");
        setSize(1600, 1200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JPanel panel = new JPanel(new BorderLayout());

        // 添加科目数量输入框和确定按钮
        JPanel topPanel = new JPanel(new FlowLayout());
        JLabel numSubjectsLabel = new JLabel("科目数量:");
        numSubjectsLabel.setFont(Config.DEFAULT_FONT);
        numSubjectsField = new JTextField(5);
        numSubjectsField.setPreferredSize(new Dimension(140, 55));
        numSubjectsField.setFont(Config.FIELD_FONT);

        enterButton = new JButton("确定");
        enterButton.setFont(Config.DEFAULT_FONT);
        topPanel.add(numSubjectsLabel);
        topPanel.add(numSubjectsField);
        topPanel.add(enterButton);
        panel.add(topPanel, BorderLayout.NORTH);

        // 添加文件路径输入框和保存按钮
        JPanel bottomPanel = new JPanel(new FlowLayout());
        JLabel filePathLabel = new JLabel("文件保存路径:");
        filePathLabel.setFont(Config.DEFAULT_FONT);
        filePathField = new JTextField(20);
        filePathField.setFont(Config.FIELD_FONT);
        saveButton = new JButton("保存");
        saveButton.setFont(Config.DEFAULT_FONT);
        bottomPanel.add(filePathLabel);
        bottomPanel.add(filePathField);
        bottomPanel.add(saveButton);
        panel.add(bottomPanel, BorderLayout.SOUTH);

        // 添加事件监听器以响应确定按钮点击事件
        enterButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(!Objects.equals(numSubjectsField.getText(), "")) {
                    int numSubjects = Integer.parseInt(numSubjectsField.getText());
                    createInputPanel(numSubjects);
                    revalidate();
                }
            }
        });

        // 添加事件监听器以响应保存按钮点击事件
        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                saveToFile();
            }
        });

        add(panel, BorderLayout.NORTH);
        setVisible(true);
    }

    private void createInputPanel(int numSubjects) {
        if (scrollPane != null) {
            getContentPane().remove(scrollPane);
        }

        inputPanel = new JPanel();
        inputPanel.setLayout(new GridLayout(0, 2));

        // 添加成绩和权重输入框
        Font labelFont = Config.DEFAULT_FONT;
        Font fieldFont = Config.FIELD_FONT;
        for (int i = 1; i <= numSubjects; i++) {
            JLabel scoreLabel = new JLabel("科目 " + i + " 成绩:");
            scoreLabel.setFont(labelFont);
            JTextField scoreField = new JTextField(5);
            scoreField.setFont(fieldFont);
            JLabel weightLabel = new JLabel("权重:");
            weightLabel.setFont(labelFont);
            JTextField weightField = new JTextField(10);
            weightField.setFont(fieldFont);

            inputPanel.add(scoreLabel);
            inputPanel.add(scoreField);
            inputPanel.add(weightLabel);
            inputPanel.add(weightField);
        }

        // 添加计算按钮和结果标签
        calculateButton = new JButton("计算");
        calculateButton.setFont(Config.DEFAULT_FONT);
        calculateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                calculateWeightedAverage(numSubjects);
            }
        });
        inputPanel.add(calculateButton);

        resultLabel = new JLabel();
        inputPanel.add(resultLabel);

        scrollPane = new JScrollPane(inputPanel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        revalidate();
    }

    private void calculateWeightedAverage(int numSubjects) {
        try {
            double totalWeightedScore = 0;
            double totalWeight = 0;
            resultLabel.setFont(Config.DEFAULT_FONT);
            resultLabel.setForeground(Color.RED);

            Component[] components = inputPanel.getComponents();
            for (int i = 0; i < numSubjects; i++) {
                JTextField scoreField = (JTextField) components[i * 4 + 1];
                JTextField weightField = (JTextField) components[i * 4 + 3];
                double score = Double.parseDouble(scoreField.getText());
                double weight = Double.parseDouble(weightField.getText());
                totalWeightedScore += score * weight;
                totalWeight += weight;
            }
            double weightedAverage = totalWeightedScore / totalWeight;
            resultLabel.setText("加权平均分:" + String.format("%.6f", weightedAverage));

            // 保存结果到文件
//            saveToFile();
        } catch (NumberFormatException e) {
            resultLabel.setText("输入格式错误,请重新输入!");
        }
    }

    private void saveToFile() {
        String filePath = filePathField.getText() + Config.SAVE_PATH + System.currentTimeMillis() + ".txt";

        try {
            File file = new File(filePath);

            FileWriter writer = new FileWriter(file);
            writer.write("科目 | 成绩 | 权重\n");
            if(inputPanel == null) {
                JOptionPane.showMessageDialog(this, "请先输入成绩和权重进行计算!");
                return;
            }
            Component[] components = inputPanel.getComponents();
            for (int i = 0; i < components.length / 4; i++) {
                JTextField scoreField = (JTextField) components[i * 4 + 1];
                JTextField weightField = (JTextField) components[i * 4 + 3];
                double score = Double.parseDouble(scoreField.getText());
                double weight = Double.parseDouble(weightField.getText());
                writer.write("科目 " + (i + 1) + " | " + score + " | " + weight + "\n");
            }
            writer.write("\n");
            writer.write(resultLabel.getText());
            writer.close();

            JOptionPane.showMessageDialog(this, "文件保存成功!");
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, "保存文件时发生错误:" + e.getMessage());
        }
    }

    public static void main(String[] args) {
        UIManager.put("OptionPane.messageFont", Config.FIELD_FONT);
        // 设置全局对话框确认按钮大小
        UIManager.put("OptionPane.buttonFont", Config.FIELD_FONT);

        // 显示对话框
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new WeightedAverageCalculatorGUI();
            }
        });
    }
}

Config.java

import java.awt.*;

public class Config {
    public static final int FONT_SIZE = 30;
    public static final String FONT_NAME = "Microsoft YaHei";
    public static final Font DEFAULT_FONT = new Font(FONT_NAME, Font.BOLD, FONT_SIZE);
    public static final Font FIELD_FONT = new Font(FONT_NAME, Font.PLAIN, FONT_SIZE);
    public static final String SAVE_PATH = "\\WeightAverageRecord";
}

相关代码以及jar包已开源至GitHub仓库,包括Config.java、WeightedAverageCalculatorGUI.java和WeightedAverageCalculator.jar。

GitHub地址:https://github.com/wyd333/WeightedAverageCalculator?tab=readme-ov-fileicon-default.png?t=N7T8https://github.com/wyd333/WeightedAverageCalculator?tab=readme-ov-file

如果需要要对代码进行操作,直接拷贝Config.java和WeightedAverageCalculatorGUI.java文件到Project的src目录下(这两个文件最好放在同一目录下),运行WeightedAverageCalculatorGUI.java即可。

如果只是使用功能而无需代码操作,运行WeightedAverageCalculator.jar即可。确定配置过Java环境变量后,直接cmd打开命令行窗口,执行命令:

java -jar WeightedAverageCalculator.jar的绝对路径

页面展示:  

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 的 Http 请求系统指南

文章目录 快速体验请求方法URL参数响应信息BodyStatusCodeHeaderEncoding 图片下载定制请求头复杂的POST请求表单提交提交文件 CookieClient 上设置 Cookie请求上设置 Cookie 重定向和请求历史超时设置总超时连接超时读取超时 请求代理错误处理总结 前几天在 “知乎想法” 谈到…

开源的API Gateway项目- Kong基于OpenResty(Nginx + Lua模块)

Kong 是一个在 Nginx 内运行的开源 API 网关和微服务抽象层。它是用于处理 API 流量的灵活、可扩展、可插入的工具。 Kong 提供了以下功能&#xff1a; 用户登录&#xff1a;Kong 提供了多种认证插件&#xff0c;像 JWT、OAuth 2.0 等&#xff0c;可以满足用户登录需求。Toke…

精要图示:园区金融数字化服务蓝图,以园区为支点推动信贷业务增长

作为企业集聚地&#xff0c;园区已然成为银行业夯实客群基础的重要切口&#xff0c;各大行陆续围绕园区场景创新金融产品&#xff0c;以期抢跑园区金融新赛道、把握新增量。 启信慧眼首推一站式【园区金融】数字化服务方案&#xff0c;该方案同时支持启信天元私有化部署&#x…

使用acme.sh 签发SSL证书

(Nginx) 使用acme.sh 签发SSL证书 背景&#xff1a; 域名服务商&#xff1a; 阿里云 SSL证书使用场景: Nginx ,Tomcat 安装acme.sh 国内由于墙的问题&#xff0c;建议用gitee的镜像库克隆 mkdir /usr/local/acme cd /usr/local/acme git clone https://gitee.com/neilpa…

【操作系统】实验九 写一个设备驱动程序

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

分享一个“产业级,开箱即用”的NLP自然语言处理工具

NLP的全称是Natuarl Language Processing&#xff0c;中文意思是自然语言处理&#xff0c;是人工智能领域的一个重要方向 自然语言处理&#xff08;NLP&#xff09;的一个最伟大的方面是跨越多个领域的计算研究&#xff0c;从人工智能到计算语言学的多个计算研究领域都在研究计…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储&#xff0c;这是一种连接MySQL数据库的方式。在本篇文章中&#xff0c;将详细介绍如何使用pym…

SpringBoot 自定义Filter 提前返回 CORS 错误 处理前后端分离跨域配置无效问题解析

前言 浏览器有跨域限制&#xff0c;非同源策略 (协议、主机名或端口不同) 被视为跨域请求&#xff0c;解决跨域有跨域资源共享(CORS)、反向代理和 JSONP的方式。本篇通过 SpringBoot 的资源共享配置 (CORS) 来解决前后端分离项目的跨域&#xff0c;以及从原理上去解决跨域配置…

2023年NOC大赛(学而思赛道)创意编程Python初中组决赛真题

2023年NOC大赛&#xff08;学而思赛道&#xff09;创意编程Python初中组决赛真题 题目总数&#xff1a;7 总分数&#xff1a;100 编程题 第 1 题 问答题 二进制回文 编程实现: 输入一个正整数&#xff0c;判断它的二进制形式是否是回文数&#xff0c;如果是输出True…

web系统服务器监控检查

一、检查操作系统是否存在增减文件&#xff0c;是否有shell被上传 要检查操作系统是否存在增减文件或是否有shell被上传&#xff0c;您可以按照以下步骤进行操作&#xff1a; 文件完整性检查&#xff1a; 使用文件系统的完整性检查工具&#xff0c;例如fsck&#xff08;对于ext…

Backtrader 文档学习-Order Management and Execution

Backtrader 文档学习-Order Management and Execution 本章提供了关于order的详细功能测试用例&#xff0c;很好很重要。 最后的示例部分&#xff0c;详细分析总结了不同参数的效果和输出。 如果不能模拟订单交易回测就不会完整。为此&#xff0c;平台中提供了以下功能&…

LLM之Agent(九)| 通过API集成赋能Autogen Multi-Agent系统

随着大型语言模型的快速发展&#xff0c;构建基于LLM驱动的自治代理&#xff08;autonomous agents&#xff09;已经成为一个备受关注的话题。仅在过去一年中&#xff0c;就出现了许多基于这一理念的新技术和框架。 ​ 本文将探索微软开源的Agent框架&#xff1a;Autogen…

幻兽帕鲁服务器搭建教程分享,小白有福了

如何自建幻兽帕鲁服务器&#xff1f;基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了&#xff0c;一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器&#xff0c;阿里云百科aliyunbaike.com分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程&…

vue 样式隔离原理

日常写单文件组件时&#xff0c;会在style添加scoped属性&#xff0c;如<style scoped>&#xff0c;目的是为了隔离组件与组件之间的样式&#xff0c;如下面的例子&#xff1a; <template><p class"foo">这是foo</p><p class"bar&q…

【SpringCloud Nacos】 微服务治理介绍及Nacos引入初体验

文章目录 前言服务治理介绍什么是服务治理1、服务发现2、服务配置3、服务健康检测 常见的注册中心ZookeeperEurekaConsulNacos Nacos 简介Nacos 实战入门搭建nacos环境1、安装nacos2、配置nacos3、访问nacos 将商品微服务注册到 nacos1、在 pom. xml 中添加 nacos 的依赖2、在主…

华为机考入门python3--(0)测试题1-句子平均重量

分类&#xff1a;字符串 知识点&#xff1a; 获取输入 input().strip().split(" ") 拼接列表 " ".join(list) 输出指定位数的浮点数 print("%.2f" % value) len() 函数对于很多内置的数据类型都适用&#xff0c;它返回对象的元素个数或长度。…

Android App开发基础(3)——App的设计规范

3 App的设计规范 本节介绍了App工程的源码设计规范&#xff0c;首先App将看得见的界面设计与看不见的代码逻辑区分开&#xff0c;然后利用XML标记描绘应用界面&#xff0c;同时使用Java代码书写程序逻辑&#xff0c;从而形成App前后端分离的设计规约&#xff0c;有利于提高App集…

零基础学编程工具简介,中文编程开发工具

零基础学编程工具简介&#xff0c;中文编程开发工具 一、前言 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家…

大创项目推荐 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

并行化K-means聚类算法的实现与分析

并行化K-means聚类算法 并行化K-means聚类算法的实现与分析项目背景与意义算法原理与串行实现分析并行化策略与关键细节实验结果与讨论未来改进方向结语 并行化K-means聚类算法的实现与分析 在大数据时代&#xff0c;对数据进行高效的聚类是数据分析与挖掘的重要工具之一。本文…