资源描述
C语言课程设计汇报
电子投票系统
学 院 计算机学院
专 业
年 级
姓 名
学 号
教 师
年 月 日
广东工业大学计算机学院制
一.设计题目
电子投票系统
二.课程设计目标
了解软件工程中部分系统分析,模块分析,代码设计概念,利用WIN-TC实现学生成绩管理系统录入、查询、删除、统计等基础操作,使用单链表结构实现学生成绩管理,了解数据库管理基础功效,掌握C语言中结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。经过对系统分析和设计,深入巩固C语言学习,以提升对开发环境深入认识和综合编程能力。
三. 系统功效
本系统程序功效:
(1)投票者功效
a.浏览全部候选人资料
b.查询要了解候选人信息
c.在了解候选人以后进行投票
(2)管理员功效
a.创建新候选人资料
b.创建新用户资料
c.查询要了解候选人资料
d.浏览全部候选人资料
e.对候选人票数进行统计并排序
四.系统功效模块结构图
本程序利用单链表存放结构完成对学生成绩动态管理,其基础功效模块以下图所表示:
电子投票系统
验证账号密码
投票人
管理员
浏览候选人
浏览候选人
添加投票人
查找候选人
添加候选人
查找候选人
查看投票结果
投票
图1 程序功效模块结构图
五.程序设计及各模块函数功效简述
1.数据结构
链表是线形表一个,线形表分为次序存放结构和链式存放结构。线形表次序存放结构特点是逻辑关系上相邻两个元素物理位置上也相邻,所以能够随机存取表中任一元素。链式存放结构特点是用一组任意存放单元存放线形表数据元素。链表最大优点是对表添加、删除、查找、排序等操作比较方便,所以采取链表来存放候选人,投票人相关信息。且对结点定义以下:
ttypedef struct candidate//候选人数据结构体
{
long number;//候选人编号
char name[20];//候选人姓名
char intro[400];//候选人介绍
int vote;//候选人得票数
}candidate;
typedef struct user//投票者数据结构体
{
char name[20];//投票者姓名
char ps[8];//对应密码
int power;//权限
}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>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define closegr closegraph
#define N 30
void main_a(); //管理员界面
void main_v(); //投票者者界面
void addcandidate(); // 创建候选人
void addUser();//创建投票者
void search(); //查询候选人信息
void scan();//浏览候选人信息
void vote(); //投票者投票
void read();//读取候选人信息
void save();//存放候选人信息
void sort();//整理全部投票
int total=0,c_total=0;
int i=0;
typedef struct candidate//候选人数据结构体
{
long number;//候选人编号
char name[20];//候选人姓名
char intro[400];//候选人介绍
int vote;//候选人得票数
}candidate;
typedef struct user//投票者数据结构体
{
char name[20];//投票者姓名
char ps[8];//对应密码
int power;//权限
}user;
candidate c_man[N];
user total_user[N];
void main_v()//投票者者界面
{
int key;
do
{
printf("*************************************************************\n");
printf("********************欢迎进入投票员界面***********************\n");
printf("*************************************************************\n");
printf("** 1.浏览全部候选人 2.查询候选人信息 **\n");
printf("** 3.投票 4.退出 **\n");
scanf("%d",&key);
switch(key)
{
case 1:scan();break;
case 2:search();break;
case 3:vote();break;
case 4:break;
default:break;
}
}while(key!=4);
}
void vote() //投票者投票
{
long candidatenum;//定义进行操作时临时结构体变量
int i,flag;
char DataFile[20]="候选人.txt",next;// DataFile存放候选人信息文件名,next为是否进行下一次投标操作选项
candidate TempS;
FILE *fp;
begin:
flag=0;//flag用来标志是否找对应编号,即投票是否成功
read();
printf("请输入您要投票候选人号码:");
scanf("%ld",&candidatenum);
printf("您所投票候选人号码是:%ld\n",candidatenum);
for(i=0;i<c_total;i++)
{
if(c_man[i].number==candidatenum)
{
flag=1;
c_man[i].vote++;
}
}
if(flag)
{
printf("投票成功\n");
fp=fopen(DataFile,"wb");
if(fp==NULL)//假如目前文件不存在,提醒打开文件失败
{
printf("\nOpen file is fail!End with any key.\n",DataFile);
perror("Open file fail");
getch();
exit(1);
}
for(i=0;i<c_total;i++)
{
fwrite(&c_man[i],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 key \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): ");
fflush(stdin);
next=getchar();
putchar('\n');
if(next=='y'||next=='Y')goto begin;
}
void main_a()//管理员界面
{
int key;
do
{
printf("*************************************************************\n");
printf("********************欢迎进入管理员界面***********************\n");
printf("*************************************************************\n");
printf("** 1.创建新候选人 2.创建新用户 **\n");
printf("** 3.查询候选人信息 4.浏览全部候选人 **\n");
printf("** 5.整理全部投票 0.退出 **\n");
scanf("%d",&key);
switch(key)
{
case 1:addcandidate();break;
case 2:addUser();break;
case 3:search();break;
case 4:scan();break;
case 5:sort(); break;
case 0:break;
default:break;
}
}while(key!=0);
}
void addcandidate()//创建候选人
{
char DataFile[20]="候选人.txt";
FILE * fp=NULL;
char c;
int over_flag=0;
candidate TempS;
read();
fp=fopen(DataFile,"ab+");
do
{
printf(" *****************创建新候选人*****************\n");
printf("请输入:");
printf("候选人号码:");scanf("%ld",&TempS.number);
for(i=0;i<c_total;i++)//检验输入编号是否有反复
{
if(TempS.number==c_man[i].number)
{
printf("该号码已存在.按任意键浏览全部候选人...");
getch();
over_flag=1;
break;
}
}
if (over_flag)
{
over_flag=0;
continue;
}
printf(" 姓名:");scanf("%s",&TempS.name);
TempS.name[19]='\0';
for(i=0;i<c_total;i++)
{
if(strcmp(TempS.name,c_man[i].name)==0)
{
printf("该姓名已存在!请再输入一次!按任意键继续...");
getch();
over_flag=1;
break;
}
}
if (over_flag)
{
over_flag=0;
continue;
}
printf(" 介绍:");
fflush(stdin);
gets(TempS.intro);
TempS.intro[399]='\0';
TempS.vote=0;
c_man[c_total]=TempS;//将数据加入原始数据,用于下一次输入比较
c_total++;
if(fwrite(&TempS,sizeof(candidate),1,fp)!=1)
{
printf("\nwrite file is fail! End with any key\n",DataFile);
perror("write file fail");
getch();
exit(1);
}
printf("要继续创建新候选人吗?是(Y)/否(N): ");
fflush(stdin);
c=getchar();
}while(c=='Y'||c=='y');
fclose(fp);
printf("候选人资料:\n"); // 在屏幕上显示文件内容
printf("*****************************************************************");
fp=fopen(DataFile,"rb");
if(fp==NULL)
{
printf("\nOpen file %s fail! 任意键结束 \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 read()//读取候选人信息
{
char DataFile[20]="候选人.txt";
FILE * fp=NULL;
c_total=0;
fp=fopen(DataFile,"rb");
if(fp==NULL)
{
printf("\nOpen file %s fail! 任意键结束 \n",DataFile);
perror("Open file fail");
getch();
exit(1);
}
while(fread(&c_man[c_total],sizeof(candidate),1,fp)!=(int)NULL)
{
c_total++;
}
fclose(fp);
}
void addUser()//创建用户
{
FILE *fp=NULL;
char DataFile[20]="用户.txt";//存放投票人信息文件名
user TempS;
int over_flag=0;
char c;
fp=fopen(DataFile,"rb");//读入原始数据,用于检验输入是否有反复
if(fp==NULL)
{
printf("\nOpen file %s fail! 任意键结束 \n",DataFile);
perror("Open file fail");
getch();
exit(1);
}
while(fread(&total_user[total],sizeof(user),1,fp)!=(int)NULL)
{
total++;
}
fclose(fp);
fp=fopen(DataFile,"ab+");
do
{
printf(" *****************创建新用户***************** ");
printf("请输入:");
printf("用户名:");scanf("%s",&TempS.name);
TempS.name[19]='\0';
for(i=0;i<total;i++)//检验输入姓名是否有反复
{
if(strcmp(TempS.name,total_user[i].name)==0)
{
printf("该用户名已存在!按任意键浏览全部用户...");
getch();
over_flag=1;
break;
}
}
if (over_flag)
{
over_flag=0;
continue;
}
printf(" 密码:");
scanf("%s",&TempS.ps);
TempS.ps[7]='\0';
printf(" 权限:");scanf("%d",&TempS.power);
if(TempS.power!=1)
{
TempS.power=0;
}
total_user[total]=TempS;//将数据加入原始数据
total++;
if(fwrite(&TempS,sizeof(user),1,fp)!=1)
{
printf("\nwrite file is fail! 任意键结束\n",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 With any key \n",DataFile);
perror("Open file fail");
getch();
exit(1);
}
printf("\n姓名\t\t密码\t\t权限\n");
while(fread(&TempS,sizeof(user),1,fp)!=(int)NULL)
{
printf("\n%s\t\t%-8s\t\t%d\n",TempS.name,TempS.ps,TempS.power);
}
fclose(fp);
printf("************************************************************");
printf("\n按任意键返回首页!");
getch();
}
void scan()//浏览候选人信息
{
read();
printf("候选人资料:\n");
printf("***************************************************************\n");
for(i=0;i<c_total;i++)
{
printf("号码:%-15ld",c_man[i].number);
printf("姓名:%-19s",c_man[i].name);
printf("介绍:%s\n",c_man[i].intro);
}
printf("***************************************************************");
printf("\n按任意键返回首页!");
getch();
}
void search() //查询候选人信息
{
char c;
long number;
int flag=0;
read();
do
{
printf("\n\t请输入要查询候选人号码:");
scanf("%ld",&number);
for(i=0;i<c_total;i++)
{
if(number==c_man[i].number)
{
printf("\t您要查询候选人信息以下:\n\n");
printf("\t号码:%ld \n",c_man[i].number);
printf("\t姓名:%s \n",c_man[i].name);
printf("\t介绍:%s \n",c_man[i].intro);
flag=1;
break;
}
}
if (flag)
{
flag=0;
}
else
{
printf("\t对不起,没有您要查询候选人\n");
}
printf("\t要继续查询候选人吗?是(Y)/否(N): ");
getchar();
c=getchar();
}while((c=='Y')||(c=='y'));
}
void sort()//整理全部投票
{
int i,k,j;
candidate c_man2[N]/*存放排序后数据 */, temp;
read();
for(i=0;i<c_total;i++)
c_man2[i]=c_man[i];
for(i=0;i<c_total-1;i++)//用选择法排序
{
k=i;
for(j=i+1;j<c_total;j++)
{
if(c_man2[k].vote<c_man2[j].vote)k=j;
}
if(k!=i){
temp=c_man2[i];c_man2[i]=c_man2[k];c_man2[k]=temp;
}
} //排序结束
printf("票数从高到低排列以下:\n");
printf("***********************************************\n");
printf("*号码 候选人 票数 *\n");
printf("***********************************************\n");
for(i=0;i<c_total;i++) //输出排序后结果
{
printf("* %-13ld %-13s %-6d *\n",c_man2[i].number,c_man2[i].name,c_man2[i].vote);
}
printf("***********************************************\n");
printf("按任意键返回首页!");
fflush(stdin);
getch();
}
void main()
{
FILE * fp=NULL;
char DataFile[20]="用户.txt";
char relogin;//是否重新登录标志
int success=0;
user input_user,temp_user;
printf("管理员账号密码全部为1\n");
printf("\n");
printf("*************************************************************\n");
printf("********************欢迎登录电子投票系统*********************\n");
printf("*************************************************************\n");
printf("* *\n");
again:
printf("* 请输入用户名: *");
scanf("%s",input_user.name);
printf("* 请输入密码: *");
scanf("%s",input_user.ps);
printf("*************************************************************\n");
fflush(stdin);
fp=fopen(DataFile,"ab");
if(fp==NULL)
{
printf("\nOpen file %s fail! 按任意键结束\n",DataFile);
perror("Open file fail");
getch();
exit(1);
}
if(strcmp(input_user.name,"1")==0 && (strcmp(input_user.ps,"1")==0))//校验用户名和密码,若用户名和密码分别为1,是管理员,并调用管理员界面
{
printf("\nlogin successful
展开阅读全文