投票系统改写(用函数指针结构体的方式)

本文介绍了如何使用C++实现一个选民管理系统,包括选民信息的初始化、投票操作、废票统计以及票数最多的候选人查找。通过`initXms`函数获取选民指针,`doVote`进行投票计票,`printXms`展示选民信息,`getMax`找出得票最多的选民。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先对选民指针初始化,之后用malloc开辟n个空间。len在主函数里面没法用sizeof的方式来计算长度,这是因为当计算指针时固定为8个字节,在初始化后要将指针地址指向一开始的地方。关于getmax函数,首先先将max指针指向p,通过if函数来判断两个是否相等,由于p一直在偏移,所以当他们两个值有比较的时候交换地址。

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

struct XuanMin* initXms(struct XuanMin* p,int *pn)  //返回选民的指针
{
	int i;
	if(p==NULL){
		printf("请输入有几个人参选:\n");
		scanf("%d",pn);
		p=(struct XuanMin*)malloc(*pn*sizeof(struct XuanMin));
		
	}
	for(i=0;i<*pn;i++){
		p->tickets=0;
		printf("请输入第%d选民的名字:\n",i+1);
		scanf("%s",p->name);
		p++;
	}
	
	return p-*pn;
	
}


void printXms(struct XuanMin* p,int len)
{
	
	int i;
	for(i=0;i<len;i++){
	printf("名字:%s,票数:%d\n",p->name,p->tickets);
	p++;
	}
	
}


int doVote(struct XuanMin* p,int len)
{
	int i;
	int j;
	int mark;
	char tmp_name[32];
	int feipiao=0;
	struct XuanMin *xm=p;
	
	for(i=0;i<5;i++){
		mark=0;
		printf("请输入你要投的选民:\n");
		memset(tmp_name,'\0',sizeof(tmp_name));
		scanf("%s",tmp_name);
		p=xm;
		for(j=0;j<len;j++){
			if(strcmp(tmp_name,p->name)==0){
			p->tickets++;
			mark=1;
			}	
			p++;
		}
		if(mark==0){
			printf("没有此人放弃\n");
			feipiao++;
		}
		
	}
		return feipiao;
}



void getMax(struct XuanMin* p,int len)
{
	struct XuanMin* Max;
	Max=p;
	int i;
	for(i=0;i<len;i++){
		if(Max->tickets < p->tickets){
			Max=p;
			
		}
		p++;
	}	
	printf("票数最多的人:%s,票数为:%d\n",Max->name,Max->tickets);
}



int main()
{
	struct XuanMin *xm=NULL;
	int total=0;
	int feipiao;
	
	xm = initXms(xm,&total);
	printf("sizeof xms = %d\n",total);
	
	feipiao=doVote(xm,total);
	printf("废票为:%d\n",feipiao);
	printXms(xm,total);
	getMax(xm,total);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值