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;
}