我需要家庭作业问题的帮助。
家庭作业的描述是:
使用引用调用方法在C中设计程序,该方法 生成由M名学生组成的班级的成绩统计 在一个学期中给出了N个测验。测验全部 进行相同的加权,每个测验中的等级不超过10 点。该程序将按指示的顺序执行以下操作 程序执行时:
- 要求用户在键盘上输入学生人数M和测验数N,其中M代表数字 行和N表示二维中的列数 数组x [M] [N]的浮点数。
- 要求用户在键盘上键入数组x [M] [N]的所有元素的值。
- 在控制台上显示输入的数组元素值的M行和N列。
- 在控制台上生成并显示一维数组p [M]的元素,其中此数组的每个元素为p [M] 代表M中每个学期的平均成绩 生。
- 在控制台上生成并显示一维数组q [N]的元素,其中q [N]的每个元素代表 N个测验中每个班级的平均成绩。
- 在整个学期中,在控制台上生成并显示整个班级的平均成绩z。
醇>
这是我到目前为止所做的代码:
#include <stdio.h>
#define students 300
#define quizzes 20
void averageGradeOfStudents(int M, int N, float p[], float *xPtr);
float averageGradeOfClass();
float averageGradeOfWholeClass();
int main() {
int M, N;
float x[students][quizzes];
printf("Enter the number students (Maximum: 300): ");
scanf_s("%d", &M);
printf("\nEnter the number of Quizzes (Maximum: 20): ");
scanf_s("%d", &N);
for (int i = 0; i < M; i++) {
for (int k = 0; k < N; k++) {
printf("Enter the grade for student %d, Quiz %d: ", i, k);
scanf_s("%f", &x[i][k]);
}
}
printf("\n--------------------------------------------------------------------------------\n\n");
for (int k = 1; k <= N; k++) {
printf("\t\tQuiz%d", k);
}
for (int i = 0; i < M; i++) {
printf("\nStudent%d Grades: ", i);
for (int k = 0; k < N; k++) {
printf("%.2f\t\t", x[i][k]);
}
}
printf("\n\n\n--------------------------------------------------------------------------------\n\n");
float p[students];
averageGradeOfStudents(M, N, p, &x[0][0]);
float q[quizzes];
float z;
getchar();
return 0;
}
void averageGradeOfStudents(int M, int N, float p[], float *xPtr) {
float grade[students];
for (int i = 0; i < M; i++) {
for (int k = 0; k < N; k++) {
grade[i] += *(xPtr + i);
}
}
for (int k = 0; k < M; k++) {
p[k] = grade[k] / N;
printf("The average grade of student%d is: %.2f\n\n", k, p[k]);
}
}
float averageGradeOfClass() {
}
float averageGradeOfWholeClass() {
}
我遇到的问题是,我无法找到一种方法来对数组的每一行进行求和。
答案 0 :(得分:2)
在你知道M和N的值之前我不会声明数组。所以main
的第一部分如下所示。 (这也允许您转储students
和quizzes
常量。)并始终检查库函数的返回值。
int main( void )
{
int M, N;
printf("Enter the number students (Maximum: 300): ");
if ( scanf_s("%d", &M) != 1 || M > 300 ) {
printf( "Whatever\n" );
exit( 1 );
}
printf("\nEnter the number of Quizzes (Maximum: 20): ");
if ( scanf_s("%d", &N) != 1 || N > 20 ) {
printf( "Sigh...\n" );
exit( 1 );
}
float x[M][N];
// ...
}
将数组传递给函数时,可以使用数组表示法。并且您可以省略数组的第一个维度。所以以下两个函数声明都是有效的
void averageGradeOfStudents(int M, int N, float p[M], float x[M][N]);
void averageGradeOfStudents(int M, int N, float p[], float x[][N]);
在功能内部,存在一些问题
grade[i]
在使用之前未初始化(这应该会导致编译器警告)grade[i]
应该是N个等级的平均值(按k
而不是i
索引)grade
数组p
数组
这里是我如何编写函数(我更改了索引名称以保持我的行和列清晰)
void averageGradeOfStudents(int M, int N, float p[], float x[][N])
{
for (int row = 0; row < M; row++) {
p[row] = 0; // initialize the sum to zero
for (int col = 0; col < N; col++) {
p[row] += x[row][col]; // update the sum with each test result
}
p[row] /= N; // convert the sum to the average
}
for (int row = 0; row < M; row++) {
printf("The average grade of student%d is: %.2f\n\n", row, p[row]);
}
}
应该用
调用该函数averageGradeOfStudents(M, N, p, x);
答案 1 :(得分:2)
你的任务取得了很好的进展。获得完整的代码和工作令人耳目一新。在我们达到平均水平之前,有一些事情会有所帮助。首先,总是很好的做法,初始化你的变量。对于数组尤其如此,因为它可以防止意外尝试从未初始化的值读取,并且在字符数组的情况下,可以为数组的第一个副本提供自动空终止(只要你只复制size-1 chars)。
int M = 0, N = 0;
float x[students][quizzes] = {{ 0 }};
float p[students] = {0};
float q[quizzes] = {0};
float z = 0;
传递数组始终是一个问题区域。传递声明为2D数组的数组时,必须将数组的宽度作为函数参数的一部分传递:
void averageGradeOfStudents (int M, int N, float p[], float xPtr[][quizzes]);
然后您可以通过传递数组本身来调用该函数。
averageGradeOfStudents (M, N, p, x);
(注意:当作为函数参数传递时,任何数组的第一级间接转换为指针,但这是后续问题的主题。但是,供您参考,函数声明也可以正确写成:)
void averageGradeOfStudents (int M, int N, float p[], float (*xPtr)[quizzes]);
现在接近你的平均水平,你很接近,你只需要通过改变你的索引xPtr
的方式(并初始化grade
的值)来对每个学生的元素求和:
void averageGradeOfStudents (int M, int N, float p[], float xPtr[][quizzes])
{
float grade[M];
/* initialize variable length array to 0 */
for (int i = 0; i < M; i++) grade[i] = 0;
/* sum of grades for each student */
for (int i = 0; i < M; i++) {
for (int k = 0; k < N; k++) {
grade[i] += xPtr[i][k];
}
}
printf ("The average grades for the students are:\n\n");
for (int k = 0; k < M; k++) {
p[k] = grade[k] / N;
printf(" student[%3d] is: %6.2f\n", k, p[k]);
}
}
在完整代码中使用它的一个简单示例可能是:
#include <stdio.h>
#define students 300
#define quizzes 20
void averageGradeOfStudents (int M, int N, float p[], float (*xPtr)[quizzes]);
int main (void) {
/* good habit -- always initialize your variables */
int M = 0, N = 0;
float x[students][quizzes] = {{ 0 }};
float p[students] = {0};
printf("Enter the number students (Maximum: 300): ");
scanf ("%d", &M);
printf("\nEnter the number of Quizzes (Maximum: 20): ");
scanf ("%d", &N);
for (int i = 0; i < M; i++) {
for (int k = 0; k < N; k++) {
printf("Enter the grade for student %d, Quiz %d: ", i, k);
scanf("%f", &x[i][k]);
}
}
printf("\n--------------------------------------------------------------------------------\n\n");
printf (" ");
for (int k = 1; k <= N; k++) {
printf(" Quiz%-2d", k);
}
putchar ('\n');
for (int i = 0; i < M; i++) {
printf("\n Student[%3d] Grades: ", i);
for (int k = 0; k < N; k++) {
printf(" %6.2f", x[i][k]);
}
}
printf("\n\n--------------------------------------------------------------------------------\n\n");
averageGradeOfStudents (M, N, p, x);
/* getchar(); */
return 0;
}
void averageGradeOfStudents (int M, int N, float p[], float (*xPtr)[quizzes])
{
float grade[M];
/* initialize variable length array to 0 */
for (int i = 0; i < M; i++) grade[i] = 0;
/* sum of grades for each student */
for (int i = 0; i < M; i++) {
for (int k = 0; k < N; k++) {
grade[i] += xPtr[i][k];
}
}
printf ("The average grades for the students are:\n\n");
for (int k = 0; k < M; k++) {
p[k] = grade[k] / N;
printf(" student[%3d] is: %6.2f\n", k, p[k]);
}
putchar ('\n');
}
使用/输出强>
$ ./bin/studentavg
Enter the number students (Maximum: 300): 3
Enter the number of Quizzes (Maximum: 20): 3
Enter the grade for student 0, Quiz 0: 8
Enter the grade for student 0, Quiz 1: 9
Enter the grade for student 0, Quiz 2: 8
Enter the grade for student 1, Quiz 0: 9
Enter the grade for student 1, Quiz 1: 9
Enter the grade for student 1, Quiz 2: 10
Enter the grade for student 2, Quiz 0: 7
Enter the grade for student 2, Quiz 1: 8
Enter the grade for student 2, Quiz 2: 9
--------------------------------------------------------------------------------
Quiz1 Quiz2 Quiz3
Student[ 0] Grades: 8.00 9.00 8.00
Student[ 1] Grades: 9.00 9.00 10.00
Student[ 2] Grades: 7.00 8.00 9.00
--------------------------------------------------------------------------------
The average grades for the students are:
student[ 0] is: 8.33
student[ 1] is: 9.33
student[ 2] is: 8.00
注意:我已将scanf_s
更改为scanf
我的系统,您需要将其更改回来。如果您还有其他问题,请与我们联系。
答案 2 :(得分:1)
对数组求和是一个相当常见的习语:
double sumArray(double arr[], int arrLen)
{
int i;
double sum = 0.0;
for (i = 0; i < arrLen; i++)
sum += arr[i];
return sum;
}
这会对一维数组求和,但请记住,数组x
的每一行都是一维数组。
答案 3 :(得分:0)
int avg=0;
int sum=0;
for (int i = 0; i < M; i++) {
for (int k = 0; k < N; k++) {
printf("Enter the grade for student %d, Quiz %d: ", i, k);
scanf("%f", &x[i][k]);
sum=sum+x[i][k]
}
}avg=sum/M;
为了得到平均值,你必须总结...试试这可能对你有所帮助