投票系统(结构体二级指针,数组,函数综合应用)

该程序是一个简单的投票系统,使用C语言编写。它允许用户输入参选者姓名,然后进行投票。系统会检查投票的有效性,统计票数,并显示结果。当投票人选择的参选者不在列表中时,该票被视为弃票。最后,程序会宣布得票最多的参选者为胜出者。

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

/*
=========
投票系统
=========
*/
//vote投票;elector候选人;voter投票人;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Vote
{
	char name[64];											//指定多少个人参选,则就是定义一个结构体数组,人数固定,不能想输入几个人参选就几个人;
	int tickets;
};

void initElector(struct Vote **p, int *electorNum)			//二级指针,用来存放一级指针的地址,可以返回空类型,从而在地址上进行改变数值,不需要返回数值;
{
	int i;
	
	if (*p == NULL){
		printf("请您输入参选的人数:\n");
		scanf("%d", electorNum);
		*p = (struct Vote *)malloc((*electorNum)*sizeof(struct Vote));		//因为需要外部输入多少个人,所以需要动态的分配内存;
	}
	
	for (i=0; i<*electorNum; i++){
		printf("请您输入第%d位参选者的姓名:\n", i+1);
		scanf("%s", (*p)->name);
		(*p)++;
	}
	*p = *p-*electorNum;
	
	printf("\n参加的选民基本信息如下所示:\n");
	for (i=0; i<*electorNum; i++){
		printf("第%d位参选人的名字:%s\n", i+1, (*p)->name);
		(*p)++;
	}
	*p = *p-*electorNum;
}

int initVoter(struct Vote *q, int electorNum)
{
	int i, j;
	int mark;												//标记,检测弃票错票;
	int error = 0;
	char tempname[64];										//定义数组来存放字符串;
	int voterNum;
	
	printf("\n请您输入投票的人数:\n");
	scanf("%d", &voterNum);
	
	for (i=0; i<voterNum; i++){
		mark = 0;											//要在for内部进行置0;
		memset(tempname, '\0', sizeof(tempname));			//将临时名字内清0,每次都要输入新的名字;
		printf("请第%d个人写下你想投票的名字:\n", i+1);
		scanf("%s", tempname);
		for (j=0; j<electorNum; j++){						//开始拿存放在临时名字内的名字与现有的名字进行比较,并且进行计次tickets,遍历len次,即参选人数;
			if (strcmp(tempname, q->name) == 0){
				(q->tickets)++;
				mark = 1;
			}
			q++;
		}
		q = q-electorNum;									//不能去掉,很重要!每次都要重头开始遍历比较;
		if (mark == 0){
			printf("此票作为弃票!\n");
			error++;
		}
	}
	
	return error;
}

void printResult(struct Vote *pp, int error, int electorNum)
{
	int i;
	struct Vote *max;
	max = pp;
	
	printf("\n");
	for (i=0; i<electorNum; i++){
		printf("名字:%s,票数:%d\n", pp->name, pp->tickets);
		pp++;
	}
	pp = pp-electorNum;										//不能去掉;为了下面pp->tickets的pp开始从第一个遍历;
	printf("弃票数:%d\n", error);
	
	for (i=0; i<electorNum; i++){
		if (max->tickets < pp->tickets){
			max = pp;
		}
		pp++;
	}
	printf("最终%s以%d票竞选成功\n", max->name, max->tickets);
}

int main()
{
	int electorNum = 0;										//定义一个候选(参选)人数;
	struct Vote *elector = NULL;							//结构体类型的指针变量,其内部也包含了结构体的所有变量;NULL指向空指针,防止悬挂;
	int error = 0;
	struct Vote **pelector = &elector;						//二级指针,pelector存放的是elector的地址,则*pelector=(elector这个地址内存放的内容),而这个内容是NULL,所以*pelector=NULL;
															//下面一行传地址就可以不用返回值,直接修改地址上的数据,均变化;
	initElector(&elector, &electorNum);						//函数功能:确定候选人数,姓名和年龄;将elector候选人传入函数内,在函数内部进行赋值,初始化候选人;
	
	error = initVoter(elector, electorNum);					//函数功能:确定投票人数以及唱票;
	
	printResult(elector, error, electorNum);				//函数功能:打印投票结果;
	
	return 0;
}


//结果:

请您输入参选的人数:
3
请您输入第1位参选者的姓名:
aa
请您输入第2位参选者的姓名:
bb
请您输入第3位参选者的姓名:
cc

参加的选民基本信息如下所示:
第1位参选人的名字:aa
第2位参选人的名字:bb
第3位参选人的名字:cc

请您输入投票的人数:
5
请第1个人写下你想投票的名字:
aa
请第2个人写下你想投票的名字:
cc
请第3个人写下你想投票的名字:
bb
请第4个人写下你想投票的名字:
dd
此票作为弃票!
请第5个人写下你想投票的名字:
bb

名字:aa,票数:1
名字:bb,票数:2
名字:cc,票数:1
弃票数:1
最终bb以2票竞选成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux再对我好一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值