1、电子投票系统C语言课程设计广东工业大学452020年4月19日文档仅供参考课程设计报告一、需求分析:1、 设计题目:电子投票系统2、设计内容及要求:(1)经过编程建立一个小型电子投票系统,其中包含电子投票、票数统计功能。尽量做到提供一个简单的人机界面,系统界面友好,使用方便。(2)软件的使用者分为两类,一类为管理员,能够对候选人信息进行初始化和修改,还可浏览候选人信息介绍,可对候选人的票数进行排序以及对系统的用户进行管理,创立使用者用户名和密码等。另一类为使用者普通投票者,该类用户需要用管理员分配的用户名和密码正确登录系统,能够查询候选人介绍、投票等。(投票是只需做到输入自己想要投票的候选人编
2、号即可完成投票) 3、系统功能分析:本系统程序功能:(1)投票者功能a.浏览所有候选人资料b.查询要了解的候选人的信息c.在了解候选人之后进行投票(2)管理员功能a.创立新的候选人资料b.创立新的用户资料c.查询要了解的候选人资料d.浏览所有的候选人资料e.对候选人票数进行统计并排序二、具体设计1、功能模块 (1)开始运行与结束运行界面模块开始运行显示有“电子投票系统”字样的界面,结束运行时则输出显示“感谢参与、再见”字样的界面。(2)功能选择模块根据输入的用户名和密码,分别进入管理员界面和投票者界面(3)身份验证模块验证管理员和投票者的用户名和密码是否正确,不正确可选择重新输入用户名和密码或
3、者退出。(4)投票人管理模块实现对投票人的管理功能,如创立投票人用户名和密码。主要用结构体类型的数组和文件的读写来完成数据的管理操作。 (5)候选人管理模块同投票人管理模块类似,要实现对大量有一定结构的信息进行管理的操作,如创立候选人,查询、浏览候选人信息。因此定义候选人信息结构体,用于存储候选人信息记录,而且将大量记录存储在硬盘文件中以便保存。用文件的读写函数实现各项功能。 (6)投票区模块投票区模块用于完成系统的主体功能,提示投票人输入自己想要选举的候选人序号,系统马上将该候选人对应的票数加一,并将当前的投票状况显示给投票人。因此该部分只需读取候选人信息文件,将对应的候选人票数加一后再写回
4、文件并显示即可。(7)票数管理模块:该模块具有对候选人票数进行排行和浏览两大功能。2、程序流程图三、源程序代码#include#include#include#include#include#define closegr closegraph#define N 30void welcome();/*欢迎 */void thans(); /* 再见 */void main_a(); /* 管理员主控平台 */void main_v(); /* 用户(投票者)主控平台 */void create(); /* 创立候选人 */void CreatUser();/* 创立用户 */void searc
5、h(); /* 查询候选人信息 */void browse(); /* 浏览候选人信息 */void vote(); /* 用户投票 */void read_c_man();/* 读取候选人信息 */void c_save(); /* 存储候选人信息*/int total=0,c_total=0;int i=0;/*候选人信息数据结构描述候选人的编号、姓名、简介和得票数量信息,作为候选人信息记录存在文件中*/typedef struct candidate long number; char name20; char intro400; int vote;candidate;/*系统用户数据结
6、构描述系统用户编号、用户名、密码和权限信息,作为一整条记录存放在文件中*/typedef struct user char name20; char ps8; int power;user;candidate c_manN;user total_userN;void read_c_man() char DataFile20=候选人.txt; FILE * fp=NULL; c_total=0; fp=fopen(DataFile,rb); if(fp=NULL) printf(nOpen file %s fail! End With any key n,DataFile); perror(Op
7、en file fail); getch(); exit(1); while(fread(&c_manc_total,sizeof(candidate),1,fp)!=(int)NULL) c_total+; fclose(fp);void c_save() FILE *fp=NULL; char DataFile20=候选人.txt;/* 存储投票人信息的文件名 */ fp=fopen(DataFile,wb); for(i=0;ic_total;i+) if(fwrite(&c_mani,sizeof(candidate),1,fp)!=1) printf(nwrite file is f
8、ail! End with any keyn,DataFile); perror(write file fail); getch(); exit(1); void byebye() thans();void vote() long candidatenum;/* 定义进行操作时的临时结构体变量 */ int i,flag; char DataFile20=候选人.txt,next; /* DataFile存储候选人信息的文件名,next为是否进行下一次投标操作的选项 */ candidate TempS; FILE *fp;begin: flag=0;/*flag用来标志是否找对应编号,即投票
9、是否成功*/ read_c_man(); printf(请输入您要投票的候选人的号码:); scanf(%ld,&candidatenum); printf(您所投票的候选人号码是:%ldn,candidatenum); for(i=0;ic_total;i+) if(c_mani.number=candidatenum) flag=1; c_mani.vote+; if(flag) printf(投票成功n); fp=fopen(DataFile,wb); /* 如果当前文件不存在,提示打开文件失败 */ if(fp=NULL) printf(nOpen file is fail!End w
10、ith any key.n,DataFile); perror(Open file fail); getch(); exit(1); for(i=0;ic_total;i+) fwrite(&c_mani,sizeof(candidate),1,fp); fclose(fp); else printf(投票失败!您要投票的号码不存在n); printf(按任意键返回首页! n); getch(); return; /* 显示投票后的情况 */ fp=fopen(DataFile,rb); if(fp=NULL) printf(nOpen file %s fail! End With any k
11、ey n,DataFile); perror(Open file fail); getch(); exit(1); printf(整理后的最新投票情况:n); printf(n候选人号码 t候选人姓名 t票数n); /*将文件中的数据读入结构体数组*/ while(fread(&TempS,sizeof(candidate),1,fp)!=(int)NULL) if(TempS.number!=0) printf(n%ld t%s t%d n,TempS.number,TempS.name,TempS.vote); fclose(fp); printf(n继续吗?是(Y)/否(N): ); f
12、flush(stdin); next=getchar(); putchar(n); if(next=y|next=Y)goto begin; /*创立用户信息*/void CreatUser() FILE *fp=NULL; char DataFile20=用户.txt;/* 存储投票人信息的文件名 */ user TempS; int over_flag=0; char c; /*读入原始数据,用于检查输入是否有重复*/ fp=fopen(DataFile,rb); if(fp=NULL) printf(nOpen file %s fail! End With any key n,DataF
13、ile); perror(Open file fail); getch(); exit(1); while(fread(&total_usertotal,sizeof(user),1,fp)!=(int)NULL) total+; fclose(fp); fp=fopen(DataFile,ab+); clrscr(); do clrscr(); printf( *创立新用户* ); gotoxy(23,3); printf(请输入:); gotoxy(30,5);printf(用户名:);scanf(%s,&TempS.name); TempS.name19=0; /*检查输入姓名是否有重复
14、*/ for(i=0;itotal;i+) if(strcmp(TempS.name,total_useri.name)=0) printf(该用户名已存在!按任意键浏览所有用户.); getch(); over_flag=1; break; if (over_flag) over_flag=0; continue; gotoxy(30,6);printf( 密码:);scanf(%s,&TempS.ps); TempS.ps7=0; gotoxy(30,7);printf( 权限:);scanf(%d,&TempS.power); if(TempS.power!=1) TempS.power
15、=0; /*将数据加入原始数据,用于下一次输入比较*/ total_usertotal=TempS; total+; if(fwrite(&TempS,sizeof(user),1,fp)!=1) printf(nwrite file is fail! End with any keyn,DataFile); perror(write file fail); getch(); exit(1); printf(要继续创立新用户吗?是(Y)/否(N):); getchar(); c=getchar(); while(c=Y|c=y); fclose(fp); /* 在屏幕上显示文件内容 */ pr
16、intf(用户资料数据处理完毕.n,DataFile); printf(所有用户具体情况如下:n); fp=fopen(DataFile,rb); printf(*); if(fp=NULL) printf(nOpen file is fail! End With any key n,DataFile); perror(Open file fail); getch(); exit(1); printf(n姓名tt密码tt权限n); while(fread(&TempS,sizeof(user),1,fp)!=(int)NULL) printf(n%stt%-8stt%dn,TempS.name
17、,TempS.ps,TempS.power); fclose(fp); printf(*); printf(n按任意键返回首页!); getch();void create() char DataFile20=候选人.txt; FILE * fp=NULL; char c; int over_flag=0; candidate TempS; clrscr(); read_c_man(); fp=fopen(DataFile,ab+); do clrscr(); printf( *创立新候选人*); gotoxy(22,3); printf(请输入:); gotoxy(29,5);printf(
18、候选人号码:);scanf(%ld,&TempS.number); /*检查输入编号是否有重复*/ for(i=0;ic_total;i+) if(TempS.number=c_mani.number) printf(该号码已存在.按任意键浏览所有候选人.); getch(); over_flag=1; break; if (over_flag) over_flag=0; continue; gotoxy(27,6);printf( 姓名:);scanf(%s,&TempS.name); TempS.name19=0; for(i=0;ic_total;i+) if(strcmp(TempS.
19、name,c_mani.name)=0) printf(该姓名已存在!请再输入一次!按任意键继续.); getch(); over_flag=1; break; if (over_flag) over_flag=0; continue; gotoxy(27,7);printf( 简介:); fflush(stdin); gets(TempS.intro); TempS.intro399=0; TempS.vote=0; /*将数据加入原始数据,用于下一次输入比较*/ c_manc_total=TempS; c_total+; if(fwrite(&TempS,sizeof(candidate)
20、,1,fp)!=1) printf(nwrite file is fail! End with any keyn,DataFile); perror(write file fail); getch(); exit(1); printf(要继续创立新的候选人吗?是(Y)/否(N): ); fflush(stdin); c=getchar(); while(c=Y|c=y); fclose(fp); /* 在屏幕上显示文件内容 */ clrscr(); printf(候选人资料:n); printf(*); fp=fopen(DataFile,rb); if(fp=NULL) printf(nOp
21、en file %s fail! End With any key n,DataFile); perror(Open file fail); getch(); exit(1); while(fread(&TempS,sizeof(candidate),1,fp)!=(int)NULL) printf(n号码:%-15ld姓名:%-15s简介:%s,TempS.number,TempS.name,TempS.intro); fclose(fp); printf(n*); printf(n按任意键返回首页!); getch();void browse()/* 浏览候选人信息 */ read_c_m
22、an(); clrscr();/* 清屏 */ printf(候选人资料:n); printf(*n); for(i=0;ic_total;i+) printf(号码:%-15ld,c_mani.number); printf(姓名:%-19s,c_mani.name); printf(简介:%sn,c_mani.intro); printf(*); printf(n按任意键返回首页!); getch();void search()/* 查询候选人信息 */ char c; long number; int flag=0; read_c_man(); do clrscr(); printf(n
23、t请输入要查询的候选人号码:); scanf(%ld,&number); for(i=0;ic_total;i+) if(number=c_mani.number) clrscr(); printf(t您要查询的候选人信息如下:nn); printf(t号码:%ld n,c_mani.number); printf(t姓名:%s n,c_mani.name); printf(t简介:%s n,c_mani.intro); flag=1; break; if (flag) flag=0; else printf(t对不起,没有您要查询的候选人n); printf(t要继续查询候选人吗?是(Y)/
24、否(N): ); getchar(); c=getchar(); while(c=Y)|(c=y);void sort() /*按票数从高到低列出所有数据*/ int i,k,j; candidate c_man2N,temp; /*c_manN用于存放排序后的数据*/ read_c_man(); for(i=0;ic_total;i+) c_man2i=c_mani; /*将c_manc_total赋值给c_man2c_total*/ for(i=0;ic_total-1;i+) /*用选择法排序*/ k=i; for(j=i+1;jc_total;j+) if(c_man2k.votec_
25、man2j.vote)k=j; if(k!=i) temp=c_man2i;c_man2i=c_man2k;c_man2k=temp; /*排序结束*/ printf(票数从高到低排列如下:n); printf(*-*n); printf(*号码 候选人 票数 *n); printf(*-*n); for(i=0;ic_total;i+) /*输出排序后的结果*/ printf(* %-13ld %-13s %-6d *n,c_man2i.number,c_man2i.name,c_man2i.vote); printf(*-*n); printf(按任意键返回首页!); fflush(std
26、in); getch();void welcome() printf(n *电子投票系统* nnnnr); printf( 按任意键进入系统登录界面.); getch(); clrscr(); printf(nnnr *欢迎登陆电子投票系统* nnr);void thans() clrscr(); cprintf(nnnnnnr 感谢您的参与! n); cprintf(nnnnnnr 再见!); sleep(3); clrscr();/*管理员主控平台*/void main_a() int key; char menu= *nr 管理员界面nr *nr nr 1.创立新候选人nnr 2.创立新
27、用户nnr 3.查询候选人信息nnr 4.浏览所有候选人nnr 5.整理所有投票nnr 0.退出nnr nn *请选择0到5:; do clrscr(); cprintf(%s,menu); /*输出主菜单*/ scanf(%d,&key); switch(key) case 1:create();break; case 2:CreatUser();break; case 3:search();break; case 4:browse();break; case 5:clrscr(); sort(); break; case 0:break; default:break; while(key!
28、=0); byebye();void main_v()/*用户主控平台*/ int key; char menu= *nr 投票者界面 nr *nr nnr 1.浏览所有候选人 nnr 2.查询候选人信息 nnr 3.投票 nnr 0.退出 nnr n *请选择0到3:; do clrscr(); cprintf(%s,menu); /*输出主菜单*/ scanf(%d,&key); switch(key) case 1:browse();break; case 2:search();break; case 3:clrscr(); vote();break; case 0:break; default:break; while(key!=0); byebye();void main() FILE * fp=NULL; char DataFile20=用户.txt; char relogin;/* 是否重新登录的标志 */ int success=0; user input_user,temp_user; system( graftabl 936 ); welcome();