加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

图形界面的席位分配程序(惯例法、Q值法、D'Hondt法)

(2006-04-14 15:27:58)
标签:

java

席位分配

原创

分类: 程序

席位分配之图形界面程序:

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

 class Dinterface extends JFrame implements ActionListener  {
 TextField tf1;   //文本框1,用于输入第一部分人数。
 TextField tf2;   //文本框2,用于输入第二部分人数。
 TextField tf3;   //文本框3,用于输入第三部分人数。
 TextField tf4;   //文本框4,用于输入席位数。
 TextArea ta;   //用于显示席位分配结果。
 JButton btnReset;    //重置按钮
 JButton btnTradition;   //惯例分配法按钮
 JButton btnQway;   //Q值法按钮
 JButton btnDhondt;   //D'Hondt方法按钮
  JButton btnClear;   //清空按钮
  JButton btnExit;    //退出按钮
  JButton btnAbout;   //关于按钮
  JDialog about=new JDialog(this); //关于对话框
  static int seatA,seatB,seatC;
  static float tseatA,tseatB,tseatC;
 
 
 
  public void init() {
   tf1 = new TextField("此处输入第一组人数",15);
   tf2 = new TextField("此处输入第二组人数",15);
   tf3 = new TextField("此处输入第三组人数",15);
   tf4 = new TextField("此处输入席位数",10);
   ta = new TextArea(20,60);
   ta.setEditable(false);
   btnReset = new JButton("重置");
   btnTradition = new JButton("惯例分配法");
   btnQway = new JButton("Q值法");
   btnDhondt = new JButton("D’Hondt方法");
   btnClear = new JButton("清空");
   btnExit = new JButton("退出");
   btnAbout = new JButton("关于");
    setBackground(Color.black);   //设置背景色
   setLayout(new FlowLayout());    //设置工作区
   add(tf1);   //添加
   add(tf2);
   add(tf3);
   add(tf4);
    add(btnReset);
    add(ta);
    add(btnTradition);
   add(btnQway);
   add(btnDhondt);
   add(btnClear);
   add(btnAbout);
   add(btnExit);
    btnReset.addActionListener(this);  //设置监听
   btnClear.addActionListener(this);
   btnTradition.addActionListener(this);
   btnQway.addActionListener(this);
   btnDhondt.addActionListener(this);
   btnAbout.addActionListener(this);
   btnExit.addActionListener(this);
  }
 
  public void actionPerformed(java.awt.event.ActionEvent ae) {
   if(ae.getActionCommand().equals("清空")) 
    ta.setText("");
   if(ae.getActionCommand().equals("退出"))
    System.exit(0);
   if(ae.getActionCommand().equals("关于")) {
    initAboutDialog();   //初始化about
     about.setSize(220,150);
      about.setVisible(true);
    }
   if(ae.getActionCommand().equals("重置")) {
    tf1.setText("");
    tf2.setText("");
    tf3.setText("");
    tf4.setText("");
   }
   if(ae.getActionCommand().equals("惯例分配法")) {
    int numA = Integer.parseInt(tf1.getText());
    int numB = Integer.parseInt(tf2.getText());
    int numC = Integer.parseInt(tf3.getText());
    int commissary = Integer.parseInt(tf4.getText());
    tradition(numA,numB,numC,commissary);
    ta.append("按惯例分配法分配如下:\n");
    ta.append("学生A宿舍分配委员数:" + (int)tseatA + "人\n");
    ta.append("学生B宿舍分配委员数:" + (int)tseatB + "人\n");
    ta.append("学生C宿舍分配委员数:" + (int)tseatC + "人\n\n");
   }
   if(ae.getActionCommand().equals("Q值法")) {
    int numA = Integer.parseInt(tf1.getText());
    int numB = Integer.parseInt(tf2.getText());
    int numC = Integer.parseInt(tf3.getText());
    int commissary = Integer.parseInt(tf4.getText());
    qWay(numA,numB,numC,commissary);
    ta.append("按Q值法分配如下:\n");
    ta.append("学生A宿舍分配委员数:" + seatA + "人\n");
    ta.append("学生B宿舍分配委员数:" + seatB + "人\n");
    ta.append("学生C宿舍分配委员数:" + seatC + "人\n\n");
    }
    if(ae.getActionCommand().equals("D’Hondt方法")) {
     int numA = Integer.parseInt(tf1.getText());
    int numB = Integer.parseInt(tf2.getText());
    int numC = Integer.parseInt(tf3.getText());
    int commissary = Integer.parseInt(tf4.getText());
     dHondt(numA,numB,numC,commissary);
     ta.append("按D’Hondt方法分配如下:\n");
    ta.append("学生A宿舍分配委员数:" + seatA + "人\n");
    ta.append("学生B宿舍分配委员数:" + seatB + "人\n");
    ta.append("学生C宿舍分配委员数:" + seatC + "人\n\n");
   }
  }

  void initAboutDialog(){   //初始化关于对话框
    about.getContentPane().add(new JLabel("作者-李彦伟:席位分配系统0.10版."));
    about.setModal(true);
  }
  public static void tradition(int numA,int numB,int numC,int commissary)     //惯例分配方法
  float decimalFractionA = 0,decimalFractionB = 0 ,decimalFractionC = 0;   //小数
  float max,secMax = 0;
  tseatA = commissary*(float)numA/(float)(numA + numB + numC);
  tseatB = commissary*(float)numB/(float)(numA + numB + numC);
  tseatC = commissary*(float)numC/(float)(numA + numB + numC);
  if((int)tseatA + (int)tseatB + (int)tseatC == commissary)
  {
     System.out.println("用惯例分配法分配如下:\n\n");
     System.out.println("学生A宿舍分配委员数:" + seatA + "人");
     System.out.println("学生B宿舍分配委员数:" + seatB + "人");
     System.out.println("学生C宿舍分配委员数:" + seatC + "人\n\n");
  }
  else
  {
     decimalFractionA =tseatA - (int)tseatA;
     decimalFractionB =tseatB - (int)tseatB;
     decimalFractionC =tseatC - (int)tseatC;
       max = maxNum(decimalFractionA,decimalFractionB,decimalFractionC);   //调用三个数比较最大值方法
    if (max == decimalFractionA) {
      tseatA = (int)tseatA + 1;
      secMax =(decimalFractionB > decimalFractionC) ? decimalFractionB : decimalFractionC; //次大数
     }
    else if (max == decimalFractionB) {
      tseatB = (int)tseatB + 1;
      secMax =(decimalFractionA > decimalFractionC) ? decimalFractionA : decimalFractionC; //次大数
     }
    else if (max == decimalFractionC) {
       tseatC = (int)tseatC + 1;
       secMax =(decimalFractionA > decimalFractionB) ? decimalFractionA : decimalFractionB; //次大数
      }
    if (commissary - (int)tseatA - (int)tseatB - (int)tseatC != 0)   //座位还没有分配完
  {
   if(secMax == decimalFractionA) 
      tseatA = (int)tseatA + 1;
   else if(secMax == decimalFractionB) 
      tseatB = (int)tseatB + 1;
   else if(secMax == decimalFractionC) 
      tseatC = (int)tseatC + 1;
     }
  }
  }

  public static void qWay(int numA,int numB,int numC,int commissary)  //Q值方法
  seatA = seatB = seatC = 1;
  float q1,q2,q3,maxQ;  // Q值
  while(seatA + seatB + seatC != commissary) { //只要还有剩余座位就循环
   q1 = (float)numA * numA / seatA / (seatA + 1);   //求Q1
   q2 = (float)numB * numB / seatB / (seatB + 1);
   q3 = (float)numC * numC / seatC / (seatC + 1);
   maxQ = maxNum(q1,q2,q3);
   if (maxQ == q1)
      seatA +=1;
   else if (maxQ == q2)
      seatB +=1;
   else if (maxQ == q3)
      seatC +=1;
   }
  }
 
  public static void dHondt(int numA,int numB,int numC,int commissary)   //d'Hondt分配方法
   seatA = seatB = seatC = 0;
  int i = 0, j = 0, k = 0, m = 0;
    float d ;  
  float[] a = new float[commissary];
  float[] b = new float[commissary];
  float[] c = new float[commissary];
  for(int n = 0; n < commissary; n ++) {
   a[n] = (float)numA/(n+1);
   b[n] = (float)numB/(n+1);
   c[n] = (float)numC/(n+1);
  }
  while(m < commissary) {
   d = maxNum(a[i],b[j],c[k]);
   if(d == a[i]) {
    seatA +=1;
    i +=1;
    m +=1;
    continue;
   }
   if(d == b[j]) {
    seatB +=1;
    j +=1;
    m +=1;
    continue;
   }
   if(d == c[k]) {
    seatC +=1;
    k +=1;
    m +=1;
    continue;
   }
  }
 }
 
  public static float maxNum(float a,float b,float c)    //三个数求最大值方法
   float max,maxab;
  maxab = (a >= b) ? a : b;
  max = (maxab >= c) ? maxab : c;
  return max;
 }
}

public class Distribute1 
 public static void main(String[] args) {
   Dinterface d1=new Dinterface();
   d1.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e) {
        Dinterface d1=new Dinterface();
        int s=JOptionPane.showConfirmDialog(d1,"你确定要退出吗?","结束程序",JOptionPane.YES_NO_OPTION);
        if(s==JOptionPane.YES_OPTION)
          System.exit(0);}
        });
    d1.setTitle("席位分配系统");
  d1.setBounds(100,100,450,500);
  d1.setVisible(true);
  d1.init();
  d1.setVisible(true);
 }
}
  
  

   
   
   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有