C语言学习第9次打卡

用指针进行操作编写选票程序

//用指针进行操作编写选票程序
#include <stdio.h> 	
#include <stdlib.h>
#include <string.h>

enum data{male=1,female};

struct vote
{
	char name[20];
	enum data sex;
	int numballot;
	
};

void initnum(int *pd)//确定人数
{

	printf("\n请输入参与选举的人数\n");
	scanf("%d",pd);
}

void initcandidate(int *number1, struct vote **pc)   //录入选举人信息
{
	int i;

	
	for(i=0;i<*number1;i++)
	{
	int stopsgl=0;
	int k=0 ;
	(*pc)->numballot=0;
	printf("请输入第%d位选举人的姓名\n",i+1);
	scanf("%s",(*pc)->name);
	printf("请输入第%d位选举人的性别: 1.male  2.famale\n",i+1);
	while (1)
	{
		scanf("%d",&k);
		getchar();
		//while(1)
		//{
		    switch(k)
	        {
		    case 1: puts ("性别:male\n\n"); stopsgl=1;break;
		    case 2: puts ("性别:famale\n\n");stopsgl=1;break;
		    default: break;
	        }
	    if(stopsgl==1) 
		    {
			break;
			puts("\n");
			}
	
		printf("性别输入错误,重新输入选举人的性别: 1.male  2.famale\n");
		//}
	}
	((*pc)->sex)=(enum data)k; 		
	(*pc)++;//*pc++写成这样子的会出错卡死,因为*pc的地址一直是*PC[0],第一次赋值数组的name常量后第二次写入*PC[0]卡死,常量无法修改。
	}
	//getchar();//作用防止按下回车键后,polling函数当做1个字符了,导致执行1次。
	//*pc=*pc-*number1;
	puts("\n");
}



void printfinfo(int *number2, struct vote **pc)   //打印选举人信息
{
	int j;
		printf("本次参加选举共有%d人\n",*number2);
	for(j=0;j<*number2;j++)
	{

	printf("第%d位选举人的名字:%s\n ",j+1,(*pc)->name);
	
	switch((*pc)->sex)
	{
		case 1: puts ("性别:male\n");break;
		case 2: puts ("性别:famale\n");break;
		default: puts("性别输入错误,重新输入");break;
	}

	(*pc)++;
	}
	
	//*pc=*pc-*number2; 	
	
}
void polling(int *number3, struct vote **pc,int *numpeo)//开始投票
{
int i;
char cdd[20];
memset(cdd,'\0',sizeof(cdd));
char*pcdd=cdd;
while (1)
{
int	sigaldata=0;
printf("请输入您想投的人的名字,投票结束输入q\n");

gets(cdd);

   if(*cdd=='q') 	 	
    {
    puts("\n\n投票结束");		
    break;
    }
	
	for(i=0;i<*number3;i++)
	{
		   if(strcmp(cdd,(*pc)->name)==0)
		   {
		   (*pc)->numballot++;
		   sigaldata=1;
		   printf("目前他/她的票数:%d\n",(*pc)->numballot);
		   (*numpeo)++;//投票人数
		   }
		
		   (*pc)++;	 	 
    }
	 if(sigaldata==0)
		 {printf("输入有误,请重新输入, ");}
	 
	
   *pc=*pc-*number3;
}
}




void  getresult (int *number4, struct vote **pc,int numpeo)      //对比产生结果1
{
int i;
printf("本次参与投票人数:%d(人)\n",numpeo);
puts("各位参赛者的票数如下:\n");
for (i=0;i<*number4;i++)
{
printf("%d,%s的票数:%d\n",i+1,(*pc)->name,(*pc)->numballot);
(*pc)++;
}
}


void getmax(int *number4, struct vote **pc)//打印结果2
{
	int i,maxdata;
	char maxname[20];
	memset(maxname,'\0',sizeof(maxname));
	 strcpy(maxname,(*pc)->name);
    maxdata=(*pc)->numballot;	 
    for (i=0;i<*number4-1;i++)
    {
		if(       ( (*pc)   ->   numballot)  <    (  (*pc+1)  ->numballot )      )
		{	
        maxdata=(*pc+1)->numballot;   
       strcpy(maxname,(*pc+1)->name); 
        }
		else(  ( (*pc)   ->   numballot) ==   (  (*pc+1)  ->numballot ) )
		{
			
			
		}
       (*pc)++;
    
}
       printf("本次选举的获胜者:%s, 票数:%d",maxname,maxdata);
}


int main ()
{
int data=0;             //没有这一步,pdata就是野地址,initdata(int **pd)输入的值无法传递过来。
int *pdata =&data; 
int numpeo =0;
initnum(pdata);//
struct vote *candidate[data];//定义一个指针型结构体数组。
struct vote **px=candidate;
//printf("点位1-1:%p\n",*px);//点位1-1:0000000000401540
*px=(struct vote*)malloc (data*sizeof(struct vote));
struct vote *pb=*px;//取一个pb用于回正指针。
//printf("点位1-2:%p\n",*px);//点位1-2:00000000009713E0
initcandidate(pdata,px);    *px=pb;//对数据操作地址重新归位。
printfinfo(pdata,px);    *px=pb;

polling(pdata,px,&numpeo);   *px=pb;
	
getresult (pdata,px,numpeo);   *px=pb;

getmax(pdata,px);

return 0;

}






/*
枚举知识:scanf("%d",(*pc)->sex);这里是不被允许的,枚举变量不能直接输入,必须强制进行类型转换才能赋值。
举例 :  scanf("%d",&k);
	     day=(enum weekday)k; 
		 
		 strcpy函数
		 char * strcpy(char *strDest, const char *strSrc) 

		 
*/

枚举知识:scanf(“%d”,(*pc)->sex);这里是不被允许的,枚举变量不能直接输入,必须强制进行类型转换才能赋值。
举例 : scanf(“%d”,&k);
day=(enum weekday)k;

	 strcpy函数
	 char * strcpy(char *strDest, const char *strSrc) 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值