Thread: Array Question

  1. #31
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    Post your new code
    Fact - Beethoven wrote his first symphony in C

  2. #32
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    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);
                    }

  3. #33
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    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
    Fact - Beethoven wrote his first symphony in C

  4. #34
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    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]'

  5. #35
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    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));
    }
    Last edited by Click_here; 11-15-2012 at 07:59 PM.
    Fact - Beethoven wrote his first symphony in C

  6. #36
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    The excercise is to call only the [3][4] elements into the function lol

  7. #37
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    So you want to calculate the class average, not student?
    Fact - Beethoven wrote his first symphony in C

  8. #38
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    Now say I want to find the individual subject for each student

  9. #39
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    Quote Originally Posted by Sorinx View Post
    Now say I want to find the individual subject for each student
    Look at the code in post #35 and think...
    Fact - Beethoven wrote his first symphony in C

  10. #40
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    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);
    }

  11. #41
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    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.

  12. #42
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    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.
    Fact - Beethoven wrote his first symphony in C

  13. #43
    TEIAM - problem solved
    Join Date
    Apr 2012
    Location
    Melbourne Australia
    Posts
    1,907
    Quote Originally Posted by Sorinx View Post
    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.
    I'd like to say for the record, I did show you how to send a 2D array from a 3D array as a parameter in post #17. You didn't seem very interested though.
    Fact - Beethoven wrote his first symphony in C

  14. #44
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    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 
    }

  15. #45
    Registered User
    Join Date
    Oct 2012
    Posts
    126
    Quote Originally Posted by Click_here View Post
    I'd like to say for the record, I did show you how to send a 2D array from a 3D array as a parameter in post #17. You didn't seem very interested though.
    I did try it, it gave me the error I posted previously

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 12
    Last Post: 11-21-2010, 09:46 AM
  2. Array question HELP!!
    By evangela in forum C Programming
    Replies: 7
    Last Post: 11-28-2009, 12:38 PM
  3. Array question
    By Karmachrome in forum C Programming
    Replies: 4
    Last Post: 10-27-2005, 09:33 PM
  4. array question
    By KAchE in forum C Programming
    Replies: 4
    Last Post: 02-18-2002, 06:33 PM
  5. Array Question
    By Unregistered in forum C Programming
    Replies: 3
    Last Post: 11-03-2001, 05:23 PM