将 C 中的结构与用户定义的函数一起使用

Using structures in C with user defined functions

我遇到了一个问题,我用不同的方法尝试了很多次,但仍然无法获得所需的解决方案,请帮助我。 问题:定义一个结构来存储学生的详细信息。将它们传递给一个函数,其中具有最高 CGPA 的学生是从一组 5 名学生中计算出来的。并显示结果。(这里我们要存储每个学生的姓名,年龄和CGPA) 这是我尝试解决的问题:

#include <stdio.h>
void highCGPA(float b,struct detst D[4]);

struct detst
{
    int age;
    float CGPA;
    char name[30];
};

int main()
{
    struct detst D[4];
    int i;
    float h;
    for(i=0;i<=4;i++)
    {
    printf("Enter the name of student %d:\n",i+1);
    scanf("%s",&D[i].name);
    printf("Enter the age of student %d:\n",i+1);
    scanf("%d",&D[i].age);
    printf("Enter the CGPA obtined by student %d:\n",i+1);
    scanf("%f",&D[i].CGPA);
    }
    highCGPA(h,D);
}

void highCGPA(float b,struct detst D[4])
{
    int i,max;
    
    max = D[0].CGPA;
    
    for(i=0;i<=4;i++)
    {
        if(D[i].CGPA > max)
        {
            max = D[i].CGPA;
        }
    }
    printf("Highest CGPA obtained is:\n%f",max); 
}

问题不止一个。您正在尝试将 5 个学生的数据存储在一个大小为 4 的结构数组中。因此:

struct detst D[5]; // fixed size
int i;
float h;
for(i=0;i<5;i++) { // EDIT (comments suggestion): for loop fix following standard convetions
    /* take input */
}

最后,如果将 max 声明为 int,则无法尝试使用 float 的格式说明符打印它。所以:

printf("Highest CGPA obtained is: %d\n",max); // format specifier for int is %d (not %f)

还有其他几个问题。

  1. 您的函数声明 highCGPA 高于您的 struct detst 定义 你应该有错误

error: array type has incomplete element type ‘struct detst’

在结构定义之后声明你的函数。

  1. 您的 max 变量在函数 highCGPA 中是 int,但您试图在其中存储一个 float 值。

稍作改动即可改进程序功能:

#include <float.h> // FLT_MAX
#include <stdio.h>

struct detst
{
   int age;
   float CGPA;
   char name[30];
};

// Return offset of student with highest CGPA
int highCGPA(struct detst const (*D)[5]);  // Using pointer to array 
                                           // to avoid degeneration

int main()
{
   struct detst D[5];
   int i;
   for(i = 0; i < 5; i++)
   {
      printf("Enter the name of student %d:\n", i + 1);
      scanf("%29s", D[i].name);  // Make sure we don't overwrite the buffer
      printf("Enter the age of student %d:\n", i + 1);
      scanf("%d", &D[i].age);
      printf("Enter the CGPA obtained by student %d:\n", i + 1);
      scanf("%f", &D[i].CGPA);
   }
   int bestStudentOffset = highCGPA(&D); // By asking for best student
                                         // we can obtain a lot more
   printf(
      "Best student is %d year old %s with\n",
      D[bestStudentOffset].age,
      D[bestStudentOffset].name);
   printf("Highest CGPA obtained is:\n%f\n", D[bestStudentOffset].CGPA);
}

// Return offset of student with highest CGPA
int highCGPA(struct detst const (*D)[5])
{
   int i, maxOffset = -1;
   float max = -FLT_MAX;

   for(i = 0; i < 5; i++)
   {
      if((*D)[i].CGPA > max)
      {
         max       = (*D)[i].CGPA;
         maxOffset = i;
      }
   }
   return maxOffset;
}