用指针进行操作编写选票程序
//用指针进行操作编写选票程序
#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)