数据结构-课程设计

/*?	电子投票系统
本项目功能多,可以由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;
		}
	}
}
posted @ 2019-12-11 20:55  东辰弈  阅读(373)  评论(0)    收藏  举报