一、问题描述
(一)、建立三个文本文件(Student.txt,Course.txt和SC.txt)
1.学生表(文件Student.txt)(学号(唯一Sno),姓名(Sname),性别(Ssex),年龄(Sage),专业(Sdept))
2.课程表(文件Course.txt)(课程号(唯一Cno),课程名(Cname),学分(Ccredit))
3.学生成绩表(文件SC.txt)(学号(Sno) 课程号(Cno) 成绩(Grade))
4.表间关系如图所示:
(二)、对三个文件的操作
1、为存储学生、课程和选课信息设计数据结构,将以上文件内容导入其中;
2、对学生表进行插入、删除、修改和查询操作;
3、对选修表进行插入、删除、修改操作;
4、综合查询(查询一门课程选课学生的信息和查询某位同学所有课程的成绩信息);
5、将系统中的数据保存回文件中;
二、解题思路
1、建立三张表的数据存储结构(Java的对象数组),完成Student,Course和SC三个类,并且设计各属性为private类型,获取其属性值的函数Get~~(),还有待参数的构造函数,便于直接赋值。
2、实现对学生表数据的增删改查,通过读写文件操作做到同步更新txt文件,抽取部分代码达到最简洁。
1>、通过文件的读取和插入同步对数据进行存储,每次运行时对数据进行读取到jTable中,同时对对象数组初始化。插入后又执行一次读取,所以又存储一次。继而完成对数据表的增加
2>、修改时先点击表格中的数据,使数据先显示到文本框中,接着修改变为保存,清空文本框。接着执行读取函数,重新存储。
3>、删除时先选定要删除的数据,和修改一样。接着执行一次读取。完成删除
4>、查找函数,通过学号查找学生信息。点击一下查找按钮,弹出一个文本框,输入学号,通过学号查询,若查询到,即把学生信息显示到文本框中;若查询不到,则提示没有该学生信息;当然也得对输入学号进行验证。
3、实现对课程表的增删改查功能,和学生表类似。
4、关键的成绩表,它关联着学生表和课程表。从它上面可以看出学生选的课程以及某门课程被那些人选了。故通过成绩表来进行综合查询。
1>、首先是把SC.txt文件中的数据读取到jTable中,同时对SC数据进行存储到SC对象数组中去。
2>、对成绩表进行添加,添加现有学生的学号和现有课程的课程号及成绩。但是学号+课程号一起不能重复,就是一个人的某一门课程只能有一个成绩。添加仿照课程表的添加。
3>、对成绩表进行修改,修改只能修改成绩。
4>、对成绩表进行删除,直接删除就行。
5、建立综合查询:
1>、建立查询个人的成绩单,从成绩表中查找一个学号对应的多个课程号,再通过课程号从课程表中获得对应的课程名,从成绩表中取得成绩。
2>、建立查询某门课程的逊克学生情况,输入课程名,从课程表中取得对应的课程号,再通过成绩表得到该课程号对应的所有学号,通过学号从学生表中取得所有选该科目的学生信息。
6、完成学生表的添加时对学号的正确性和唯一性验证;完成对学生表中学生年龄的正确性验证;完成学生表中数据删除时同时删除成绩表中该学生学号对应的所有课程成绩。
7、完成选课表的添加时对学分的正确性验证,对课程号和课程名的唯一性验证;完成对课程名和学分的修改时继续验证;完成课程表删除时同时删除成绩表中的该课程号对应的所有成绩。
8、完成成绩表的添加时对学号的课程号的检索,检索是否存在该学号和课程号;同时对成绩分数进行限制(0~100),且仅允许有一位小数。当然修改时也得对成绩进行验证。
三、 主要源程序及其分析
(一)、定义存储结构
public class Student {
/**
* 学生信息类
* 功能:存储学生信息(学号,姓名,性别,年龄,专业)
* 创建时间:2014-02-19 9:31
* 创建人:张龙
*/
private String Sno;
private String Sname;
private String Ssex;
private int Sage;
private String Sdept;
Student(){}
Student(String Sno,String Sname,String Ssex,int Sage,String Sdept){
this.Sno=Sno;
this.Sname=Sname;
this.Ssex=Ssex;
this.Sage=Sage;
this.Sdept=Sdept;
}
public String GetSno(){return Sno;}
public String GetSname(){return Sname;}
public String GetSsex(){return Ssex;}
public int GetSage(){return Sage;}
public String GetSdept(){return Sdept;}
public static void main(String[] args) {
}
}
/**
* 课程信息类
*/
class Course{
private String Cno;
private String Cname;
private double Ccredit;
Course(){}
Course(String Cno,String Cname,double Ccredit){
this.Cno=Cno;
this.Cname=Cname;
this.Ccredit=Ccredit;
}
public String GetCno(){return Cno;}
public String GetCname(){return Cname;}
public double GetCcredit(){return Ccredit;}
}
/**
* 学生课程成绩类
*/
class SC{
private String Sno;
private String Cno;
private double Grade;
SC(){}
SC(String Sno,String Cno,double Grade){
this.Sno=Sno;
this.Cno=Cno;
this.Grade=Grade;
}
public String GetSno(){return Sno;}
public String GetCno(){return Cno;}
public double GetGrade(){return Grade;}
}
(二)、对文件的操作代码
/**
* 创建文件
* @param fileName
* @return
*/
public static boolean createFile(File fileName) throws Exception {
boolean flag = false;
try {
if (!fileName.exists()) {
fileName.createNewFile();
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 函数功能:读取txt文件到jTable1中
* 创建人:张龙
* 创建时间:2014-02-18 14:29
*
*/
public static void readTxtFile(String filePath) {
try {
String encoding = "GBK";
File file = new File(filePath);
if (file.isFile() && file.exists()) {// 判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
int i = 0;
String lineTxt = null;
Vector data = new Vector();
String[] temp;
while ((lineTxt = bufferedReader.readLine()) != null) {
temp = lineTxt.split(" ");
student[i] = new Student(temp[0], temp[1], temp[2],
Integer.parseInt(temp[3]), temp[4]);
i += 1;
Vector row = new Vector();
for (int m = 0; m < temp.length; m++) {
row.add(temp[m]);
}
data.add(row);
}
for (int k = i; k < SIZE; k++) {
student[k] = null;
}
Vector title = new Vector();
title.add("学号");
title.add("姓名");
title.add("性别");
title.add("年龄");
title.add("专业");
DefaultTableModel dtm = new DefaultTableModel(data, title);
jTable1.setModel(dtm);
read.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
/**
* 函数功能:公共可用的插入新数据到指定txt文件中
* 创建人:张龙
* 创建时间:2014-02-18 21:29
*
*/
public static void contentToTxt(String filePath, String content) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
s1 += str + "\n";
}
input.close();
s1 += content;
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
System.out.println("写入文件成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 修改学生表信息函数
* 创建时间:2014-02-20 13:17
* @param filePath
* @param Sno
*/
public static void UpdateTxt(String filePath, Student st) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
String temp[] = str.split(" ");
if (temp[0].equals(st.GetSno())) {
str = st.GetSno() + " " + st.GetSname() + " "
+ st.GetSsex() + " " + st.GetSage() + " "
+ st.GetSdept();
}
s1 += str + "\n";
}
// System.out.println(s1);
input.close();
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除txt 数据文件中的某一行内容(按学号或课程号删除)
*创建时间 2014-02-19
*创建人:张龙
* @param filePath
* @param num
*/
public static void DeleteTxt(String filePath, String num) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
String temp[] = str.split(" ");
if (!temp[0].equals(num)) {
s1 += str + "\n";
}
}
// System.out.println(s1);
input.close();
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
System.out.println("删除文件成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
(四)、对学生表的增删改查操作
/**
* 以下是对学生表的操作
*/
//定义全局变量
final static int SIZE = 100;
final static int MAX = 10;
static Student student[] = new Student[SIZE];
static Helper hp = new Helper();
//学生表把表格的选中行填到文本框中
private void jTableSelected() {
// TODO add your handling code here:
int rowIndex = jTable1.getSelectedRow();
jTextField1.setText(jTable1.getValueAt(rowIndex, 0).toString());
jTextField2.setText(jTable1.getValueAt(rowIndex, 1).toString());
if (jTable1.getValueAt(rowIndex, 2).toString().equals("男")) {
jRadioButton1.setSelected(true);
} else {
jRadioButton2.setSelected(true);
}
jTextField4.setText(jTable1.getValueAt(rowIndex, 3).toString());
jTextField5.setText(jTable1.getValueAt(rowIndex, 4).toString());
jTextField1.setEditable(false);
}
//学生表插入按钮的代码段
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String sno, sname, ssex, sage, sdept;
sno = jTextField1.getText();
sname = jTextField2.getText();
if (jRadioButton1.isSelected()) {
ssex = jRadioButton1.getText();
} else {
ssex = jRadioButton2.getText();
}
sage = jTextField4.getText();
sdept = jTextField5.getText();
boolean b1 = hp.checkSno(sno);
boolean b2 = hp.onlySno(student, sno);
boolean b3 = hp.checkSage(sage);
if (b1 && b2 && b3) {
String filePath = "D:\\数据结构课程设计\\Student.txt";
contentToTxt(filePath, sno + " " + sname + " " + ssex + " " + sage
+ " " + sdept + "\n");
readTxtFile(filePath);
jTextField1.setText("");
jTextField2.setText("");
jRadioButton1.setSelected(true);
jTextField4.setText("");
jTextField5.setText("");
}
if (!b1) {
JOptionPane.showMessageDialog(this, "学号输入错误,请重新输入");
jTextField1.setText("");
}
if (!b2) {
JOptionPane.showMessageDialog(this, "该学号已存在,请修改学号");
jTextField1.setText("");
}
if (!b3) {
JOptionPane.showMessageDialog(this, "该学生年龄输入有误,请重新输入");
jTextField4.setText("");
}
}
//学生表查找按钮的事件
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int k = 0;
String inputValue = JOptionPane.showInputDialog("请输入学号,确认按学号查询!");
if (inputValue != null) {
for (; student[k] != null; k++) {
if (student[k].GetSno().equals(inputValue)) {
jTextField1.setText(student[k].GetSno());
jTextField2.setText(student[k].GetSname());
if (student[k].GetSsex().equals("男")) {
jRadioButton1.setSelected(true);
} else {
jRadioButton2.setSelected(true);
}
//注意,得把int值转化为String
jTextField4.setText(Integer.toString(student[k].GetSage()));
jTextField5.setText(student[k].GetSdept());
break;
}
}
if (student[k] == null) {
JOptionPane.showMessageDialog(this, "不存在该学生,请检查学号是否有误。");
}
}
}
//学生表修改按钮的事件
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if (jButton2.getText().equals("修改")) {
jTableSelected();
jButton2.setText("保存");
} else {
//返回int值0&1,0表示确定,1表示否
int response = JOptionPane.showConfirmDialog(null, "是否进行修改?", "标题",
JOptionPane.YES_NO_OPTION);
//如果确定的话,执行对新数据的保存
if (response == 0) {
String sno, sname, ssex, sage, sdept;
sno = jTextField1.getText();
sname = jTextField2.getText();
if (jRadioButton1.isSelected()) {
ssex = jRadioButton1.getText();
} else {
ssex = jRadioButton2.getText();
}
sage = jTextField4.getText();
sdept = jTextField5.getText();
Student st = new Student(sno, sname, ssex,
Integer.parseInt(sage), sdept);
String filePath = "D:\\数据结构课程设计\\Student.txt";
UpdateTxt(filePath, st);
readTxtFile(filePath);
JOptionPane.showMessageDialog(this, "保存成功!");
}
jTextField1.setText("");
jTextField2.setText("");
jRadioButton1.setSelected(true);
jTextField4.setText("");
jTextField5.setText("");
jTextField1.setEditable(true);
jButton2.setText("修改");
}
}
//学生表删除按钮的事件
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
jTableSelected();
String filePath = "D:\\数据结构课程设计\\Student.txt";
String SCFilePath = "D:\\数据结构课程设计\\SC.txt";
//返回int值0&1,0表示确定,1表示否
int response = JOptionPane.showConfirmDialog(null, "是否真的删除?", "标题",
JOptionPane.YES_NO_OPTION);
if (response == 0) {
DeleteTxt(filePath, jTextField1.getText());
readTxtFile(filePath);
DeleteSCTxtByNo(SCFilePath, jTextField1.getText(), 0);
readSCTxtFile(SCFilePath);
jTextField1.setText("");
jTextField2.setText("");
jRadioButton1.setSelected(true);
jTextField4.setText("");
jTextField5.setText("");
jTextField1.setEditable(true);
JOptionPane.showMessageDialog(this, "删除成功!");
} else {
jTextField1.setText("");
jTextField2.setText("");
jRadioButton1.setSelected(true);
jTextField4.setText("");
jTextField5.setText("");
jTextField1.setEditable(true);
}
}
(五)、对成绩表的操作代码
/**
* 对课程表的操作
* 创建时间:2014-02-22 12:04
*/
static Course course[] = new Course[SIZE];
//课程表把表格的选中行填到文本框中
private void CourseTableSelected() {
// TODO add your handling code here:
int rowIndex = jTable2.getSelectedRow();
jTextField3.setText(jTable2.getValueAt(rowIndex, 0).toString());
jTextField6.setText(jTable2.getValueAt(rowIndex, 1).toString());
jTextField7.setText(jTable2.getValueAt(rowIndex, 2).toString());
jTextField3.setEditable(false);
jTextField6.setEditable(false);
}
/*
* 函数功能:读取txt文件到jTable2中
* 创建人:张龙
* 创建时间:2014-02-22 12:13
*
*/
public static void readCourseTxtFile(String filePath) {
try {
String encoding = "GBK";
File file = new File(filePath);
if (file.isFile() && file.exists()) {// 判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
Vector data = new Vector();
int j = 0;
String[] temp;
while ((lineTxt = bufferedReader.readLine()) != null) {
temp = lineTxt.split(" ");
course[j] = new Course(temp[0], temp[1],
Double.parseDouble(temp[2]));
j += 1;
Vector row = new Vector();
for (int i = 0; i < temp.length; i++) {
row.add(temp[i]);
}
data.add(row);
}
for (int k = j; k < SIZE; k++) {
course[k] = null;
}
//String[] title=new String[]{"学号","姓名","性别","年龄","专业"};
Vector title = new Vector();
title.add("课程号");
title.add("课程名");
title.add("学分");
DefaultTableModel dtm = new DefaultTableModel(data, title);
jTable2.setModel(dtm);
read.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
/**
* 修改课程表信息函数
* 创建时间:2014-02-20 13:17
* @param filePath
* @param Sno
*/
public static void UpdateCourseTxt(String filePath, Course st) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
String temp[] = str.split(" ");
if (temp[0].equals(st.GetCno())) {
str = st.GetCno() + " " + st.GetCname() + " "
+ st.GetCcredit();
}
s1 += str + "\n";
}
// System.out.println(s1);
input.close();
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//课程表添加按钮
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String Cno, Cname, Ccredit;
Cno = jTextField3.getText();
Cname = jTextField6.getText();
Ccredit = jTextField7.getText();
boolean b1 = hp.onlyCno(course, Cno);
boolean b2 = hp.onlyCname(course, Cname);
boolean b3 = hp.checkCcredit(Ccredit);
if (b1 && b2 && b3) {
String filePath = "D:\\数据结构课程设计\\Course.txt";
contentToTxt(filePath, Cno + " " + Cname + " " + Ccredit + "\n");
readCourseTxtFile(filePath);
jTextField3.setText("");
jTextField6.setText("");
jTextField7.setText("");
}
if (!b1) {
JOptionPane.showMessageDialog(this, "已经存在该课程号");
jTextField3.setText("");
}
if (!b2) {
JOptionPane.showMessageDialog(this, "已经存在该课程名");
jTextField6.setText("");
}
if (!b3) {
JOptionPane.showMessageDialog(this, "学分不符合规定,请重新输入");
jTextField7.setText("");
}
}
//课程表查找按钮
private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int k = 0;
String inputValue = JOptionPane.showInputDialog("请输入要查询课程的课程名");
if (inputValue != null) {
for (; course[k] != null; k++) {
if (course[k].GetCname().equals(inputValue)) {
jTextField3.setText(course[k].GetCno());
jTextField6.setText(course[k].GetCname());
//注意,得把double值转化为String
jTextField7
.setText(Double.toString(course[k].GetCcredit()));
break;
}
}
if (course[k] == null) {
JOptionPane.showMessageDialog(this, "不存在该课程,请检查输入的课程名是否有误。");
}
}
}
//课程表删除按钮
private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
CourseTableSelected();
String filePath = "D:\\数据结构课程设计\\Course.txt";
String SCFilePath = "D:\\数据结构课程设计\\SC.txt";
//返回int值0&1,0表示确定,1表示否
int response = JOptionPane.showConfirmDialog(null, "是否真的删除?", "标题",
JOptionPane.YES_NO_OPTION);
if (response == 0) {
DeleteTxt(filePath, jTextField3.getText());
readCourseTxtFile(filePath);
DeleteSCTxtByNo(SCFilePath, jTextField3.getText(), 1);
readSCTxtFile(SCFilePath);
jTextField3.setText("");
jTextField6.setText("");
jTextField7.setText("");
jTextField3.setEditable(true);
jTextField6.setEditable(true);
JOptionPane.showMessageDialog(this, "删除成功!");
} else {
jTextField3.setText("");
jTextField6.setText("");
jTextField7.setText("");
jTextField3.setEditable(true);
}
}
//课程表修改按钮
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if (jButton6.getText().equals("修改")) {
CourseTableSelected();
jButton6.setText("保存");
} else {
//返回int值0&1,0表示确定,1表示否
int response = JOptionPane.showConfirmDialog(null, "是否进行修改?", "标题",
JOptionPane.YES_NO_OPTION);
//如果确定的话,执行对新数据的保存
if (response == 0) {
String Cno, Cname, Ccredit;
Cno = jTextField3.getText();
Cname = jTextField6.getText();
Ccredit = jTextField7.getText();
boolean b = hp.checkCcredit(Ccredit);
if (b) {
Course cs = new Course(Cno, Cname,
Double.parseDouble(Ccredit));
String filePath = "D:\\数据结构课程设计\\Course.txt";
UpdateCourseTxt(filePath, cs);
readCourseTxtFile(filePath);
JOptionPane.showMessageDialog(this, "保存成功!");
}
if (!b) {
JOptionPane.showMessageDialog(this, "学分输入有误,请重新输入");
jTextField7.setText("");
}
}
jTextField3.setText("");
jTextField6.setText("");
jTextField7.setText("");
jTextField3.setEditable(true);
jTextField6.setEditable(true);
jButton6.setText("修改");
}
}
(六)、对成绩表的操作
/**
* 对成绩表的操作
* @param args
*/
static SC sc[] = new SC[SIZE];
//成绩表把表格的选中行填到文本框中
private void SCTableSelected() {
// TODO add your handling code here:
int rowIndex = jTable3.getSelectedRow();
jTextField8.setText(jTable3.getValueAt(rowIndex, 0).toString());
jTextField9.setText(jTable3.getValueAt(rowIndex, 1).toString());
jTextField10.setText(jTable3.getValueAt(rowIndex, 2).toString());
jTextField8.setEditable(false);
jTextField9.setEditable(false);
}
/**
* 修改成绩表信息函数
* 创建时间:2014-02-22 21:33
* @param filePath
* @param st
*/
public static void UpdateSCTxt(String filePath, SC st) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
String temp[] = str.split(" ");
if (temp[0].equals(st.GetSno()) && temp[1].equals(st.GetCno())) {
str = st.GetSno() + " " + st.GetCno() + " " + st.GetGrade();
}
s1 += str + "\n";
}
input.close();
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 函数功能:读取txt文件到jTable3中
* 创建人:张龙
* 创建时间:2014-02-22 12:13
*
*/
public static void readSCTxtFile(String filePath) {
try {
String encoding = "GBK";
File file = new File(filePath);
if (file.isFile() && file.exists()) {// 判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
int k = 0;
String lineTxt = null;
Vector data = new Vector();
String[] temp;
while ((lineTxt = bufferedReader.readLine()) != null) {
temp = lineTxt.split(" ");
sc[k] = new SC(temp[0], temp[1],
Double.parseDouble(temp[2]));
k += 1;
Vector row = new Vector();
for (int i = 0; i < temp.length; i++) {
row.add(temp[i]);
}
data.add(row);
}
for(int m=k;k<SIZE;k++)
{
sc[k]=null;
}
//String[] title=new String[]{"学号","姓名","性别","年龄","专业"};
Vector title = new Vector();
title.add("学号");
title.add("课程号");
title.add("成绩");
DefaultTableModel dtm = new DefaultTableModel(data, title);
jTable3.setModel(dtm);
read.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
/**
* 成绩表的删除函数
* 创建时间:2014-02-22 21:55
* @param filePath
* @param num
*/
public static void DeleteSCTxt(String filePath, String Sno, String Cno) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
String temp[] = str.split(" ");
if (temp[0].equals(Sno)&& temp[1].equals(Cno)) {
} else {
s1 += str + "\n";
}
}
// System.out.println(s1);
input.close();
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据学号或课程号完成成绩表的删除函数
* 创建时间:2014-02-23 22:21
* @param filePath
* @param Sno
*/
public static void DeleteSCTxtByNo(String filePath, String no, int k) {
String str = new String(); //原有txt内容
String s1 = new String();//内容更新
try {
File f = new File(filePath);
if (!f.exists()) {
System.out.print("文件不存在");
f.createNewFile();// 不存在则创建
}
BufferedReader input = new BufferedReader(new FileReader(f));
while ((str = input.readLine()) != null) {
String temp[] = str.split(" ");
if (!temp[k].equals(no)) {
s1 += str + "\n";
}
}
// System.out.println(s1);
input.close();
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(s1);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//删除成绩按钮
//成绩表的删除按钮
private void jButton11ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
SCTableSelected();
String filePath = "D:\\数据结构课程设计\\SC.txt";
//返回int值0&1,0表示确定,1表示否
int response = JOptionPane.showConfirmDialog(null, "是否真的删除?", "标题",
JOptionPane.YES_NO_OPTION);
if (response == 0) {
DeleteSCTxt(filePath, jTextField8.getText(), jTextField9.getText());
readSCTxtFile(filePath);
jTextField8.setText("");
jTextField9.setText("");
jTextField10.setText("");
jTextField8.setEditable(true);
jTextField9.setEditable(true);
JOptionPane.showMessageDialog(this, "删除成功!");
} else {
jTextField8.setText("");
jTextField9.setText("");
jTextField10.setText("");
jTextField8.setEditable(true);
jTextField9.setEditable(true);
}
}
//成绩表的修改按钮
//修改成绩按钮
private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if (jButton10.getText().equals("修改")) {
SCTableSelected();
jButton10.setText("保存");
} else {
//返回int值0&1,0表示确定,1表示否
int response = JOptionPane.showConfirmDialog(null, "是否进行修改?", "标题",
JOptionPane.YES_NO_OPTION);
//如果确定的话,执行对新数据的保存
if (response == 0) {
String Sno, Cno, Grade;
Sno = jTextField8.getText();
Cno = jTextField9.getText();
Grade = jTextField10.getText();
boolean b = hp.checkGrade(Grade);
if (b) {
SC sc = new SC(Sno, Cno, Double.parseDouble(Grade));
String filePath = "D:\\数据结构课程设计\\SC.txt";
UpdateSCTxt(filePath, sc);
readSCTxtFile(filePath);
JOptionPane.showMessageDialog(this, "保存成功!");
} else {
JOptionPane.showMessageDialog(this, "成绩值输入有误(0~100)");
jTextField10.setText("");
return;
}
}
jTextField8.setText("");
jTextField9.setText("");
jTextField10.setText("");
jTextField8.setEditable(true);
jTextField9.setEditable(true);
jButton10.setText("修改");
}
}
//成绩表的添加按钮
//添加成绩的按钮
private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String Sno, Cno, Grade;
Sno = jTextField8.getText();
Cno = jTextField9.getText();
Grade = jTextField10.getText();
boolean b1 = hp.existSno(student, Sno);
boolean b2 = hp.existCno(course, Cno);
boolean b3 = hp.checkGrade(Grade);
boolean b4=hp.checkOnlyOneSC(sc, Sno, Cno);
if (b1&&b2&&b3&&b4) {
String filePath = "D:\\数据结构课程设计\\SC.txt";
contentToTxt(filePath, Sno + " " + Cno + " " + Grade + "\n");
readSCTxtFile(filePath);
jTextField8.setText("");
jTextField9.setText("");
jTextField10.setText("");
}
if (!b1) {
JOptionPane.showMessageDialog(this, "不存在该同学,请检查输入是否有误");
jTextField8.setText("");
}
if (!b2) {
JOptionPane.showMessageDialog(this, "不存在该课程,请检查输入是否有误");
jTextField9.setText("");
}
if (!b3) {
JOptionPane.showMessageDialog(this, "成绩值输入有误(0~100)");
jTextField10.setText("");
}
if(!b4){
JOptionPane.showMessageDialog(this, "该生的该课程已有成绩,不能再次添加");
jTextField8.setText("");
jTextField9.setText("");
}
}
/**
* 根据成绩表查询某个人的各科成绩
* 创建时间:2014-02-23 13:26
*/
//查询个人的各科成绩(课程名 成绩)
private void jButton13ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String Sno = jTextField11.getText();
boolean flag = false;
Vector data = new Vector();
for (int k = 0; sc[k] != null; k++) {
Vector row = new Vector();
if (sc[k].GetSno().equals(Sno)) {
flag = true;
int k1 = 0;
while (course[k1] != null) {
if (course[k1].GetCno().equals(sc[k].GetCno())) {
row.add(course[k1].GetCname());
row.add(sc[k].GetGrade());
data.add(row);
}
k1 += 1;
}
}
}
if (!flag) {
JOptionPane.showMessageDialog(this, "该同学暂时还没有选课成绩或不存在在该同学");
}
Vector title = new Vector();
title.add("课程名");
title.add("成绩");
DefaultTableModel dtm = new DefaultTableModel(data, title);
jTable4.setModel(dtm);
jTextField11.setText("");
}
/**
* 查询该课程的选课学生信息
* 创建时间:2014-02-23 14:22
*/
//查询课程已选人的信息
private void jButton14ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
DefaultTableModel dtm = new DefaultTableModel();//
String Cname = jTextField12.getText();
String Cno = null;
boolean flag = false;
int k1 = 0;
//由课程名从course中得到Cno
while (course[k1] != null) {
if (course[k1].GetCname().equals(Cname)) {
Cno = course[k1].GetCno();
}
k1 += 1;
}
if (Cno == null) {
JOptionPane.showMessageDialog(this, "不存在该课程");
return;
}
Vector data = new Vector();
for (int k = 0; sc[k] != null; k++) {
if (sc[k].GetCno().equals(Cno)) {
int k2 = 0;
flag = true;
//由课程名从course中得到Cno
Vector row = new Vector();
while (student[k2] != null) {
if (student[k2].GetSno().equals(sc[k].GetSno())) {
row.add(student[k2].GetSno());
row.add(student[k2].GetSname());
row.add(student[k2].GetSsex());
row.add(student[k2].GetSdept());
data.add(row);
}
k2 += 1;
}
}
}
if (!flag) {
JOptionPane.showMessageDialog(this, "该课程暂时无人选");
return;
}
Vector title = new Vector();
title.add("学号");
title.add("姓名");
title.add("性别");
title.add("专业");
dtm = new DefaultTableModel(data, title);
jTable5.setModel(dtm);
jTextField12.setText("");
}
(七)、对数据的验证代码
public class Helper {
/**
* 功能:完成对学生学号的正确性检验
* 创建时间 2014-02-23 21:42
* 创建人:张龙
* @param Sno
*/
public static boolean checkSno(String Sno){
boolean flag=true;
char temp[]=Sno.toCharArray();
for(int i=0;i<temp.length;i++)
{
if(temp[i]<'0'||temp[i]>'9')
{
flag=false;break;
}
}
return flag;
}
/**
* 功能;完成对学号唯一性的检验
* 创建时间:2014-02-23 22:01
*/
public static boolean onlySno(Student []s,String Sno){
boolean flag=true;
for(int k=0;s[k]!=null;k++){
if(s[k].GetSno().equals(Sno))
{
flag=false;break;
}
}
if(Sno==null)
{
flag=false;
}
return flag;
}
/**
* 功能:完成对学生表中年龄的正确性检验
* @param Sage
*/
public static boolean checkSage(String Sage)
{
boolean flag=false;
int temp=Integer.parseInt(Sage);
if(temp!=0&&temp>0&&temp<150){
flag=true;
}
return flag;
}
/**
* 功能:完成对选课表学分的正确性验证
* @param Ccredit
* @return
*/
public static boolean checkCcredit(String Ccredit){
boolean flag=false;
double temp=Double.parseDouble(Ccredit);
if(temp>0&&((temp+"").length()-(temp+"").indexOf(".")-1)==1){
flag=true;
}
return flag;
}
/**
* 功能:完成对选课表的课程号的唯一性验证
* @param Cno
* @return
*/
public static boolean onlyCno(Course []c,String Cno)
{
boolean flag=true;
for(int k=0;c[k]!=null;k++)
{
if(c[k].GetCno().equals(Cno))
{
flag=false;break;
}
}
if(Cno==null)
{
flag=false;
}
return flag;
}
/**
* 功能:完成对选课表的课程名的唯一性验证
* @param c
* @param Cname
* @return
*/
public static boolean onlyCname(Course []c,String Cname)
{
boolean flag=true;
for(int k=0;c[k]!=null;k++)
{
if(c[k].GetCname().equals(Cname))
{
flag=false;break;
}
}
if(Cname==null){
flag=false;
}
return flag;
}
/**
* 功能:完成成绩表的对学号的存在性验证
* 创建时间:2014-02-24 15:29
*/
public static boolean existSno(Student s[],String Sno)
{
boolean flag=false;
for(int k=0;s[k]!=null;k++)
{
if(s[k].GetSno().equals(Sno))
{
flag=true;break;
}
}
return flag;
}
/**
* 功能:完成成绩表的对课程号的存在性验证
* 创建时间:2014-02-24 15:35
*/
public static boolean existCno(Course c[],String Cno){
boolean flag=false;
for(int k=0;c[k]!=null;k++)
{
if(c[k].GetCno().equals(Cno)){
flag=true;break;
}
}
return flag;
}
/***
* 功能:完成成绩表的成绩值的合格性验证
* 创建时间:2014-02-24 15:40
*/
public static boolean checkGrade(String Grade)
{
boolean flag=false;
double temp=Double.parseDouble(Grade);
if(temp>=0&&temp<=100&&((temp+"").length()-(temp+"").indexOf(".")-1)==1){
flag=true;
}
return flag;
}
/***
* 检测该生的该课程是否只有一个成绩
* 创建时间:2014-03-11 23:02
*/
public static boolean checkOnlyOneSC(SC sc[],String sno,String cno)
{
boolean flag=true;
for(int k=0;sc[k]!=null;k++)
{
if(sc[k].GetSno().equals(sno)&&sc[k].GetCno().equals(cno)){
flag=false;break;
}
}
return flag;
}
四、使用说明
//对学生表的单独操作说明如下:
1、可直接对学生表进行插入,但是学号不能重复,且学号为只能数字。
2、点击修改时先从表格选中要修改的行,再点击修改,只能对除学号以外的信息修改,然后修改变为保存字样。
点击保存后出现提示,是则修改,提示修改成功。否则放弃修改,将界面恢复为主界面(第一张图)
3、删除时也要先从表格中选定要删除的行,让后点击删除,是则删除,否则返回界面
4、查找时直接点击查找按钮,弹出一个文本框,提示只能按学号查找。
若存在该同学,则将该学生信息显示到主界面,若不存在,则提示不存在该同学。
//对课程表的单独操作说明如下:
1、添加时课程号不能重复,课程名也不能重复,学分只能是以为小数。
2、修改也要先选定,在进行修改,只能修改课程的学分。与学生表操作类似。
3、删除操作在选定后直接删除即可,附加判断,是否真的删除,是则删,不是则返回;
4、查找时直接点击查找按钮,弹出一个文本框,输入课程名,按课程名查找。若找到,则显示信息到主界面,找不到则提示不存在。
//对成绩表的综合操作
1、插入时要判断该学生号和课程号是否在Student.txt和COurse.txt文件中存在。还有成绩是不是在0~100之间,若其中有一个条件不满足,则插入不会成功。
2、修改时只能对成绩进行修改。然后点击保存,是则保存,不是则返回。
3、删除时从表格中选中后删除即可。
//综合查询部分
//查询个人所有课程成绩
1、文本框中输入学生学号,点击查询,可以查到该生所有课程成绩
//查询某门科目的选课学生信息
输入课程名后查询,讲查询结果添加到表格中,若不存在在该课程,则会提示课程不存在。
五、设计总结
本次课程设计其实从寒假就看到任务书,但是一直没有下定决心去做,所以以前有好多时间可以去准备的,但是没有付诸于实践。开学后经过老师的详细安排,自己也之前了解过数据库的基本知识,所以一下子想到了要实现的功能,以及要控制的数据,报括学号,课程号的唯一性,成绩,年龄的参照完整性,还有可控数据的处理。虽然还是有好多问题没有得意解决,但是的确学到了好多东西,一直是我感觉到,学着去做一个大的东西,分析清楚他的各种功能,然后一点一点的查找,学习,这种学习方法真的很好。就拿这次课程设计来说,老师提出了好多界面化。考虑到用户体验,于是我就想用java做,但是好多东西之前根本不知道,更不用说用了。就开始网上搜索,查找资料,等一系列学习途径,一个一个问题解决,各个击破。最终做出了还可以操作的简单界面,但是好多控制都没有加上去,好多该处理的问题都出来了,途中遇到了很棘手的问题,就是删除某一项数据,然后添加时他会给你返回“该学生学号已经存在”,“该课程号已经存在”等错误,经过仔细分析,原来是我把文件中的数据的确是删除了,但是没有对存储结构里的数据惊醒更新,也就是对象数组里那些值还是存在的,而我所添加的判断正是又对象数组里的值进行处理,
故而提醒新添加的数据时已经存在的。
还有就是我的综合查询,差一个学生的各科成绩,表格中就给我重复列出各科成绩信息,并且一个考场信息不止重复一次,搞得我真是烦啊,最后才发现,前面添加之后,我的对象数组是静态的,由于对他的操作是放在类外,对后面的没有初始化,所以给我出错。
还有就是这次的课程设计从开始设计到初步完成,再到细化到各个功能,我都是先做了设计步骤的。今天完成那些功能,用怎么样的方法去完成,我都写了详细的文档,所以做的时候思路清晰,遇到问题都能很快的处理掉,还有数据的存储结构,还有完整性控制我都重新建了两个类。这样操作方便,容易找到错误,测试也很方便。所以我有了一个完整的设计思想,以及一定的设计理念,这样对我以后用其他语言,开发其他的项目,都是很好的参考。