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);
}
}
请输入你要输入的学生个数: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: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);
}
}
if(students.average > students.average)
个人认为,上面这一行,在双层for下,有问题如下:
当第一位学生i时,j为第二位学生。
因为有n-1=49,下标正确实际只能访问到第48元素就跳出这是i层for的问题。
j层问题是由于i层已0元素开始,那么j=i+1
就说明j层是从下标1开始的,首元素没有计算。
howzyao 发表于 2020-4-8 19:57
if(students.average > students.average)
个人认为,上面这一行,在双层for下,有问题如下 ...
你的理解是不对的。你该去学习一下冒泡法排序了 我反应过来了,这是一个学生和二个学生做比较。
竟然没有考虑到这是一条线上的50个学生。。。
谢谢你的提醒。 关键还是对冒泡排序理解的不透彻。 本帖最后由 老牛来学习 于 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]