【问题标题】:How to create a function that calculates maximum average grade?如何创建一个计算最高平均成绩的函数?
【发布时间】:2019-11-08 12:25:52
【问题描述】:

函数int getMax(student *students, int entry_size)应该计算所有学生的最高成绩。 student 这里是结构体,*students 是数组,entry_size 已经可以使用如下所示的函数找到。 getMax 函数的诀窍在于它应该使用递归; 包含数据的文件格式如下:

Name Surname ID Grade
Name Surname ID Grade
...

我已经完成了部分代码,它扫描并返回一组学生:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
   char firstName[30], secondName[30];
   int ID;
   int grade;
} student;

typedef struct {
   int ID;
   int avgGrade;
} topThreeAvg;

student *readStudents(char *fileName, int* entry_size, int *all_ids, int* studentSize){
/*
all_ids is an array for counting the amount of grades per student. studentSize is the actual number of students (for example, in students1.txt it is 2)
*/
   FILE *openedFile = fopen(fileName, "r");

   if(openedFile == NULL){
      printf("Cannot open a file");
      exit (0);
   }

   char entrySize[10];
   fscanf(openedFile, "%[^\n]", entrySize);

   int numberOfEntries = atoi(entrySize);
   *entry_size = numberOfEntries;

   student *students;
   if ( NULL == ( students = malloc(numberOfEntries * sizeof *students))) {
      printf ("Error with memory allocation");
      exit (0);
   }

   int i;
    for(i=0; i < numberOfEntries; i++){
        if (4 != fscanf(openedFile, "%s %s %d %d"
        , students[i].firstName
        , students[i].secondName
        , &students[i].ID
        , &students[i].grade)) {
            exit (0);
        }
    }

    return students;
  }

我试图实现这个功能,但它给出了非常大的数字:

int max_in(student *students, int entry_size){
     int curr_val = students->grade;
     if (entry_size == 1) {
        return curr_val;
     }

     int max_in_rest = max_in(&students->ID+1, entry_size-1);

     return curr_val > max_in_rest ? curr_val : max_in_rest;
}

如何使函数递归并找到所有学生的最高分?

【问题讨论】:

  • @kiranBiradar 自己尝试编辑
  • 为什么要让它递归?
  • @klutt 我很想这样做没有递归=)问题是它被要求这样做
  • 发布样本数据,AFAIK,名字太大了。 "%s %s %d %d" --> "%29s %29s %d %d"
  • OT:关于结构定义,例如:typedef struct { int ID; int avgGrade; } topThreeAvg; 不要创建匿名结构,它们很难调试。而是给每个结构一个“标签”名称,以便调试器可以显示结构中的每个字段。

标签: c


【解决方案1】:

尝试如下。

   int max(int x, int y){
       return x > y ? x : y;
   }

  int max_in(student *students, int entry_size){

     if (entry_size <= 0){
        return -1;
     }
     else {
        return max(students[entry_size-1].grade, max_in(students, entry_size-1))
     }
  }

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多