C语言——函数+指针形式来做选票系统

#include<stdio.h>#include<string.h>
#include <stdlib.h>
struct Xuanmin
{
char name[32];
int ticket;
};

struct Xuanmin *initXms(struct Xuanmin *p,int *len)
{
int i;
if(p==NULL){
printf ("请输入有几个人参选\n");
scanf("%d",len);
p=(struct Xuanmin*)malloc((*len)*sizeof(struct Xuanmin));//有几个选民开辟n*结构体个内存空间
}
for(i=0;i<*len;i++){
p->ticket=0;
printf ("请输入%d个选民的名字:\n",i+1);
scanf("%s",p->name);
p++;
}
return p-(*len);//重新指向第一个选民首地址
};

void printXms(struct Xuanmin *p,int *len,int *feipiao)
{
int i;
struct Xuanmin *max;
struct Xuanmin *pbak=p;
for(i=0;i<*len;i++){
printf("第%d个选民名字为%s,得票%d\n",i+1,p->name,p->ticket);
p++;
}

p=pbak;
*max=p[0];
for(i=0;i<*len;i++){

if(max->ticket<p->ticket){
*max=*p;
}
p++;
}
printf("候选人%s以%d票当选,废票是%d\n",max->name,max->ticket,*feipiao);
}

int doVot(struct Xuanmin *p,int len,int feipiao)
{
int i;
int j;
int mark;
char tmpname[32];
struct Xuanmin *pbak=p;

for(i=0;i<5;i++){
mark=0;
printf("你要把票投给谁:\n");
memset(tmpname,'\0',sizeof(tmpname));
scanf("%s",tmpname);
p=pbak;//重新指向首地址
for(j=0;j<len;j++){
if(strcmp(tmpname,p->name)==0){
p->ticket++;
mark=1;

}
p++;
}
//没有此候选人,弃票
if(mark==0){
printf("没有此候选人,弃票\n");
feipiao++;
}

}
return feipiao;
}

int main()
{
int total=0;
int feipiao=0;
struct Xuanmin *xm=NULL;
xm=initXms(xm,&total);//选民赋值

feipiao=doVot(xm,total,feipiao);
printXms(xm,&total,&feipiao);//打印选民

return 0;
}

 

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
struct Xuanmin
{
 char name[32];
 int ticket;
};

/*struct Xuanmin *initXms(struct Xuanmin *p,int *len)
{
 int i;
 if(p==NULL){
  printf ("请输入有几个人参选\n");
     scanf("%d",len);
  p=(struct Xuanmin*)malloc((*len)*sizeof(struct Xuanmin));//有几个选民开辟n*结构体个内存空间
 }
 for(i=0;i<*len;i++){
  p->ticket=0;
  printf ("请输入%d个选民的名字:\n",i+1);
  scanf("%s",p->name);
  p++;
 }
    return p-(*len);//重新指向第一个选民首地址
};*/
void initXms(struct Xuanmin **pxm,int *pt)//定义二级指针承接二级指针地址
{
 int i;
 
 if (*pxm==NULL){
  printf("请输入有几个人参选:\n");
  scanf("%d",pt);
  *pxm=(struct Xuanmin*)malloc(12*sizeof(struct Xuanmin));
 }
 for(i=0;i<*pt;i++){
  (*pxm)->ticket=0;
  printf("请输入第%d个选民的名字:\n",i+1);
  scanf("%s",(*pxm)->name);
  (*pxm)++;
 }
 *pxm=(*pxm)-(*pt);
}

void printXms(struct Xuanmin *p,int *len,int *feipiao)
{
 int i;
 struct Xuanmin *max;
 struct Xuanmin *pbak=p;
 for(i=0;i<*len;i++){
  printf("第%d个选民名字为%s,得票%d\n",i+1,p->name,p->ticket);
  p++;
 }
 
 p=pbak;
 *max=p[0];
 for(i=0;i<*len;i++){
  
  if(max->ticket<p->ticket){
   *max=*p;
  }
  p++;
 }
 printf("候选人%s以%d票当选,废票是%d\n",max->name,max->ticket,*feipiao);
}

int doVot(struct Xuanmin *p,int len,int feipiao)
{
 int i;
 int j;
 int mark;
 char tmpname[32];
 struct Xuanmin *pbak=p;

for(i=0;i<5;i++){
  mark=0;
  printf("你要把票投给谁:\n");
  memset(tmpname,'\0',sizeof(tmpname));
  scanf("%s",tmpname);
  p=pbak;//重新指向首地址
  for(j=0;j<len;j++){
   if(strcmp(tmpname,p->name)==0){
    p->ticket++;
    mark=1;
    
   }
   p++;
  }
  //没有此候选人,弃票
     if(mark==0){
      printf("没有此候选人,弃票\n");
   feipiao++;
     }
 
 }
 p=pbak;
 for(j=0;j<len;j++){
   printf("dayin%d\n",p->ticket);
   p++;
  }
 
 return feipiao;
}

int main()
{
 int total;
 int feipiao=0;
 struct Xuanmin *xm=NULL;
 
    struct Xuanmin **pxm=&xm;
 int *pt=&total;            //区分一级指针变量与二级指针变量,看保存的是否是指针变量地址

initXms(pxm,pt);//实参地址引用到函数,这里为二级指针地址
 //xm=initXms(xm,&total);//选民赋值

feipiao=doVot(*pxm,*pt,feipiao);
 printXms(*pxm,&total,&feipiao);//打印选民
 
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值