C:计算学生GPA的计划

时间:2014-04-18 19:03:53

标签: c function struct

每当我插入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;
}

2 个答案:

答案 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可以正常; sn不是很好,mxb对于来自我的旧的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);