数据结构课设--电子投票系统

1 项目描述
电子投票系统是指以电子方式进行投票,也指通过电子方式统计票数的一种方式。
投票人主要功能如下:
(1)投票人输入要选举的候选人编号,即可完成投票。
(2)投票人可以浏览候选人列表、输入序号查询候选人介绍。
管理员的主要功能如下:
(1)初始化候选人信息:在系统投入使用前需要先将需要投票选举的候选人信息录入系统中,以便投票和查看。管理员的初始化工作就是将候选人的序号、姓名和简介录入系统。
(2)浏览候选人简介:为随时掌握候选人的信息,以便进行修改,管理员有权浏览候选人简介。浏览的顺序按照候选人序号即可。
(3)修改候选人简介:当系统更新或候选人信息有所变化时,输入候选人序号对其信息进行修改。
(4)查询投票情况:管理员有权查询当前各个候选人得票情况,以便得出最终被选出的候选人信息。
(5)清除投票信息:当投票工程结束后,管理员选择清除投票信息即清除系统中所有候选人的票数,使之归零。
(6)管理员可以对投票人进行管理,投票人只有用管理员规定的用户名和密码才能进入系统进行投票。管理员还可以更改用户名、密码和权限,并对投票人信息进行增加、删除、查询、初始化等操作。

2 数据及其逻辑结构分析

ADT Evoting
{
数据对象:
	D={a1,a2,,ad,b1,b2,,bd|i=1,,i=d}
数据关系:
	R={ r1,r2,,rd}
	r1={<a1…i…d,a1…i+1…d>|1<=k<=bk,,1<=k>=d且k!=I,1<=i<=bi-1,i=1,…d}
基本运算:
candidate InitList();//初始化链表 被投票人 
user InitList1();//初始化链表 投票人 
candidate initialize();//初始化候选人
user newuser();//新建用户 
bool login(char name[20],char ps[8]);//用户登录 
void query();//查询投票情况 按票数降序输出 
void change();//修改候选人信息 
void read();//浏览候选人信息 
void vote();//用户投票 
void clear();//清除投票信息 
void Adnotice();//管理员须知
void usernotice();//用户须知
void changeps();//更改用户密码
void deluser();//删除用户信息
}

3 数据的存储结构设计

typedef struct candidate//候选人数据结构体
{
    char number[101];//候选人编号
    char name[20];//候选人姓名
    char intro[400];//候选人简介
    int vote;//候选人得票数
    struct candidate *next;
}candidate;
typedef struct user//投票者数据结构体
{
  char name[20];//投票者姓名
  char ps[8];//对应密码
  int cnt;
  struct user *next;
}user;
candidate L1;
user L2;

数据的存储结构主要采用链表,使用这种数据结构来对信息进行添加、删除、修改等操作时比较方便,同时此结构简单方便出现Bug的时候容易及时做出修改。

4 项目主要算法
冒泡排序

bubblesort(A)
{
   for i = 1 to length[A]
   {
       for j = length[A] to i+1
       {
           if A[j] < A[j-1]
           {
                exchane A[j] and A[j-1];
           }
       }
   }
}

性质:1、时间复杂度:O(n^2)
2、空间复杂度:O(1)
3、稳定排序

顺序查找:
输入要查找的内容k;
While(链表不为空){
If(k= =目标内容)
进行相应操作;
}
链表为空后依旧没有找到,输出未找到;
最好情况:要查找的第一个就是。时间复杂度为:O(1)
最坏情况:最后一个是要查找的元素。时间复杂度为:O(n)
平均情况:时间复杂度为:O(n)

源程序:

/***********************************************************
* 版权所有 (C)2021, 
*
* 文件名称: Evoting.h
* 文件标识:无
* 内容摘要:函数文件
* 其它说明:各个模块函数 
* 当前版本: V1.0
* 作   者:
* 完成日期: 20211222
*
* 修改记录1:
* 修改日期: 20211222
* 版本号: V1.0
* 修改人: 
* 修改内容:创建
**********************************************************/
#include <bits/stdc++.h>
using namespace std;
int n=1,c=0;
typedef struct candidate//候选人数据结构体
{
    char number[101];//候选人编号
    char name[20];//候选人姓名
    char intro[400];//候选人简介
    int vote;//候选人得票数
    struct candidate *next;
}candidate;

typedef struct user//投票者数据结构体
{
  char name[20];//投票者姓名
  char ps[8];//对应密码
  int cnt;//用户票数 
  struct user *next;
}user;

candidate L1;
user L2;

