吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1861|回复: 11
收起左侧

[求助] C语言,谭浩强第五版原题,我改了一下标准答案,发现无法解决问题。

[复制链接]
tpdddP 发表于 2021-8-3 19:30
谭浩强第五版第九章课后第五题
题目:有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输人10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
10个学生太多了,我就修改成了3个。
标准答案:
[C] 纯文本查看 复制代码
#include <STDIO.H>
struct student 
{
	char num[6];
	char name[8];
	float sco[3];
	float ave;
}stu[3];

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[i].num);
		printf("姓名:");
		scanf("%s",stu[i].name);
		for (j=0;j<3;j++)
		{
			printf("请输入成绩%d:",j+1);
			scanf("%f",&stu[i].sco[j]);
		}
	}
	k=0;
	for (i=0;i<3;i++)
	{
		sum=0;
		for (j=0;j<3;j++)
		{
			sum=sum+stu[i].sco[j];
		}
		stu[i].ave=sum/3.0;
		aver=aver+stu[i].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[i].num,stu[i].name);
		for (j=0;j<3;j++)
		{
			printf("%11.2f",stu[i].sco[j]);
		}
		printf("%9.2f\n",stu[i].ave);
	}
	printf("平均分=%5.2f\n",aver);
	printf("最高的成绩是:学生%s,%s\n",stu[k].num,stu[k].name);
	printf("他的成绩为:%6.2f,%6.2f,%6.2f,平均分为:%5.2f \n",stu[k].sco[0],stu[k].sco[1],stu[k].sco[2],stu[k].ave);
	return 0;
}


根据标准答案,修改了一下:
[C] 纯文本查看 复制代码
#include <STDIO.H>

struct student 
{
	char num[6];
	char name[8];
	float sco[3];
	float ave;
}stu[3];

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[j]);
		}
	}
	k=0;
	for (p=stu;p<stu+3;p++)
	{
		sum=0;
		for (j=0;j<3;j++)
		{
			sum=sum+p->sco[j];
		}
		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[j]);
		}
		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[0],p->sco[1],p->sco[2],p->ave);
	return 0;
}


结果,成绩最大的学生输出失败,问题应该是出在倒数第五行 p=stu+k; 我想法是把指针指向最大的那个学生,然后输出他的信息,可是没有成功,我把k改成0,1,2,输出的时候没问题,改成k就出现了问题,大佬能解释一下为什么?
我输出的结果如下:

结果

结果

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
笨鸟不一定先飞 + 1 + 1 楼下的坛友已经说的很详细了,其实楼主细心点应该不难发现的

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

layuai 发表于 2021-8-3 20:05
本帖最后由 layuai 于 2021-8-3 20:07 编辑

很明显的指针越界了。此时i已经为3,而你有效值应该是到2就行。
所以你最后只用将p=stu+k-1变成这样。后续你可以把代码在改一改写的太乱了。
飘零星夜 发表于 2021-8-3 20:05
你都知道是K有问题了,难道不进一步看看吗?
你的K=i;  这里i哪里来的?
怎么赋值的?
evea 发表于 2021-8-3 20:10
CC000731 发表于 2021-8-3 20:13
你的i值是你最开始循环里面的i值,每次循环都一样,这样你的K值就不会变。而且你的数量是3,你用stu+k也就是stu+3,已经越界了。
阳光好青年 发表于 2021-8-3 20:13
43行 有问题。
木有海鲜 发表于 2021-8-3 20:37
QYI(%QE`WLNOSKQ$7)~B.png 原题这里用的是i这个变量,他所代表的是,第几个的学生的分数最高,用k来记录。
而你做的是指针,并没有一个i值来确定
C`U{L2VFMG(F(AYELNMWH0B.png 接下来输出就正确了 QQ截图20210803203616.jpg
风停雨 发表于 2021-8-3 21:28
43行语句k=i;错误,i值存在越界可能,建议在第一次循环后重置i值
Helibrolilare 发表于 2021-8-3 22:52
虽然但是都2021年了,可以上中国大学MOOC上面找名牌大学的网课,那些都挺好的
SuperGround 发表于 2021-8-3 23:33
谭浩强老师的课本,额,也就看看得了,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 01:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表