在学到结构体的时候,这道例题,我用了至少4个小时才弄懂,指针,结构体,函数在这个程序的搭配使用的含义。应该是我比较菜鸡了....我愿意说实话...hhh
先上代码,我先说明一下,这个程序不严谨,主要是用来巩固知识的作用
话不多说先上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Xuanmin
{
char name[32];
int tickets;
};
struct Xuanmin* initxm(struct Xuanmin *p,int *pn)
{
int i;
if(p == NULL){
printf("请输入有几人参选\n");
scanf("%d",pn);
p = malloc(*pn*sizeof(struct Xuanmin));//36*n
}
for(i=0;i<*pn;i++){//因为我们结构体一般不让初始化 为了不让tickets未定义所以要初始化;
p->tickets = 0;
p++;
}
p=p-*pn;
for(i=0;i<*pn;i++){
printf("请输入第%d个选民的名字\n",i+1);
scanf("%s",p->name);
p++;
}
return p-*pn;
}
void printfXms(struct Xuanmin *p,int len)
{
int i;
for(i=0;i<len;i++){
printf("名字%s 票数%d\n",p->name,p->tickets);
p++;
}
}
//唱票环节
int dovot(struct Xuanmin *p,int len)
{
int i;
int j;
int mark=0;
char tempName[32];
struct Xuanmin *pbak = p;//定义这个就是为了后面的重置作用:指针重新指向头
int feipiao=0;
for(i=0;i<len;i++){
mark=0;
printf("请输入你要投给谁的名字:\n");
memset(tempName,'\0',sizeof(tempName));//每次清空一下
scanf("%s",tempName);//输入选中名字,像打开一个选票,看到名字一样 tempName就像一张纸一样临时保存了名字
p = pbak;//指针重新指向头部
for(j=0;j<len;j++){//拿到名字,对应的候选人选票+1
if(strcmp(p->name,tempName) == 0){
p->tickets++;
mark = 1;
}
p++;
}
if(mark==0){
printf("没有此候选人,放弃\n");
feipiao++;
}
}
return feipiao;
}
struct Xuanmin* getMax(struct Xuanmin *p,int len)
{
struct Xuanmin *max;
int i;
max=p;
for(i=0;i<len;i++){
if(p->tickets > max->tickets){
max=p;
}
p++;
}
return max;
}
int main()
{
struct Xuanmin *xm = NULL;
struct Xuanmin *final;
int total=0;
xm = initxm(xm,&total);
printfXms(xm,total);
int feipiao = dovot(xm,total);
printf("废票数是%d\n",feipiao);
printfXms(xm,total);
final = getMax(xm,total);
printf("%s以%d票当选!!废票是%d\n",final->name,final->tickets,feipiao);
return 0;
}
tips:在同一个函数里,若指针发生了偏移,并且没有额外的重置操作,在后续的循环里指针仍然会保持偏移后的位置,不会自动重置。
这个就是我们对于结构体与指针配合需要注意的一点。程序不好解释太多了,要是我的话我会跟你将程序是怎么设计的,这个没有几千个字,说不清的,不浪费时间了,重要的注释都在代码里面,编程序最重要的是培养程序的设计思想。