1、电子投票系统C语言课程设计广东工业大学课程设计报告一、需求分析:1、 设计题目:电子投票系统2、设计内容及要求:(1)通过编程建立一个小型电子投票系统,其中包含电子投票、票数统计功能。尽量 做到提供一个简单的人机界面,系统界面友好,使用方便。(2)软件的使用者分为两类,一类为管理员,可以对候选人信息进行初始化和修改, 还可浏览候选人信息介绍,可对候选人的票数进行排序以及对系统的用户进行管理,创建 使用者用户名和密码等。另一类为使用者普通投票者,该类用户需要用管理员分配的用 户名和密码正确登录系统,可以查询候选人介绍、投票等。 (投票是只需做到输入自己想要 投票的候选人编号即可完成投票)3、系统
2、功能分析:本系统程序功能:(1)投票者功能a.浏览所有候选人资料b.查询要了解的候选人的信息c.在了解候选人之后进行投票(2)管理员功能a.创建新的候选人资料b.创建新的用户资料c.查询要了解的候选人资料d.浏览所有的候选人资料e.对候选人票数进行统计并排序二、具体设计1、功能模块(1)开始运行与结束运行界面模块 开始运行显示有“电子投票系统”字样的界面,结束运行时则输出显示“感谢参与、再见”字样的界面。(2)功能选择模块 根据输入的用户名和密码,分别进入管理员界面和投票者界面(3)身份验证模块验证管理员和投票者的用户名和密码是否正确,不正确可选择重新输入用户名和密码 或者退出。(4)投票人管
3、理模块 ?实现对投票人的管理功能,如创建投票人用户名和密码。主要用结构体类型的数组和 文件的读写来完成数据的管理操作。(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 candidatelong number;char name20;char intro400;int vote;candidate;/* 系统用
6、户数据结构*/描述系统用户编号、用户名、密码和权限信息,作为一整条记录存放在文件中typedef struct userchar 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(Open f
7、ile 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 fail! End with
8、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 用来标志是否找对应编号,即投票是否成功 */read_c_man();p
9、rintf( 请输入您要投票的候选人的号码 :);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 with any key.n,DataFile);per
10、ror(Open file fail);getch();exit(1);for(i=0;ic_total;i+)fwrite(&c_mani,sizeof(candidate),1,fp);fclose(fp);elseprintf( 投票失败!您要投票的号码不存在 n);getch();return;/* 显示投票后的情况 */fp=fopen(DataFile,rb);if(fp=NULL)printf(nOpen file %s fail! End With any key n,DataFile);perror(Open file fail);getch();exit(1);printf
11、( 整理后的最新投票情况 :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): );fflush(stdin);next=getchar();putchar(n);if(next=y|next=Y)goto begin;/* 创建用户信息 */ void CreatUse
12、r()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,DataFile); perror(Open file fail);getch();exit(1);while(fread(&total_usertotal,sizeof(user),1,fp)!=(in
13、t)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;/* 检查输入姓名是否有重复 */ for(i=0;itotal;i+)if(strcmp(TempS.name,total_useri.name)=0)printf( 该用户名已存在!按任意键浏览所有用户 .);getch();over_flag=1
14、;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=0;/* 将数据加入原始数据 ,用于下一次输入比较 */total_usertotal=TempS;total+;if(fwrite(&TempS,sizeof(user),1,fp)!=1)printf(nwrite file is f
15、ail! 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);/* 在屏幕上显示文件内容 */printf( 用户资料数据处理完毕 .n,DataFile);printf( 所有用户具体情况如下 :n);fp=fopen(DataFile,rb);printf( *);if(fp=NULL) printf(nOpen file is fail! End W
16、ith 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,TempS.ps,TempS.power); fclose(fp);printf( *);printf(n 按任意键返回首页! );getch();void create()char DataFile20=候选人 .txt;FILE * fp=NULL;c
17、har c;int over_flag=0;candidate TempS;clrscr();read_c_man();fp=fopen(DataFile,ab+);doclrscr();printf(创建新候选人);gotoxy(22,3);printf( 请输入 :);gotoxy(29,5);printf(候选人号码 :);scanf(%ld,&TempS.number);/* 检查输入编号是否有重复 */for(i=0;ic_total;i+)if(TempS.number=c_mani.number)printf( 该号码已存在 .按任意键浏览所有候选人 .);getch();ove
18、r_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.name,c_mani.name)=0)printf( 该姓名已存在!请再输入一次!按任意键继续 .);getch();over_flag=1;break;if (over_flag)over_flag=0;continue;gotoxy(27,7);printf( 简介 :);fflush(std
19、in);gets(TempS.intro);TempS.intro399=0;TempS.vote=0;/* 将数据加入原始数据 ,用于下一次输入比较 */ c_manc_total=TempS;c_total+; if(fwrite(&TempS,sizeof(candidate),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=get
20、char();while(c=Y|c=y);fclose(fp);/* 在屏幕上显示文件内容 */ clrscr();printf( 候选人资料: n);printf( *);fp=fopen(DataFile,rb);if(fp=NULL)printf(nOpen 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简介 :
21、%s,TempS.number,TempS.name,TempS.intro);fclose(fp);printf(n*);printf(n 按任意键返回首页! );getch();void browse()/* 浏览候选人信息 */read_c_man();clrscr();/* 清屏 */printf( 候选人资料: n);*n);printf(for(i=0;ic_total;i+)printf(号码 :%-15ld,c_mani.number);printf(姓名 :%-19s,c_mani.name);printf(简介 :%sn,c_mani.intro);printf( *);p
22、rintf(n 按任意键返回首页! );getch();void search()/* 查询候选人信息 */char c;long number;int flag=0;read_c_man();doclrscr();printf(nt 请输入要查询的候选人号码 :);scanf(%ld,&number);for(i=0;iejq!(O4u !ue-,11u s%:号凰 )Hud!(eu ue-,11u s%:沏 lll)uud!(jqnu ue-,11u p%: lll)uudK1.uu: WWBYWWM 11)ud!()JSJ(jqu nr!ue0=OqlU nu)elseprintf(t
23、对不起,没有您要查询的候选人 n);printf(t 要继续查询候选人吗 ?是(Y)/否(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;
24、for(j=i+1;jc_total;j+)if(c_man2k.votec_man2j.vote)k=j;if(k!=i)temp=c_man2i;c_man2i=c_man2k;c_man2k=temp; /* 排序结束 */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( 按任意键返回首页!
25、 );fflush(stdin);getch();void welcome()printf(n电子投票系统nnnnr);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 *nrnr 1.创建新候选人 nnr 2.创建新用户 nnr
26、3.查询候选人信息 nnr 4.浏览所有候选人 nnr 5.整理所有投票 nnr 0.退出 nnr nn *请选择 0到 5:;doclrscr();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!=0);byebye();void main_v()/* 用户主控平台 */int key;char menu=nrnnr nnrn*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1