设计一个排课系统(Java实现)

题目: 设计一个排课系统

内容:

设计一个排课系统,要求从文本文件导入教室情况(大小,数量)、培养方案(课程、学生年级、人数、教师)、约束条件(有些约束从培养方案中可知,如一个教师可以教授两门课不可以安排在同一时间上,其他包括课程先修关系,教师的特殊情况如不能上上午一二节课等),系统最终生成课表或给出无法排课的错误提示。

知识点:

使用多种存储结构,使用多种常用算法,编写复杂系统

能力:

能够掌握多种存储结构,灵活运用已学知识解决实际问题。

效果截图

在这里插入图片描述
在这里插入图片描述

部分源码(源代码见文末):

package view;



import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;

import clazz.ClassRoom;
import clazz.Course;
import clazz.CourseForm;
import clazz.Teacher;
import clazz.Class;

import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Random;

import java.util.Set;

import javax.swing.JButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;

public class Show extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
    private static LinkedList<Class> classList = new LinkedList<>();
    private static LinkedList<ClassRoom> classroomList = new LinkedList<>();
    private static LinkedList<Course> courseList = new LinkedList<>();
    private static LinkedList<Teacher> teacherList = new LinkedList<>();
    private static Set<String> preCouse = new HashSet<>();
    private static Set<String> having_preCourse = new HashSet<>();
    private static LinkedList<String> temList1;
    private static LinkedList<String> temList2;
    private JTextField textField;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Show frame = new Show();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Show() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 461, 371);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel Label1 = new JLabel("排课系统");
		Label1.setFont(new Font("造字工房言宋(非商用)常规体", Font.PLAIN, 38));
		Label1.setBounds(148, 27, 165, 72);
		contentPane.add(Label1);
		
		try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("Class.txt")), "GBK"));
            String line;
            while ((line = br.readLine()) != null) {
                String[] result = line.split(" ");
                classList.add(new Class(Integer.parseInt(result[0]), result[1], Integer.parseInt(result[2])));
            }
            br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("ClassRoom.txt")), "GBK"));
            while ((line = br.readLine()) != null) {
                String[] result = line.split(" ");
                classroomList.add(new ClassRoom(Integer.parseInt(result[0]), result[1], Integer.parseInt(result[2])));
            }
            br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("Course.txt")), "GBK"));
            while ((line = br.readLine()) != null) {
                String[] result = line.split(" ");
                courseList.add(new Course(Integer.parseInt(result[0]), result[1], Integer.parseInt(result[2])));
                for (int i = 3; i < result.length; i++) {
                    courseList.getLast().precourse.add(result[i]);
                    preCouse.add(result[i]);
                    having_preCourse.add(result[1]);
                }
            }
            br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("Teacher.txt")), "GBK"));
            while ((line = br.readLine()) != null) {
                String[] result = line.split(" ");
                teacherList.add(new Teacher(Integer.parseInt(result[0]), result[1]));
                for (int i = 2; i < result.length; i++) {
                    if (result[i].length() == 1 && result[i].charAt(0) <= 'z' && result[i].charAt(0) >= 'a') {
                        teacherList.getLast().getSq().getList().remove(result[i].charAt(0) - 'a');
                    } else
                        teacherList.getLast().teachCourse.add(result[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

		
		JButton Button1 = new JButton("开始排课");
		Button1.setBounds(100, 100, 100, 27);
		contentPane.add(Button1);
		
		JButton Button2 = new JButton("指定年级课表");
		Button2.setBounds(210, 151, 140, 27);
		contentPane.add(Button2);
		
		JButton Button3 = new JButton("指定老师课表");
		Button3.setBounds(211, 207, 139, 27);
		contentPane.add(Button3);
		
		JButton Button4 = new JButton("所有年级课表");
		Button4.setBounds(102, 261, 248, 27);
		contentPane.add(Button4);
		
		JButton Button5 = new JButton("退出系统");
		Button5.setBounds(237, 100, 113, 27);
		contentPane.add(Button5);
		
		JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(1, 1, 5, 1));
		spinner1.setBounds(100, 152, 80, 24);
		contentPane.add(spinner1);
		
		textField = new JTextField();
		textField.setBounds(100, 208, 86, 24);
		contentPane.add(textField);
		textField.setColumns(10);
		
		
		Button1.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				 System.out.println("排课中。。。");
                 Arranging();
                 System.out.println("排课成功。");
                 JOptionPane.showMessageDialog(contentPane, "排课成功", "成功", 1);
			}
		});
		
		Button2.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				int number = (int) spinner1.getValue();
				showClass(number);
			}
		});
		
		Button3.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String name = textField.getText();
				showTeacher(name);
			}
		});
		
		Button4.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				for (Class x : classList) {
					ShowAll(x.observed, x.getName() + "的班级课表");
                }
			}
		});
		
		Button5.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});
	}
	
	 private static void showClass(int grade) {
	        for (Class x : classList) {
	            if (x.getGrade() == grade) {
	            	ShowAll(x.observed, x.getName() + "的班级课表");
	                return;
	            }
	        }

	    }

	    private static void showTeacher(String teachername) {
	        for (Teacher x : teacherList) {
	        	System.out.println(x.getName());
	            if (x.getName().equals(teachername) ) {
	            	ShowAll(x.observed, x.getName() + "的课表");
	                //return;
	            }
	        }
	    }

	
	 private static void ShowAll(String[] list, String string) {
	        JFrame frame = new JFrame(string);
	        JTable table = new JTable(new CourseForm(list));
	    	//设置表数据居中显示
			DefaultTableCellRenderer cr = new DefaultTableCellRenderer();
			cr.setHorizontalAlignment(JLabel.CENTER);
			table.setDefaultRenderer( Object.class, cr);
	        table.setRowHeight(120);
	        JScrollPane pane = new JScrollPane(table);
	        frame.getContentPane().add(pane);
	        //frame.pack();
	        frame.setSize(1200,600);
	        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	        frame.setVisible(true);
	 }

	 private static void Arranging() {
	        for (Course cou : courseList) {
	            Teacher tea = null;
	            Class cla = null;
	            if (preCouse.contains(cou.getName())) {
	                for (Class x : classList) {
	                    if (x.getGrade() == 1) {
	                        cla = x;
	                        break;
	                    }
	                }
	                for (Teacher x : teacherList) {
	                    if (x.teachCourse.contains(cou.getName())) {
	                        tea = x;
	                        break;
	                    }
	                }
	                
	                order(tea, cla, cou);
	          
	            } else if (having_preCourse.contains(cou.getName())) {
	                int max = 0;
	                for (Class x : classList) {
	                    if (x.getSq().getList().size() > max && x.getGrade() != 1) {
	                        cla = x;
	                        max = x.getSq().getList().size();
	                    }
	                }
	                for (Teacher x : teacherList) {
	                    if (x.teachCourse.contains(cou.getName())) {
	                        tea = x;
	                        break;
	                    }
	                }
	                order(tea, cla, cou);
	            } else {
	                int max = 0;
	                for (Class x : classList) {
	                    if (x.getSq().getList().size() > max) {
	                        cla = x;
	                        max = x.getSq().getList().size();
	                    }
	                }
	                for (Teacher x : teacherList) {
	                    if (x.teachCourse.contains(cou.getName())) {
	                        tea = x;
	                        break;
	                    }
	                }
	                order(tea, cla, cou);
	            }
	        }
	    }
	 
	    // 从LinkedList<String>中随机取出timesPerWeek个元素组成的LinkedList<String>
	    private static LinkedList<String> randList(LinkedList<String> list, int timesPerWeek) {
	        LinkedList<String> subList = new LinkedList<String>();
	        Random rand = new Random();
	        int j = 0;
	        while (true) {
	            String m = list.get(rand.nextInt(list.size()));

	            if (!subList.contains(m)) {
	                subList.add(m);
	                j++;
	            }
	            if (j == timesPerWeek) {
	                break;
	            }
	        }
	        return subList;
	    }
	 
	  @SuppressWarnings("unchecked")
	private static void order(Teacher te, Class cl, Course co) {
	        temList1 = (LinkedList<String>) (te.getSq().getList().clone());
	        te.getSq().getList().retainAll(cl.getSq().getList());
	        if (te.getSq().getList().size() < co.getTimesWeek()) {
	        	JOptionPane.showMessageDialog(null, "老师和同学公共可利用时间不足安排", "安排失败", 1);
	            System.out.println("老师和同学公共可利用时间不足安排" + co.getName());
	        }
	        temList2 = randList(te.getSq().getList(), co.getTimesWeek());
	        cl.getSq().getList().removeAll(temList2);
	        te.getSq().setList(temList1);
	        te.getSq().getList().removeAll(temList2);
	        //System.out.println(cl.getSq().getList().size());
	        for (String x : temList2) {
	            int max=1000;
	            ClassRoom selectRoom=null;
	            for (ClassRoom y: classroomList) {
	                if(y.getSq().getList().contains(x)&&y.getCapacity()-cl.getSum()<max
	                		&&y.getCapacity()-cl.getSum()>=0) {
	                    max = y.getCapacity() - cl.getSum();
	                    selectRoom=y;
	                }
	            }
	            if(selectRoom!=null){
	                selectRoom.getSq().getList().remove(x);
	            }
	            else{
	                System.out.println("教室资源不够。");
	                JOptionPane.showMessageDialog(null, "教室资源不够。", "提示", 1);
	                return;
	            }
	            te.observed[x.charAt(0) - 'a'] = co.getName()+" "+cl.getName()+" "+selectRoom.getName();
	            cl.observed[x.charAt(0) - 'a'] = co.getName()+" "+te.getName()+" "+selectRoom.getName();
	        }
	    }
}

