C语言,谭浩强第五版原题,我改了一下标准答案,发现无法解决问题。
谭浩强第五版第九章课后第五题题目:有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输人10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
10个学生太多了,我就修改成了3个。
标准答案:#include <STDIO.H>
struct student
{
char num;
char name;
float sco;
float ave;
}stu;
int main()
{
int i=0,j,k;
float sum,max=0,aver=0;
for (i;i<3;i++)
{
printf("请输入学生%d的成绩:\n",i+1);
printf("序号:");
scanf("%s",stu.num);
printf("姓名:");
scanf("%s",stu.name);
for (j=0;j<3;j++)
{
printf("请输入成绩%d:",j+1);
scanf("%f",&stu.sco);
}
}
k=0;
for (i=0;i<3;i++)
{
sum=0;
for (j=0;j<3;j++)
{
sum=sum+stu.sco;
}
stu.ave=sum/3.0;
aver=aver+stu.ave;
if (sum>max)
{
max=sum;
k=i;
}
}
aver=aver/3;
printf(" 序号 姓名 成绩1 成绩2 成绩3 平均分 \n");
for (i=0;i<3;i++)
{
printf("%5s%10s",stu.num,stu.name);
for (j=0;j<3;j++)
{
printf("%11.2f",stu.sco);
}
printf("%9.2f\n",stu.ave);
}
printf("平均分=%5.2f\n",aver);
printf("最高的成绩是:学生%s,%s\n",stu.num,stu.name);
printf("他的成绩为:%6.2f,%6.2f,%6.2f,平均分为:%5.2f \n",stu.sco,stu.sco,stu.sco,stu.ave);
return 0;
}
根据标准答案,修改了一下:
#include <STDIO.H>
struct student
{
char num;
char name;
float sco;
float ave;
}stu;
int main()
{
struct student *p;
p=stu;
int i=0,j,k;
float sum,max=0,aver=0;
for (;p<stu+3;p++,i++)
{
printf("请输入学生%d的成绩:\n",i+1);
printf("序号:");
scanf("%s",p->num);
printf("姓名:");
scanf("%s",p->name);
for (j=0;j<3;j++)
{
printf("请输入成绩%d:",j+1);
scanf("%f",&p->sco);
}
}
k=0;
for (p=stu;p<stu+3;p++)
{
sum=0;
for (j=0;j<3;j++)
{
sum=sum+p->sco;
}
p->ave=sum/3.0;
aver=aver+p->ave;
if (sum>max)
{
max=sum;
k=i;
}
}
aver=aver/3;
printf(" 序号 姓名 成绩1 成绩2 成绩3 平均分 \n");
for (p=stu;p<stu+3;p++)
{
printf("%5s%10s",p->num,p->name);
for (j=0;j<3;j++)
{
printf("%11.2f",p->sco);
}
printf("%9.2f\n",p->ave);
}
printf("平均分=%5.2f\n",aver);
p=stu+k;
printf("最高的成绩是:学生%s,%s\n",p->num,p->name);
printf("他的成绩为:%6.2f,%6.2f,%6.2f,平均分为:%5.2f \n",p->sco,p->sco,p->sco,p->ave);
return 0;
}
结果,成绩最大的学生输出失败,问题应该是出在倒数第五行 p=stu+k; 我想法是把指针指向最大的那个学生,然后输出他的信息,可是没有成功,我把k改成0,1,2,输出的时候没问题,改成k就出现了问题,大佬能解释一下为什么?
我输出的结果如下: 本帖最后由 layuai 于 2021-8-3 20:07 编辑
很明显的指针越界了。此时i已经为3,而你有效值应该是到2就行。
所以你最后只用将p=stu+k-1变成这样。后续你可以把代码在改一改写的太乱了。 你都知道是K有问题了,难道不进一步看看吗?
你的K=i;这里i哪里来的?
怎么赋值的? 本帖最后由 evea 于 2021-8-3 20:12 编辑
i 的值是3 你的i值是你最开始循环里面的i值,每次循环都一样,这样你的K值就不会变。而且你的数量是3,你用stu+k也就是stu+3,已经越界了。 43行 有问题。 原题这里用的是i这个变量,他所代表的是,第几个的学生的分数最高,用k来记录。
而你做的是指针,并没有一个i值来确定
接下来输出就正确了
43行语句k=i;错误,i值存在越界可能,建议在第一次循环后重置i值 虽然但是都2021年了,可以上中国大学MOOC上面找名牌大学的网课,那些都挺好的 谭浩强老师的课本,额,也就看看得了,
页:
[1]
2