2014-04-18 5 views
-2

Всякий раз, когда я вставляю 2 или более студентов, программа дает тот же gpa от первого ученика. Я вставляю как каждый раз, так и как я могу отобразить max gpa и кто его получил?C: программа для вычисления 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

gpa - это оценка или другое слово gpa = сумма оценок/количество курсов –

+0

GPA взвешивается на основе кредитов, так что вам не хватает баллов * кредитов + сорт * кредитов ..../сумма кредитов –

ответ

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 в порядке afaic; s и n не очень хороши, m, x и b были бы хороши для 50 ударов плетью от моих старых учителей точно!

0

Это должно быть в цикле (вы только проверить один, как это в настоящее время написано):

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; 
    } 
} 

и изменение оператора печати соответственно:

printf("\n\nHighest GPA is done by Student %d with GPA = %f",iwithmax,max); 
Смежные вопросы