鱼C论坛

 找回密码
 立即注册
查看: 2095|回复: 7

C语言

[复制链接]
发表于 2020-4-8 17:32:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目要求:输入n(n<50)个学生的成绩信息,按照学生的个人平均成绩从高到低输出他们的信息。



我这段代码好像有点问题,但是找不出来哪里有问题?大佬指点迷津。

#include<stdio.h>

struct student
{
    int num;
    char name[10];
    int computer,english,math;
    double average;
};

int main()
{
    struct student students[50],temp;
    int n,j,i,index;

    printf("请输入你要输入的学生个数:");
    scanf("%d",&n);

    for(i = 0; i < n; i++)
    {
        printf("Input the info of No.%d:",i+1);
        scanf("%d",&students[i].num);

        printf("Input the name of student %d:",i+1);
        scanf("%s",students[i].name);

        printf("Input math score:");
        scanf("%d",&students[i].math);

        printf("Input english score:");
        scanf("%d",&students[i].english);

        printf("Input computer score:");
        scanf("%d",&students[i].computer);

        students[i].average = (students[i].math + students[i].english + students[i].computer) / 3.0;
    }


    for(i = 0; i < n-1; i++)
    {
        for(j = i+1; j < n; j++)
        {
            if(students[j].average > students[i].average)
            {
                index = j;
            }
        }
        temp = students[j];
        students[j] = students[i];
        students[i] = temp;
    }


    printf("num\tname\taverage\t");
    printf("\n");
    for(i = 0; i < n; i++)
    {
        printf("%d\t%s\t%.2lf\n",students[i].num,students[i].name,students[i].average);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-8 17:46:54 | 显示全部楼层
请输入你要输入的学生个数:4
Input the info of No.1:1
Input the name of student 1:A
Input math score:11
Input english score:22
Input computer score:33
Input the info of No.2:2
Input the name of student 2:B
Input math score:12
Input english score:23
Input computer score:31
Input the info of No.3:3
Input the name of student 3:C
Input math score:13
Input english score:21
Input computer score:32
Input the info of No.4:4
Input the name of student 4:D
Input math score:33
Input english score:22
Input computer score:11
num     name    average
-858993460      烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫   -92559631349317831000000000000000000000000000000000000000000000.00
1       A       22.00
2       B       22.00
4       D       22.00
Press any key to continue
经典烫烫烫(找不出错)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 19:52:50 | 显示全部楼层
本帖最后由 sunrise085 于 2020-4-8 19:59 编辑

程序第49~51行,交换两个student的时候写错了
交换的应该是i和index,你写成交换i和j了
另外,不管在一次内循环中,有没有找到比当前student[i]大的值,你都会进行交换,这是不对的
#include<stdio.h>

struct student
{
    int num;
    char name[10];
    int computer,english,math;
    double average;
};

int main()
{
    struct student students[50],temp;
    int n,j,i,index;

    printf("请输入你要输入的学生个数:");
    scanf("%d",&n);

    for(i = 0; i < n; i++)
    {
        printf("Input the info of No.%d:",i+1);
        scanf("%d",&students[i].num);

        printf("Input the name of student %d:",i+1);
        scanf("%s",students[i].name);

        printf("Input math score:");
        scanf("%d",&students[i].math);

        printf("Input english score:");
        scanf("%d",&students[i].english);

        printf("Input computer score:");
        scanf("%d",&students[i].computer);

        students[i].average = (students[i].math + students[i].english + students[i].computer) / 3.0;
    }


    for(i = 0; i < n-1; i++)
    {
        for(j = i+1; j < n; j++)
        {
            if(students[j].average > students[i].average)
            {
                temp = students[j];
                students[j] = students[i];
                students[i] = temp;
            }
        }
    }


    printf("num\tname\taverage\t");
    printf("\n");
    for(i = 0; i < n; i++)
    {
        printf("%d\t%s\t%.2lf\n",students[i].num,students[i].name,students[i].average);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 19:57:57 From FishC Mobile | 显示全部楼层
if(students[j].average > students[i].average)
          个人认为,上面这一行,在双层for下,有问题如下:
当第一位学生i时,j为第二位学生。
因为有n-1=49,下标正确实际只能访问到第48元素就跳出这是i层for的问题。
j层问题是由于i层已0元素开始,那么j=i+1
就说明j层是从下标1开始的,首元素没有计算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 20:08:46 | 显示全部楼层
howzyao 发表于 2020-4-8 19:57
if(students[j].average > students.average)
          个人认为,上面这一行,在双层for下,有问题如下 ...

你的理解是不对的。你该去学习一下冒泡法排序了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 22:16:27 From FishC Mobile | 显示全部楼层
我反应过来了,这是一个学生和二个学生做比较。
竟然没有考虑到这是一条线上的50个学生。。。
谢谢你的提醒。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-9 09:49:28 | 显示全部楼层
关键还是对冒泡排序理解的不透彻。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-9 21:03:33 | 显示全部楼层
本帖最后由 老牛来学习 于 2020-4-9 21:16 编辑
sunrise085 发表于 2020-4-8 19:52
程序第49~51行,交换两个student的时候写错了
交换的应该是i和index,你写成交换i和j了
另外,不管在一次 ...

    for(i = 0; i < n-1; i++)
    {
        for(j = i+1; j < n; j++)
        {
            if(students[j].average > students[i].average)
            {
                index = j;
            }
        }
        temp = students[index];
        students[index] = students[i];
        students[i] = temp;
    }
所以改成index之后,这段代码相当于是不管j比不比i大,最后都要交换一次,导致如果某一次循环j不比i大,i将和上一次的index交换。是这样吗?

改成这样是不是就行了?

前面定义一个k = 0
    for(i = 0; i < n-1; i++)
    {
        for(j = i+1; j < n; j++)
        {
            if(students[j].average > students[i].average)
            {
                k = (index = j);
            }
        }
        if(k)
        {
            temp = students[index];
            students[index] = students[i];
            students[i] = temp;
        }
        k = 0;
    }

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 06:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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