[说明及要求]
设有代码号为X、Y、Z的3个候选人竞选年度先进工作者,积分方法如下:投票者在选票上对他们的编号的填写顺序分极为5.3.2时,若投票人数为4,输入投票内容为(1) XYZ; (2) ZXY; (3) ZYX ;(4) YZX ;候选人等分为X:12 ; Y:13 ; Z:15 ,则Z为年度先进工作者。请编程从键盘上输入投票人数及投票结果,统计他们的得分,并输入哪位是年度先进工作者。要求投票者在选票上对他们的编号的填写顺序可自行设定,同一张票上写有两个相同代号视为无效票。
[提示]
(1) 定义结构体成员表示投票及得分。
(2) 若采用二维数组,可考虑行方向对应一张投票,列方向对应各候选人得分。
(3) 编写main函数进行演示,可考虑函数调用。
#include<stdio.h>
#include<stdlib.h>
#define PEOPLE 3
#pragma warning(disable : 4996)
struct vote
{
char a1;
char a2;
char a3;
}voteman[20];
struct abc
{
char name;
int ticket;
}number[PEOPLE];
void select();
void grade(struct vote p[], struct abc number[], int n)
{
int i;
number[0].ticket = 0;
number[1].ticket = 0;
number[2].ticket = 0;
for (i = 0; i < n; i++)
{
if ((p[i].a1 == p[i].a2) || (p[i].a1 == p[i].a3) || (p[i].a2 == p[i].a3))
{
printf("同一张票上写有两个相同代号视为无效票!!!\n");
continue;
}
else
{
switch (p[i].a1)
{
case 'X':
{
number[0].ticket += 5;
if (p[i].a2 == 'Y')
{
number[1].ticket += 3;
number[2].ticket += 2;
}
else
{
number[1].ticket += 2;
number[2].ticket += 3;
}
break;
}
case'Y':
{
number[0].ticket += 3;
if (p[i].a2 == 'X')
{
number[1].ticket += 5;
number[2].ticket += 2;
}
else
{
number[1].ticket += 2;
number[2].ticket += 5;
}
break;
}
case'Z':
{
number[0].ticket += 2;
if (p[i].a2 == 'X')
{
number[1].ticket += 5;
number[2].ticket += 3;
}
else
{
number[1].ticket += 3;
number[2].ticket += 5;
}
break;
}
}
}
}
select();
}
void iresult(struct abc number[])
{
if (number[0].ticket == 0 && number[1].ticket == 0 && number[2].ticket == 0)
{
printf("请先投票!!!\n");
select();
}
else
{
if (number[0].ticket >= number[1].ticket && number[0].ticket >= number[2].ticket)
{
printf("X的得分最高,当选年度先进工作者!\n");
}
else if (number[1].ticket >= number[0].ticket && number[1].ticket >= number[2].ticket)
{
printf("Y的得分最高,当选年度先进工作者!\n");
}
else
{
printf("Z的得分最高,当选年度先进工作者!\n");
}
select();
}
}
int input(struct vote voteman[])
{
int i, people;
printf("请输入投票人数:");
scanf("%d", &people);
printf("请输入投票结果:\n");
for (i = 0; i < people; i++)
{
getchar();
printf("(%d)", i + 1);
scanf("%c%c%c", &voteman[i].a1, &voteman[i].a2, &voteman[i].a3);
}
grade(voteman, number, people);
}
void voteout(struct abc number[], int n)
{
int i;
if (number[0].ticket == 0 && number[1].ticket == 0 && number[2].ticket == 0)
{
printf("请先投票!!!\n");
select();
}
else
{
for (i = 0; i < PEOPLE; i++)
{
switch (i)
{
case 0:
printf("X候选人的票数和为:%d\n", number[i].ticket);
break;
case 1:
printf("Y候选人的票数和为:%d\n", number[i].ticket);
break;
case 2:
printf("X候选人的票数和为:%d\n", number[i].ticket);
}
}
select();
}
}
void select()
{
int n;
printf("请输入选择:");
scanf("%d", &n);
switch (n)
{
case 1:
input(voteman);
break;
case 2:
voteout(number, PEOPLE);
break;
case 3:
iresult(number);
break;
case 4:
printf("再见!\n");
break;
default:
printf("Error!!!\n");
select();
}
}
void mainmenu()
{
printf("\n\n\n\n");
printf("\t\t|-----------------------------------------|\n");
printf("\t\t| |\n");
printf("\t\t| ====================== |\n");
printf("\t\t| 欢迎光临投票系统 |\n");
printf("\t\t| ====================== |\n");
printf("\t\t| |\n");
printf("\t\t| 1.输入选票人数及信息 |\n");
printf("\t\t| 2.查看分数 |\n");
printf("\t\t| 3.查看结果 |\n");
printf("\t\t| 4.退出系统 |\n");
printf("\t\t|-----------------------------------------|\n");
select();
}
int main()
{
mainmenu();
return 0;
}