(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; }
/*********************************************************** * 版权所有 (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; } } } }运行结果: