学生信息管理
. 1. 数据类
DAO分层技术防止业务层直接干扰数据
主要初始化数据
代码如下`:
package Data;
import Readandwrite.Readandwrite;
import pojo.Account;
import pojo.Student;
import java.util.*;
public class Database implements java.io.Serializable {
private List<Account> accountList = new ArrayList<>();
private List<Student> studentsList = new ArrayList<>();
Readandwrite f=new Readandwrite();
public Database() {
Account account = new Account(12345678, "admin", "0000");
accountList.add(account);
List<String> slist=new ArrayList<>();
slist=f.reader();
for(String s:slist) {
String student[] = s.split(" ");
studentsList.add(new Student(student[0], student[1], student[2],
Double.parseDouble(student[3]), Double.parseDouble(student[4]),
Double.parseDouble(student[5]), Double.parseDouble(student[6])));
}
for(int i=0;i<studentsList.size();i++)
{
studentsList.get(i).setRank(i+1);
}
}
public List<Student> getStudentsList() {
return studentsList;
}
public void setStudentsList(List<Student> studentsList) {
this.studentsList = studentsList;
}
public List<Account> getAccountList(){
return accountList;
}
public void setAccountList(List<Account> accountList) {
this.accountList = accountList;
}
}
. 2. Dao类用于跟业务层对接去修改后端的数据
代码如下:
package Dao;
import Data.Database;
import pojo.Account;
public class Accountdao {
private Database database;
public Accountdao(Database database) {
this.database = database;
}
public Account findByName(String accountName){
Account account = null;
for (Account user : database.getAccountList()) {
if(user.getAccountName().equals(accountName)){
account = user;
break;
}
}
return account;
}
public String findid(long id)
{
String s=null;
for (Account account : database.getAccountList()) {
if(account.getAccountId()==id)
{
s=account.getAccountName();
break;
}
}
return s;
}
public void extra(String name,String password,long phone)
{
Account s=new Account(phone,name,password);
database.getAccountList().add(s);
}
public void modicode(String password,String name)
{
for(int i=0;i<database.getAccountList().size();i++)
{
if(database.getAccountList().get(i).getAccountName().equals(name))
{
database.getAccountList().get(i).setPassword(password);
break;
}
}
}
}
package Dao;
import Data.Database;
import Readandwrite.Readandwrite;
import pojo.Student;
import java.util.ArrayList;
import java.util.List;
public class Studentdao {
private Database database;
public Studentdao(Database database) {
this.database = database;
}
public void add(Student s) {
database.getStudentsList().add(s);
}
public void show() {
for (int i = 0; i < database.getStudentsList().size(); i++) {
System.out.print("学号:" + database.getStudentsList().get(i).getName()+"\t");
System.out.print("姓名: " + database.getStudentsList().get(i).getNum()+"\t");
System.out.print("专业:" + database.getStudentsList().get(i).getPro()+"\t");
System.out.print("语文:" + database.getStudentsList().get(i).getChinese()+"\t");
System.out.print("数学:" + database.getStudentsList().get(i).getMath()+"\t");
System.out.print("英语:" + database.getStudentsList().get(i).getEng()+"\t");
System.out.print("理综:" + database.getStudentsList().get(i).getScience()+"\t");
System.out.print("总分:" + database.getStudentsList().get(i).getTotal()+"\t");
System.out.print("名次:" + database.getStudentsList().get(i).getRank()+"\t");
System.out.println();
}
}
public void delete(String s) {
int flag = 0;
for (int i = 0; i < database.getStudentsList().size(); i++) {
if (database.getStudentsList().get(i).getNum().equals(s)) {
database.getStudentsList().remove(i);
flag = 1;
break;
}
}
if (flag == 1) {
System.out.println("已删除");
} else
System.out.println("未查找到该学号学生");
}
public void find(String s) {
int flag = 0;
Student a = new Student();
for (int i = 0; i < database.getStudentsList().size(); i++) {
if (database.getStudentsList().get(i).getNum().equals(s)) {
a = database.getStudentsList().get(i);
flag = 1;
break;
}
}
if (flag == 1) {
System.out.print("\t姓名:\t" + a.getName());
System.out.print("\t学号:\t" + a.getNum());
System.out.print("\t专业:\t" + a.getPro());
System.out.print("\t语文:\t" + a.getChinese());
System.out.print("\t数学:\t" + a.getMath());
System.out.print("\t英语:\t" + a.getEng());
System.out.print("\t理综:\t" + a.getScience());
System.out.print("\t总分:\t" + a.getTotal());
System.out.print("\t名次:\t" + a.getRank());
} else
System.out.println("未查找到该学号学生");
}
public Student findbynum(String s)
{
int flag = 0;
Student a = new Student();
for (int i = 0; i < database.getStudentsList().size(); i++) {
if (database.getStudentsList().get(i).getNum().equals(s)) {
a = database.getStudentsList().get(i);
flag = 1;
break;
}
}
if (flag == 1) {
return a;
} else
System.out.println("未查找到该学号学生");
return null;
}
public void modi(String num,double s,int f)
{
Student s1=findbynum(num);
if(s1!= null)
{
switch(f)
{
case 1:
s1.setChinese(s);
break;
case 2:
s1.setEng(s);
break;
case 3:
s1.setMath(s);
break;
case 4:
s1.setScience(s);
break;
}
}
else
System.out.println("不存在该学生");
}
public void shaker() {
List<Student> list = database.getStudentsList();
Student temp = null;
int left = 0, right = list.size() - 1;
while (left < right) {
for (int i = left + 1; i <= right; i++) {
if (list.get(left).getTotal() < list.get(i).getTotal()) {
temp = list.get(i);
list.set(i, list.get(left));
list.set(left, temp);
}
}
left++;
for (int i = right - 1; i >= left; i--) {
if (list.get(right).getTotal() > list.get(i).getTotal()) {
temp = list.get(i);
list.set(i, list.get(right));
list.set(right, temp);
}
}
right--;
}
for (int i = 0; i < list.size(); i++) {
list.get(i).setRank(i + 1);
}
}
public void shell() {
List<Student> list = new ArrayList<>();
list = database.getStudentsList();
if (list == null || list.size() <= 1) return;
for (int gap = list.size() / 2; gap > 0; gap /= 2) {
for (int i = gap; i < list.size(); i++) {
for (int j = i - gap; j >= 0; j -= gap) {
if (list.get(j).getTotal() < list.get(j + gap).getTotal()) {
Student s = list.get(j);
list.set(j, list.get(j + gap));
list.set(j + gap, s);
}
}
}
}
for (int i = 0; i < list.size(); i++) {
list.get(i).setRank(i + 1);
}
}
public void quicksort() {
List<Student> list = database.getStudentsList();
quick(list, 0, list.size() - 1);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRank(i + 1);
}
}
public void quick(List<Student> list, int left, int right) {
if (left > right) {
return;
}
Student base = list.get(left);
double b = list.get(left).getTotal();
int i = left;
int j = right;
while (i != j) {
while (list.get(j).getTotal() <= b && i < j) {
j--;
}
while (list.get(i).getTotal() >= b && i < j) {
i++;
}
Student s = list.get(i);
list.set(i, list.get(j));
list.set(j, s);
}
list.set(left, list.get(i));
list.set(i, base);
quick(list, left, i - 1);
quick(list, j + 1, right);
}
public void heap() {
List<Student> list = new ArrayList<>();
list = database.getStudentsList();
if (list.size() <= 1) {
return;
}
creatheap(list);
for (int i = list.size() - 1; i >= 1; i--) {
Student s = list.get(0);
list.set(0, list.get(i));
list.set(i, s);
maxheap(list, i, 0);
}
for (int i = 0; i < list.size(); i++) {
list.get(i).setRank(i + 1);
}
}
public void creatheap(List<Student> list)
{
int parent=list.size()/2-1;
for(int i=parent;i>=0;i--)
{
maxheap(list,list.size(),i);
}
}
public void maxheap(List<Student> list,int length,int index)
{
int left =2*index+1;
int right =2*index+2;
int maxindex =index;
if (left<length && list.get(left).getTotal() < list.get(maxindex).getTotal())
{
maxindex = left;
}
if (right<length && list.get(right).getTotal() < list.get(maxindex).getTotal())
{
maxindex = right;
}
if (maxindex!=index)
{
Student s = list.get(index);
list.set(index, list.get(maxindex));
list.set(maxindex, s);
maxheap(list,length, maxindex);
}
}
public void save(){
List<String> list1=new ArrayList<>();
for(Student s:database.getStudentsList()){
String s1=s.getNum()+" "+s.getName()+" "+s.getPro()+" "+s.getMath()+" "+
s.getEng()+" "+s.getChinese()+" "+s.getScience();
list1.add(s1);
}
Readandwrite rw = new Readandwrite();
rw.writer(list1);
}
}
. 3. 用户类包括登录帐号类以及学生类的定义
代码如下:
package pojo;
public class Account {
private long accountId;
private String accountName;
private String password;
public Account(long accountId, String accountName, String password) {
this.accountId = accountId;
this.accountName = accountName;
this.password = password;
}
public Account() {
}
public long getAccountId() {
return accountId;
}
public void setAccountId(long accountId) {
this.accountId = accountId;
}
public String getAccountName() {
return accountName;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package pojo;
public class Student implements java.io.Serializable{
private String num;
private String name;
private double math;
private double chinese;
private double eng;
private double total;
private double science;
private int rank;
private String pro;
public Student(String num, String name, String pro, double chinese, double math, double eng, double science) {
this.num = num;
this.name = name;
this.math = math;
this.chinese = chinese;
this.eng = eng;
this.science = science;
this.total = this.chinese+this.math+this.eng+this.science;
this.pro = pro;
}
public Student()
{
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
public double getChinese() {
return chinese;
}
public void setChinese(double chinese) {
this.chinese = chinese;
}
public double getEng() {
return eng;
}
public void setEng(double eng) {
this.eng = eng;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public double getScience() {
return science;
}
public void setScience(double science) {
this.science = science;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getPro() {
return pro;
}
public void setPro(String pro) {
this.pro = pro;
}
}
. 4. 开始界面主界面用于界面的展示以及用户交互方法的实现
代码如下:
package service;
import Dao.Accountdao;
import Dao.Studentdao;
import Data.Database;
import pojo.Account;
import pojo.Student;
import java.util.Random;
import java.util.Scanner;
public class Studentsystem {
private Scanner scanner = new Scanner(System.in);
private Accountdao accountDao;
private Studentdao studentdao;
int count = 0;
public Studentsystem(Database database) {
accountDao = new Accountdao(database);
studentdao = new Studentdao(database);
}
public void start() {
System.out.println("***************欢迎进入学籍管理系统***************");
System.out.println("1. 登录");
System.out.println("2. 注册");
System.out.println("3. 退出系统");
System.out.println("请选择:");
int chooice = scanner.nextInt();
switch (chooice) {
case 1:
login();
break;
case 2:
regist();
break;
case 3:
System.out.println("退出了系统!");
break;
default:
System.out.println("无效的选项,请重新输入!");
start();
}
}
public void login() {
System.out.println("***************登录***************");
System.out.println("请输入用户名:");
String userName = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
System.out.println("输入验证码");
String code2 = captcha();
System.out.println("验证码为:" + code2);
String code = scanner.next();
Account a = null;
a = accountDao.findByName(userName);
if (a != null) {
if (a.getPassword().equals(password)) {
if (code.equals(code2)) {
System.out.println("登录成功");
menu();
} else {
System.out.println("验证码错误请重新输入");
count++;
if (count > 2) {
System.out.println("错误次数过多请稍后再试");
count = 0;
code();
} else
login();
}
} else {
System.out.println("密码错误请重新输入");
count++;
if (count > 2) {
System.out.println("错误次数过多请稍后再试");
count = 0;
code();
} else {
login();
}
}
} else {
System.out.println("用户名错误请重新输入");
count++;
if (count > 2) {
System.out.println("错误次数过多请稍后再试");
count = 0;
code();
} else
login();
}
}
public void code() {
System.out.println("***************用户界面***************");
System.out.println("1. 忘记密码");
System.out.println("2. 忘记用户名");
System.out.println("3. 继续输入");
System.out.println("0. 返回上一层");
System.out.println("请选择!");
int x = scanner.nextInt();
switch (x) {
case 0:
start();
break;
case 1:
findcode();
break;
case 2:
findname();
break;
case 3:
login();
break;
default:
System.out.println("无效选项请重新输入");
code();
}
}
public void findname() {
System.out.println("***************找回用户名***************");
System.out.println("输入要找的用户名的id");
long id = scanner.nextLong();
String a = accountDao.findid(id);
if (a == null) {
System.out.println("此id不存在请重新输入");
findname();
} else {
System.out.println("用户名为:" + a);
start();
}
}
public void findcode() {
System.out.println("***************找回密码***************");
System.out.println("输入用户名");
String name = scanner.next();
Account a = accountDao.findByName(name);
System.out.println("输入id");
long i = scanner.nextLong();
if (a != null) {
if (a.getAccountId() == i) {
System.out.println("输入要修改的密码");
String code = scanner.next();
System.out.println("请确认密码");
String code1 = scanner.next();
if (code.equals(code1)) {
String cap = captcha();
System.out.print("输入验证码:\t");
System.out.println(cap);
String code2 = scanner.next();
if (code2.equals(cap)) {
accountDao.modicode(code, name);
start();
} else {
System.out.println("验证码错误请重新输入");
findcode();
}
} else {
System.out.println("密码不一致请重新输入");
findcode();
}
} else {
System.out.println("id输入错误请重新输入");
findcode();
}
} else {
System.out.println("查无此id请重新确认");
findcode();
}
}
public void regist() {
System.out.println("***************账号注册***************");
System.out.println("输入用户名");
String name = scanner.next();
Account a = null;
a = accountDao.findByName(name);
if (a == null) {
System.out.println("输入id");
long num = scanner.nextLong();
System.out.println("输入密码");
String password = scanner.next();
System.out.println("请确认密码");
String password2 = scanner.next();
if (!(password2.equals(password))) {
System.out.println("两次密码不一致请重新输入");
regist();
} else {
System.out.println("输入验证码");
String code2 = captcha();
System.out.println("验证码为:" + code2);
String code = scanner.next();
if (code2.equals(code)) {
accountDao.extra(name, password, num);
System.out.println("注册成功!");
start();
} else {
System.out.println("验证码错误请重新输入");
regist();
}
}
} else {
System.out.println("此用户名已被注册请重新输入");
regist();
}
}
public String captcha() {
Random random = new Random();
String code = "";
for (int i = 0; i < 4; i++) {
int x = random.nextInt(2);
if (x == 0) {
code = code + random.nextInt(10);
} else {
int a = random.nextInt(26) + 65;
int q = random.nextInt(2);
if (q == 0) {
a = a + 32;
}
char s = (char) a;
code = code + s;
}
}
return code;
}
public void menu() {
System.out.println("***************欢迎进入学籍管理系统***************");
System.out.println("1. 新增学生信息");
System.out.println("2. 浏览学生信息");
System.out.println("3. 删除指定学生");
System.out.println("4. 查找指定学生");
System.out.println("5. 保存指定学生");
System.out.println("6. 修改学生成绩");
System.out.println("0. 返回上一层");
System.out.println("请选择:");
int chooice = scanner.nextInt();
switch (chooice) {
case 1:
add();
break;
case 2:
show();
break;
case 3:
delete();
break;
case 4:
find();
break;
case 5:
keep();
menu();
break;
case 6:
modi();
break;
case 0:
start();
break;
default:
System.out.println("无效的选项,请重新输入!");
menu();
}
}
private void keep() {
studentdao.save();
}
private void find() {
System.out.println("输入查找学生学号");
String s = scanner.next();
studentdao.find(s);
menu();
}
private void delete() {
System.out.println("请输入删除信息的学号");
String s = scanner.next();
studentdao.delete(s);
menu();
}
private void show() {
System.out.println("请选择排序方法");
System.out.println("1. 双向冒泡");
System.out.println("2. 希尔排序");
System.out.println("3. 快速排序");
System.out.println("4. 堆排序");
System.out.println("0. 返回上一层");
System.out.println("请选择:");
int choice = scanner.nextInt();
switch (choice) {
case 1:
studentdao.shaker();
break;
case 0:
menu();
break;
case 2:
studentdao.shell();
break;
case 3:
studentdao.quicksort();
break;
case 4:
studentdao.heap();
break;
default:
System.out.println("输入无效请重新输入");
show();
}
studentdao.show();
show();
}
private void add() {
System.out.println("输入学号");
String a = scanner.next();
System.out.println("输入姓名");
String b = scanner.next();
System.out.println("输入专业");
String c = scanner.next();
System.out.println("输入语文成绩");
double d = scanner.nextDouble();
System.out.println("输入数学成绩");
double e = scanner.nextDouble();
System.out.println("输入英语成绩");
double f = scanner.nextDouble();
System.out.println("输入理综成绩");
double g = scanner.nextDouble();
Student s = new Student(a, b, c, d, e, f, g);
studentdao.add(s);
menu();
}
private void modi() {
System.out.println("输入要修改学生的学号");
String s=scanner.next();
System.out.println("选择修改的学科");
System.out.println("1. 语文");
System.out.println("2. 外语");
System.out.println("3. 数学");
System.out.println("4. 理综");
int f=scanner.nextInt();
if(f==1||f==2||f==3||f==4)
{
System.out.println("输入修改的值");
double x=scanner.nextDouble();
studentdao.modi(s,x,f);
}
else{
System.out.println("重新输入");
modi();
}
menu();
}
}
. 5 文件的读取与写入io流不是太会copy室友的。。
package Readandwrite;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Readandwrite {
public BufferedReader br;
public BufferedWriter bw;
public File file =new File("C:\\Users\\莉莉安\\Desktop\\java\\数据结构实践\\学籍管理\\src\\student.txt");
public Readandwrite(){}
public List<String> reader() {
List<String> list = new ArrayList<>();
try {
br = new BufferedReader(
new InputStreamReader(new FileInputStream(file)));
String line=null;
while ((line = br.readLine()) != null) {
list.add(line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public boolean writer(List<String> list){
try {
bw=new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(file)));
for(String s:list){
bw.write(s);
bw.newLine();
}
bw.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
. 6.主类直接进行测试
package Test;
import Data.Database;
import service.Studentsystem;
public class Test {
public static void main(String[] args) {
Database database = new Database();
Studentsystem studentsystem=new Studentsystem(database);
studentsystem.start();
}
}