要求如下:
为《算法与数据结构设计》课程开发实验室安排系统。该课程开课时间为2周,在两周内需要上6次课,每次连续4个学时。
每天上午下午可各安排一次课,周末不安排上课。该系统包含两个程序:管理员程序和教师申请程序:
在教师申请界面中:
教师录入所授课班级ID、班级人数、不希望的时间安排(例如不安排周一上午和周四下午);信息提交后将被存储到后台数据库中。
在管理员界面中:
管理员录入现有的实验室信息,包括实验室地址、实验室所能容纳学生数量。管理员可以选择“课表生成”,实验室安排算法读入已有
申请和实验室信息,生成总课程安排,并写入数据库。
当总课程安排生成后,教师再次进入教师申请程序时,可以看到自己的课表。
请使用C/C++或Java实现。数据库可随意选择。
基本要求:
(1) 两个程序可以由同一个界面进行入口,或者分别两个界面,不要求身份验证;用户只需要输入ID即可,ID事先已写入数据库。
(2) 算法生成的课程安排,要求尽可能为每个老师安排6次课,所安排实验室能容纳所上课班级;按照教师申请的时间次序,尽可能
优先满足先申请教师的期望实验安排;当申请较多而管理员录入的实验室较少,允许出现有的教师申请无法满足的情况;
(3) 实物演示时要求能够说明所采用算法思想;
(4) 程序操作友好、健壮;操作界面简洁美观。
提高要求:
(1) 完善程序功能。例如身份验证、教师与程序员可以修改自己的录入信息等。
(2) 先进而高效的算法。
(3) 界面美观,课表整齐美观。
准备工作:
工具:eclipse
MySQL5.6
MySQL连接驱动:mysql-connector-java-5.1.27.jar
加载驱动:
1. 在工程目录中创建lib文件夹,将下载好的JDBC放到该文件夹下,如下图所示:
2. 右键工程名,在java build path中的Libraries分页中选择Add JARs...,选择刚才添加的JDBC,如下图:
实现步骤:
1,系统主界面的设计
用户输入账号密码后选择教师或者管理员身份进行登录(默认密登录码均为1),若果账户名或者密码输入错误,则无法登录,
重新输入,效果图如下:
代码:
package实验室安排系统;import javax.swing.*;import java.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;public class MainUI extends JFrame implementsActionListener {//定义组件
JButton jb1,jb2,jb3=null;
JRadioButton jrb1,jrb2=null;
JPanel jp1,jp2,jp3,jp4=null;
JTextField jtf=null;
JLabel jlb1,jlb2,jlb3=null;
JPasswordField jpf=null;
ButtonGroup bg=null;//设定用户名和密码
final String gly_name="GLY";final String gly_pwd="1";
String tername=null;final String tea_pwd="1";public static voidmain(String[] args) {
MainUI mUI=newMainUI();
}publicMainUI()
{//创建组件
jb1=new JButton("登录");
jb1.setBounds(91, 5, 83, 29);
jb2=new JButton("退出");
jb2.setBounds(225, 5, 83, 29);//设置监听
jb1.addActionListener(this);
jb2.addActionListener(this);
jrb1=new JRadioButton("教师");
jrb1.setBounds(145, 5, 69, 29);
jrb2=new JRadioButton("\u7BA1\u7406\u5458");
jrb2.setBounds(258, 5, 87, 29);
bg=newButtonGroup();
bg.add(jrb1);
bg.add(jrb2);
jrb2.setSelected(true); //初始页面默认选择权限为管理员
jp1=newJPanel();
jp2=newJPanel();
jp3=newJPanel();
jp4=newJPanel();
jlb1=new JLabel("\u7528 \u6237 \u540D\uFF1A");
jlb1.setBounds(43, 8, 90, 21);
jlb2=new JLabel(" \u5BC6 \u7801 \uFF1A");
jlb2.setBounds(44, 8, 95, 21);
jlb3=new JLabel("\u6743 \u9650\uFF1A");
jlb3.setBounds(54, 9, 72, 21);
jtf=new JTextField(10);
jtf.setBounds(144, 5, 197, 27);
jpf=new JPasswordField(10);
jpf.setBounds(146, 5, 195, 27);
jp1.setLayout(null);//加入到JPanel中
jp1.add(jlb1);
jp1.add(jtf);
jp2.setLayout(null);
jp2.add(jlb2);
jp2.add(jpf);
jp3.setLayout(null);
jp3.add(jlb3);//添加标签
jp3.add(jrb1);
jp3.add(jrb2);
jp4.setLayout(null);
jp4.add(jb1);//添加按钮
jp4.add(jb2);//加入JFrame中
getContentPane().add(jp1);
getContentPane().add(jp2);
getContentPane().add(jp3);
getContentPane().add(jp4);
getContentPane().setLayout(new GridLayout(4,1)); //选择GridLayout布局管理器
this.setTitle("实验室安排系统");this.setSize(400,200);this.setLocation(600, 300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置当关闭窗口时,保证JVM也退出
this.setVisible(true);this.setResizable(true);
}public void actionPerformed(ActionEvent e) { //事件判断
if(e.getActionCommand()=="登录")
{//如果选中教师登录
if(jrb1.isSelected())
{
tealogin();//连接到教师的方法 页面
}else if(jrb2.isSelected()) //学生在登录系统
{
glylogin();//连接到管理员的方法 页面
}
}else if(e.getActionCommand()=="退出")
{
dispose();
}
}//管理员登录判断方法
public voidglylogin()
{if(gly_name.equals(jtf.getText())&&gly_pwd.equals(jpf.getText()))
{
JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
dispose();
clear();
GlyUI ui=new GlyUI(); //创建新界面
}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jtf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else{
JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);//清空输入框
clear();
}
}//教师登录判断方法
public voidtealogin()
{if(tea_pwd.equals(jpf.getText()))
{
tername=jtf.getText();
JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
clear();
dispose();
TerUI ui=new TerUI(tername); //创建一个新界面
}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jtf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else{
JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
clear();//清空输入框
}
}//清空文本框和密码框
public voidclear()
{
jtf.setText("");
jpf.setText("");
}
}
View Code
2,管理员界面设计
以管理员身份登录成功后,可以进行信息(实验室地址,实验室容纳量)录入,信息修改,生成课表等操作,效果图如下:
代码:
package实验室安排系统;import java.awt.*;import java.awt.event.*;importjava.sql.SQLException;import javax.swing.*;import实验室安排系统.MainUI;public class GlyUI extends JFrame implementsActionListener
{//定义组件
JButton jb1,jb2,jb3=null;
JPanel jp3,jp4=null;
JLabel jlb1,jlb3,jlb4,jlb6=null;public static voidmain(String[] args) {
GlyUI ui=newGlyUI();
}publicGlyUI()
{
jp3=newJPanel();
jp3.setBounds(0, 220, 378, 23);
getContentPane().setLayout(null);
jlb1=new JLabel("\u4F60\u597D\uFF0C\u7BA1\u7406\u5458");
jlb1.setBounds(68, 15, 231, 49);
getContentPane().add(jlb1);
jb2=new JButton("\u4FE1\u606F\u5F55\u5165");
jb2.setBounds(15, 79, 105, 61);
getContentPane().add(jb2);
jb2.setForeground(Color.BLUE);
jb2.addActionListener(newActionListener() {
@Overridepublic voidactionPerformed(ActionEvent e) {
dispose();newGlyInputUI();
}
});//创建组件
jb3=new JButton("信息修改");
jb3.setForeground(Color.BLUE);
jb3.setBounds(135, 79, 105, 61);
getContentPane().add(jb3);
jb3.addActionListener(newActionListener() {
@Overridepublic voidactionPerformed(ActionEvent e) {//TODO Auto-generated method stub
dispose();newglyxg();
}
});
jb1=new JButton("\u751F\u6210\u8BFE\u8868");
jb1.setBounds(255, 79, 105, 61);
getContentPane().add(jb1);
jb1.setForeground(Color.BLUE);
jb1.addActionListener(newActionListener() {
@Overridepublic voidactionPerformed(ActionEvent e) {try{
GlykbUI gl=newGlykbUI();
}catch(SQLException e1) {//TODO Auto-generated catch block
e1.printStackTrace();
}//生成课表
JOptionPane.showMessageDialog(null,"生成成功","提示消息",J