注:本文章虽然没有什么很有难度的东西,但是是本身亲自手敲的第一个具有完整功能的增删改查的系统(不带数据库),转载时请注明,如果看到本文章有不错的地方想自己用,请稍作更改,谢谢。
(1)头文件:
/***********************************************************
* 版权所有 (C)2015, LiuQiang。
*
* 文件名称: head.h
* 文件标识:无
* 内容摘要:电子投票系统
* 其它说明:无
* 当前版本: V1.1
* 作 者:刘强
* 完成日期: 20151224
*
* 修改记录1:
* 修改日期: 20151220
* 版本号: V1.0
* 修改人: 刘强
* 修改内容:创建
*
* 修改记录2:
* 修改日期: 20151223
* 版本号: V1.1
* 修改人: 刘强
* 修改内容:多文件划分
**********************************************************/
#include<stdio.h>
#include<string.h>
#include<string>
#include<malloc.h>
#include<fstream>
#include<iostream>
#include<windows.h>
using namespace std;
struct xuanshou
{
string name;//姓名
int num;//序号
string zijie; //自我介绍
string sex; //性别
int piaoshu;//票数
xuanshou()
{
piaoshu=0;
}
struct xuanshou *next; //指向下一个人的指针
};
struct httype
{
xuanshou *link; //指向第一个人的指针
};
struct toupiaozhe
{
string name;
int num;
int mima;
int quanxian;//0为最低权限,2为最高
int cishu;//投票次数1
toupiaozhe()
{
quanxian=0;
cishu=1;
}
};
int h(int n); //实现哈希函数
int DispHT(httype ht[]);//输出哈希表
void cunpan(httype l[]);//存盘
void duqu(httype ht[]); //读取
void hash(string s[],int a[],httype ht[]); //创建哈希表
void chakanxinxi(); //查看选手信息
void toupiao(); //投票
void root(int a); //管理员
void genggai();//更改选手信息
void rootmima();//root用户的密码验证
void qingkuang(httype *ht);
void qingchu();//清除信息
void zhizhenchushihua();//ht中的指针置为NULL
void xierpaixu(xuanshou R[],int n) ;//希尔排序
void fanhui();//返回程序上一层
void zhuhuanying();//欢迎界面
void login();//登录界面
void zhuce();//注册用户
void cunpan2(toupiaozhe log[]);//将用户信息存盘
void duqu2(toupiaozhe l[]);//将用户信息读取
void zhuxiao();//注销
void genggai2();//更改用户信息
(2)主函数:
/***********************************************************
* 版权所有 (C)2015, LiuQiang。
*
* 文件名称: main.cpp
* 文件标识:无
* 内容摘要:电子投票系统
* 其它说明:无
* 当前版本: V1.1
* 作 者:刘强
* 完成日期: 20151224
*
* 修改记录1:
* 修改日期: 20151220
* 版本号: V1.0
* 修改人: 刘强
* 修改内容:创建
*
* 修改记录2:
* 修改日期: 20151223
* 版本号: V1.1
* 修改人: 刘强
* 修改内容:多文件划分
**********************************************************/
/*********************************************************
* 功能描述: main函数 调用函数
* 输入参数:`xinxi[]-指针数组
log[]-投票人信息
renshu-人数(投票人)
dangqian-当前人数
* 输出参数: 无
* 返回值 : 0-系统需要
* 其它说明: 无
************************************************************/
#include"head.h"
httype xinxi[17];
toupiaozhe log[100];
int renshu=0;
int dangqian;
int main()
{
zhizhenchushihua();//将指针数组所有值置为空
duqu(xinxi);
duqu2(log);//将文件中的信息读入
login();//登录
zhuhuanying();//欢迎界面
cunpan(xinxi);
cunpan2(log);//储存信息
return 0;
}
(3)源文件:
/***********************************************************
* 版权所有 (C)2015, LiuQiang。
*
* 文件名称: shixianhanshu.cpp
* 文件标识:无
* 内容摘要:电子投票系统
* 其它说明:无
* 当前版本: V1.1
* 作 者:刘强
* 完成日期: 20151224
*
* 修改记录1:
* 修改日期: 20151220
* 版本号: V1.0
* 修改人: 刘强
* 修改内容:创建
*
* 修改记录2:
* 修改日期: 20151223
* 版本号: V1.1
* 修改人: 刘强
* 修改内容:多文件划分
**********************************************************/
#include"head.h"
extern struct httype xinxi[17];
extern struct toupiaozhe log[100];
extern int renshu;
extern int dangqian;
/*********************************************************
* 功能描述: 哈希函数 生成数据存储位置
* 输入参数: 候选人的序号
* 输出参数: 无
* 返回值 : 数值取余运算的结果
* 其它说明: 无
************************************************************/
int h(int n) //实现哈希函数
{
return n%17;
}
/*********************************************************
* 功能描述: 存储函数 存储候选人的信息到文件
* 输入参数: l[]-存储指针的数组
* 输出参数: f1.txt-输出文件名
* 返回值 : 无
* 其它说明: 无
************************************************************/
void cunpan(httype l[])
{
int i=0;
httype a;
ofstream outfile("f1.txt",ios::binary);
if(!outfile)
{
exit(1);
}
i=0;
while(i<17)
{
a=l[i];
while(a.link!=NULL)
{
outfile<<a.link->name<<' '<<a.link->num<<' '<<a.link->zijie<<' '<<a.link->sex<<' '<<a.link->piaoshu;
outfile<<"\r\n";
a.link=a.link->next;
}
i++;
}
outfile.close();
}
/*********************************************************
* 功能描述: 读取函数 读取候选人的信息到文件
* 输入参数:`无
* 输出参数: ht[]-指针数组
* 返回值 : 无
* 其它说明: 无
************************************************************/
void duqu(httype ht[])
{
int i,j;
xuanshou *q;
ifstream infile("f1.txt",ios::binary);
if(!infile)
{
cout<<"您是第一次使用本系统"<<endl;
}
else
{
for(i=0; i<17; i++)
{
q=new xuanshou;
infile>>q->name>>q->num>>q->zijie>>q->sex>>q->piaoshu;
q->next=NULL;
j=h(q->num);
if(ht[j].link==NULL)
{
ht[j].link=q;
}
else
{
q->next=ht[j].link;
ht[j].link=q;
}
infile.get();
}
}
infile.close();
}
/*********************************************************
* 功能描述: 哈希函数-建立哈希表
* 输入参数:`xs[]-选手信息
ht[]-指针数组
n-需要储存的个数
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void hash(xuanshou xs[],httype ht[],int n)
{
int i,j; //i是计数器,j是制定存储位置的
xuanshou *q;
for(i=0; i<n; i++)
{
q=new xuanshou;
q->name=xs[i].name;
q->num=xs[i].num;
q->zijie=xs[i].zijie;
q->sex=xs[i].sex;
q->piaoshu=xs[i].piaoshu;
q->next=NULL;
j=h(xs[i].num);
if(ht[j].link==NULL)
{
ht[j].link=q;
}
else
{
q->next=ht[j].link;
ht[j].link=q;
}
}
cunpan(xinxi);
}
/*********************************************************
* 功能描述: 输出函数,显示选手信息
* 输入参数: ht[]-指针数组
* 输出参数: p->num-选手的序号
p->name->选手的名字
p->sex->选手的性别
p->zijie->选手的自我介绍
* 返回值 : 无
* 其它说明: 无
************************************************************/
int DispHT(httype ht[])
{
int i,j=1,k=0;
xuanshou *p;
for(i=0; i<17; i++)
{
p=ht[i].link;
if(p==NULL)
k++;
while(p!=NULL)
{
cout<<j;
cout<<"学号:"<<p->num;
cout<<" 姓名:"<<p->name;
cout<<" 性别:"<<p->sex;
cout<<" 自我介绍:"<<p->zijie;
p=p->next;
cout<<endl;
j++;
}
}
if(k==17)
{
cout<<"管理员未在此系统中登入信息。"<<endl;
return 1;
}
}
/*********************************************************
* 功能描述: 初始化-将选手信息录入系统
* 输入参数:`xs[]-选手信息
xinxi[]-指针数组
n-需要储存的个数
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void chushihua()
{
int n,cuowu;//n人数
int yanzheng;
int i=0;
xuanshou xs[100];
httype a;
cout<<"请输入您想录入的人数"<<endl;
cin>>n;
while(i<n)
{
cout<<"学号"<<endl;
cin>>xs[i].num;
yanzheng=h(xs[i].num);
a.link=xinxi[yanzheng].link;
while(a.link!=NULL)
{
if(a.link->num==xs[i].num)
{
cout<<"您输入的选手已录入系统"<<endl;
cout<<"如果想更改选手的信息请按1,重新初始化请按0"<<endl;
cin>>cuowu;
if(cuowu==1)
{
genggai();
}
else if(cuowu==0)
{
chushihua();
root(1);
}
}
a.link=a.link->next;
}
cout<<"请输入姓名";
cin>>xs[i].name;
cout<<"请输入性别"<<endl;
cin>>xs[i].sex;
cout<<"请输入自我介绍"<<endl;
cin>>xs[i].zijie;
i++;
}
hash(xs,xinxi,n);
}
/*********************************************************
* 功能描述: 查看选手信息
* 输入参数:`xinxi[]-指针数组
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void chakanxinxi() //查看选手信息
{
DispHT(xinxi);
}
/*********************************************************
* 功能描述: 给选手投票
* 输入参数:`n-选手序号
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void toupiao() //投票
{
int n,m;
httype a;
int k=DispHT(xinxi);
if(k==1)
{
}
else
{
if(log[dangqian].cishu!=0)
{
cout<<"按照学生的学号进行投票"<<endl;
cin>>n;
m=h(n);
a=xinxi[m];
while(a.link!=NULL)
{
if(a.link->num==n)
{
a.link->piaoshu++;
log[dangqian].cishu=0;
break;
}
else
a.link=a.link->next;
}
}
else
{
cout<<"您的投票次数已经用完!"<<endl;
}
cunpan(xinxi);
}
}
/*********************************************************
* 功能描述: 管理员函数
* 输入参数:`n-选手序号
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void root(int a) //管理员
{
int xuanxiang;
if(a==0)
rootmima();
Sleep(1000);
system("cls");
system("Color 0C");
while(1)
{
cout<<"请输入选项:"<<endl;
cout<<"请输入您想使用的功能:"<<endl;
cout<<"1.初始化选手信息"<<endl;
cout<<"2.浏览候选人简介"<<endl;
cout<<"3.修改候选人简介"<<endl;
cout<<"4.查看当前投票情况"<<endl;
cout<<"5.清除所有信息"<<endl;
cout<<"6.返回上一层"<<endl;
cout<<"7.修改投票人的信息"<<endl;
cout<<"请输入您的选择:";
cin>>xuanxiang;
switch(xuanxiang)
{
case 1:
chushihua();
break;
case 2:
chakanxinxi();
break;
case 3:
genggai();
break;
case 4:
qingkuang(xinxi);
break;
case 5:
qingchu();
break;
case 6:
fanhui();
break;
case 7:
genggai2();
break;
}
}
}
/*********************************************************
* 功能描述: 管理员密码管理
* 输入参数:`mima-用户输入的密码
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void rootmima()
{
string mima;
int i=3;
cout<<"请输入密码:";
while(i>=0)
{
cin>>mima;
if(mima=="admin")
{
cout<<"密码正确,正在跳转,请稍后";
break;
}
else
{
cout<<"密码输入错误,您还有"<<i<<"次机会(如果错误三次将会冻结)";
i--;
}
}
}
/*********************************************************
* 功能描述: 管理员更改选手信息
* 输入参数:`xuhao-选手的序号
n-更改的项目序号
na-临时变量可代表名字,性别,自我介绍。
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void genggai()
{
int xuhao; //选择序号
DispHT(xinxi);
cout<<"请输入需要更改的选手的学号:";
cin>>xuhao;
int n,m,p; //m为哈希表临时变量,n为更改选项
httype a; //指针数组临时变量
string na; //字符串临时变量
m=h(xuhao);
a=xinxi[m];
while(a.link!=NULL)
{
if(a.link->num==xuhao)
{
break;
}
else
a.link=a.link->next;
}
cout<<"1.请输入新的姓名"<<endl;
cout<<"2.请输入新的性别"<<endl;
cout<<"3.请输入新的自我介绍"<<endl;
cout<<"请输入需要更改的项目:";
cin>>n;
switch(n)
{
case 1:
{
cout<<"请输入新的名字:";
cin>>na;
a.link->name=na;
}
break;
case 2:
{
cout<<"请输入新的性别:";
cin>>na;
a.link->sex=na;
}
break;
case 3:
{
cout<<"请输入新的自我介绍:";
cin>>na;
cout<<"如果想全部修改请按1,插入到后边请按2.";
cin>>p;
if(p==1)
a.link->zijie=na;
else if(p==2)
{
a.link->zijie=a.link->zijie+na;
}
}
break;
}
}
/*********************************************************
* 功能描述: 管理员清楚选手信息
* 输入参数:`无
* 输出参数: 无
* 返回值 : 无
* 其它说明: 删除系统中储存文件,释放内存中的空间。
************************************************************/
void qingchu()
{
int i,j=1;
xuanshou *p=NULL;
xuanshou *q=NULL;
for(i=0; i<17; i++)
{
p=xinxi[i].link;
if(p!=NULL)
{
q=p;
p=p->next;
}
while(p!=NULL)
{
delete q;
q=p;
p=p->next;
}
if(p==NULL&&q!=NULL)
{
delete q;
q=NULL;
}
}
DeleteFile("f1.dat");
zhizhenchushihua();
}
/*********************************************************
* 功能描述: 管理员清楚选手信息
* 输入参数:`无
* 输出参数: 无
* 返回值 : 无
* 其它说明: 将指针数组置为NULL。
************************************************************/
void zhizhenchushihua()
{
int i;
for(i=0; i<17; i++)
{
xinxi[i].link=NULL;
}
}
/*********************************************************
* 功能描述: 管理员查看选手票数排名
* 输入参数:`k- 1全部输出(排序)
- 2指定输出
ht-指针数组
* 输出参数: p->num-选手的序号
p->name->选手的名字
p->sex->选手的性别
p->zijie->选手的自我介绍
* 返回值 : 无
* 其它说明: 无
************************************************************/
void qingkuang(httype *ht)
{
int i,j=0,k;//k为选择全部输出还是单个输出
xuanshou *p;
xuanshou a[100];
for(i=0; i<17; i++)
{
p=ht[i].link;
while(p!=NULL)
{
a[j].num=p->num;
a[j].name=p->name;
a[j].sex=p->sex;
a[j].zijie=p->zijie;
a[j].piaoshu=p->piaoshu;
p=p->next;
j++;
}
}
xierpaixu(a,j);
i=j-1;
cout<<"查看所有选手的排名请按1,查看某位选手的排名及票数请按2."<<endl;
cin>>k;
if(k==1)
{
while(i>=0)
{
cout<<"学号:"<<a[i].num<<endl;
cout<<endl;
cout<<"姓名:"<<a[i].name<<endl;
cout<<endl;
cout<<"性别:"<<a[i].sex<<endl;
cout<<endl;
cout<<"票数:"<<a[i].piaoshu<<endl;
i--;
}
}
else if(k==2)
{
cout<<"请输入选手的学号"<<endl;
cin>>k;
int t=h(k);
httype a;
a=xinxi[t];
while(a.link!=NULL)
{
if(a.link->num==k)
{
cout<<"学号:"<<a.link->num<<endl;
cout<<"姓名:"<<a.link->name<<endl;
cout<<"性别:"<<a.link->sex<<endl;
cout<<"票数:"<<a.link->piaoshu<<endl;
break;
}
else
{
a.link=a.link->next;
}
}
}
}
/*********************************************************
* 功能描述: 排序 希尔排序
* 输入参数:`R[] -选手信息
n - 选手个数
* 输出参数: 无
* 返回值 : 无
* 其它说明: 将链表中的数据读入数组进行排序
************************************************************/
void xierpaixu(xuanshou R[],int n) //希尔排序
{
int i,j,gap;
xuanshou tmp;
gap=n/2; //增量置初值
while (gap>0)
{
for (i=gap; i<n; i++) //对所有相隔gap位置的所有元素组进行排序
{
tmp=R[i];
j=i-gap;
while (j>=0 && tmp.piaoshu<R[j].piaoshu)//对相隔gap位置的元素组进行排序
{
R[j+gap]=R[j];
j=j-gap;
}
R[j+gap]=tmp;
j=j-gap;
}
gap=gap/2; //减小增量
}
}
/*********************************************************
* 功能描述: 从root界面返回一般界面
* 输入参数:`无
* 输出参数: 无
* 返回值 : 无
* 其它说明: 清屏并调用欢迎界面
************************************************************/
void fanhui()
{
system("cls");
zhuhuanying();
}
/*********************************************************
* 功能描述: 用户欢迎界面
* 输入参数:`xuanze- 用户的功能输入选择
* 输出参数: 无
* 返回值 : 无
* 其它说明: 输出功能选项并执行相应的功能
************************************************************/
void zhuhuanying()
{
int xuanze;//选项号
system("cls");
system("color 1A");
while(1)
{
system("color 1A");
cout<<" "<<log[dangqian].name<<"同学欢迎使用学生投票系统!"<<endl;
cout<<"********************************************************************************"<<endl;
cout<<" 请输入您想使用的功能:"<<endl;
cout<<" 1.查看候选人的介绍。 "<<endl;
cout<<" 2.投票。"<<endl;
cout<<" 6.注销当前用户"<<endl;
cout<<" 8.管理员选项(非管理员勿动!)"<<endl;
cout<<" 0.退出。"<<endl;
cout<<"********************************************************************************"<<endl;
cout<<" 请输入您的选择:";
cin>>xuanze;
if(xuanze==0)
{
cunpan(xinxi);
cunpan2(log);
exit(1);
}
switch(xuanze)
{
case 1:
chakanxinxi();
break;
case 2:
toupiao();
break;
case 6:
zhuxiao();
break;
case 8:
root(0);
break;
}
}
}
/*********************************************************
* 功能描述: 用户登录界面
* 输入参数:`a -用户名
t -密码
k -选项
* 输出参数: 无
* 返回值 : 无
* 其它说明: 输出功能选项并执行相应的功能
************************************************************/
void login()
{
string a; //用户名
int t; //密码
int k;//临时变量
int i=0;//计数器
cout<<"-------------------------------------------------------------------"<<endl;
cout<<"| 欢迎使用学生投票系统! |"<<endl;
cout<<"| 登陆请按1,注册请按8 |"<<endl;
cout<<"| |"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
cout<<" 请输入您的选择: ";
cin>>k;
if(k==1)
{
while(1)
{
cout<<" 请输入您的用户名:";
cin>>a;
if(a=="admin")
{
rootmima();
root(1);
}
cout<<" 请输入密码:";
cin>>t;
while(i<100)
{
if(log[i].name==a)
{
break;
}
i++;
}
dangqian=i;
if(i==100)
{
cout<<" 用户名不存在"<<endl;
i=0;
}
else if(i<=100&&log[i].mima!=t)
cout<<" 密码错误"<<endl;
else break;
}
}
else if(k==8)
{
zhuce();
·
}
system("cls");
if(log[dangqian].quanxian==1)
{
root(1);
}
}
/*********************************************************
* 功能描述: 用户注册界面
* 输入参数:`log[renshu].name -用户名
i -重复密码
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void zhuce()
{
int i;
cout<<"请输入您的姓名:"<<endl;
cin>>log[renshu].name;
cout<<"请输入您的学号:"<<endl;
cin>>log[renshu].num;
while(1)
{
cout<<"请输入您的密码:"<<endl;
cin>>log[renshu].mima;
cout<<"请再输入您的密码:"<<endl;
cin>>i;
if(i==log[renshu].mima)
{
cout<<"注册成功!正在跳转。"<<endl;
cout<<log[renshu].cishu<<' '<<log[renshu].quanxian;
Sleep(1000);
dangqian=renshu;
renshu++;
break;
}
else
cout<<"两次密码不一致,请重新输入"<<endl;
}
cunpan2(log);
}
/*********************************************************
* 功能描述: 读取投票者信息
* 输入参数:`无
* 输出参数: log[]-用户信息
* 返回值 : 无
* 其它说明: 无
************************************************************/
void duqu2(toupiaozhe log[])
{
int i;
ifstream in1("f2.txt",ios::binary);
if(!in1)
{
cout<<"该系统中还未有用户注册"<<endl;
}
else
{
i=0;
while(in1.peek()!= EOF)
{
in1>>log[i].name>>log[i].mima>>log[i].cishu>>log[i].quanxian>>log[i].num;
i++;
in1.get();
}
renshu=i-1;
in1.close();
}
}
/*********************************************************
* 功能描述: 存储投票者信息
* 输入参数:`log[]-用户信息
* 输出参数: 无
* 返回值 : 无
* 其它说明: 无
************************************************************/
void cunpan2(toupiaozhe log[])
{
int i;
ofstream out1("f2.txt",ios::binary);
if(!out1)
{
exit(1);
}
i=0;
while(i<renshu)
{
out1<<log[i].name<<' '<<log[i].mima<<' '<<log[i].cishu<<' '<<log[i].quanxian<<' '<<log[i].num;
out1<<"\r\n";
i++;
}
out1.close();
}
/*********************************************************
* 功能描述: 用户注销
* 输入参数:`无
* 输出参数: 无
* 返回值 : 无
* 其它说明: 用户通过该模块可以登录别的账号
************************************************************/
void zhuxiao()
{
cout<<"你确定要注销?(y/n)";
char n;
cin>>n;
if(n=='y')
{
system("Color 0A");
system("cls");
login();
}
else
{
system("cls");
zhuhuanying();
}
}
/*********************************************************
* 功能描述: 更改投票者的信息
* 输入参数:`k-临时变量(int)
a-临时变量(string)
* 输出参数: 无
* 返回值 : 无
* 其它说明: 管理员可以更改投票者的信息
************************************************************/
void genggai2()
{
int i=0,j=0;
int t,k;
string a;
while(1)
{
cout<<"请输入您要更改的投票人的序号";
cin>>t;
while(i<100)
{
if(log[i].num==t)
{
break;
}
i++;
}
if(i==100)
{
cout<<"您输入的学号有误请重新输入"<<endl;
}
else
{
cout<<"请输入需要修改的项目"<<endl;
cout<<"1. 姓名"<<endl;
cout<<"2. 密码"<<endl;
cout<<"3. 学号"<<endl;
cout<<"4. 权限"<<endl;
cin>>t;
if(t==1)
{
cout<<"请输入您要修改的名字"<<endl;
cin>>a;
log[i].name=a;
break;
}
else if(t==2)
{
cout<<"请输入您要修改的密码"<<endl;
cin>>k;
log[i].mima=k;
break;
}
else if(t==3)
{
cout<<"请输入您要修改的次数"<<endl;
cin>>k;
log[i].cishu=k;
break;
}
else if(t==4)
{
cout<<"请输入您要修改的权限"<<endl;
cin>>k;
log[i].quanxian=k;
break;
}
}
}
}
运行结果: