繁体   English   中英

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

[英]How to calculate the average within an array of struct?

因此,我的问题必须处理代码中的计算平均值函数。 该函数接受statistics_array和semester_index。 此函数在semester_index指示的结构中遍历grades_array并求和所有分数。 该总和除以成员结构中的no_of _grades(由semester_index索引)以计算该学期期末考试的平均成绩。 最后,此平均值存储在由semester_index索引的结构的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;
    }

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

像这样修改您的函数以计算平均值并将其保存到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使用浮点数,因为平均值是一个浮点数,这样计算将得出一个浮点值,或者进行类型转换。

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

您正在将statistics_array[index].grades_array添加到sum ,但是没有将值存储在任何地方。 从您的问题来看,我假设您需要递增statistics_array[index].grades_array以便在for循环的每次迭代中sum

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

虽然所有这些解决方案都使用for循环工作,但我建议使用一种标准算法(尽管在<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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM