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的返回值改一下