源代码下载:

完整项目下载:点此获取
或许有帮到你的话可以点个Star么~

排课系统可行性研究报告 一、 引言 1.1编写目的 编本可行性报告目的是为了以后排课工作节省时间、提高教学效率、便于课程设计的管理。 1.2 项目背景 a. 软件的名称是排课系统。 b. 项目的委托单位:中州大学信息工程学院。 c. 本项目是08信管2班张钦钦、张杰、李水莲、王珂、曹建超五个人参与软件过程开发。 2可行性研究前提 2.1 要求 a 功能完善。 b 便于操作。 c 结构严紧。 d 便于管理。 e 使用方便、快捷。 f 易于在数据库上实现。 2.2 目标 a 本排课系统目标是每学期都可使用. b 机器代替手工工作。 c 便于课程教学的管理,减少人工排课的工作量。 d 可以进行精确查询。 e 与数据库连接,研究所处理数据的最优算法,提高计算机的处理速度。 f不断改善软件开发前各项决策系统的研发。 二、可行性分析 1、对现有系统的分析: 1.1现有系统是人工操作的。 1.2费时费力。 1.3工作效率低。 1.4容易出错。 1.5人力投入费用高。 2、系统的可行性从四个方面考虑 2.1、技术可行性 a.通过研究及查资料了解到当前的技术可以实现这个课程表管理系统。 b.五个人为一组,所学专业为计算机信息管理能满足此系统的开发。 c. 有充足的时间完成本系统。 2.2经济可行性 a.经过调查了解各个学校也有这个经济实力使用我们开发的课程表管理系统。 b.使用本系统不受时间限制。 c.排课一般为每学期一次,系统工作量不大。 d.本系统是学生自己开发的小型软件,设备和软件配置变化对支出和效益的影响比较小。 2.3、操作可行性 操作系统:我们开发的课程表管理系统适应于各个操作系统,比如windows xp ,vista,unix,linux等。 支持环境:IIS5.0数据库:Microsoft SQL Server 2000 2.4、法律可行性 我们开发的课程表管理系统没有任何抄袭,不会引起任何侵权问题。 3、系统的简要描述 这个系统要与数据库连接,并依赖于数据库,可以方便的查询课程和上课时间,上课地点,任课老师,可自动编排课程表。 4、与现有系统比较的优越性 这个系统比原系统更可靠,快速,且减少了出错的几率,减少了人力的投入,降低了成本,提高了工作效率,减少了编排课程表人员的工作量和劳动强度。 5、结论意见 通过分析可着手开发 三.需求分析 1.开发排课系统的必要性 现在课程表的编排使用的是人工,人来完成课程编排增加了人的劳动量,而且人工容易出错,人力投入资金多,效率不高,使用的范围有限,鉴于以上这些情况很有必要开发课程表排课系统。 2.此软件能实现的功能 只需操作人员输入校名,级别,班级,专业名及授课教师名,这样本软件就可以自动完成一周内各年级各专业的每个班级所上课程,上课时段,上课地点及任课老师的编排工作,操作人员不必过多参与。 3.动态数据 a.输入学校名。 b.输入院系名。 c.输入班级名。 d.输入专业课名及对应的授课教师名。 e.选择规定课程的时段。 4.其他非功能需求 本软件应具有可维护性,可扩展性,可测试性,兼容性. 5.使用范围 此系统不设密码,任何学校都可以使用。 6.功能模块 模块一:输入学校名,院系名,班级名,专业课名及授课教师名。 模块二:显示结果,支持手工修改,打印,并可以导出到word文档。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值