假设我有以下代码用于取全班数学和科学成绩的平均值。
typedef struct
{
char name[30];
float math;
float science;
}
grade;
int n = 5;
grade grades[n];
float math_average(int n)
{
float run_sum = 0;
for (int i = 0; i < n; i++)
{
run_sum += grades[i].math;
}
return (run_sum / n);
}
float science_average(int n)
{
float run_sum = 0;
for (int i = 0; i < n; i++)
{
run_sum += grades[i].science;
}
return (run_sum / n);
}
是否可以创建具有相同效果的广义平均函数?因此,我只有n个主题函数,而不是n个。也许像将主题作为参数传递?包含的示例可以更好地可视化我想要实现的目标:
float average(int n, /* [SUBJECT] */)
{
float run_sum = 0;
for (int i = 0; i < n; i++)
{
run_sum += grades[i]./*SUBJECT*/;
}
return (run_sum / n);
}
通常,如果您具有N
相同性质的变量(字段),则没有N
声明,而是声明一个N
元素数组。因此
#define MATH 0
#define SCIENCE 1
#define NUM_SUBJECTS 2
typedef struct
{
char name[30];
float subjects[NUM_SUBJECTS];
} grade;
而不是写,而是grades[i].math
写grades[i].subjects[MATH]
。当然,现在您可以通过参考编写一般平均例程grades[i].subjects[j]
。
现在,如果您认为#define
开头的s序列非常愚蠢,那您将是对的。我只是把它们放在那里作为例证。实际上,您enum
改为使用单个声明:
enum subjects { MATH, SCIENCE, NUM_SUBJECTS };
NUM_SUBJECTS
扩展主题列表时,只需要将最后一项保留在列表中。
当您的主题列表不是一成不变的,而是程序的输入之一时,这种方法自然可以扩展到这种情况。例如,您将需要一个或多个伪装的动态数组。
typedef struct
{
char name[30];
int num_subjects;
float *subjects;
} grade;
但通用平均功能代码将保持不变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句