老牛来学习 发表于 2020-4-8 17:32:14

C语言

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



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


#include<stdio.h>

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

int main()
{
    struct student students,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.num);

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

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

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

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

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


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


    printf("num\tname\taverage\t");
    printf("\n");
    for(i = 0; i < n; i++)
    {
      printf("%d\t%s\t%.2lf\n",students.num,students.name,students.average);
    }
}

墨羽岚 发表于 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
经典烫烫烫(找不出错)

sunrise085 发表于 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;
    int computer,english,math;
    double average;
};

int main()
{
    struct student students,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.num);

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

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

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

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

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


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


    printf("num\tname\taverage\t");
    printf("\n");
    for(i = 0; i < n; i++)
    {
      printf("%d\t%s\t%.2lf\n",students.num,students.name,students.average);
    }
}

howzyao 发表于 2020-4-8 19:57:57

if(students.average > students.average)
          个人认为,上面这一行,在双层for下,有问题如下:
当第一位学生i时,j为第二位学生。
因为有n-1=49,下标正确实际只能访问到第48元素就跳出这是i层for的问题。
j层问题是由于i层已0元素开始,那么j=i+1
就说明j层是从下标1开始的,首元素没有计算。

sunrise085 发表于 2020-4-8 20:08:46

howzyao 发表于 2020-4-8 19:57
if(students.average > students.average)
          个人认为,上面这一行,在双层for下,有问题如下 ...

你的理解是不对的。你该去学习一下冒泡法排序了

howzyao 发表于 2020-4-8 22:16:27

我反应过来了,这是一个学生和二个学生做比较。
竟然没有考虑到这是一条线上的50个学生。。。
谢谢你的提醒。

chxchxkkk 发表于 2020-4-9 09:49:28

关键还是对冒泡排序理解的不透彻。

老牛来学习 发表于 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.average > students.average)
            {
                index = j;
            }
      }
      temp = students;
      students = students;
      students = 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.average > students.average)
            {
                k = (index = j);
            }
      }
      if(k)
      {
            temp = students;
            students = students;
            students = temp;
      }
      k = 0;
    }

页: [1]
查看完整版本: C语言