import java.io.bufferedreader;
import java.io.bufferedwriter;
import java.io.file;
import java.io.filenotfoundexception;
import java.io.filereader;
import java.io.filewriter;
import java.io.ioexception;
import java.io.inputstreamreader;
import java.io.printwriter;
import java.io.stringreader;
import java.util.arraylist;
import java.util.collection;
import java.util.collections;
import java.util.hashmap;
import java.util.iterator;
import java.util.stringtokenizer;
/*
* created on 2005-1-11
*/
/**
* @author 让炜
* @since 1.0
*
* todo 学生成绩管理系统
* 通过学号查找,修改,删除数据
*
*/
public class littleprogram
{
static boolean isdelete = true;
static boolean isfind = true;
public static void main(string [] args)//主方法,程序从这里开始运行
throws ioexception,numbernotfoundexception
{
int choice=-1;
do{
littleprogram lp = new littleprogram();
system.out.println();
system.out.println("\t####################################");
system.out.println();
system.out.println("\t\t java学生成绩管理系统1.1");
system.out.println("\t\t请用学号查找,修改,删除数据");
system.out.println();
system.out.println("\t####################################\n");
system.out.print("1.增加数据:\n"+
"2.查找数据:\n"+
"3.删除数据:\n"+
"4.清除所有数据:\n"+
"5.把数据全部打印到屏幕\n"+
"6.把成绩按学号排序\n"+
"7.修改数据\n"+
"8.统计已记录成绩学生数\n"+
"9.关于作者\n"+
"0.退出程序.\n" +
"输入:");
bufferedreader in = //从终
new bufferedreader( //端接
new inputstreamreader(system.in));//收数
string inputline = in.readline(); //字选
choice= integer.valueof(inputline).intvalue();//项;
switch(choice)
{
case 1: {//1.增加数据
string str = lp.inputdata();
lp.adddata(str);
system.out.println("增加数据成功.");
timeout(1);
}break;
case 2: {//2.查找数据
long find = 0;
system.out.print("请输入你要查找的学生学号:");
bufferedreader inn =
new bufferedreader(
new inputstreamreader(system.in));
string inputli = inn.readline();
find = integer.valueof(inputli).longvalue();
lp.finddata(find);
timeout(2);
}break;
case 3: {//3.删除数据
long deletenumber = 0;
system.out.print("请输入你想删除的同学的学号:");
bufferedreader bf =
new bufferedreader (
new inputstreamreader(system.in));
string inputl = bf.readline();
deletenumber = integer.valueof(inputl).longvalue();
lp.deletedata(deletenumber);
if(isdelete)
system.out.println("删除数据成功!");
timeout(1);
}break;
case 4: {
lp.cleardata();//4.清除所有数据
timeout(1);
}break;
case 5: {
print();//5.把数据全部打印到屏幕
timeout(2);
}break;
case 6: {
lp.numsort();//6.把成绩按学号排序
system.out.println("按照学号从小到大排序成功!\n"+
"排序后:\n");
print();
timeout(2);
}break;
case 7: {
lp.rewrite();//7.修改数据
timeout(2);
}break;
case 8: {
int count = lp.count();
system.out.println("共有"+count+"个学生已经记录.");
timeout(2);
}break;
case 9: {
system.out.print("\t\t让炜\n"+
"\t\t上海电力学院通信工程系\n"+
"\t\tqq:254482170\n");
timeout(4);
}break;
}while (choice != 0);
system.out.println("bye! ^-^");
system.exit(0);
}
public string inputdata()//从终端接收数据的方法,返回字符串
throws ioexception,numberformatexception
{
system.out.print("请依次输入 :学号 姓名 性别 成绩\n" +
"每项数据请用空格隔开:");
string all = "";
try{
bufferedreader in = //从终
new bufferedreader ( //端接
new inputstreamreader(system.in)); //收数
string inputline = in.readline(); //据
stringtokenizer str =
new stringtokenizer(inputline," ");//接收的数据用空格隔开,这个类用来提取每个字符串
long num = integer.valueof(str.nexttoken()).longvalue();//学号
string name = (string)str.nexttoken(); //姓名
string sex = (string)str.nexttoken(); //性别
double mark = integer.valueof(str.nexttoken()).doublevalue();//分数
all = string.valueof(num) +" , "+
name +" , "+
sex +" , "+
string.valueof(mark);//把所有的数据用" , "隔开然后在连起来放进字符串all
}catch (ioexception e){}
catch (numberformatexception e){}
return all;//返回字符串all
}
public void adddata(string str)//增加数据的方法
throws ioexception
{
string s1 ="",s2="" ,s3= "";
file file = new file("data.txt");
if (file.exists())//如果文件data.txt存在
{
try{
bufferedreader in =
new bufferedreader(
new filereader("data.txt"));
while ((s1=in.readline())!=null)
s2+=s1+"\n";//把文件中的每行数据全部放进一个字符串s2
s2+=str+"\n"; //再把s2于形参str相连放进s2
bufferedreader in2 = //把字符
new bufferedreader( //串s2也
new stringreader(s2)); //就是原
printwriter out = //文件+
new printwriter( //形参str(新输入的一行数据)
new bufferedwriter( //重新写进data.txt
new filewriter("data.txt"))); //覆盖原来的数据
while ((s3=in2.readline())!= null)
{
out.println(s3);
}
out.close();
//system.out.println("write data true.");
}catch (ioexception e){}
}else{
system.err.println("file \"data\" missing!");
}
}
public void cleardata()//清除data.txt的所有数据的方法
throws ioexception
{
file file = new file("data.txt");
if(file.exists())//如果文件在
{
try{
printwriter out =
new printwriter(
new bufferedwriter(
new filewriter(file)));
out.print("");//在文件data.txt里写进一个空字符,所以清除了原来的内容
out.close(); //关闭文件
system.out.println("clear data true!");
}catch(ioexception e){}
}else{
system.err.println("file \"data\" missing!");
}
}
public void deletedata(long deletenumber)//删除某条数据
throws ioexception,filenotfoundexception
{
isdelete = true;
try{
datamap mp = new datamap();//生成一个自己编写的容器
long j=0;
string s1="",s2="",s3="";
bufferedreader in =
new bufferedreader(
new filereader("data.txt"));
while ((s1=in.readline())!=null)
{
j=numbertokenizer(s1);
mp.put(j,s1);
}
try{
if(mp.containskey( string.valueof(deletenumber).tostring()))
{
mp.remove(deletenumber);
}else
throw new numbernotfoundexception();
collection c = mp.values();
iterator iter = c.iterator();
while(iter.hasnext())
{
s1 = (string)iter.next();
s3 +=s1+"\n";
}
bufferedreader in2 =
new bufferedreader(
new stringreader(s3));
printwriter out =
new printwriter(
new bufferedwriter(
new filewriter("data.txt")));
//system.out.println("delete no"+deletenumber);
while( (s1 = in2.readline())!=null)
{
out.println(s1);
}
out.close();
}catch (numbernotfoundexception e)
{
isdelete = false;
system.out.println(deletenumber+" no found :(");
}
}catch(ioexception e){}
}
public long numbertokenizer(string s)
throws ioexception
{
stringtokenizer st =
new stringtokenizer(s," ");
return integer.valueof((st.nexttoken())).longvalue();
}
public void finddata(long find)//查找数据
throws ioexception,numbernotfoundexception
{
isfind = true;
string s = "",findstring ="";
long i;
datamap dm = new datamap();
bufferedreader in =
new bufferedreader(
new filereader("data.txt"));
while ((s=in.readline())!=null)
{
i=numbertokenizer(s);
dm.put(i,s);
}
//in.close();
try{
if(dm.containskey( string.valueof(find).tostring()))
{
findstring = dm.get(find);
system.out.println("学号"+find+"学生的资料是:");
system.out.println(findstring);
}else
throw new numbernotfoundexception();
}catch (numbernotfoundexception e){
system.out.println(find+" no found :(");
isfind = false;
}
}
public static void print()//读取文本文件把数据打印到终端的方法
throws ioexception
{
try{
bufferedreader in =
new bufferedreader(
new filereader("data.txt"));
string read = "";
while ((read = in.readline())!=null)
system.out.println(read);
}catch(ioexception e){}
}
public static void timeout(double sec)//停顿短暂时间的一个方法完全可以不要这个功能
{
double seconds = sec;
long t = system.currenttimemillis()+(int)(seconds*1000);
while ((system.currenttimemillis())<t)
;
}
public void numsort()//按学号排序
throws ioexception
{
long i = 0;
string s = "";
try{
dataarraylist dal = new dataarraylist();
bufferedreader in =
new bufferedreader(
new filereader("data.txt"));
while ((s=in.readline())!=null)
{
i=numbertokenizer(s);
dal.add(i);
}
collections.sort(dal);
datamap dm = new datamap();
bufferedreader in2 =
new bufferedreader(
new filereader("data.txt"));
while ((s=in2.readline())!=null)
{
i=numbertokenizer(s);
dm.put(i,s);
}
printwriter out =
new printwriter (
new bufferedwriter(
new filewriter("data.txt")));
iterator it = dal.iterator();
long temp = 0;
string tempstr = "";
while (it.hasnext())
{
temp = integer.valueof((string)it.next()).longvalue();
tempstr = dm.get(temp);
out.println(tempstr);
}
out.close();
}catch(ioexception e){}
}
public void rewrite()
throws ioexception,numbernotfoundexception
{
try{
system.out.print("请输入你要修改的学生学号:");
bufferedreader in =
new bufferedreader (
new inputstreamreader(system.in));
string inputline = in.readline();
long num = integer.valueof(inputline).longvalue();
finddata(num);
if(isfind)
{
deletedata(num);
system.out.print("请重新输入该学生的资料:");
string str = inputdata();
adddata(str);
system.out.println("rewrite true!");
}
}catch(ioexception e){}
catch(numbernotfoundexception e){}
}
public int count()
throws ioexception
{
dataarraylist dal = new dataarraylist();
try{
string s = "";
long i =0;
bufferedreader in =
new bufferedreader(
new filereader("data.txt"));
while ((s=in.readline())!=null)
{
i=numbertokenizer(s);
dal.add(i);
}
}catch(ioexception e){}
return dal.size();
}
}
/*
*
* @author rangwei
* todo 这是个我们写的一个容器,继承公共类hashmap
* 大概的功能就相当一个数组
*
*/
class datamap extends hashmap//一个存储数据的map
{
public void put(long i,string str)//把学号和数据放进这个map
{ //以后一个学号(key)对应的是一个人的数据(value)
put(string.valueof(i).tostring(),str);
}
public void remove(long i)//接收学号,然后删除学号(key)和它对应的数据(value)
{
remove(string.valueof(i).tostring().tostring());
}
public string get(long i)//接收一个学号,然后返回这个key对应的value
{
string s = string.valueof(i).tostring();
if (!containskey(s))
{
system.err.println("not found key: "+s);
}
return (string)get(s);
}
}
/*
*
* @author rangwei
*
* todo 这个类继承arraylist
* 用来按数字排序,在用学号排序时要用到它
*
*/
class dataarraylist extends arraylist
{
public void add(long num)
{
string numtostring = string.valueof(num).tostring();
add(numtostring);
}
}
/*
*
* @author rangwei
*
* todo 增加的一个exception,主要是在文件里没有要找
* 的学号就抛出
*
*/
class numbernotfoundexception extends exception
{
public numbernotfoundexception()
{}
}
