资源描述
中南大学 数据结构课程设计报 告 指导教师 学 院 信息科学与工程学院 完成时间 2010 年 7 月 7 日 数据结构课程设计报告 计算机 0801 - 2 - 目 录 目 录 .- 2 - 题目一:利用线性表进行算式计算 .- 1 - 一、实验名称: .- 1 - 二、需求分析: .- 1 - 三、概要设计 .- 1 - 四、详细设计 .- 3 - 五、调试分析 .- 5 - 六、测试结果 .- 5 - 七、课程设计总结 .- 7 - 八、参考文献 .- 8 - 九、附录 .- 9 - 题目三:排课问题 .- 21 - 一、实验名称: .- 21 - 二、需求分析: .- 21 - 三、概要设计 .- 21 - 四、详细设计 .- 24 - 五、调试分析 .- 33 - 六、测试结果 .- 33 - 七、课程设计总结 .- 34 - 八、参考文献 .- 35 - 九、附录 .- 35 - 数据结构课程设计报告 计算机 0801 - 1 - 题目一:利用线性表进行算式计算 一、实验名称: 利用线性表进行算式计算 二、需求分析: 设计任务: 界面上出现一个文本框,输入一个算式,点击按钮,显示结果。该算式内 只含有数字、括号、+、-、*、/、%这几种字符,优先级为:括号-%-*,/- +,-。如输入:2+3*5,结果为 17,输入(2+3)*5 结果为 25。输入格式有误,需 要给予提示。在算法中,必须实现对输入的算式字符串的分析,而不仅仅是得 到结果。 (1)输入的形式和输入值的范围:数字和运算符(只含有括号、+、-、*、/、%) 。 (2)输出的形式:以数字和运算符组成的算式形式输出。 (3)程序所能达到的功能:对输入数字和运算符进行分析,并输出分析结果。 (4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。 三、概要设计 抽象数据类型的定义: ADT Stack 数据对象:D=a i|aiElemSet,i=1,2,n, n0 数据关系:R1=|ai-1,aiD,i=1,2,n 基本操作: InitStack( double arrayN; NumStack; typedef struct int top; char arrayN; OpStack; 数据结构课程设计报告 计算机 0801 - 4 - /把字符转换为相应的整数的函数 int Cint(char mychar) return (mychar-48); /数字进栈的函数 status PushNum(NumStack numstack.arraynumstack.top-1=num; return OK; else return ERROR; /数字出栈的函数 status PopNum(NumStack numstack.top-; return OK; else return ERROR; /操作符进栈的函数 status PushOp(OpStack opstack.arrayopstack.top-1=op; return OK; else return ERROR; 数据结构课程设计报告 计算机 0801 - 5 - /操作符出栈的函数 status PopOp(OpStack opstack.top-; return OK; else return ERROR; /进行运算的函数 double Calc(double a,double b,char c) double result; 五、调试分析 1调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析 调试过程中,对于非法输入的测试很重要,对于一些不符合常规的输入进 行测试,并针对存在的问题对源代码进行修改,可以对于非法输入进行提示。 2算法的时间复杂性和可能的改进设想 此算法的运行时间主要花在 while 循环上,它从头到尾扫描后缀表达式中 的每一个数据(每个操作数或运算符均为一个数据) ,若后缀表达式由 n 个数据 组成,则此算法的时间复杂度为 O(n)。 在转换算法中,中缀算术表达式中的每个字符均需要扫描一遍,对于扫描 到的每个运算符,最多需要进行入栈、出栈和写入后缀表达式这三次操作,对 于扫描到的数字或小数点,只需要把它直接写入到后缀表达式即可。所以,此 算法的时间复杂度为 O(n),n 为后缀表达式中字符的个数。 六、测试结果 1、输入:5+6*3%2 数据结构课程设计报告 计算机 0801 - 6 - 输出:5+6*3%2=11.0 2、输入:3+5*(8-2)%4 输出:3+5*(8-2)%4=13.0 3、输入:1*5+2 输出:对不起!表达式有错! 4、输入:123321123+456654456 输出:123321123+456654456=5.7997555E8 5、输入:1111 输出:1111=1111.0 6、输入:5(3+2) 输出:对不起!表达式有错! 7、输入:5+9*3-8/4%2 输出:5+9*3-8/4%2= -Infinity 界面效果图 数据结构课程设计报告 计算机 0801 - 7 - 运行结果显示-1 运行结果显示-2 数据结构课程设计报告 计算机 0801 - 8 - 七、课程设计总结 通过本次数据结构课程设计,我有很多收获,在此,我将我的亲身感受回 顾和总结于下: 在上学期中学习了本专业的核心课程数据结构。什么是数据结构呢? 这是我们首先考虑到的问题:从字面上来看, “数据结构”分数据和结构两部分, 这就很容易联想到数据结构的本质是一种使数据结构化的知识。通过理论课程 的学习,使我初步了解了数据结构的基本知识。数据结构是一门研究非数值计 算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科。现 代程序设计已转型为讨论如何在最大程度上处理好数据之间的相互关系并提升 数据处理的效率。在这里,数据结构就发挥了重要的作用。数据结构可以说是 编程的灵魂,它不是一门语言。数据结构和程序设计语言本身没有任何联系, 唯一有的关系就是用程序语言去描述数据结构。现今我们所学习的数据结构课 程常用的描述语言主要有 C、C+和 JAVA 等。数据结构只是给我们提供处理常 规问题的一个思路而已,讲的是已经成熟的编程思想和算法,适用于所有开发 语言。所以说,组织好数据结构是写程序的第一步。 数据结构是一门实践性较强的计算机基础课程,为了学好这门课程,必须 在掌握理论知识的同时,加强上机实践。课程设计的目的就是要达到理论与实 际应用相结合,使我们能够根据数据对象的特性,学会数据组织的方法,能把 现实世界中的实际问题在计算机内部表示出来,同时强化对编程语言的使用, 培养基本的、良好的程序设计能力。 我于大二上学期从软件学院软件工程专业转到信息学院计算机专业,在 09 年暑假中,我参加了软件学院的 JAVA 实训,了解了一定的 JAVA 语言知识,因 为本次课程设计要制作界面,所以选择 JAVA 语言有它的优势。 通过这次课程设计,我体会到要做出一个好的程序是很难的,尽管我花了 一个多星期去做这两个项目,但这个程序还是不够理想,只是达到一些基本的 水平而已,跟那些功能强大的程序还是有很大的距离。这个程序还有一些地方 值得完善的,比如算式计算中一些非法输入(如数字后面连续输入括号无法判 断非法并影响计算结果等) ,这些问题需要程序员考虑得更全面,使实现的功能 更完善,在今后不断改进。 数据结构课程设计报告 计算机 0801 - 9 - 在近两周的课程设计中,我认为最大的收获就是在遇到问题时解决问题的 过程。如对语言并不完全了解,如有些函数的操作需要通过查阅相关书籍和帮 助来了解,另外,在入栈、出栈的算法设计中,曾因为思路不清晰而在编代码 时遇到了困难,对于运算符和数字的分离和判断也曾困扰过我。我通过查阅书 籍、上网搜索和向其他同学询问,才得以最终完成项目。 通过这次课程设计,我学到了很多,同时也认识到了自己的不足。学校的 课程不能将所有的知识都讲授给我们,所以要想学好一门课程,我们应该充分 利用课余时间多看专业相关的书籍,丰富自己的知识。同时,作为计算机专业 的学生,动手能力也是非常重要的,在掌握了理论知识后应多多上机实践。只 有多多实践,才能更好地学习好一门语言,更好地理解课程的内容。 八、参考文献 【1】 清华大学计算机系列教材数据结构(C 语言版)/严蔚敏,吴伟民编著 北京:清华大学出版社,2007.4 【2】 Java JDK 5.0 学习笔记/良葛格编著北京:清华大学出版社, 2006.8 九、附录 package stack; public class CharStack CharNode top; int sum; public CharStack() top=new CharNode(); top.c=#; sum=0; public char pop() /不作有没有元素的判断,统一在出栈前进行判断,若没有元素, 则不调用此函数 char c=top.node.c; top.node=top.node.node; 数据结构课程设计报告 计算机 0801 - 10 - sum-; return c; public void push(char c) CharNode newNode=new CharNode(); newNode.c=c; newNode.node=top.node; top.node=newNode; sum+; class CharNode CharNode node; char c; public CharNode() node=null; c= ; package stack; public class CharStack CharNode top; int sum; public CharStack() top=new CharNode(); top.c=#; sum=0; public char pop() /不作有没有元素的判断,统一在出栈前进行判断,若没有元素, 则不调用此函数 char c=top.node.c; top.node=top.node.node; sum-; return c; public void push(char c) CharNode newNode=new CharNode(); 数据结构课程设计报告 计算机 0801 - 11 - newNode.c=c; newNode.node=top.node; top.node=newNode; sum+; class CharNode CharNode node; char c; public CharNode() node=null; c= ; package stack; import java.awt.GridBagConstraints; import java.awt.Insets; /* * GBC GridBagLayout * * author ibm * */ public class GBC extends GridBagConstraints /* * () * param x * param y */ public GBC(int x, int y) this.gridx = x; this.gridy = y; 数据结构课程设计报告 计算机 0801 - 12 - public GBC(int gridx, int gridy, int gridwidth, int gridheight) this.gridx = gridx; this.gridy = gridy; this.gridwidth = gridwidth; this.gridheight = gridheight; public GBC setAnchor(int anchor) this.anchor = anchor; return this; /* * 仯 * param fill * return */ public GBC setFill(int fill) this.fill = fill; return this; /* * * param weightx * param weighy * return */ public GBC setWeight(double weightx, double weighty) this.weightx = weightx; this.weighty = weighty; return this; /* * * param distance * return */ public GBC setInset(int distance) 数据结构课程设计报告 计算机 0801 - 13 - this.insets = new Insets(distance, distance, distance, distance); return this; /* * * param distance * return */ public GBC setInset(int top, int left, int bottom, int right) this.insets = new Insets(top, left, bottom, right); return this; public GBC setIpad(int ipadx, int ipady) this.ipadx = ipadx; this.ipady = ipady; return this; public class GetPriority public int inSideStack(char c) int i=0; switch(c) case =: i=1;break; case ): i=1;break; case +: i=3;break; case -: i=3;break; case *: i=5;break; case /: i=5;break; case %: i=7;break; case : i=9;break; case (: i=1;break; return i; public int outSideStack(char c) int i=0; switch(c) case =: i=0;break; case ): i=0;break; case +: i=2;break; 数据结构课程设计报告 计算机 0801 - 14 - case -: i=2;break; case *: i=4;break; case /: i=4;break; case %: i=6;break; case : i=8;break; case (: i=10;break; default : i=-1; /当遇到不可识别的运算符识,设其优先级为-1,以便在主程 序中能及时检查出错误 return i; package stack; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class MainClass extends JFrame private static final long serialVersionUID = 8669406311759888678L; MainClass mainClass; JTabbedPane tab; JTextField input, output; JButton btnWork; private JTextArea txtaDisplay; private JTextArea txtaInput; private JLabel lblDisplay; private JLabel lblInput; private JButton btnProcess; private JPanel pnlNorth; private JPanel pnlSouth; private JPanel pnl; private JScrollPane scrDisplayPnl; private JScrollPane scrInputPnl; public static void main(String args) new MainClass().init(); public void init() try UIManager.setLookAndFeel(com.nilo.plaf.nimrod.NimRODLookAndFeel); 数据结构课程设计报告 计算机 0801 - 15 - catch (Exception e) try UIManager.setLookAndFeel(UIManager .getSystemLookAndFeelClassName(); catch (Exception e1) mainClass = new MainClass(); this.setTitle(数据结构); this.setSize(500, 400); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.add(this.getJTabbedPane(), BorderLayout.CENTER); this.setVisible(true); public JTabbedPane getJTabbedPane() tab = new JTabbedPane(); tab.addTab(线性表, getFirstPanel(); tab.addTab(Huffman, new JPanel(); return tab; public JPanel getFirstPanel() JPanel panel = new JPanel(); panel.setLayout(new BorderLayout(); txtaDisplay = new JTextArea(8, 10); txtaDisplay.setEditable(false); txtaInput = new JTextArea(8, 15); scrDisplayPnl = new JScrollPane(txtaDisplay); scrInputPnl = new JScrollPane(txtaInput); lblDisplay = new JLabel(分析结果); lblInput = new JLabel(输入表达式:); btnProcess = new JButton(分析); pnlNorth = new JPanel(); pnlSouth = new JPanel(); pnl = new JPanel(); pnlNorth.setLayout(new BorderLayout(); pnlSouth.setLayout(new BorderLayout(); / 组件控制 pnlNorth.add(lblDisplay, BorderLayout.NORTH); pnlNorth.add(scrDisplayPnl, BorderLayout.CENTER); pnlSouth.add(lblInput, BorderLayout.NORTH); pnlSouth.add(scrInputPnl, BorderLayout.CENTER); pnl.add(btnProcess); panel.add(pnlNorth, BorderLayout.NORTH); 数据结构课程设计报告 计算机 0801 - 16 - panel.add(pnlSouth, BorderLayout.CENTER); panel.add(pnl, BorderLayout.SOUTH); btnProcess.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) String source = txtaInput.getText().trim(); txtaInput.setText(); txtaDisplay.setText(calculate(source); ); return panel; public String calculate(String inputStr) String result; CharStack charStack = new CharStack(); NumStack numStack = new NumStack(); GetPriority priority = new GetPriority(); / GetPriority priority=new GetPriority(); OperationClass operationFunction = new OperationClass(); String str = inputStr + =; / 输入一个正确的表达式 char charArray = str.toCharArray(); float a = 0f; boolean f = false; boolean d = false; boolean judgechar = true; boolean rku = false; int lku = 0; int l = 0; char chInStack; / 这个字符变量在下面代码中充当存储从运算符栈中出栈的运算 符 for (int i = 0; i i + 1) judgechar = false; break; if (mainClass.judge(charArrayi) if (d = true) float k = (float) (charArrayi - 0); for (int j = 0; j = 0 if (t) return true; else return false; package stack; public class NumStack IntNode top; public NumStack() top=new IntNode(); public float pop() /出栈 /对于头结点,存整数类型的a属性存的是栈内的元素个数 /对于出栈操作,由于本函数返回值为整数,故不进行判断是否栈内还有元素, /而是在调用此函数前,通过top.a的值进行判断 数据结构课程设计报告 计算机 0801 - 20 - float t=top.node.a; top.node=top.node.node; top.a-; return t; public void push(float a) /进栈 IntNode newnode=new IntNode(); newnode.a=a; newnode.node=top.node; top.node=newnode; top.a+; class IntNode IntNode node; float a; public IntNode() node=null; a=0f; package stack; public class OperationClass /从numStack 栈中依次取出两个数字进行相应运算符的操作,结果再压入numStack栈 中 public boolean operation(char chInStack,NumStack numStack,CharStack charStack) float a; float b; switch(chInStack) case +: if(numStack.top.a=2)a=numStack.pop();b=numStack.pop();numStack.push(a+b);return true;elsereturn false; case -: if(numStack.top.a=2)a=numStack.pop();b=numStack.pop();numStack.push(b-a);return true;elsereturn false; case *: if(numStack.top.a=2)a=numStack.pop();b=numStack.pop();numStack.push(a*b);return true;elsereturn false; 数据结构课程设计报告 计算机 0801 - 21 - case /: if(numStack.top.a=2)a=numStack.pop();b=numStack.pop();numStack.push(b/a);return true;elsereturn false; case %: if(numStack.top.a=2)a=numStack.pop();b=numStack.pop();numStack.push(b%a);return true;elsereturn false; case : if(numStack.top.a=2)a=numStack.pop();b=numStack.pop();float t=b;for(int i=1;ia;i+)b*=t;numStack.push(b);return true;elsereturn false; case (: return true; default : return true; 数据结构课程设计报告 计算机 0801 - 22 - 题目三:排课问题 一、实验名称: 排课问题 二、需求分析: 设计任务: 在文件 conf.txt 中保存若干门课程,以及该课程需要哪些前续课程。要求 一门课程需要一个学期才能学完。保存格式为例如: 大学物理 C 语言 Java 语言:C 语言 微积分 高级物理学:微积分,大学物理 界面上,首先出现一个按钮,点击,载入 conf.txt。点击另一个按钮,显 示需要几个学期上完这些课程,每学期各学习哪些课程。 (1)输入的形式和输入值的范围:读入文件。 (2)输出的形式:文本输出。 (3)程序所能达到的功能:从文件中读出数据,采用拓扑排序,显示出各学期需 要学习哪些课程。 (4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。 三、概要设计 1ADT Stack 数据对象:D=a i|aiElemSet,i=1,2,n, n0 数据结构课程设计报告 计算机 0801 - 23 - 数据关系:R1=|ai-1,aiD,i=1,2,n 基本操作: InitStack( /对各顶点求入度 indegree0.vernum-1 数据结构课程设计报告 计算机 0801 - 26 - InitStack(S); for(i=0;inextarc) k=p-adjvex; if(!(-indegreek) Push(S,k); /若入度减为 0,则入栈 /for /while if(countbase=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType); if(!S-base) printf(memory allocation failed, goodbye); exit(1); S-top=S-base; S-stacksize=STACK_INIT_SIZE; 出栈操作函数 原型:int Pop(SqStack *S,ElemType *e) 功能:删除 S 的栈顶元素,并用 e 返回; 参数:SqStack *S,ElemType *e 返回值:int 源代码: int Pop(SqStack *S,ElemType *e) if(S-top=S-base) return ERROR; *e=*-S-top; 数据结构课程设计报告 计算机 0801 - 28 - return 0; 进栈操作函数 原型 void Push(SqStack *S,ElemType e) 功能:插入元素 e 为新的栈顶元素 参数:SqStack *S ,ElemType e 返回值:void 源代码: void Push(SqStack *S,ElemType e)/ if(S-top-S-base=S-stacksize) S-base=(ElemType*)realloc(S-base,(S- stacksize+STACKINCREMENT)* sizeof(ElemType); if(!S-base) printf(memory allocation failed, goodbye); exit(1); S-top = S-base+S-stacksize; *S-top+=e; 判断栈是否为空的函数 原型 int StackEmpty(SqStack *S) 功能:判断栈是否为空 参数:SqStack *S 返回值:int 数据结构课程设计报告 计算机 0801 - 29 - 源代码: int StackEmpty(SqStack *S) if(S-top=S-base) return OK; else return ERROR; 创建图的函数 原型 void CreatGraph(ALGraph *G) 功能:创建一有向图 参数:ALGraph *G 返回值:void 源代码: void CreatGraph(ALGraph *G) int m, n, i; ArcNode *p; printf(请输入顶点数和边数:); scanf(%d%d, for (i = 1; i vexnum; i+) G-verticesi.data = i; G-verticesi.firstarc = NULL; for (i = 1; i arcnum; i+) /输入存在边的点集合 printf(n 请输入存在边的两个顶点的序号:); scanf(%d%d, while (n G-vexnum | m G-vexnum) 数据结构课程设计报告 计算机 0801 - 30 - printf(输入的顶点序号不正确 请重新输入:); scanf(%d%d, p = (ArcNode*)malloc(sizeof(ArcNode); if (p = NULL) printf(memory allocation failed,goodbey); exit(1); p-adjvex = m; p-nextarc = G-verticesn.firstarc; G-verticesn.firstarc = p; printf(建立的邻接表为:n); /输出建立好的邻接表 for(i = 1; i vexnum; i+) printf(%d,G-verticesi.data); for(p = G-verticesi.firstarc; p; p = p-nextarc) printf(%3d,p-adjvex); printf(n); 求入度操作函数 原型 void FindInDegree(ALGraph G, int indegree) 功能:求图中顶点的入度 参数:ALGraph G, int indegree 返回值:void 源代码: void FindInDegree(ALGraph G, int indegree) 数据结构课程设计报告 计算机 0801 - 31 - int i; for (i = 1; i = G.vexnum; i+) indegreei = 0; for (i = 1; i adjvex+; G.verticesi.firstarc = G.verticesi.firstarc-nextarc; 拓扑排序函数 原型 void TopologicalSort(ALGraph G) 功能:将一个偏序排列成一个全序 参数:ALGraph G 返回值:void 源代码: void TopologicalSort(ALGraph G) /进行拓扑排序 int indegreeM;/存放顶点的入度 int i, k, n; int count = 0; ArcNode *p; SqStack S; FindInDegree(G, indegree); InitStack( 数据结构课程设计报告 计算机 0801 - 32 - for (i = 1; i = G.vexnum; i+) printf(第%d 个点的入度为%d n, i, indegreei); printf(n); for ( i = 1; i nextarc) k = p-adjvex; if (!(-indegreek) Push( printf(n); if (count G.vexnum)/该有向图有回路 printf(出现错误n); 数据结构课程设计报告 计算机 0801 - 33 - else printf(排序成功n); 2存储结构: (1),表结点 typedef struct ArcNode int adjvex; struct ArcNode *nextarc; ArcNode; (2),链表的存储结构 typedef struct VNode int data; ArcNode *firstarc; VNode,AdjListMAX_VEXTEX_NUM; (3),图的存储结构 typedef struct AdjList vertices; int vexnum, arcnum; ALGraph; (4),栈的存储结构 typedef struct ElemType *base; ElemType *top; 数据结构课程设计报告 计算机 0801 - 34 - int stacksize; SqStack; 五、调试分析 算法的时间复杂性和可能的改进设想 该拓扑排序算法,对有 n 个顶点和 e 条弧的有向图而言,建立求各顶点的 入度的时间复杂度为 O(e);建立入度顶点栈的时间复杂度为 O(n);在拓扑排序 过程中,若有向图无环,则每个顶点进一次栈,出一次栈,入度减 1 的操作在 while 语句中总共执行 e 词,所以,总的时间复杂度为 O(n+e)。 六、测试结果 界面效果图 数据结构课程设计报告 计算机 0801 - 35 - 打开文件效果图 运行结果 七、课程设计总结 在近两周的课程设计中,我认为最大的收获就是在遇到问题时解决问题的 数据结构课程设计报告 计算机 0801 - 36 - 过程。如对语言并不完全了解,如有些函数的操作需要通过查阅相关书籍和帮 助来了解,同时也向其他同学询问,才得以最终完成项目。这次课程设计,培 养了我自己的实际分析能力、编程和动手能力,最终目标是想通过这种形式, 帮助自己更加系统的掌握数据结构的主要内容;培养了自己对 JAVA 语言程序设 计的兴趣,更加有信心学好这门课程;设计了一个拓扑排序程序,解决实际问 题,将所学内容运用到实际当中。 通过这次课程设计,我学到了很多,同时也认识到了自己的不足。学校的 课程不能将所有的知识都讲授给我们,所以要想学好一门课程,我们应该充分 利用课余时间多看专业相关的书籍,丰富自己的知识。同时,作为计算机专业 的学生,动手能力也是非常重要的,在掌握了理论知识后应多多上机实践。只 有多多实践,才能更好地学习好一门语言,更好地理解课程的内容。 八、参考文献 【1】 清华大学计算机系列教材数据结构(C 语言版)/严蔚敏,吴伟民编 著北京:清华大学出版社,2007.4 【2】 Java JDK 5.0 学习笔记/良葛格编著北京:清华大学出版社,2006.8 九、附录 package sort.test; import sort.Interface; public class Outmain /* * param args */ public static void main(String args) new Interface(); 数据结构课程设计报告 计算机 0801 - 37 - package sort; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import com.birosoft.liquid.LiquidLookAndFeel; /* * 输出界面 * */ public class Interface extends JFrame JTextField text; JTable table; JFileChooser fileChooser; static try / UIManager.setLookAndFeel(ch.randelshofer.quaqua.QuaquaLookAndFeel); UIManager.setLookAndFeel(new LiquidLookAndFeel(); catch (UnsupportedLookAndFeelException e) / TODO Auto-generated catch block e.printStackTrace(); public Interface() super(排课); init(); private void init() String title = new String学期,所修课程; 数据结构课程设计报告 计算机 0801 - 38 - String args = new String00; this.setSize(480, 320); this.setLocationRelativeTo(null); JPanel panel = new JPanel(); text = new JTextField(15); BorderLayout layout = new BorderLayout(); this.setLayout(layout); panel.add(text); JButton button = new JButton(选择课程文件); button.setActionCommand(open); fileChooser = new JFileChooser(.); panel.add(button); button.addActionListener(new Listener(this); table = new JTable(args,title); JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS , JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); this.add(panel,BorderLayout.NORTH); this.add(pane,BorderLayout.CENTER); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); package sort; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.util.ArrayList; import Exception.DateException; /* * * 实现排课类 * */ public class Arranging 数据结构课程设计报告 计算机 0801 - 39 - /* * 节点内部类,用来存储数据 * 一是存储课程名和学该课程前的前提课程 * 二是用来存储课程安排次序和该次可学的内容 */ public class Node String name; ArrayList baseList; /* * 空构造器 */ public Arranging() /* * 排课方法 * 第一次排课的课程是 Node 节点所代表课程该课程的前提课程是空,将其写入 ArrayList * 再将上次课程从剩余课程的前提课程中删除,重复以上过程知道所有课程被排完或 排了 * 8 次后仍未排完(大学教育只有四年,八个学期,若八次不能排完,说明课程安排 存在问题, * 超出本方法处理范围、不予处理) * param filepath * return * throws */ public ArrayList arrayclass(File filepath) throws DateException, FileNotFoundException,IOException ArrayList result = new ArrayList();/存储结果 ArrayList list = readFile(filepath); Integer i = 1;/记录排课次序 int t = 1;/标记 while(list.size() 0) s.name = i.toString(); s.baseList = new ArrayList(); for(Node tem:list) /提取前提课程为空的节点,写入 result 数据结构课程设计报告 计算机 0801 - 40 - if(tem.baseList.size() = 0) s.baseList.add(tem.name); /list.remove(tem); for(String tem:s.baseList) /删除前提课程为空的节点 list.remove(serchIndex(list,tem); for(Node tem:list) /删除剩余节点的前提课程已修过课程 for(String tem2:s.baseList) tem.baseList.remove(tem2); result.add(s); i +; return result;/返回 /* * 文件读取方法 * param * return */ public ArrayList readFile(File filepath) throws DateException ,FileNotFoundException,IOException ArrayList list = new ArrayList(); / File file = new File(filepath); BufferedReader read= new BufferedReader(new LineNumberReader(new FileReader(filepath); try String temp; while(temp = read.readLine() != null) if(.equals(temp.trim() continue; if(!checkchar(temp) Node s = new Node(); s.name = temp; s.baseList = new ArrayList(); list.add(s); else String arg0 = temp.split(:);/按“:”拆分 数据结构课程设计报告 计算机 0801 - 41 - if(arg0.length != 2 ) throw new DateException(); Node s = new Node(); s.name = arg00; String arg1 = arg01.split(,);/按“, ”拆分 ArrayList l = new ArrayList(); for(String tem:arg1) l.add(tem); s.baseList = l; list.add(s); catch (FileNotFoundException e) throw new FileNotFoundException(); catch (IOException e) throw new IOException(); finally read.close();/关闭 return list; /* * 判断是否有“:”号 * param str * return */ private boolean checkchar(String str) for(int i = 0;i str.length();i+) if(str.charAt(i) = :) return true; return false; /* * 查找 Node 节点内 name 为 Str 的节点 * param list * param str * return */ private Node serchIndex(ArrayList list,String str) for(Node temp: list) if(temp.name.equals(str) return temp; 数据结构课程设计报告 计算机 0801 - 42 - return null; package sort; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import javax.swing.table.DefaultTableModel; import sort.Arranging.Node; import Exception.DateException; /* * * 监听器类 * * */ public class Listener implements ActionListener Interface face; /* * 构造器类 * * param face */ public Listener(Interface face) this.face = face; /* * 监听器 * 数据结构课程设计报告 计算机 0801 - 43 - * param e */ public void actionPerformed(ActionEvent e) / if (输入.equals(e.getActionCommand() / / String road = face.text.getText(); / if (.equals(road) / / 当内容为空时,抛出错误信息 / new JOpt
展开阅读全文