C Program to Calculate Rank list of Class Students using Pointers
The C program to Processing of Examination Marks and to calculate rank list of class students by using pointers with two dimensional arrays. The Marks obtained by batch of students in the Annual Examination are tabulated as follows:
Student name Marks obtained
S.Laxmi 45 67 38 55
V.S.Rao 77 89 56 69
..etc
It is required to compute the total marks obtained by each student and print the rank list based on the total marks.
The program in below example shows stores the student names in the array name and the marks in the array marks. After computing the total marks obtained by all the students, the program prepares and prints the rank list. The declaration
int marks[STUDENTS][SUBJECTS+1];
To define marks as C pointer to the array’s first row. We use rowptr as the pointer to the row of marks. The rowptr is initialized as follows:
int (*rowptr)[SUBJECTS+1] = array;
Note that array is the formal argument whose values are replaced by the values of the actual argument marks. The parentheses around *rowptr makes the rowptr as a pointer to an array of SUBJECTS+1 integers. Remember, the statement
int *rowptr[SUBJECTS+1];
would declare rowptr as an array of SUBJECTS+1 elements.
When we increment the rowptr (by rowptr+1), the increment is done in units of the size of each row of array, making rowptr point to the next row. Since rowptr points to a particular row,
(*rowptr)[x] points to the xth element in the row.
Example : C Program to Calculate rank list of Class Students
#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '\0'; i = 0; while(s1[i] != '\0' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '\0' && i < 256) { s1[i] = s2[i]; s1[++i] = '\0'; } i = 0; while(swaparea[i] != '\0') { s2[i] = swaparea[i]; s2[++i] = '\0'; } }'; i = 0; while(s1[i] != '#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '\0'; i = 0; while(s1[i] != '\0' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '\0' && i < 256) { s1[i] = s2[i]; s1[++i] = '\0'; } i = 0; while(swaparea[i] != '\0') { s2[i] = swaparea[i]; s2[++i] = '\0'; } }' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '\0'; i = 0; while(s1[i] != '\0' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '\0' && i < 256) { s1[i] = s2[i]; s1[++i] = '\0'; } i = 0; while(swaparea[i] != '\0') { s2[i] = swaparea[i]; s2[++i] = '\0'; } }' && i < 256) { s1[i] = s2[i]; s1[++i] = '#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '\0'; i = 0; while(s1[i] != '\0' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '\0' && i < 256) { s1[i] = s2[i]; s1[++i] = '\0'; } i = 0; while(swaparea[i] != '\0') { s2[i] = swaparea[i]; s2[++i] = '\0'; } }'; } i = 0; while(swaparea[i] != '#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '\0'; i = 0; while(s1[i] != '\0' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '\0' && i < 256) { s1[i] = s2[i]; s1[++i] = '\0'; } i = 0; while(swaparea[i] != '\0') { s2[i] = swaparea[i]; s2[++i] = '\0'; } }') { s2[i] = swaparea[i]; s2[++i] = '#define Students 5 #define Subject 4 #include <string.h> main() { char name[STUDENTS][20]; int marks[STUDENTS][SUBJECTS+1]; printf("Input students names & their marks in four subjects\n"); get_list(name, marks, STUDENTS, SUBJECTS); get_sum(marks, STUDENTS, SUBJECTS+1); printf("\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); get_rank_list(name, marks, STUDENTS, SUBJECTS+1); printf("\nRanked List\n\n"); print_list(name,marks,STUDENTS,SUBJECTS+1); } /* Input student name and marks */ get_list(char *string[ ], int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { scanf("%s", string[i]); for(j = 0; j < SUBJECTS; j++) scanf("%d", &(*(rowptr + i))[j]); } } /* Compute total marks obtained by each student */ get_sum(int array [ ] [SUBJECTS +1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { (*(rowptr + i))[n-1] = 0; for(j =0; j < n-1; j++) (*(rowptr + i))[n-1] += (*(rowptr + i))[j]; } } /* Prepare rank list based on total marks */ get_rank_list(char *string [ ], int array [ ] [SUBJECTS + 1] int m, int n) { int i, j, k, (*rowptr)[SUBJECTS+1] = array; char *temp; for(i = 1; i <= m-1; i++) for(j = 1; j <= m-i; j++) if( (*(rowptr + j-1))[n-1] < (*(rowptr + j))[n-1]) { swap_string(string[j-1], string[j]); for(k = 0; k < n; k++) swap_int(&(*(rowptr + j-1))[k],&(*(rowptr+j))[k]); } } /* Print out the ranked list */ print_list(char *string[ ], int array [] [SUBJECTS + 1], int m, int n) { int i, j, (*rowptr)[SUBJECTS+1] = array; for(i = 0; i < m; i++) { printf("%-20s", string[i]); for(j = 0; j < n; j++) printf("%5d", (*(rowptr + i))[j]); printf("\n"); } } /* Exchange of integer values */ swap_int(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } /* Exchange of strings */ swap_string(char s1[ ], char s2[ ]) { char swaparea[256]; int i; for(i = 0; i < 256; i++) swaparea[i] = '\0'; i = 0; while(s1[i] != '\0' && i < 256) { swaparea[i] = s1[i]; i++; } i = 0; while(s2[i] != '\0' && i < 256) { s1[i] = s2[i]; s1[++i] = '\0'; } i = 0; while(swaparea[i] != '\0') { s2[i] = swaparea[i]; s2[++i] = '\0'; } }'; } }
Output
Output Input students names & their marks in four subjects S.Laxmi 45 67 38 55 V.S.Rao 77 89 56 69 A.Gupta 66 78 98 45 S.Mani 86 72 0 25 R.Daniel 44 55 66 77 S.Laxmi 45 67 38 55 205 V.S.Rao 77 89 56 69 291 A.Gupta 66 78 98 45 287 S.Mani 86 72 0 25 183 R.Daniel 44 55 66 77 242 Ranked List V.S.Rao 77 89 56 69 291 A.Gupta 66 78 98 45 287 R.Daniel 44 55 66 77 242 S.Laxmi 45 67 38 55 205 S.Mani 86 72 0 25 183
Let me know if you find any difficulty in understanding this C Program to Calculate Rank list of Class Students example and I would be glad to explain it further.