[英]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.