用结构体函数,完善选票系统
知识点: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;
}
结果: