c语言结构体指针编程例题,C语言题目,小弟我是新手,学到结构体加上指针有点迷茫,能否帮小弟我看下这编程有什么错...

C语言题目,我是新手,学到结构体加上指针有点迷茫,能否帮我看下这编程有什么错

#include 

struct student

{

int num;

char name[20];

float score;

};

void input(struct student *p)

{

int i;

for(i=0;i<4;i++)

scanf("%d%s%f",*(p+i)->num,*(p+i)->name,*(p+i)->score);

}

float zuida(struct student *p)

{

int i;

float max;

max=p->score;

for(i=1;i<4;i++)

if(p->score>max)

{

max=p->score;

}

return(max);

}

output(struct student *p)

{

printf("%f",*p);

}

main()

{

struct student stu[4];

struct student *pr;

pr=&stu[4];

input(pr);

zuida(pr);

output(pr);

}

题目:有4个学生,每个学生包活学号,姓名,成绩。要求找出成绩最高者的姓名和成绩

我想分别调用三个函数input,output,max来实现 这个功能,不想在主函数main一次编写完

但程序input有问题,能否帮忙修改顺便讲解下错误

------解决方案--------------------

你的output函数 传递的就是pr的首地址,所以output无论如何都是打印的是第一个元素的内容,对你的zuida函数做了修改,返回最大分数的那个结构体的地址,调用output函数时,把最大的地址传进去

student * zuida(student *p)

{

student *tmp=p;

for(i=1;i<4;i++){

if(tmp->score 

tmp=p+i;

}

return tmp;

}

//main函数其余部分省略

output(zuida(pr));//zuida函数的返回值作为output函数的参数

------解决方案--------------------

接着往下看了下,你对指针和数组还没弄清楚

main()

{

struct student stu[4];//数组名就是代表的数组的首地址

struct student *pr;

pr=&stu[4];//你在这里把pr指向了一个超过数组边界的地址,

//数组的成员分别是stu[0]-stu[3],stu[4]已经越界

input(pr);

zuida(pr);

output(pr);

}

------解决方案--------------------

#include 

struct student

{

int num;

char name[20];

float score;

};

void input(struct student *p)

{

int i;

for(i=0;i<2;i++)

{

scanf("%d %s %f",&(p+i)->num,&(p+i)->name,&(p+i)->score);

//printf("%d %s %f",(p+i)->num,(p+i)->name,(p+i)->score);

}

}

student zuida(struct student *p)

{

int i;

student max;

max=*p;

for(i=1;i<2;i++)

if(p[i].score>max.score)

{

max=p[i];

}

return(max);

}

void output(struct student p)

{

///printf("%f",*p);

//for(int i=0;i<2;i++)

printf("%d %s %f\n",p.num,p.name,p.score);

}

int main()

{

struct student *pr = new student[2];

//pr=&stu[2];

input(pr);

//printf("%f\n",);

output(zuida(pr));

delete []pr;

return 0;

}

把zuida的返回值改一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值