candidate InitList();//初始化链表 被投票人 
user InitList1();//初始化链表 投票人 
bool login(char name[20],char ps[8]);//用户登录 
candidate initialize();//初始化候选人
user newuser();//新建用户 
void query();//查询投票情况 按票数降序输出 
void change();//修改候选人信息 
void read();//浏览候选人信息 
void read1();//浏览候选人信息 
void vote();//用户投票 
void clear();//清除投票信息 
void Adnotice();//管理员须知
void usernotice();//用户须知
void changeps();//更改用户密码
void deluser();//删除用户信息 
candidate InitList()
{
	candidate *L1;
	L1=(candidate *)calloc(1,sizeof(candidate));
	L1->next=NULL;
}//初始化链表 被投票人 
user InitList1()
{
	user *L2;
	L2=(user *)malloc(sizeof(user));
	L2->next=NULL;
}//初始化链表 投票人 
/*********************************************************
* 功能描述:用户登录
* 输入参数: name-用户名 ps-密码
* 返回值: 1-成功   0-失败
************************************************************/
bool login(char name[20],char ps[8])//用户登录 
{
   user *p;
   p=&L2;
   int flag=0;
   while(p)
        {
            if(p!=NULL)
            {
                if(strcmp(p->name,name)==0&&strcmp(p->ps,ps)==0)
                {
					return 1;
                }
            }
            p=p->next;
        }
        if(!flag)
			return 0;
}
/*********************************************************
* 功能描述:用户投票
* 输入参数: name-用户名 num-编号
************************************************************/
void vote()//用户投票 
{
	char num[20],name[20];int flag=0,flag1=0;
	candidate *p;p=&L1;user *s;s=&L2;
	cout<<"请输入投票人姓名:";
	cin>>name;
	while(s){
		if(strcmp(s->name,name)==0&&s->cnt!=0)
		{
			cout<<"请输入您想投票的候选人的编号:";
			cin>>num;
    		while(p)
    		{
        		if(strcmp(p->number,num)==0)
        		{
        			p->vote++;
        			s->cnt--;
        			flag=1;flag1=1; 
        			cout<<"投票成功!"<<endl; 
					break;
				}
				p=p->next;
			}
		}
		
		s=s->next;
	} 
	if(flag1==0||flag==0){
	cout<<"没有找到您想要的投票人或者此投票人已投票!"<<endl;
	}		 
	system("pause");
}
/*********************************************************
* 功能描述:浏览候选人信息
* 输入参数: 无
************************************************************/
void read()//浏览候选人信息 
{
	candidate *p;
	p=&L1;
	p=p->next;
	while(p!=NULL)
	{
		
		cout<<"候选人编号:"<<p->number<<endl;
		cout<<"候选人姓名:"<<p->name<<endl;
		cout<<"候选人简介:"<<p->intro<<endl;
		cout<<"候选人票数:"<<p->vote<<endl;
		cout<<endl;
		p=p->next;
	}
	cout<<endl;
	system("pause");
}
/*********************************************************
* 功能描述:浏览用户信息
* 输入参数:无
************************************************************/
void read1()//浏览用户信息 
{
	user *p;
	p=&L2;
	p=p->next;
	while(p!=NULL)
	{
		
		cout<<"用户的用户名:"<<p->name<<endl;
		cout<<"用户密码:"<<p->ps<<endl;
		cout<<"用户票数:"<<p->cnt<<endl;
		cout<<endl;
		p=p->next;
	}
	cout<<endl;
	system("pause");
}
/*********************************************************
* 功能描述:修改候选人信息
* 输入参数: num-编号 intro-简介
************************************************************/
void change()//修改候选人信息 
{
	cout<<"请输入您想修改的候选人简介的编号:";
	char num[20];cin>>num;
    candidate *p;
    p=&L1;
    int s=0;
    while(p)
    {
        if(strcmp(p->number,num)==0)
        {
        	cout<<"请输入修改后的简介:";
			cin>>p->intro;
			s=1;
			cout<<"修改成功"<<endl;
			break;
		}
		p=p->next;
	}
	if(!s)
		cout<<"未找到该编号"<<endl;
	system("pause");
}
/*********************************************************
* 功能描述:更改用户密码
* 输入参数: name-用户名 ps-新密码
************************************************************/
void changeps()//更改用户密码
{
	cout<<"请输入您想修改的用户的用户名:";
	char name[20];cin>>name;
	user *p;
	p=&L2;
	int s=0;
	while(p)
	{
		if(strcmp(p->name,name)==0)
        {
        	cout<<"请输入修改后的密码:";
			cin>>p->ps;
			s=1;
			cout<<"修改成功"<<endl;
			break;
		}
		p=p->next;
	}
	if(!s)
	cout<<"未找到该用户"<<endl;
	system("pause");
}
/*********************************************************
* 功能描述:删除用户信息
* 输入参数: name-用户名
************************************************************/
void deluser()//删除用户信息 
{
	cout<<"请输入您想删除的用户的用户名:";
	char name[20];cin>>name;
	user *p;int s=0;
	p=&L2;
	p=p->next;
	while(p)
	{
		if(strcmp(p->name,name)==0)
        {
        	//p=p->next;
			free(p);
			s=1;
			cout<<"删除成功"<<endl;
			break;
		}
		p=p->next;
	}
	if(!s)
	cout<<"未找到该用户"<<endl;
	system("pause");
}
/*********************************************************
* 功能描述:查询投票情况
* 输入参数: 无
************************************************************/
void query()//查询投票情况 
{
	candidate *p;
	candidate *p1;
	bool flag;
	p=&L1;
	p1=p->next;
	for(int i=0;i<c-1;i++)
	{
		p=p->next;
		for(int j=c-1;j>i;j--){
			if (p->vote < p1->vote) {
			swap(p->vote,p1->vote);
            swap(p->name,p1->name);
            swap(p->intro,p1->intro);
            swap(p->number,p1->number);
            }
            flag=true;
         	p = p->next;
		}
	
	}
	read();

}
/*********************************************************
* 功能描述:新建用户
* 输入参数: name-用户名 ps-密码
************************************************************/
user newuser()//新建用户 
{
	char name[20];char ps[8];int c='y'; 
	user *s,*r;
	s=&L2;
    while(s->next!=NULL)
        s=s->next;
    r=s;
    s=(user *)malloc(sizeof(user));
	 	printf("用户名:");
	 	cin>>s->name;cout<<endl;
		printf("密码:");
		cin>>s->ps;cout<<endl;
		s->cnt=1;
    	r->next=s;
    	r=s;
    	r->next=NULL;
    	r=s;
    	cout<<"新建成功"<<endl; 
	system("pause");
	return L2;
}
/*********************************************************
* 功能描述:清除投票信息 
* 输入参数:无
************************************************************/
void clear()//清除投票信息 
{
	candidate *p=&L1;
	while(p)
	{
		p->vote=0;
		p=p->next;
	}
	cout<<"清除成功"<<endl;
	system("pause");
}
/*********************************************************
* 功能描述:初始化候选人
* 输入参数: name-候选人姓名 num-候选人编号 intro-候选人简介
************************************************************/
candidate initialize()//初始化候选人 
{
	long number;char name[20];char intro[400];int c='y'; 
	candidate *s,*r;
	s=&L1;
    while(s->next!=NULL)
        s=s->next;
    r=s;
    s=(candidate *)malloc(sizeof(candidate));
    	printf("编号:");
    	cin>>s->number;cout<<endl;
    	printf("候选人姓名:");
    	cin>>s->name;cout<<endl;
    	printf("候选人简介:");
    	cin>>s->intro;cout<<endl;
    	s->vote=0;
    	r->next=s;
    	r=s;
    	r->next=NULL;
    	r=s;
    cout<<"新建成功"<<endl; 
	system("pause");
    return L1; 
}

