如何计算struct数组中的平均值?

时间:2017-04-27 17:36:05

标签: c++

所以我的问题必须处理我的代码中的计算平均函数。该函数接受statistics_array和semester_index。此函数循环遍历semester_index指示的struct中的grades_array,并对所有等级求和。此总和除以成员结构中的no_of _grades(由semester_index索引),以计算该学期期末考试的平均成绩。最后,这个平均值存储在semester_index索引的struct的average_grade成员中。

问题是我该怎么做才是我的代码我创建了一个变量名总和添加到此但该方法不起作用如何修复此错误我的代码如下。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
struct ExamType {
    string semester_name;
    int year;
    int num_grades;
    float average_grade;
    int grades_above_average;
    int grades_below_average;
    int grades_array[35];
};

void input_data(ExamType[], ifstream&);
void calculate_statistics(ExamType[]);
void print_results(ExamType[]);
void calculate_average(ExamType[], int);
void calculate_above_average(ExamType[], int);
void calculate_below_average(ExamType[], int);


int main()
{
    char make_type;
    ifstream myfile;
    ExamType statistics_array[5];
    myfile.open("infile.txt");
    input_data(statistics_array,myfile);
}

void input_data(ExamType statistics_array[], ifstream& myfile)
{
    int num_students;
    for (int i = 0; i < 5; i++) {
        myfile >> statistics_array[i].semester_name;
        myfile >> statistics_array[i].year;
        myfile >> num_students;
        statistics_array[i].num_grades=num_students;
        for (int j = 0; i < num_students; i++) {
            myfile >> statistics_array[j].grades_array[i];
        }
    }
}

void calculate_statistics(ExamType statistics_array[])
{
    for (int index = 0; index < 5; index++) {
        calculate_average(statistics_array, index);
        calculate_above_average(statistics_array, index);
        calculate_below_average(statistics_array, index);
    }
}

void calculate_average(ExamType statistics_array[], int index)
{
    int sum = 0;
    for (int i = 0; i < statistics_array[index].num_grades; i++)
    {
      statistics_array[index].grades_array+sum;
    }

}

4 个答案:

答案 0 :(得分:2)

statistics_array[index].grades_array+sum;

此行对您的任何变量都不起作用。你基本上是在说:

void foo(){
    /*some stuff*/
    1+1;
}

看看我的目标是什么?您没有在任何地方分配计算的值,因此上述行的结果不会存储在任何地方。

要解决此问题,请将行更改为

sum += statistics_array[index].grades_array;

sum = sum + statistics_array[index].grades_array;

但这不是唯一的错误,因为grades_array是一个数组,并且您正在尝试将其添加到普通的int中。所以你必须在grades_array中指定一个索引。

sum += statistics_array[index].grades_array[another_index];

答案 1 :(得分:2)

像这样修改你的函数来计算平均值并将其保存到average_grade

void calculate_average(ExamType statistics_array[], int index) {
    float sum = 0;
    int n = statistics_array[index].num_grades; // total no. of grades
    for (int i = 0; i < n; i++) {
        sum += statistics_array[index].grades_array[i]; // summing all grades
    }
    statistics_array[index].average_grade = sum/n; // average = total_sum / (num_of_grades)
}

注意:我建议对sum使用float,因为平均值是浮点数,因此计算将产生浮点值,或者对其进行类型转换。

答案 2 :(得分:1)

for (int i = 0; i < statistics_array[index].num_grades; i++)
{
  statistics_array[index].grades_array + sum;
}

您要将statistics_array[index].grades_array添加到sum,但您不会将值存储在任何位置。从您的问题来看,我假设您需要在for循环的每次迭代中将statistics_array[index].grades_array增加到sum

for (int i = 0; i < statistics_array[index].num_grades; i++)
{
    sum += statistics_array[index].grades_array[i];
}

答案 3 :(得分:0)

虽然所有这些解决方案都使用for-loop工作,但我建议使用其中一种标准算法(尽管在<numeric>标题中):std::accumulate

在其帮助下,您可以将calculate_average重写为

void calculate_average(ExamType statistics_array[], int index) {
    auto const n = statistics_array[index].num_grades;
    auto const sum
        = std::accumulate(std::cbegin(statistics_array[index].grades_array),
                          std::cend(statistics_array[index].grades_array),
                          0);

    statistics_array[index].average_grade = static_cast<float>(sum)/n;
}