#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct people
{
char name[128]; //候选人的名字
int piao; //候选人的票数
};
void kaipi(struct people **p,int *ren) // 1.候选人的名字赋值,票数初始化0
{ //结构体二级指针运用
puts("请输入候选人数"); //输入有几个候选人,
scanf("%d",ren);
*p =(struct people*)malloc( (*ren) * sizeof(struct people));//根据候选人数动态开辟字节空间malloc()
int i;
for(i = 0;i<*ren;i++){
puts("请输入候选人名字");
(*p) -> piao = 0; //给每个候选人票数初始化成0 //注意优先级 (*p)
scanf("%s", (*p) -> name); //输入候选人的名字 //注意优先级 (*p)
(*p) ++; //下一个候选人,指针后偏移 //注意优先级 (*p)
}
(*p) = (*p) - *ren; //重新把指针p偏移到头
printf("有%d个候选人,名字是\n",*ren); //打印候选人数
for(i = 0; i < *ren;i++){ //打印候选人名字
printf("%s\n",(*p)->name);
(*p) ++;
}
(*p) = (*p) - *ren;
}
int toupiao(struct people *p,int ren) // 2.候选人投票环节
{
struct people *p2;
p2 = p;
int i;
int j;
char toupiaoname[128];
int feipiao;
int data = 0;
for(i=0;i<5;i++){ //这里i=5,表示有五个票
feipiao = 0; //废票初始化
puts("请输入候选人名字进行投票"); //提示打印,输入候选人名字,进行投票
memset(toupiaoname,'\0',sizeof(toupiaoname));
scanf("%s",toupiaoname); //输入候选人名字toupiaoname,进行投票
for(j = 0;j<ren;j++){ //将投票人名字和每个候选人的名字进行对比
if( strcmp(toupiaoname,p->name) == 0 ){ //当投票人名字与候选人名字相同时候
p->piao++; //候选人的票数+1
feipiao = 1;
}
p++; //指针的偏移,这里指针偏移的意思是换下一候选人
}
p = p2; //将指针重新回到头,意思是指针指针重新偏移到第一候选人
if(feipiao == 0){ //如果,输入的投票人名字,不是候选人的名字(找不到相同候选人名字),记录一次废票,此票作废
puts("请输入正确的候选人名字,此票作废");
data++;
}
}
return data; //返回废票的数
}
void jieguo(struct people *p,int ren,int feipiao) //投票结果的打印
{
int i;
for(i=0;i<ren;i++){
printf("name %s,票数%d \n",p->name,p->piao); //打印每个候选人的名字和获得的票数
p++;
}
printf("废票数%d",feipiao); //打印废票数
}
int main()
{
int ren;
struct people *p = NULL;
int feipiao;
kaipi(&p,&ren); //1.输入有几个候选人,并且输入候选人的名字
feipiao = toupiao(p,ren); //2.进行投票,输入候选人名字,投一票
jieguo(p,ren,feipiao); //打印投票结果
return 0;
}
运行结果:
请输入候选人数
3
请输入候选人名字
a
请输入候选人名字
b
请输入候选人名字
c
有3个候选人,名字是
a
b
c
请输入候选人名字进行投票
a
请输入候选人名字进行投票
a
请输入候选人名字进行投票
a
请输入候选人名字进行投票
c
请输入候选人名字进行投票
b
name a,票数3
name b,票数1
name c,票数1
废票数0