嵌入式c语言学习--选票系统3

用结构体函数,完善选票系统

知识点:malloc函数动态开辟空间,与null

定义结构体指针函数struct Person *initnum(struct Person *p,int *pnum)目的,返回的是指针变量,改变主函数内的结构体值,用指针传参方便。推荐听小破站浙大翁恺的c语言关于结构体和指针,和malloc几节课,帮助很大,这些老陈讲的不行。容易不懂。

代码:

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


//定义结构体
struct Person
{
	char name[50];
	int  tickets;
	
};
//封装参选
struct Person *initnum(struct Person *p,int *pnum)
{
	//未想到p==NULL,与开辟动态空间
	if(p == NULL){
	   puts("请输入参选人数");
	   scanf("%d",pnum);
		p = (struct Person*)malloc(*pnum*sizeof(struct Person));//开辟动态空间,要定义起是什么类型的指针,里面开辟了多少空间,记得free
	}
	
	for(int i=0;i<*pnum;i++){
		printf("请输入第%d位候选人的名字\n",i+1);
		scanf("%s",p->name);
		p->tickets = 0;//一定要对传参的目标进行初始化
		p++;
			
	}
	//free(p);不能加在这里,程序崩溃
	return p-*pnum;
	
}
//打印名字与票数
void printfName(struct Person *p,int *pnum)
{
	int i=0;
	puts("候选人为:");
	for(i=0;i<*pnum;i++){
		printf("候选人:%s  票数:%d\n",p->name,p->tickets);
		
		p++;
	}
	
}
//投票

int vote(struct Person *p,int *voter,int *pnum)
{
	
	int len2=0;
	int none =0;
	char votename[32];
	int abandonTickets=0;
	struct Person *pbak=p;
	puts("请输入投票人数");
	scanf("%d",voter);

	for(int i = 0;i<*voter;i++){
		none = 0;//每次循环初始化,不能在下面
		puts("请输入你支持的候选人的名字");
		memset(votename,'\0',sizeof(votename));//初始化
		scanf("%s",votename);//数组首就是地址可以不用加&
		p=pbak;
		for(int k=0;k<*pnum;k++){
		if(strcmp(votename,p->name)==0){//比较是否相等    //注意最好通过间接和strcmp进行结构体间接赋值
			p->tickets++;
			none=1;
			
			 
		   }
		  p++;
		}
		if(none == 0){
		puts("哥们,你选的那位大神啊!没这人啊!");
		abandonTickets++;
		}
	}
	return abandonTickets;
}


//最多票
int getMax(struct Person *ppname,int *pnum)
{
	struct Person *max;
	max =ppname;
	for(int i=0;i<*pnum;i++){
		if(max->tickets<ppname->tickets)
			max=ppname;
		ppname++;
		
	}
	printf("得票最高的为%s ,票数为%d \n",max->name,max->tickets);
	
	
}

int main()
{
	//1.输入参选人数,与名字
	struct Person *ppname=NULL;
	int pnum=0;
	int abandonTickets=0;
	int voter = 0;
	ppname = initnum(ppname,&pnum);
	//2.打印候选人名字与票数
	printfName(ppname,&pnum);
	//3.投票
	abandonTickets=vote(ppname,&voter,&pnum);
	printf("废票是:%d\n",abandonTickets);
	printfName(ppname,&pnum);
	//最多票
	getMax(ppname,&pnum);
	
	
	
	
	return 0;
}

 

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值