
题 目: 电子投票平台管理系统
课程名称: C语言程序设计
院系名称: 信息科学与工程学院
专业班级:
学生姓名:
学 号:
任课教师:
一、实验目的:
1. 掌握用C语言进行简单的数据库管理的要点。
2. 了解C程序菜单设计的一般方法。
3. 综合利用指针、函数、结构体数组以及文件等知识进行程序设计。
二、实验要求:
1.主要操作包括:数据输入、输出、插入、删除、查找、修改、排序等。
2. 用C语言编程实现上述实验内容的结构定义和相关功能,要求程序能够正确执行,最后提交源程序代码及实验报告。
三、实验设备及环境:
1)硬件:PC机
2)操作系统:Windows 2000/XP/2003
3) 编译环境:Visual C++ 6.0
四、系统分析
电子投票平台有两大功能是:身份验证和投票。它包括功能选择;身份验证;投票人管理模块;候选人管理模块;投票区和得票结果管理六大模块。保证了不同人有自己的操作,同时又不能执行别人的操作,具有安全性,并且又有一定的实用性。
本程序包含六个功能模块:功能选择;身份验证;投票人管理模块;候选人管理模块;投票区和得票结果管理。
功能选择:功能选择模块为系统提供类似于菜单的功能,让用户输入功能选择项,并进入相应的功能执行程序。系统按权限分为管理员的功能选择和投票人的功能选择。分别在list1()和list2()函数中。
身份验证:该模块判断要使用该系统的是投票人还是管理员,首先获取登录者的用户名和密码,其中密码的获取用不回显的方式输入,避免他人从旁窃取,在一定程度上保证安全性。当用户名和密码相符时,判断用户的权限并进入相应功能选择函数。当用户忘记密码时,给用户机会进行重新输入。源程序包含在login()中。
投票人管理模块:该模块对投票人进行管理是由管理员实现的,确保只有用管理员预先定义好的投票人用户名和密码才能正确登系统进行投票。管理员对投票人的管理有投票人的增加、删除、修改和浏览。源程序包含在adduser()(增加用户记录);deluser()(删除投票人信息);moduserbynum()(根据用户序号修改);scanbynum()(根据用户序号排序浏览)。
候选人管理模块:候选人管理模块完成候选人信息的浏览、候选人信息修改、候选人简介按姓名的查询3个主要功能。源程序包含在sortscand()(排序浏览候选人);modifycand()(按号修改候选人信息);findcandbyname()(按姓名查询候选人)。
投票区管理:投票区完成该系统的主体功能。当投票人顺得登录系统后,输入要投票的候选人的数字代码,即可完成投票。候选人的得票信息会随时刷新。该系统定义了一个单独的函数vote()来实现此功能,每个投票人的一次投票都会触发该函数,从而读取并修改候选人信息文件,使得所投候选人的票数增一。
得票结果管理:对于得票结果,系统规定管理员可以对其进行管理操作,操作之一是排行浏览得票结果,从而可以得知哪位候选人被选中。该功能也是通过对文件的读写和对数组的排序实现的。对得票结果的另一个管理功能是清空得票信息。此功能只有管理员能够使用。功能的实现是用重写文件的方式来实现的。将文件内容读取到数组,将数组中每条记录的得票信息都重置为0,再重新写入文件,从而完成得票记录的清空功能。
五、系统实现
表3-1 程序总框架(函数清单)表
| 序号 | 文字解释 | 函数 |
| 1 | 排序浏览候选人 | sortscand() |
| 2 | 按号修改候选人信息 | modifycand() |
| 3 | 排序浏览票数信息 | sortvotenum(); |
| 4 | 清空得票信息 | clearvotenum() |
| 5 | 增加用户记录 | adduser(); |
| 6 | 删除投票人信息 | deluser(); |
| 7 | 根据用户序号修改 | moduserbynum() |
| 8 | 根据用户序号排序浏览 | scanbynum() |
| 9 | 按姓名查询候选人 | findcandbyname() |
| 10 | 投票 | vote() |
| 11 | 登陆界面 | login() |
| 12 | 创建用户 | creatuser(); |
| 13 | 初始化候选人信息 | creatcandidate() |
详细源程序
#include #include #define SIZE 50/*为用户初始化内存*/ #define MAX 50/*为候选人初始化内存*/ #define INCREASE 20/*内存增加数目*/ typedef struct {long number; char name[20]; char intro[500]; int votenum; }candidate; typedef struct {long number;/*用户序号*/ char name[20];/* 用户名称 */ char ps[8];/* 用户密码 */ int power;/* 用户权限 */ }user; void vote()//投票选举 {int i,flag;/*flag用来标志是否找对应编号,即投票是否成功*/ long candidatenum,number; candidate temps,*s,*t; int total=MAX; int num; char DataFile[10]="candidate",next; FILE * fp; s=(candidate*)malloc(total*sizeof(candidate)); if(s==NULL) {printf("分配内存失败!\\n按任意键继续..\n"); getch(); return;} system("cls"); begin: flag=0; fp=fopen(DataFile,"rb"); if(fp==NULL) { printf("\\n打开文件失败!按任意键结束..\n"); getch(); exit(1); } printf("请输入你要选举的候选人序号:"); scanf("%ld",&candidatenum); printf("你要选举的候选人序号是:%ld\\n",candidatenum); number=candidatenum; num=0; while((fread(&temps,sizeof(candidate),1,fp))==1) { if(temps.number!=candidatenum) { s[num].number=temps.number; strcpy(s[num].name,temps.name); strcpy(s[num].intro,temps.intro); s[num].votenum=temps.votenum; } else { s[num].number=number; strcpy(s[num].name,temps.name); strcpy(s[num].intro,temps.intro); s[num].votenum=temps.votenum+1; flag=1; } num++; if(total<=num) { total+=INCREASE; t=realloc(s,total*sizeof(candidate)); if(t==NULL) { printf("内存分配失败!\\n按任意键继续..\n"); free(s);/*释放内存*/ getch(); return; } s=t; t=NULL; } } fclose(fp); if(flag==0) { printf("投票失败!找不到你要选举的候选人,按任意键继续...\n"); getch(); goto begin; } else { printf("投票成功!\\n"); } /* 将修改后的结构体数组记录写入文件 */ fp=fopen(DataFile,"wb"); if(fp==NULL) { printf("\\n写入文件错误!按任意键结束.\n",DataFile); getch(); exit(1); } for(i=0;i if(fwrite(&s[i],sizeof(candidate),1,fp)!=1) {printf("\\n写入文件错误!按任意键结束.\n"); getch(); exit(1);} } fclose(fp); /* 显示投票后的投票情况 */ fp=fopen(DataFile,"rb"); if(fp==NULL) { printf("\\n打开文件错误!按任意键结束\n",DataFile); getch(); exit(1); } printf("投票后的信息是:\\n"); printf("\\n序号 \姓名\t票数\n"); while(fread(&temps,sizeof(candidate),1,fp)!=(int)NULL) { if(temps.number!=0) printf("\\n%ld\%s\%d\\n",temps.number,temps.name,temps.votenum);} fclose(fp); printf("\\n是否继续?(y/n)"); fflush(stdin); next=getchar(); putchar('\\n'); if(next=='y'||next=='Y')goto begin; free(s);/*释放内存*/。 list1() {int ch2; list01: system("cls"); printf("+--------------------------------------------------+\\n"); printf("| 欢 迎 进 入 电 子 投 票 平 台! |\\n"); printf("|----------------------+----------------------------|\\n"); printf("| 1.排序浏览候选人 |2.按号修改候选人信息 |\\n"); printf("| 3.排序浏览票数信息 |4, 清空得票信息 |\\n"); printf("|----------------------+----------------------------+\\n"); printf("|#################&&&&&&&&&&&&####################+\\n"); printf("+------------------------+--------------------------+\\n"); printf("| 5.增加用户记录 | 6.删除投票人信息 |\\n"); printf("| 7.根据用户序号修改| 8.根据用户序号排序浏览 |\\n"); printf("| 0.退出系统 |\\n"); printf("+-----------------------+--------------------------+\\n"); printf(" 请输入您的选择:"); scanf("%d",&ch2); switch(ch2) {case 1:{system("cls");sortscand(); goto list01;} case 2:{system("cls");modifycand(); goto list01;} case 3:{system("cls");sortvotenum(); goto list01;} case 4:{system("cls");clearvotenum(); goto list01;} case 5:{system("cls");adduser(); goto list01;} case 6:{system("cls");deluser(); goto list01;} case 7:{system("cls");moduserbynum(); goto list01;} case 8:{system("cls");scanbynum(); goto list01;} case 0:exit(0); default:{printf("选择错误\n按任意键继续....\n"); system("cls"); getch(); goto list01;} } } list2()//投票人功能菜单 { int ch3; list02: system("cls"); printf(" +----------------------------+\\n"); printf(" | 欢迎进入电子投票系统 |\\n"); printf(" | 1.排序浏览候选人 |\\n"); printf(" | 2.按姓名查询候选人 |\\n"); printf(" | 3.投票 |\\n"); printf(" | 0.退出系统 |\\n"); printf(" +----------------------------+\\n"); printf(" 请输入您的选择:"); scanf("%d",&ch3); switch(ch3) { case 1:{system("cls");sortscand(); goto list02;} case 2:{system("cls");findcandbyname(); goto list02;} case 3:{system("cls");vote(); goto list02;} case 0:exit(0); default:printf("选择错误\n按任意键继续....\n"); getch(); } } main() /*主菜单选项*/ { int ch1,ch; char ps[8],next; start: system("cls"); printf("\ ############# \\n"); printf("\ ############# \\n"); printf("\ \\\\\\~~ ~~/// \\n"); printf("\ ( @ @ ) \\n"); printf("\+-------oOOo---------(_)-----------oOOo------+\\n"); printf("\| 欢迎进入 |\\n"); printf("\| 电子投票大厅 |\\n"); printf("\|--------------------------------------------|\\n"); printf("\| 1.创建用户 |\\n"); printf("\| 2.登录系统 |\\n"); printf("\| 0.退出系统 |\\n"); printf("\|--------------------------------------------|\\n"); printf("\| 作者 谢国林 20074300301 |\\n"); printf("\| 2008年6月29号 |\\n"); printf("\+--------------------------------------------+\\n"); printf("\请输入您的选择:"); scanf("%d",&ch1); switch(ch1) { case 1:{ reputin: printf("\请输入创建密码:"); scanf("%s",ps); if(strcmp(ps,"666666")==0) { againre: system("cls"); printf("\\n\\n\\n创建用户文件请选择1;创建候选人文件请选择2;结束请按3\\n"); scanf("%d",&ch); if(ch==1) {system("cls");creatuser();} if(ch==2){system("cls");creatcandidate();} if(ch==3) goto start; next=getch(); goto againre; } else {printf("\\n密码错误是否继续?(y/n)"); fflush(stdin); next=getchar(); putchar('\\n'); if(next=='y'||next=='Y')goto reputin; else break;} break;} case 2:login();break; case 0:exit(0); default:printf("选择错误!\\n按任意键继续...\n"); fflush(stdin); getch(); break; } } 实验结果 1.进入主菜单就会见到图一: 图一:主菜单 (由于第一次没保存该图,学校机房又关闭,只能用写的!) ############# ############# \\\\\~~ ~~/// ( @ @ ) +-------oOOo---------(_)-----------oOOo------+ | 欢迎进入 | | 电子投票大厅 | |--------------------------------------------| | 1.创建用户 | | 2.登录系统 | | 0.退出系统 | |--------------------------------------------| | 作者 谢国林 20074300301 | | 2008年6月29号 | +--------------------------------------------+ 2.当输入数据一的时候就可以进入管理员功能选项 图二:管理员功能选 3.当输入数据二的时候就可以进入投票人功能选项 图三:投票人功能选项 六、实验总结 通过这学期对C语言的学习,收获良多。尽管有些部分觉得很有难度,但在不停反复的看书与上机练习下,还是有所理解的。这个实验的程序是我从书本上的一些程序仿照而来的。刚开始进行编译时发现许多错误和警告,然后就慢慢的进行分析修改程序,错误和警告不断减少,最后没错误了,然后进行运行,可是还是不能运行,最后对源程序又进行了认真的修改,终于可以运行了! 有些功能不能实现,应该是功能模块的问题,我就对模块函数进行认真的分析,花了好长时间又发现了不少的问题,比如用if条件时把等号写成了赋值号等等。还有一些比较隐藏的错误,如:把长整型数据和字符串弄混淆,scanf函数忘了加地址符。 有一些难实现的功能,如刚开始执行每一项功能后都无法回到原来的功能菜单,经过一些时间的思考,终于想到了解决办法。在完成身份验证功能时,一直无法实现用不回显的方法实现密码的输入,以及无法确定密码输入结束标志,最后想到了用输入‘+’作为结束标志……像这样的错误还有很多,但是错误总能让人不断学到知识。 总之,做完这次综合实验,发现了自己的许多不足,从中也学了不少东西,增长不少经验。尽管花的时间确实挺多的,但这是值得的。 参考文献 [1] 谭浩强主编,C程序设计题解与上机指导(第3版),清华大学出版社,2005.7. [2] [美]Harvey M. Deitel, Paul J. Deitel 著,聂雪军,贺军译,C程序设计经典教程(第4版),清华大学出版社,2006.3 [3] 李春葆,张植民,肖忠付编,C语言程序设计题典,清华大学出版社,2002.7 [4] [美]科汉/著,张小潘译, C语言编程(第3版),电子工业出版社,2006.3 [5] [美]Brian W. Kernighan, Dennis M. Ritchie著,徐宝文,李志译,C程序设计语言(第2版·新版),机械工业出版社,2004.1 [6] Brian W. Kernighan,The C Programming Language 2nd Ed(英文影印版),清华大学出版社,2001.11 [7] Clovis L. Tondo,The C Answer Book Solutions to the Exercises in The C Programming Language(英文影印版),清华大学出版社,2001.12
