每当我插入2个或更多学生时,该程序会给第一个学生提供相同的gpa。我每次都插入两次,如何显示最大gpa以及谁获得它?
#include <stdio.h>
FILE *f;
struct student
{
char name[20];
int id;
int n;
float sum;
float gpa;
} s[100];
float FUN_GPA(int n);
int main ()
{
int m,i,x,b;
float max=0;
s[i].sum=0;
printf("Please Enter Number Of Students : ");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("\nStudent %d : \n",i+1);
printf("Name : ");
scanf("%s",&s[i].name);
printf("ID : ");
scanf("%d",&s[i].id);
printf("Number Of Courses : ");
scanf("%d",&s[i].n);
}
printf("\nEnter Student Marks");
for(i=0;i<m;i++)
{
printf("\n\n\t\t\t......[ Student %d ]......\n",i+1);
for(x=0;x<s[i].n;x++)
{
printf("Course %d Mark : ",x+1);
scanf("%d",&b);
s[i].sum+=b;
}
printf("\nSum Of The Courses Marks = %3.f",s[i].sum);
printf("\nGPA For Student %d = %f",i+1,FUN_GPA(s[i].gpa));
}
if (s[i].gpa>max)
max=s[i].gpa;
printf("\n\nHighest GPA is done by Student %d with GPA = %f",i,max);
{
if((f=fopen("d:\\STUDENTS.txt","w"))==NULL)
printf("\ncant open file ");
// if((f=fopen("d:\\STUDENTS.txt","r"))==NULL)
// printf("\ncant open file ");
fprintf(f,"Name : %s\t ID : %d\t GPA = %f \n",s[i].name,s[i].id,s[i].gpa);
fclose(f);
}
}
float FUN_GPA(int i)
{
s[i].gpa=0;
s[i].gpa=s[i].sum/s[i].n;
return s[i].gpa;
}
答案 0 :(得分:0)
将FUN_GPA(s[i].gpa)
替换为FUN_GPA(i)
。
将此放入循环中;没有太多使用它在外面:
if (s[i].gpa>max)
max=s[i].gpa;
顺便说一句,这同样适用于此初始化程序:
s[i].sum=0;
通常,不要在循环外使用变量i
;这是不好的做法,在你的特殊情况下,完全错了!
i
不是表现最佳的学生的索引;一旦循环结束,它甚至不是正确的索引,因为它引用紧跟在最后一个注册学生之后的数组元素。请介绍一个新变量,以跟踪目前表现最佳的指数。而不是i
,请在以下行中使用此新变量:
fprintf(f,"Name : %s\t ID : %d\t GPA = %f \n",s[i].name,s[i].id,s[i].gpa);
同样在这里;不要忘记像其他地方一样添加1!
printf("\n\nHighest GPA is done by Student %d with GPA = %f",i,max);
一般建议:使用描述性名称。 i
可以正常; s
和n
不是很好,m
,x
和b
对于来自我的旧的50睫毛会有好处老师们肯定!
答案 1 :(得分:0)
这需要处于for循环中(您只需检查当前编写的一个):
if (s[i].gpa>max)
max=s[i].gpa;
您可能还想跟踪哪个i
拥有max
。
类似于:
int iwithmax;
for ( i = 0 ; i < m ; i++) {
if (s[i].gpa > max) {
max = s[i].gpa;
iwithmax = i;
}
}
并相应地更改print语句:
printf("\n\nHighest GPA is done by Student %d with GPA = %f",iwithmax,max);