tpdddP 发表于 2021-8-3 19:30

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: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

本帖最后由 evea 于 2021-8-3 20:12 编辑

i 的值是3

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

原题这里用的是i这个变量,他所代表的是,第几个的学生的分数最高,用k来记录。
而你做的是指针,并没有一个i值来确定
接下来输出就正确了

风停雨 发表于 2021-8-3 21:28

43行语句k=i;错误,i值存在越界可能,建议在第一次循环后重置i值

Helibrolilare 发表于 2021-8-3 22:52

虽然但是都2021年了,可以上中国大学MOOC上面找名牌大学的网课,那些都挺好的

SuperGround 发表于 2021-8-3 23:33

谭浩强老师的课本,额,也就看看得了,
页: [1] 2
查看完整版本: C语言,谭浩强第五版原题,我改了一下标准答案,发现无法解决问题。