C语言课程设计分析报告电子投票系统Word格式文档下载.docx
《C语言课程设计分析报告电子投票系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言课程设计分析报告电子投票系统Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
1.数据结构
链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。
线形表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一元素。
链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
链表的最大的优点是对表的添加、删除、查找、排序等操作比较方便,因此采用链表来存储候选人,投票人相关信息。
且对结点的定义如下:
ttypedefstructcandidate//候选人数据结构体
{
longnumber;
//候选人编号
charname[20];
//候选人姓名
charintro[400];
//候选人简介
intvote;
//候选人得票数
}candidate;
typedefstructuser//投票者数据结构体
//投票者姓名
charps[8];
//对应密码
intpower;
//权限
}user;
2.main()主函数
主函数是程序入口,采用模块化设计。
创建用户文档,进行账号密码验证并根据账户不同调用不同函数进入不同的界面,执行不同的功能
3.main_a()管理员界面
根据输入数字的不同调用不同的函数进入对应的功能,返回主函数。
相关的一些函数如下:
addcandidate();
//创建候选人
addUser();
//创建投票者
search();
//查询候选人信息
scan();
//浏览候选人信息
sort();
//整理所有投票
对菜单选项的选择是输入对应数字按回车键进行选择。
4.main_v();
投票者者界面
search();
scan();
vote();
//投票者投票
5.addcandidate();
创建候选人
当用户选择该项对应数字后,进入该函数。
创建候选人文档,输入候选人信息。
用for语句和if语句检查编号、姓名是否重复。
在确认不再创建新候选人信息后输出所有候选人信息。
6.addUser()创建用户
创建用户文档,输入用户账号与密码。
用for语句和if语句检查账号名是否重复。
在确认不再创建新用户信息后输出所有用户信息。
7.read()读取候选人信息
打开候选人文档,提取文档内内容
8.scan()浏览候选人信息
先调用read()读取候选人信息,利用for语句输出。
9.search()查询候选人信息
先调用read()读取候选人信息,利用for语句查找与输入编号一致的候选人信息并输出,若查无此编号则输出“对不起,没有您要查询的候选人”。
10.sort()整理所有投票
先调用read()读取候选人信息,利用for语句,使用选择法对投票数进行排序,并输出。
11.vote()投票者投票
先调用read()读取候选人信息,输入候选人相应编号,利用for语句,将对应候选人的投票数+1,并返回到文档中,输出投票结果。
若查无此编号,输出“投票失败!
您要投票的号码不存在”。
六.结果
初始界面
分别输入1,1进入管理员界面
创建新候选人
输出候选人信息
投票者界面
投票以及投票结果
候选人票数排序结果
七.心得体会
在本次课程设计中,先使用结构化分析方法对系统进行分析,将整个系统细分为几个模块,再针对每个小模块编写代码。
通过本次课程设计的学习以及老师的指导,学会了很多东西,了解了开发一个系统的一些步骤。
尽管大部分都参考权威书籍的代码,但是在编写代码过程中还是加深了对链表的了解程度。
开发工具用的是vc++6.0。
这个程序还存在很多需要改进的地方,如密码输入后直接显示了出来,而不是*,缺少安全性;
每个投票人不仅仅只能投一票等等。
但我会继续努力学习,争取写出更好的程序
源代码
#include<
stdio.h>
string.h>
stdlib.h>
conio.h>
#defineclosegrclosegraph
#defineN30
voidmain_a();
//管理员界面
voidmain_v();
//投票者者界面
voidaddcandidate();
voidaddUser();
voidsearch();
voidscan();
voidvote();
voidread();
//读取候选人信息
voidsave();
//存储候选人信息
voidsort();
inttotal=0,c_total=0;
inti=0;
typedefstructcandidate//候选人数据结构体
candidatec_man[N];
usertotal_user[N];
voidmain_v()//投票者者界面
intkey;
do
{
printf("
*************************************************************\n"
);
********************欢迎进入投票员界面***********************\n"
**1.浏览所有候选人2.查询候选人信息**\n"
**3.投票4.退出**\n"
scanf("
%d"
&
key);
switch(key)
{
case1:
break;
case2:
case3:
case4:
default:
}
}while(key!
=4);
}
voidvote()//投票者投票
longcandidatenum;
//定义进行操作时的临时结构体变量
inti,flag;
charDataFile[20]="
候选人.txt"
next;
//DataFile存储候选人信息的文件名,next为是否进行下一次投标操作的选项
candidateTempS;
FILE*fp;
begin:
flag=0;
//flag用来标志是否找对应编号,即投票是否成功
read();
printf("
请输入您要投票的候选人的号码:
"
scanf("
%ld"
candidatenum);
您所投票的候选人号码是:
%ld\n"
candidatenum);
for(i=0;
i<
c_total;
i++)
{
if(c_man[i].number==candidatenum)
flag=1;
c_man[i].vote++;
if(flag)
投票成功\n"
fp=fopen(DataFile,"
wb"
if(fp==NULL)//如果当前文件不存在,提示打开文件失败
\nOpenfileisfail!
Endwithanykey.\n"
DataFile);
perror("
Openfilefail"
getch();
exit
(1);
fwrite(&
c_man[i],sizeof(candidate),1,fp);
fclose(fp);
else
投票失败!
您要投票的号码不存在\n"
按任意键返回首页!
\n"
return;
rb"
//显示投票后的情况
if(fp==NULL)
\nOpenfile%sfail!
EndWithanykey\n"
整理后的最新投票情况:
\n"
\n候选人号码\t候选人姓名\t票数\n"
while(fread(&
TempS,sizeof(candidate),1,fp)!
=(int)NULL)
if(TempS.number!
=0)
\n%ld\t%s\t%d\n"
TempS.number,TempS.name,TempS.vote);
\n继续吗?
是(Y)/否(N):
"
fflush(stdin);
next=getchar();
putchar('
\n'
if(next=='
y'
||next=='
Y'
)gotobegin;
voidmain_a()//管理员界面
********************欢迎进入管理员界面***********************\n"
**1.创建新候选人2.创建新用户**\n"
**3.查询候选人信息4.浏览所有候选人**\n"
**5.整理所有投票0.退出**\n"
addUser();
case5:
break;
case0:
}
=0);
voidaddcandidate()//创建候选人
;
FILE*fp=NULL;
charc;
intover_flag=0;
ab+"
do
*****************创建新候选人*****************\n"
请输入:
候选人号码:
scanf("
TempS.number);
i++)//检查输入编号是否有重复
if(TempS.number==c_man[i].number)
该号码已存在.按任意键浏览所有候选人..."
over_flag=1;
if(over_flag)
over_flag=0;
continue;
姓名:
%s"
TempS.name);
TempS.name[19]='
\0'
if(strcmp(TempS.name,c_man[i].name)==0)
该姓名已存在!
请再输入一次!
按任意键继续..."
简介:
gets(TempS.intro);
TempS.intro[399]='
TempS.vote=0;
c_man[c_total]=TempS;
//将数据加入原始数据,用于下一次输入比较
c_total++;
if(fwrite(&
=1)
\nwritefileisfail!
Endwithanykey\n"
writefilefail"
要继续创建新的候选人吗?
c=getchar();
}while(c=='
||c=='
候选人资料:
//在屏幕上显示文件内容
*****************************************************************"
任意键结束\n"
\n号码:
%-15ld姓名:
%-15s简介:
TempS.number,TempS.name,TempS.intro);
\n*****************************************************************"
\n按任意键返回首页!
voidread()//读取候选人信息
c_total=0;
c_man[c_total],sizeof(candidate),1,fp)!
voidaddUser()//创建用户
FILE*fp=NULL;
用户.txt"
//存储投票人信息的文件名
userTempS;
//读入原始数据,用于检查输入是否有重复
total_user[total],sizeof(user),1,fp)!
total++;
*****************创建新用户*****************"
用户名:
total;
i++)//检查输入姓名是否有重复
if(strcmp(TempS.name,total_user[i].name)==0)
该用户名已存在!
按任意键浏览所有用户..."
密码:
TempS.ps);
TempS.ps[7]='
权限:
TempS.power);
if(TempS.power!
TempS.power=0;
total_user[total]=TempS;
//将数据加入原始数据
TempS,sizeof(user),1,fp)!
任意键结束\n"
要继续创建新用户吗?
getchar();
用户资料数据处理完毕.\n"
//在屏幕上显示文件内容
所有用户具体情况如下:
************************************************************"
\n姓名\t\t密码\t\t权限\n"
\n%s\t\t%-8s\t\t%d\n"
TempS.name,TempS.ps,TempS.power);
voidscan()//浏览候选人信息
***************************************************************\n"
号码:
%-15ld"
c_man[i].number);
姓名:
%-19s"
c_man[i].name);
简介:
%s\n"
c_man[i].intro);
***************************************************************"
getc