Post your new code
Printable View
Post your new code
Code:/* The program includes functions for:
Printing an average of all grades
Finding average grade for each subject for each student
Finding the average grade for each student in both subjects
You should now rewrite the code to work with 2(subjects)-3(students)-4(exams) array and do the
same things as described above and in the attached code.*/
#include <stdio.h>
float ave(float (*stu)[][3][4]);
void sAve(float (*stu)[][4]);
int main()
{
int i, j, k;
float stu[2][3][4];
for(i=0; i<2; i++){
for(j=0;j<3;j++){
for(k=0; k<4; k++){
if(k==0){
printf("Enter in the grade for student %d in subject %d", j+1, k+1);
scanf("%f", &stu[i][j][k]);
}else
scanf("%f", &stu[i][j][k]);
}
}
}
printf("All Averages: %f", ave(*stu));
sAve(*stu);
return 0;
}
float ave(float (*stu)[][3][4])
{
float sum=0;
int i, j, k;
for(i=0; i<2; i++){
for(j=0;j<3;j++){
for(k=0; k<4; k++){
sum+=(*stu)[i][j][k];
}
}
}
return (sum/24);
}
void sAve(float (*stu)[][4])
{
float sum=0;
int i, j;
for(i=0; i<3; i++){
for(j=0;j<3;j++){
sum+=(*stu)[i][j];
}
}
printf("The Student Average is: %f", sum/12);
}
A few pointers
1) Fix your indentation.
2) Rename of i to subject, j to student and k to grade -> There is a few obvious mistakes that can be solved.
3) "ave(*stu)" is wrong -> It should be "ave(&stu)" - The "address" of the array.
4) You haven't changed %d to %f
the only %d that is in there refers to an integer it's correct
Code:/* The program includes functions for:
Printing an average of all grades
Finding average grade for each subject for each student
Finding the average grade for each student in both subjects
You should now rewrite the code to work with 2(subjects)-3(students)-4(exams) array and do the
same things as described above and in the attached code.*/
#include <stdio.h>
float ave(float (*stu)[][3][4]);
void sAve(float (*stu)[][4]);
int main()
{
int i, j, k;
float stu[2][3][4];
for(i=0; i<2; i++){
for(j=0;j<3;j++){
for(k=0; k<4; k++){
if(k==0){
printf("Enter in the grade for student %d in subject %d", j+1, k+1);
scanf("%f", &stu[i][j][k]);
}else
scanf("%f", &stu[i][j][k]);
}
}
}
printf("All Averages: %f", ave(&stu));
sAve(&stu);
return 0;
}
float ave(float (*stu)[][3][4])
{
float sum=0;
int i, j, k;
for(i=0; i<2; i++){
for(j=0;j<3;j++){
for(k=0; k<4; k++){
sum+=(*stu)[i][j][k];
}
}
}
return (sum/24);
}
void sAve(float (*stu)[][4])
{
float sum=0;
int i, j;
for(i=0; i<3; i++){
for(j=0;j<3;j++){
sum+=(*stu)[i][j];
}
}
printf("The Student Average is: %f", sum/12);
}
C:\Users\j\Desktop\>gcc Lab8a.c -o Lab8a
Lab8a.c: In function 'main':
Lab8a.c:29:1: warning: passing argument 1 of 'sAve' from incompatible pointer ty
pe [enabled by default]
Lab8a.c:9:6: note: expected 'float (*)[][4]' but argument is of type 'float (*)[
2][3][4]'
You did fix it, sorry.
You haven't fixed your indentation
You haven't renamed your variables i,j and k
The error comes from the way you are calling sAve -> You are putting a pointer to a 3D array into a pointer to a 2D.
I changed your function sAve, because it wasn't doing what you thought it was doing
Code:#define NUMBER_OF_SUBJECTS 2
#define NUMBER_OF_STUDENTS 3
#define NUMBER_OF_GRADES 3
...
float sAve(float (*stu)[NUMBER_OF_SUBJECTS][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES], int student)
{
float sum=0;
int subject, grade;
if (student >= NUMBER_OF_STUDENTS)
{
printf("\nError: No student %d found", student + 1);
return 0.0;
}
for(subject=0; subject<NUMBER_OF_SUBJECTS; subject++)
{
for(grade=0; grade<NUMBER_OF_GRADES; grade++)
{
sum+=(*stu)[subject][student][grade];
}
}
return (sum/ (NUMBER_OF_SUBJECTS * NUMBER_OF_GRADES));
}
The excercise is to call only the [3][4] elements into the function lol
So you want to calculate the class average, not student?
Now say I want to find the individual subject for each student
Alright this is where I'm at, I think it's correct
Code:/* The program includes functions for:
Printing an average of all grades
Finding average grade for each subject for each student
Finding the average grade for each student in both subjects
You should now rewrite the code to work with 2(subjects)-3(students)-4(exams) array and do the
same things as described above and in the attached code.*/
#include <stdio.h>
#define NUMBER_OF_SUBJECTS 2
#define NUMBER_OF_STUDENTS 3
#define NUMBER_OF_GRADES 4
float ave(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES]);
float sAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES], int student);
float gAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES]);
int main()
{
int i, j, k, student=0, subject;
float stu[2][3][4];
for(i=0; i<2; i++){
for(j=0;j<3;j++){
for(k=0; k<4; k++){
if(k==0){
printf("Enter in the grade for student %d in subject %d:\n", j+1, k+1);
scanf("%f", &stu[i][j][k]);
}else
scanf("%f", &stu[i][j][k]);
}
}
}
for(student=0; student<3; student++){
printf("Subject Averages for student %d %.2f\n", student+1, sAve(&stu, student));
}
printf("Average of all Grades: %.2f", ave(&stu));
for(student=0; student<3; student++){
for(subject=0; subject<NUMBER_OF_SUBJECTS; subject++){
printf("The Average of Student %d in Subject %d: %f", student+1, subject+1, gAve(&stu));
}
}
return 0;
}
float ave(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES])
{
float sum=0;
int i, j, k;
for(i=0; i<2; i++){
for(j=0;j<3;j++){
for(k=0; k<4; k++){
sum+=(*stu)[i][j][k];
}
}
}
return (sum/(2*3*4));
}
float sAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES],int student)
{
float sum=0;
int subject, grade;
for(subject=0; subject<NUMBER_OF_SUBJECTS; subject++){
for(grade=0; grade<NUMBER_OF_GRADES; grade++)
{
sum+=(*stu)[subject][student][grade];
}
}
return (sum/(NUMBER_OF_GRADES * NUMBER_OF_SUBJECTS));
}
float gAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES])
{
float sum=0;
int grade;
for(grade=0; grade<NUMBER_OF_GRADES; grade++)
{
sum+=(*stu)[NUMBER_OF_SUBJECTS][NUMBER_OF_STUDENTS][grade];
}
return (sum/NUMBER_OF_GRADES);
}
Thing that bugs me is this is not how I'm supposed to do it, I could have done this, I guess I'll have to ask about the way they actually wanted to do it. I'm only supposed to be calling 2 of the 3 elements and etc.
Trust me on this one: Change the names of i, j and k in your main function to subject, student and grade -> You'll see it straight away!
Your indentation is still extremely bad.
Also,
Only use the defines for the numbers 2, 3 and 4 -> That way you can change your code very quickly and easily.
You gAve function is a good attempt, but the reason it won't work is because NUMBER_OF_SUBJECTS/NUMBER_OF_STUDENTS are defined as 2 and 3. I'd make them parameters for the function, like student in sAve.
Code:/* The program includes functions for:
Printing an average of all grades
Finding average grade for each subject for each student
Finding the average grade for each student in both subjects
You should now rewrite the code to work with 2(subjects)-3(students)-4(exams) array and do the
same things as described above and in the attached code.*/
#include <stdio.h>
#define NUMBER_OF_SUBJECTS 2 //globals for array variables
#define NUMBER_OF_STUDENTS 3
#define NUMBER_OF_GRADES 4
float ave(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES]);
float sAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES], int student);
float gAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES], int subject, int grade);//function prototypes
int main()
{
int subject, student, grade;
float stu[NUMBER_OF_SUBJECTS][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES];//variable declarations
for(subject=0; subject<2; subject++){//for loop for populating 3 dimensional array
for(student=0;student<3;student++){
for(grade=0; grade<4; grade++){
if(grade==0){
printf("Enter in the grade for student %d in subject %d:\n", student+1, subject+1);
scanf("%f", &stu[subject][student][grade]);
}else
scanf("%f", &stu[subject][student][grade]);
}
}
}
for(student=0; student<3; student++){ //for loop to print off Subject averages by looping through students with a function call
printf("Subject Averages for student %d %.2f\n", student+1, sAve(&stu, student));
}
printf("Average of all Grades: %.2f\n", ave(&stu)); //Print out all averages by function call
for(student=0; student<NUMBER_OF_STUDENTS; student++){//nested for loop to print off student averages per subject as loops through
for(subject=0; subject<NUMBER_OF_SUBJECTS; subject++){
printf("The Average of Student %d in Subject %d: %.2f\n", student+1, subject+1, gAve(&stu, subject, student));
}
}
return 0;
}
float ave(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES]) //function definition
{
float sum=0;
int i, j, k;//local variables
for(i=0; i<2; i++){//for loop to add all the values together
for(j=0;j<3;j++){
for(k=0; k<4; k++){
sum+=(*stu)[i][j][k];
}
}
}
return (sum/(2*3*4));//print out the sum / number of subjects, students, exams
}
float sAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES],int student)//function definition
{
float sum=0;
int subject, grade;//local variables
for(subject=0; subject<NUMBER_OF_SUBJECTS; subject++){
for(grade=0; grade<NUMBER_OF_GRADES; grade++)//for loop only loops through subject and grade
{
sum+=(*stu)[subject][student][grade];
}
}
return (sum/(NUMBER_OF_GRADES * NUMBER_OF_SUBJECTS));//returns sum
}
float gAve(float (*stu)[][NUMBER_OF_STUDENTS][NUMBER_OF_GRADES], int subject, int student)//function definition for grade average
{
float sum=0;
int grade;//local variables
for(grade=0; grade<NUMBER_OF_GRADES; grade++)
{
sum+=(*stu)[subject][student][grade];//only takes sum of the grades and divides by number of grades
}
return (sum/NUMBER_OF_GRADES);//returns value
}