Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何计算struct数组中的平均值?_C++ - Fatal编程技术网

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

C++ 如何计算struct数组中的平均值?,c++,C++,因此,我的问题必须处理代码中的计算平均值函数。该函数接受统计数据数组和学期索引。此函数循环遍历由学期索引指示的结构中的grades_数组,并对所有成绩求和。此总和除以成员结构中的_分数(按学期指数索引),以计算该学期期末考试的平均分数。最后,此平均值存储在结构的average_grade成员中,该成员由Semment_索引索引 问题是我该怎么做这是我的代码我创建了一个变量名sum来添加到这个方法上,但是这个方法不起作用我该如何修复这个错误我的代码如下 #include <iostream&

因此,我的问题必须处理代码中的计算平均值函数。该函数接受统计数据数组和学期索引。此函数循环遍历由学期索引指示的结构中的grades_数组,并对所有成绩求和。此总和除以成员结构中的_分数(按学期指数索引),以计算该学期期末考试的平均分数。最后,此平均值存储在结构的average_grade成员中,该成员由Semment_索引索引

问题是我该怎么做这是我的代码我创建了一个变量名sum来添加到这个方法上,但是这个方法不起作用我该如何修复这个错误我的代码如下

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

}
#包括
#包括
#包括
#包括
使用名称空间std;
结构ExamType{
字符串名称;
国际年;
int num_等级;
浮动平均等级;
分数高于平均水平;
分数低于平均水平;
int grades_数组[35];
};
无效输入_数据(ExamType[],ifstream&);
无效计算统计(ExamType[]);
作废打印结果(ExamType[]);
无效计算平均值(ExamType[],int);
无效计算高于平均值(ExamType[],int);
无效计算低于平均值(ExamType[],int);
int main()
{
字符型;
ifstreammyfile;
ExamType statistics_数组[5];
myfile.open(“infle.txt”);
输入数据(统计数据数组,myfile);
}
无效输入_数据(ExamType统计_数组[],ifstream和myfile)
{
国际大学学生;
对于(int i=0;i<5;i++){
myfile>>统计数据数组[i]。学期名称;
myfile>>统计数据数组[i]。年份;
myfile>>num_学生;
统计数组[i].num\u grades=num\u students;
对于(int j=0;i>统计数据数组[j].成绩数组[i];
}
}
}
无效计算\u统计信息(ExamType统计信息\u数组[])
{
对于(int-index=0;index<5;index++){
计算平均值(统计数据、数组、索引);
计算高于平均值(统计数据、数组、索引);
计算低于平均值(统计数组、索引);
}
}
无效计算平均值(ExamType统计数据数组[],整数索引)
{
整数和=0;
对于(int i=0;i
这一行对任何变量都不起作用。你基本上是说:

void foo(){
    /*some stuff*/
    1+1;
}
明白我的意思了吗?您没有将计算的值分配到任何位置,因此上述行的结果不会存储在任何位置

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

sum += statistics_array[index].grades_array;

但这并不是唯一的错误,因为grades\u数组是一个数组,您试图将其添加到普通int中。因此您必须在grades\u数组中指定一个索引

sum += statistics_array[index].grades_array[another_index];
这一行对任何变量都不起作用。你基本上是说:

void foo(){
    /*some stuff*/
    1+1;
}
明白我的意思了吗?您没有将计算的值分配到任何位置,因此上述行的结果不会存储在任何位置

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

sum += statistics_array[index].grades_array;

但这并不是唯一的错误,因为grades\u数组是一个数组,您试图将其添加到普通int中。因此您必须在grades\u数组中指定一个索引

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

这样修改函数以计算平均值并将其保存到
average\u 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)
}
void计算平均值(ExamType统计数据数组[],整数索引){
浮点数和=0;
int n=statistics\u array[index].num\u grades;//等级总数
对于(int i=0;i

注意:我建议对
sum
使用float,因为平均值是一个float,因此计算将产生一个float值,或者键入它。

像这样修改您的函数以计算平均值,并将其保存到
average\u 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)
}
void计算平均值(ExamType统计数据数组[],整数索引){
浮点数和=0;
int n=statistics\u array[index].num\u grades;//等级总数
对于(int i=0;i

注意:我建议使用float for
sum
,因为平均值是一个float,因此计算将产生一个float值,或者将其类型转换为float值。

当所有这些解决方案都使用for循环时,我建议使用一种标准算法(尽管在
标题中):
std::acculate

在它的帮助下,您可以将
计算平均值
改写为

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;
}
void计算平均值(ExamType统计数据数组[],整数索引){
auto const n=统计数据数组[index].num\u等级;
自动常数和
=std::accumulate(std::cbegin(statistics_数组[索引]。grades_数组),
标准::cend(统计数据数组[索引]。等级数组),
0);
统计数据\u数组[索引]。平均\u等级=静态\u转换(总和)/n;
}

虽然所有这些解决方案都使用for循环,但我建议使用一种标准算法(尽管在
标题中)来代替:
std::accumulate

在它的帮助下,您可以将
计算平均值
改写为

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;
}
void计算平均值(ExamType统计数据数组[],整数索引){
auto const n=统计数据数组[index].num\u等级;
自动常数和
=std::accumulate(std::cbegin(statistics_数组[索引]。grades_数组),
标准::cend(统计数据数组[索引]。等级数组),
0);
统计数据\u数组[索引]。平均\u等级=静态\u转换(总和)/n;
}

您认为这条线的作用是什么<代码>统计\数组[索引]。等级\数组+总和我认为它为数组stru中的特定索引添加了值