/*? 电子投票系统
本项目功能多,可以由2-3名同学合作完成。鼓励同学合作进行开发,可获得各10分的加分,但答辩时,要明确分出各自的工作。由1人完成时,可以自行去除其中的一些非核心功能。
投票人主要功能如下:
(1)投票人输入要选举的候选人编号,即可完成投票。
(2)投票人可以浏览候选人列表、输入序号查询候选人介绍。
管理员的主要功能如下:
(1)初始化候选人信息:在系统投入使用前需要先将需要投票选举的候选人信息录入系统中,以便投票和查看。管理员的初始化工作就是将候选人的序号、姓名和简介录入系统。
(2)浏览候选人简介:为随时掌握候选人的信息,以便进行修改,管理员有权浏览候选人简介。浏览的顺序按照候选人序号即可。
(3)修改候选人简介:当系统更新或候选人信息有所变化时,输入候选人序号对其信息进行修改。
(4)查询投票情况:管理员有权查询当前各个候选人得票情况,以便得出最终被选出的候选人信息。
(5)清除投票信息:当投票工程结束后,管理员选择清除投票信息即清除系统中所有候选人的票数,使之归零。
(6)管理员可以对投票人进行管理,投票人只有用管理员规定的用户名和密码才能进入系统进行投票。管理员还可以更改用户名、密码和权限,并对投票人信息进行增加、删除、查询、排序和初始化等操作。
*/
import java.util.*;
import java.io.*;
public class VoteSystem
{ static Administrator dir2=new Administrator();
static votemansystem dir1=new votemansystem();
static safety dir3=new safety();
static Scanner In=new Scanner(System.in);
public static void main(String[] args)
{
//安全监测
System.out.println("~~~~~~电子投票系统~~~~~~");
boolean flag_=true;
while(flag_){
System.out.println("==请选择进入方式:==");
System.out.println("==1.投票人 2.管理员 3.退出投票系统==");
int mi_select=In.nextInt();
if(mi_select==1||mi_select==2||mi_select==3){
switch(mi_select){
case 1:
boolean flag2=true;
while(flag2){
if(dir3.user_certification()){//用户验证
flag2=false;
}
else{
System.out.println("用户账号或密码错误,请重新输入:");//如果不能正确验证,就要一直输入,有bug
}
}
System.out.println("~~欢迎进入投票人系统~~");
voteman_manu();//调用投票人菜单
break;
case 2:
boolean flag2_=true;
while(flag2_){
if(dir3.user_certification()){//管理员验证
flag2_=false;
}
else{
System.out.println("管理员账号或密码错误,请重新输入:");//如果不能正确验证,就要一直输入,有bug
}
}
System.out.println("~~欢迎进入管理员系统~~");
Administrator_manu();//调用管理员菜单
break;
case 3:
flag_=false;
break;
}
}
else{
System.out.println("");
System.out.println("您的输入不合法,请重新输入");
}
}
}
public static void Administrator_manu(){
Scanner In=new Scanner(System.in);
boolean flag=true;
while(flag){
System.out.println("请输入要查询的管理员功能序号:");
System.out.printf("1.初始化候选人信息\n2.浏览候选人简介\n3.修改候选人简介\n4.查询投票情况\n5.清除投票信息\n6.修改投票人用户账号和密码\n7.退出管理员系统\n");
switch(In.nextInt()){
case 1:
dir2.Initialize_message();
break;
case 2:
//System.out.println("请输入要查询的选手序号:");
dir1.show_all_message();
break;
case 3:
System.out.println("请输入要修改的选手序号:");
dir2.modify_message(In.nextLong());
break;
case 4:
dir2.getmaxvote();
break;
case 5:
dir2.clearvote();
break;
case 6:
//dir2.modify_userpass();
break;
case 7:
flag=false;
break;
default: break;
}
}
}
public static void voteman_manu(){
Scanner In=new Scanner(System.in);
//votemansystem dir1=new votemansystem();
boolean flag=true;
while(flag){
System.out.println("请输入要查询的投票人功能序号:");
System.out.println("1.浏览候选人列表 2.输入序号查询候选人介绍 3.退出投票人系统");
switch(In.nextInt()){
case 1:
dir1.show_all_message();
break;
case 2:
System.out.println("请输入要查询的选手序号:");
dir1.show_single_message(In.nextLong());
break;
case 3:
flag=false;
break;
default: break;
}
}
}
}
class votemansystem extends Administrator
{
long num;
String name;
String sex;
String status;//职业
int sumOfvote;
votemansystem next;
//votemansystem root;
//Scanner In=new Scanner(System.in);
public votemansystem(long num,String name,String sex,String status,int sumOfvote){
this.num=num;
//System.out.println("this.num="+num);
this.name=name;
this.sex=sex;
this.status=status;
this.sumOfvote=sumOfvote;
}
public votemansystem(){
}
/*public void vote(){
Scanner In=new Scanner(System.in);
System.out.println("请输入您想投的选手序号:");
long s_num=In.nextLong();//s_num为:选手序号
votemansystem issearch=search(s_num);
if(issearch!=null){//先查找,不在则提示,在则加票
System.out.println("该选手不存在,请重新输入:");
}
else{
issearch.sumOfvote++;
System.out.println("投票成功!");
}
}*/
public void show_all_message(){
if(dataArray.length!=0){
for(votemansystem show:dataArray){
System.out.println("序号:"+show.num+" 姓名:"+show.name+" 性别:"+show.sex+" 职业:"+show.status+" 票数为:"+show.sumOfvote);
}
}
else{
System.out.println("不存在用户!");
}
}
public void show_single_message(long ss_num){
boolean flag=false;
if(dataArray.length!=0){
for(votemansystem show:dataArray){
if(show.num==ss_num){
System.out.println("序号:"+show.num+" 姓名:"+show.name+" 性别:"+show.sex+" 职业:"+show.status+" 票数为:"+show.sumOfvote);
flag=true;
}
}
if(!flag){
System.out.println("该选手不存在!");
}
}
else{
System.out.println("不存在用户!");
}
}
}
class Administrator
{ static Scanner In=new Scanner(System.in);
static ArrayList<votemansystem> data=new ArrayList<votemansystem>();
static votemansystem []dataArray=new votemansystem[1];
static ArrayStack stack=new ArrayStack();//必须加static 才能和子类共享
static File file=new File("C:/safety/user_data");
public Administrator(){
}
public void Initialize_message(){//初始化数据
boolean flag=true;
long num=-1;
while(flag){
System.out.println("是否继续添加数据:y:是 n:否");
String judge=In.nextLine();
if(judge.equals("y")){
System.out.println("上次添加的用户序号为:"+stack.poll()+"请按照格式 “序号-姓名-性别-职业-票数” 添加新用户:");
num=In.nextLong();
In.nextLine();//吃掉"\n"
String name=In.nextLine();
String sex=In.nextLine();
String status=In.nextLine();//职业
int sumOfvote=In.nextInt();
In.nextLine();//吃掉"\n"
//添加用户信息
data.add(new votemansystem(num,name,sex,status,sumOfvote));
try{
BufferedWriter bw=new BufferedWriter(new FileWriter("C:/safety/user_data/"+num+".txt"));
bw.write(name+"\n"+sex+"\n"+status+"\n"+sumOfvote);//在创建好的文件中写入"Hello I/O"
bw.close();//一定要关闭文件
}
catch(IOException e){
e.printStackTrace();
}
if(stack.isfull()){
//覆盖最老的信息
for(int i=0;i<stack.max-1;i++){
stack.arr[i]=stack.arr[i+1];
}
}
}
else if(judge.equals("n")){
flag=false;
up_dataArray(data);//添加完数据后自动更新用户数组(数据库)
stack.add(num);//最后一次数据入栈
stack.quicksort(dataArray,0,dataArray.length-1);//数组更新后直接排序
System.out.println("==添加用户信息退出==");
}
else{
System.out.println("输入不正确,请重新输入:");
}
}
}
public void up_dataArray(ArrayList<votemansystem> up_data ){
votemansystem []dataArray=up_data.toArray(new votemansystem[0] );
this.dataArray=dataArray;
}
public void modify_message(long sss_num){
boolean flag=false;
int index=stack.search(dataArray,0,dataArray.length-1,sss_num);
if(index!=-1){
System.out.println("请按照格式修改投票者信息:序号-姓名-性别-职业-票数");
long num=In.nextLong();
In.nextLine();//吃掉"\n"
String name=In.nextLine();
String sex=In.nextLine();
String status=In.nextLine();//职业
int sumOfvote=In.nextInt();
In.nextLine();//吃掉"\n"
dataArray[index].num=num;
dataArray[index].name=name;
dataArray[index].sex=sex;
dataArray[index].status=status;
dataArray[index].sumOfvote=sumOfvote;
File[] list = file.listFiles();
if (list.length == 0) {
System.out.println("数据库为空");
}
else {
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);//输出文件名
System.out.println("C:\\safety\\user_data\\"+sss_num+".txt");
if(list[i].equals("C:\\safety\\user_data\\"+sss_num+".txt")){
File f=new File("C:/safety/user_data/"+sss_num+".txt");
System.out.println("C:/safety/user_data/"+sss_num+".txt");//输出文件名
f.delete();
/*try{
BufferedWriter bw=new BufferedWriter(new FileWriter("C:/safety/user_data/"+num+".txt"));
bw.write(name+"\n"+sex+"\n"+status+"\n"+sumOfvote);//在创建好的文件中写入"Hello I/O"
bw.close();//一定要关闭文件
}
catch(IOException e){
e.printStackTrace();
}*/
flag=true;
}
}
if(!flag){
System.out.println("数据库数据修改失败!");
}
}
stack.quicksort(dataArray,0,dataArray.length-1);//数组更新后直接排序
}
else{
System.out.println("该用户不存在!");
}
}
public void getmaxvote(){
int max=-1;
long s_num=-1;
for(votemansystem max_:dataArray){
if(max_.sumOfvote>max){
max=max_.sumOfvote;
s_num=max_.num;
}
}
System.out.println("~~票数最多的选手为"+s_num+",总票数为:"+max);
}
public void clearvote(){
for(votemansystem clear:dataArray){
clear.sumOfvote=0;
}
System.out.println("==票数重置完毕==");
}
public void modify_user_pass(String user_name){//只修改账号和密码
try{
FileOutputStream fos = new FileOutputStream(user_name);
System.out.println("请输入新的用户名:");
String new_username=In.nextLine();
System.out.println("请输入新的用户密码:");
String new_userpass=In.nextLine();
byte[] bytes1 = new_username.getBytes();
fos.write(bytes1);
byte[] bytes2 = new_userpass.getBytes();
fos.write(bytes2);
fos.close();
System.out.println("修改账号密码成功!");
}
catch(IOException e){
e.getStackTrace();
}
}
}
class safety
{
static Scanner In=new Scanner(System.in);
public safety(){
}
public boolean user_certification(){
if(zhanghao()){
return true;
}
return false;
}
public static boolean zhanghao(){
System.out.println("请输入用户名:");
String user_name=In.nextLine();
String logKakunePath="C:/safety/user_password";
File linkFile = new File(logKakunePath);
String[] fname=linkFile.list();//包含所有当前文件夹下的目录名
for(int i = 0; i < fname.length;i++){
//System.out.println(fname[i]);
if((user_name+".txt").equals(fname[i])){
System.out.println("通过");
System.out.println("请输入密码:");
if(mima(logKakunePath+"/"+fname[i])){
//break;
return true;
}
return false;
}
}
return false;
}
public static boolean mima(String z_h){
File new_file=new File(z_h);
//密码输入
String pri_in=In.nextLine();
try
{
BufferedReader in = new BufferedReader(new FileReader(z_h));
String str;
while ((str = in.readLine()) != null)
{
//System.out.print(str);
if(str.equals(pri_in)){
System.out.println("验证通过");
System.out.println("暴打老年!!!");
return true;
}
else{
System.out.println("验证失败");
}
}
in.close();
}
catch (IOException e)
{
e.getStackTrace();
}
return false;
}
}
class ArrayStack
{
int max;
int cur;
long []arr;
public ArrayStack(){
max=10;
cur=-1;
arr=new long[max];
}
public boolean isfull(){
return cur==max;
}
public boolean isempty(){
return cur==-1;
}
public void add(long x){
if(!isfull()){
arr[++cur]=x;
}
else{
System.out.println("栈空间已满");
}
}
public long poll(){
if(!isempty()){
return arr[cur--];
}
else{
System.out.println("栈空间为空");
return -1;
}
}
public void quicksort(votemansystem []dataArray,int l,int r){
int left=l;
int right=r;
long mid=dataArray[(left+right)/2].num;
while(left<right){
while(dataArray[left].num<mid){//最极端的情况是和mid相等,不会越界
left++;
}
while(dataArray[right].num>mid){
right--;
}
if(left>=right){
break;
}
votemansystem t;
t=dataArray[left];
dataArray[left]=dataArray[right];
dataArray[right]=t;
//一边先走完,可能到头mid就停止,另一边可能还没走完
if(dataArray[left].num==mid){
left++;//做下一次递归的左端
}
if(dataArray[right].num==mid){
right--;
}
if(left==right){
left++;
right--;
}
if(l<right){
quicksort(dataArray,l,right);
}
if(left<r){
quicksort(dataArray,left,r);
}
}
}
//二分查找
public int search(votemansystem []dataArray,int left,int right,long num){
//没有找到,即left>right
if(left>right){
return -1;
}
int mid=(right+left)/2;
if(dataArray[mid].num<num){
return search(dataArray,mid+1,right,num);//右递归
}
else if(dataArray[mid].num>num){
return search(dataArray,left,mid-1,num);
}
else{
return mid;
}
}
}