前言:
由于大二的时候计算成绩太麻烦了,特别是综测评定小组还需要验证其他同学的是否正确,对于这种重复性高的工作,首先要想到的就是用计算机来实现,想起来上学期学了一点Java,就想简单的写一个程序。
C++
因为我们是知道他的公式的,所以就是输入数据就能够得到最终的结果。最开始我也不是直接就开始想到用Java来写的,最开始只是想计算一下,整个的实现就是定义一个数据里面存放的对应的学分,通过用户输入自己的分数(一定要按顺序输入,因为科目的之间的学分不同)。
#include<iostream>
using namespace std;
int main(){
const int proportion[]={1,1,2,1,3,4,4,4,4,1,2,1,3,2,5,3,4,1,3};
double sum=0;
double avg=0;
int count=0;
int size=sizeof(proportion)/sizeof(int);
cout<<"请输入您的考试分数:";
for(int i=0;i<size;i++){
int score;
cin>>score;
sum+=score*proportion[i];
count+=proportion[i];
}
cout<<"您的自评分为"<<sum/count<<endl;
return 0;
}
Java
思路分析:
需要解决的还是以下的问题:
界面的布局
对于课程的名称就是一个个标签,然后对每一门课程都配备一个文本框,这个思路是简单,就是实现起来比较繁琐,我采用的还是坐标布局,你通过调整自己代码里面的位置以及标签和文本框的大小,设计成你自己喜欢的样子。
数据的提取与验证
对于文本框里面的数据不是所有都能够合法使用的,我这里的分数规定是[0,100]的闭区间而且都是整数,具体情况大家具体分析。(这推荐还是使用正则表达式来实现)对于文本框提取出来的数据还需要转换成int类型才能进行后续的运算。
自评分的计算
计算就和c++一样了,学分我们可以内部定义一个数组,就不需要用户自己输入了,用户只需要输入自己的成绩,开始计算就是用户按下一个按钮可以开始了,为了避免要算下一组数据,所以还增添了一个清空数据的按钮,当所有合法数据都成功提取之后,就对应相乘再相加除以各课程学分之和,对于总的这些分数数据定义需要在方法中,如果是全局的变量,一直点击开始计算,分数就会一直累加,每次的结果会不同。
不合法的警告
有不合法的数据还是需要提示用户的,我这里就是设置了一个方法,传入一个字符串就会弹窗一个显示改字符串的弹窗。
实现结果:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class F2 extends JFrame implements ActionListener{
//主方法
public static void main(String[] args) {
F2 f2=new F2();
}
//组件数据
final JPanel panel=new JPanel();//面板
//定义相关成绩的标签以及文本框
//大二上
final JLabel tow1=new JLabel("大二上");
//大二下
final JLabel tow2=new JLabel("大二下");
//健康教育
final JLabel healthLabel=new JLabel("健康教育:");
final JTextField healthField=new JTextField();
//大学生求职择业与职业发展
final JLabel jobLabel=new JLabel("大学生求职择业与职业发展:");
final JTextField jobField =new JTextField();
//大学英语三
final JLabel english3Label=new JLabel("大学英语(三):");
final JTextField english3Field =new JTextField();
//大学体育三
final JLabel sports3Label=new JLabel("大学体育(三):");
final JTextField sports3Field =new JTextField();
//中国近代史纲要
final JLabel outlineLabel=new JLabel("中国近代史纲要:");
final JTextField outlineField =new JTextField();
//离散数学
final JLabel mathLabel=new JLabel("离散数学:");
final JTextField mathField =new JTextField();
//数据结构
final JLabel dataLabel=new JLabel("数据结构:");
final JTextField dataField =new JTextField();
//数字逻辑
final JLabel digitLabel=new JLabel("数字逻辑:");
final JTextField digitField =new JTextField();
//数据库原理
final JLabel databaseLabel=new JLabel("数据库原理:");
final JTextField databaseField =new JTextField();
//数据结构实验
final JLabel dataExperimentLabel=new JLabel("数据结构实验:");
final JTextField dataExperimentField =new JTextField();
//大学英语四
final JLabel english4Label=new JLabel("大学英语(四):");
final JTextField english4Field =new JTextField();
//大学体育四
final JLabel sports4Label=new JLabel("大学体育(四):");
final JTextField sports4Field =new JTextField();
//马克思主义基本原理
final JLabel principleLabel=new JLabel("马克思主义基本原理:");
final JTextField principleField =new JTextField();
//形势与政策
final JLabel policyLabel=new JLabel("形势与政策:");
final JTextField policyField =new JTextField();
//计算机组成原理
final JLabel computerLabel=new JLabel("计算机组成原理:");
final JTextField computerField =new JTextField();
//Java
final JLabel javaLabel=new JLabel("Java:");
final JTextField javaField =new JTextField();
//操作系统
final JLabel operateLabel=new JLabel("操作系统:");
final JTextField operateField =new JTextField();
//Java实验
final JLabel javaExperimentLabel=new JLabel("Java实验:");
final JTextField javaExperimentField =new JTextField();
//Linux程序设计
final JLabel linuxLabel=new JLabel("Linux程序设计:");
final JTextField linuxField =new JTextField();
//定义开始和复位按钮
final JButton start=new JButton("开始计算");
final JButton reset=new JButton("清空数据");
//警告标签,放在弹窗里面
final JLabel warningLabel=new JLabel();
//最终计算结果
final JLabel resultLable=new JLabel("您的最终F2是:");
//学分
final int []credit={1,1,2,1,3,4,4,4,4,1,2,1,3,2,5,3,4,1,3};
//科目对应的成绩
int health=0;
int job=0;
int english3=0;
int sports3=0;
int outline=0;
int math=0;
int data=0;
int digit=0;
int database=0;
int dataExperiment=0;
int english4=0;
int sports4=0;
int principle=0;
int policy=0;
int computer=0;
int java=0;
int operate=0;
int javaExperiment=0;
int linux=0;
public F2() {
//初始化框架
initFrame();
//初始化面板
initPanel();
//绑定监听事件
buttonAction();
//窗体可见
this.setVisible(true);
}
//初始化框架
public void initFrame() {
//设置软件的标题
this.setTitle("2021级计算机科学与技术专业-课程学习成绩评分F2");
//设置窗体位置以及大小
this.setSize(1000,800);
//设置窗体居中
this.setLocationRelativeTo(null);
//关闭按钮的动作为退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//初始化面板
public void initPanel() {
//初始化组件
initModule();
//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了
panel.setLayout(null);
//添加相关的组件
panel.add(healthLabel);
panel.add(healthField);
panel.add(jobLabel);
panel.add(jobField);
panel.add(english3Label);
panel.add(english3Field);
panel.add(sports3Label);
panel.add(sports3Field);
panel.add(outlineLabel);
panel.add(outlineField);
panel.add(mathLabel);
panel.add(mathField);
panel.add(dataLabel);
panel.add(dataField);
panel.add(digitLabel);
panel.add(digitField);
panel.add(databaseLabel);
panel.add(databaseField);
panel.add(dataExperimentLabel);
panel.add(dataExperimentField);
panel.add(english4Field);
panel.add(english4Label);
panel.add(sports4Field);
panel.add(sports4Label);
panel.add(principleLabel);
panel.add(principleField);
panel.add(policyField);
panel.add(policyLabel);
panel.add(computerField);
panel.add(computerLabel);
panel.add(javaField);
panel.add(javaLabel);
panel.add(operateField);
panel.add(operateLabel);
panel.add(javaExperimentField);
panel.add(javaExperimentLabel);
panel.add(linuxField);
panel.add(linuxLabel);
panel.add(tow1);
panel.add(tow2);
panel.add(start);
panel.add(reset);
panel.add(resultLable);
this.setContentPane(panel);
}
//初始化组件
public void initModule() {
//初始化相关组件
//大二上
//设置字体的类型,加粗,和大小
tow1.setFont(new Font("Microsoft YaHei",Font.BOLD,40));
tow1.setBounds(460,0,150,50);
//健康教育
//设置字体的类型,加粗,和大小
healthLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
healthLabel.setBounds(10,55,100,50);
//文本框的位置和大小
healthField.setBounds(140,60,150,40);
healthField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//大学生求职择业与职业发展
//设置字体的类型,加粗,和大小
jobLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
jobLabel.setBounds(540,55,260,50);
//文本框的位置和大小
jobField.setBounds(800,60,150,40);
jobField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//大学英语(三)
//设置字体的类型,加粗,和大小
english3Label.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
english3Label.setBounds(10,110,130,50);
//文本框的位置和大小
english3Field.setBounds(140,115,150,40);
english3Field.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//大学体育(三)
//设置字体的类型,加粗,和大小
sports3Label.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
sports3Label.setBounds(330,110,130,50);
//文本框的位置和大小
sports3Field.setBounds(460,115,150,40);
sports3Field.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//中国近现代史纲要
//设置字体的类型,加粗,和大小
outlineLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
outlineLabel.setBounds(640,110,150,50);
//文本框的位置和大小
outlineField.setBounds(800,115,150,40);
outlineField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//离散数学
//设置字体的类型,加粗,和大小
mathLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
mathLabel.setBounds(10,170,100,50);
//文本框的位置和大小
mathField.setBounds(140,175,150,40);
mathField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//数据结构
//设置字体的类型,加粗,和大小
dataLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
dataLabel.setBounds(330,170,100,50);
//文本框的位置和大
dataField.setBounds(460,175,150,40);
dataField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//数字逻辑
//设置字体的类型,加粗,和大小
digitLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
digitLabel.setBounds(640,170,100,50);
//文本框的位置和大小
digitField.setBounds(800,175,150,40);
digitField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//数据库原理
//设置字体的类型,加粗,和大小
databaseLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
databaseLabel.setBounds(10,220,120,50);
//文本框的位置和大小
databaseField.setBounds(140,225,150,40);
databaseField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//数据结构实验
//设置字体的类型,加粗,和大小
dataExperimentLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
dataExperimentLabel.setBounds(330,220,140,50);
//文本框的位置和大小
dataExperimentField.setBounds(460,225,150,40);
dataExperimentField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
tow2.setFont(new Font("Microsoft YaHei",Font.BOLD,40));
tow2.setBounds(460,300,150,50);
//设置字体的类型,加粗,和大小
english4Label.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
english4Label.setBounds(10,360,130,50);
//文本框的位置和大小
english4Field.setBounds(140,365,150,40);
english4Field.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
sports4Label.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
sports4Label.setBounds(330,360,130,50);
//文本框的位置和大小
sports4Field.setBounds(460,365,150,40);
sports4Field.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
principleLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
principleLabel.setBounds(10,410,200,50);
//文本框的位置和大小
principleField.setBounds(210,415,150,40);
principleField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
policyLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
policyLabel.setBounds(380,410,200,50);
//文本框的位置和大小
policyField.setBounds(500,415,150,40);
policyField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
computerLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
computerLabel.setBounds(670,410,200,50);
//文本框的位置和大小
computerField.setBounds(820,415,150,40);
computerField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
javaLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
javaLabel.setBounds(10,460,200,50);
//文本框的位置和大小
javaField.setBounds(140,465,150,40);
javaField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
operateLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
operateLabel.setBounds(330,460,400,50);
//文本框的位置和大小
operateField.setBounds(460,465,150,40);
operateField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
javaExperimentLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
javaExperimentLabel.setBounds(640,460,400,50);
//文本框的位置和大小
javaExperimentField.setBounds(800,465,150,40);
javaExperimentField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//设置字体的类型,加粗,和大小
linuxLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
linuxLabel.setBounds(10,520,420,50);
//文本框的位置和大小
linuxField.setBounds(160,525,150,40);
linuxField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//放置按钮
start.setFont(new Font("楷体",Font.BOLD,15));
start.setBounds(500,650,230,80);
reset.setFont(new Font("楷体",Font.BOLD,15));
reset.setBounds(750,650,230,80);
resultLable.setBounds(10,590,1000,50);
resultLable.setFont(new Font("Microsoft YaHei",Font.BOLD,45));
}
public void buttonAction() {
//按钮绑定动作事件,和自己绑定,自己实现的监听的方法
start.addActionListener(this);
reset.addActionListener(this);
}
//提取数据并判断数据是否合法
public void judge() {
String number="";
number=healthField.getText().trim();
if(isInteger(number)){
health=Integer.parseInt(number);
number=jobField.getText().trim();
if(isInteger(number)){
job=Integer.parseInt(number);
number=english3Field.getText().trim();
if(isInteger(number)){
english3=Integer.parseInt(number);
number=sports3Field.getText().trim();
if(isInteger(number)){
sports3=Integer.parseInt(number);
number=outlineField.getText().trim();
if(isInteger(number)){
outline=Integer.parseInt(number);
number=mathField.getText().trim();
if(isInteger(number)){
math=Integer.parseInt(number);
number=dataField.getText().trim();
if(isInteger(number)){
data=Integer.parseInt(number);
number=digitField.getText().trim();
if(isInteger(number)){
digit=Integer.parseInt(number);
number=databaseField.getText().trim();
if(isInteger(number)){
database=Integer.parseInt(number);
number=dataExperimentField.getText().trim();
if(isInteger(number)){
dataExperiment=Integer.parseInt(number);
number=english4Field.getText().trim();
if(isInteger(number)){
english4=Integer.parseInt(number);
number=sports4Field.getText().trim();
if(isInteger(number)){
sports4=Integer.parseInt(number);
number=principleField.getText().trim();
if(isInteger(number)){
principle=Integer.parseInt(number);
number=policyField.getText().trim();
if(isInteger(number)){
policy=Integer.parseInt(number);
number=computerField.getText().trim();
if(isInteger(number)){
computer=Integer.parseInt(number);
number=javaField.getText().trim();
if(isInteger(number)){
java=Integer.parseInt(number);
number=operateField.getText().trim();
if(isInteger(number)){
operate=Integer.parseInt(number);
number=javaExperimentField.getText().trim();
if(isInteger(number)){
javaExperiment=Integer.parseInt(number);
number=linuxField.getText().trim();
if(isInteger(number)){
linux=Integer.parseInt(number);
}else{
warning("Linux及程序设计的分数输入不合法");
}
}else{
warning("Java实验的分数输入不合法");
}
}else{
warning("操作系统的分数输入不合法");
}
}else{
warning("Java的分数输入不合法");
}
}else{
warning("计算机组成原理的分数输入不合法");
}
}else{
warning("形势与政策的分数输入不合法");
}
}else{
warning("马克思主义基本原理的分数输入不合法");
}
}else{
warning("大学体育(四)的分数输入不合法");
}
}else{
warning("大学英语(四)的分数输入不合法");
}
}else{
warning("数据结构实验的分数输入不合法");
}
}else{
warning("数据库原理的分数输入不合法");
}
}else{
warning("数字逻辑的分数输入不合法");
}
}else{
warning("数据结构的分数输入不合法");
}
}else{
warning("离散数学的分数输入不合法");
}
}else{
warning("中国近代史纲要的分数输入不合法");
}
}else{
warning("大学体育(三)的分数输入不合法");
}
}else{
warning("大学英语(三)的分数输入不合法");
}
}else{
warning("大学生求职择业与职业发展的分数输入不合法");
}
}else{
warning("健康教育的分数输入不合法");
}
}
//计算最终的结果
public void result(){
int []score=new int[credit.length];
//需要放在方法里面,不然会重复执行
//总评分F2
double resultF2=0;
//(各课程学分*单科成绩)之和
long sumScore=0;
//总课程学分之和
int sumCredit=0;
score[0]=health;
score[1]=job;
score[2]=english3;
score[3]=sports3;
score[4]=outline;
score[5]=math;
score[6]=data;
score[7]=digit;
score[8]=database;
score[9]=dataExperiment;
score[10]=english4;
score[11]=sports4;
score[12]=principle;
score[13]=policy;
score[14]=computer;
score[15]=java;
score[16]=operate;
score[17]=javaExperiment;
score[18]=linux;
for (int i = 0; i < credit.length; i++) {
sumCredit+=credit[i];
sumScore+=credit[i]*score[i];
}
resultF2=1.0*sumScore/sumCredit;
//显示结果
resultLable.setText("您的最终F2是:"+resultF2);
}
//必须重写actionPerformed方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象
String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本
if(buttonName.equals("开始计算")) {
//提取数据并判断数据是否合法
judge();
//计算最终F2的结果
result();
}else if(buttonName.equals("清空数据")) {
//清空文本框里面的内容
healthField.setText("");
jobField.setText("");
english3Field.setText("");
sports3Field.setText("");
outlineField.setText("");
mathField.setText("");
dataField.setText("");
digitField.setText("");
databaseField.setText("");
dataExperimentField.setText("");
english4Field.setText("");
sports4Field.setText("");
principleField.setText("");
policyField.setText("");
computerField.setText("");
javaField.setText("");
operateField.setText("");
javaExperimentField.setText("");
linuxField.setText("");
}
}
//输出警告弹窗
static public void warning(String str) {
//添加一个弹窗的警告
JDialog jDialog=new JDialog();//创建弹窗对象
jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示
jDialog.setSize(500,400);//设置弹窗的大小
jDialog.setAlwaysOnTop(true);//让弹窗置顶
jDialog.setLocationRelativeTo(null);//让弹窗居中
jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面
//警告标签,放在弹窗里面
final JLabel warningLabel=new JLabel(str,JLabel.CENTER);
//设置字体的类型,加粗,和大小
warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));
//标签的位置和大小
warningLabel.setBounds(0,100,500,100);
//这个也要取消布局管理器才行
//jDialog.getContentPane().setLayout(null);
//往弹窗中添加标签(垂直加居中放置标签)
jDialog.getContentPane().add(warningLabel,BorderLayout.CENTER);
jDialog.setVisible(true);//让弹窗显示出来
}
//判断是否是[0-100]之间的整数
public boolean isInteger(String number){
String regex="(100|[1-9][0-9]{0,1})";
if(number.matches(regex)){
return true;
}else {
return false;
}
}
}
Excel
刚开始我是想用MATLAB来实现的,但是MATLAB导入数据还是需要从Excel里面导入,所以我就想Excel能不能直接计算呢,答案发现是肯定的,他对于求和和平均数之类的都有,而这个就不过是公式不一样而已,我们自己自定义公式就行了。
直接输入分数在后面输入公式即可。(下方是我的公式)随便写一些数据
(B2+C2+2*D2+E2+3*F2+4*G2+4*H2+4*I2+4*J2+K2+2*L2+M2+3*N2+2*O2+5*P2+3*Q2+4*R2+S2+3*T2)/49
总结:
这个写下来感觉是有点特意的感觉了,因为本来用Excel就可以实现,你还编一个代码,非常没有必要,但是这个我有必要辩解一下,因为我Excel不是很熟练,是后面突发奇想试验出来的,没有想到如此方面。在写之前我也能够感受到这个程序有很大的弊端就是他通用性不高,是针对自己班级来实现的,但是为什么我还写呢,所以我有了这个想法,我有能够去实现它,当这个东西做出来之后,我也可以得到满足感,这种反馈就可以让我更加的自信,学习起来也更加有意思一点。
那这个简单的程序就到这里了,希望大家能够多多支持。