void Adnotice()
{
	system("cls");
	system("Color 04");
	printf("1.候选人编号应在100以内\n\n");
	printf("2.候选人和用户姓名不超过20个字符\n\n");
	printf("3.候选人简介在400字以内\n\n");
	printf("4.用户密码不超过8位\n\n");
	printf("5.用户密码可以是数字或英文\n\n");
	system("pause");
	system("Color 07");
	system("cls");
}

void usernotice()
{
	system("cls");
	system("Color 04");
	printf("1.每名用户初始都有一票\n\n");
	printf("2.严禁刷票行为\n\n");
	printf("3.请严格按照菜单指引进行各项操作\n\n");
	system("pause");
	system("Color 07");
	system("cls");
}
/***********************************************************
* 版权所有 (C)2021, 
*
* 文件名称: main.cpp
* 文件标识:无
* 内容摘要:函数文件
* 其它说明:无
* 当前版本: V1.0
* 作   者:
* 完成日期: 20211222
*
* 修改记录1:
* 修改日期: 20211222
* 版本号: V1.0
* 修改人:
* 修改内容:创建
**********************************************************/
#include <iostream>
#include "Evoting.h"
#include<conio.h>
using namespace std;
int main()
{
	while(n!=0){
	cout<<"************************************"<<endl;
	cout<<"*	欢迎登陆电子投票系统       *"<<endl;	 
	cout<<"*	1.用户登录:                *"<<endl; 
	cout<<"*	2.管理员登录:              *"<<endl;
	cout<<"*	3.管理员须知:              *"<<endl;
	cout<<"*	4.用户须知:                *"<<endl;
	cout<<"*	0.退出:                    *"<<endl;
	cout<<"************************************"<<endl;
	cout<<"请在登录之前仔细阅读须知!!!"<<endl;
	printf("请输入选择:");
	int n;
	cin>>n;	
	InitList();
	InitList1();	
	if(n==0)
	return 0;
	if(n==1)
	{			
		char name[20],password[8];
		int i=0;string PassWord1,PassWord2;
		printf("用户名:");
		cin>>name;
		printf("密码:");
		while(1)
		{
			password[8] = _getch();//获取输入的密码
			if (password[8] == 13)//回车返回
			{
				break;
			}	
			if (password[8] == 8)//退格
			{
				if (PassWord1.length() == 0)	//如果第一个键为退格键
				{
					cout << "密码为空,请输入密码:";
					continue;
				}	
				cout << "\b \b";
				i++;//清除所要删掉的字符
				PassWord1[PassWord1.length() - i] = '\0';	//清除所要删掉的字符
			}
			else
			{
				PassWord1 += password[8];
				cout << "*";
			}
		}
		for(i=0;i<PassWord1.length();i++)
			password[i]=PassWord1[i];
		while(!login(name,password)){
			cout<<"用户不存在或密码错误"<<endl;
			cout<<"1.请重新输入:"<<endl;
			cout<<"2.退出"<<endl;
			int n;cin>>n;
			if(n==1){
				printf("用户名:");
				cin>>name;
				printf("密码:");
				while(1)
				{
					password[8] = _getch();//获取输入的密码
					if (password[8] == 13)//回车返回
					{
						break;
					}	
					if (password[8] == 8)//退格
					{
						if (PassWord2.length() == 0)//如果第一个键为退格键
						{
							cout << "密码为空,请输入密码:";
							continue;
						}	
						cout << "\b \b";
						i++;//清除所要删掉的字符
						PassWord2[PassWord2.length() - i] = '\0';//清除所要删掉的字符
					}
					else
					{
						PassWord2 += password[8];
						cout << "*";
					}
				}
				for(i=0;i<PassWord2.length();i++)
				password[i]=PassWord2[i];
			} 
			else
				break;
		}
		if(login(name,password)){
			int choice;
			do{
				system("cls");
				system("Color 06");
				printf("1.投票:\n\n");
 				printf("2.浏览候选人信息:\n\n");
 				printf("3.退出:\n\n");
 				printf("请输入选择:");
 				cin>>choice;
 				switch(choice)
 				{
 					case 1:
 						vote();
 						break;
 					case 2:
 						system("cls");
 						read(); 
 						break;
 					case 3:	
					 	system("cls");
						system("Color 07");	
 						break;
				}
			}while(choice!=3);
		}	 		
	}	
	if(n==2)
	{	
		int name,password,choice,m;string root;
		cout<<"验证管理员身份:"; 
		cin>>root;
		if(root=="lzx"){
		do{
			system("cls");
			system("Color 1F");
			printf("1.初始化候选人信息:\n\n");
 			printf("2.浏览候选人信息:\n\n");
 			printf("3.修改候选人简介:\n\n");
 			printf("4.查询投票情况:\n\n");
 			printf("5.清除投票信息:\n\n");
 			printf("6.管理用户:\n\n");
 			printf("7.退出:\n");
 			printf("------------------------------\n");
 			printf("请输入选择:");
 			cin>>choice;
 			switch(choice)
 			{
 				case 1:
 					system("cls");
 					initialize(); 
 					break;
 				case 2:
 					system("cls");
 					read();
 					break;
 				case 3:
 					system("cls");
 					change();
 					break;
 				case 4:
 					system("cls");
 					query();
 					break;
 				case 5:
 					system("cls");
 					clear();
 					break;
 				case 6:
 					do{
 						system("cls");
 						printf("1.新建用户:\n\n");
 						printf("2.更改用户密码:\n\n");
 						printf("3.查询用户信息:\n\n");
 						printf("4.删除用户:\n\n");
 						printf("5.返回:\n\n");
 						printf("请输入选择:");
						cin>>m;
						switch(m)
						{
						case 1:
							system("cls");
							newuser();
							break;
						case 2:
							system("cls");
							changeps(); 
							break;
						case 3:
							system("cls");
							read1();
							break;
						case 4:
							system("cls");
							deluser();
							break;
						case 5:
							system("cls");							
							break;
						}	
					}while(m!=5);				
 					break;
				case 7:
					system("cls");
					system("Color 07");
					break;					 					 					  				
			}	
		}while(choice!=7);
	}
	else
		cout<<"无权限!"<<endl;
}
	if(n==3)
	{
		Adnotice();
	}
	if(n==4)
	{
		usernotice();
	} 
	} 
	return 0;
}

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耗子煨汁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值