#include<conio.h>
struct hxr
{
int m
int point
} hxr[3]//选票结构体
void main()
{
int i=0,j=0,k,temp=0
char x,y,z
struct hxr hxr[3]
for(i=0i<3i++)//初始化选票结构体
{
hxr[i].m=i
hxr[i].point=0
}
printf("请输入投票总人数\n")
scanf("%d",&k)
printf("请输入投票\n")
getchar()
for(i=1i<=ki++)
{
scanf("%c%c%c",&x,&y,&z) //输入选票
getchar()
if(x!=y&&x!=z&&y!=z)//3个选票不能相同否则为无效选票
{
hxr[0].point+=(x=='a'?5:(y=='a'?3:(z=='a'?2:0))) //统计a的得票数,切输入3个选票从左到右得分分别是5.3.2
hxr[1].point+=(x=='b'?5:(y=='b'?3:(z=='b'?2:0)))
hxr[2].point+=(x=='c'?5:(y=='c'?3:(z=='c'?2:0)))
printf(" point: %d %d %d\n",hxr[0].point,hxr[1].point,hxr[2].point) //输出a,b,c的得分
continue
}
printf("此票无效\n")
}
for(i=0i<3i++)//分别输出a,b,c的得分
{
if(temp<hxr[i].point)
{
temp=hxr[i].point
j='a'+i
}
printf("people %c point %d\n",'a'+hxr[i].m,hxr[i].point)
}
if(((hxr[0].point==hxr[1].point)&&hxr[0].point>=hxr[2].point&&hxr[1].point>=hxr[2].point ) ||( (hxr[0].point==hxr[2].point)&&hxr[0].point>=hxr[1].point&&hxr[2].point>=hxr[1].point) ||((hxr[1].point==hxr[2].point)&&hxr[1].point>=hxr[0].point&&hxr[2].point>=hxr[0].point))
printf("重新投票\n")
else
{ printf("祝贺%c当选冠军\n",j) }
getchar()
}
提示输入,可以直接输入下标,0~2。这样就不需要判断了。还能避免输入错误。
提示输入的文字建议用循环动态生成。这样方便后期扩展,比如变成5个人。
提示输入的文字大致可以这样写:
把数组大小定义成常量,方便修改,比如#define SIZE 3
printf("请输入对应数字,为下列人物投票:")
for(i=0i<SIZEi++)
printf("%d:%s ",i,arr[i].name)
这样后面输入只要输入结构数组下标,就可以直接++,无需判断。
#include <stdio.h>void sort(int a[][2],int n) {
int i,j,k,t
for(i = 0 i < n - 1 ++i) {
k = i
for(j = i + 1 j <n ++j) {
if(a[k][1] < a[j][1])
k = j
}
if(k != i) {
t = a[k][0]
a[k][0] = a[i][0]
a[i][0] = t
t = a[k][1]
a[k][1] = a[i][1]
a[i][1] = t
}
}
}
void show(int a[][2], int n) {
int i
for(i = 0 i < n ++i)
printf("No%02d %d\n",a[i][0],a[i][1])
printf("\n")
}
int main() {
int i,candidate,n = 10,a[10][2]
for(i = 0 i < n ++i) {
a[i][0] = i + 1
a[i][1] = 0
}
for(i = 0 i < 20 ++i) {
printf("第%d/20个人投票:",i + 1)
scanf("%d",&candidate)
if(candidate >= 1 && candidate <= 10)
++a[candidate - 1][1]
}
sort(a,n)
show(a,n)
return 0
}