Πολυδιάστατοι Πίνακες – Multidimensional arrays πίνακας με δύο ή περισσότερες διαστάσεις float student_grades[NUM_STUDENTS][NUM_COURSES]; student course Δυσδιαστατοι πινακες ΝUM_STUDENTS rows NUM_COURSES columns
Πολυδιάστατοι Πίνακες Oρισμος: τυπος ονομα[dim1][dim2]..[dimn]; Σημασια: πινακας με n διαστασεις και (dim1*dim2*..*dimn) στοιχεια ονομα περιεχει την διευθυνση του 1ου στοιχειου πχ student_grades περιεχει ΝUM_STUDENTS*NUM_COURSES στοιχεια –1ο στοιχειο: student_grades[0][0] –τελευτ.: student_grades[NUM_STUDENTS-1][NUM_COURSES-1]
Πολυδιάστατοι Πίνακες Eπεξεργασια πολυδιαστατου πινακα απαιτει nested- loops (το nesting-level ειναι ιδιο με τον αριθμο διαστασεων του πινακα) Αρχικοποιηση –στον ορισμο int count[][]={{4,5,6},{3,56,87},{456,412,846},{0,0,0}}; πινακας 4(rows) x 3(columns) –με nested-loop for(i=0;i<NUM_STUDENTS;++i) for(j=0;j<NUM_COURSES;++j) student_grades[i][j]=0;
Πολυδιάστατοι Πίνακες Oρισμος Συναρτησησης με multi-dim παραμετρο: –void display(int table[][NUM_COURSES],...); –μονο το μεγεθος της 1ης διαστασης δεν χρειαζεται (γιατι;) Κληση συναρτησης με multi-dim πινακα –display(student_grades,...);
Αποθηκευση multi-dim πινακων Τα δεδομενα multi-dim πινακα αποθηκευονται στην μνημη κατα row major προτεραιοτητα:1η row, 2η row, κτλ int count[4][3]={ {4,5,6}, {3,56,87}, {456,412,846}, {0,0,0}}; 40,0 50,1 60,2 31,0 561,1 871,2
Παραδειγμα Γραψετε ενα προγραμμα: –που διαβαζει απο την εισοδο βαθμους 80 φοιτητων. Για καθε φοιτητη διαβαζονται 5 βαθμοι. Τα δεδομενα στο αρχειο ειναι καταχωρημενα ως ακολουθως: (βαθμοι 1ου φοιτητη) (βαθμοι 2ου φοιτητη) κτλ –υπολογιζει και τυπωνει (α) βαθμους καθε φοιτητη (β) τον μεσο ορο για καθε φοιτητη, και (γ) τον μεσο ορο για καθε μαθημα
Τι πρεπει να γινει; διαβαστουν δεδομενα (αποθηκευτουν) υπολογισμος μεσων ορων τυπωση αποτελεσματων
Τι πρεπει να γινει; διαβαστουν δεδομενα (αποθηκευτουν) void read_data(float grades_table[80][5]); υπολογισμος μεσων ορων void compute_averages(float grades_table[80][5], float average_per_student[80], float average_per_course[5]); τυπωση αποτελεσματων void display_results(float grades_table[80][5], float average_per_student[80], float average_per_course[5]);
σταθερες #define NUM_STUDENTS 80 #define NUM_COURSES 5 πινακες float grade_table[NUM_STUDENTS][NUM_COURSES]; float average_per_student[NUM_STUDENTS]; float average_per_course[NUM_COURSES];
void read_data(float grade_table[][NUM_COURSES]) { int i,j; for(i=0;i<NUM_STUDENTS;++i) for(j=0;j<NUM_COURSES;++j) scanf(“%f”,&grade_table[i][j]); }
void compute_averages(float grade_table[][NUM_COURSES], float average_per_student[], float average_per_course[]) { int i,j; for(i=0;i<NUM_STUDENTS;++i) average_per_student[i]=0; for(i=0;i<NUM_COURSES;++i) average_per_course[i]=0; for(i=0;i<NUM_STUDENTS;++i) for(j=0;j<NUM_COURSES;++j){ average_per_student[i]+=grade_table[i][j]; average_per_course[j]+= grade_table[i][j]; } for(i=0;i<NUM_STUDENTS;++i) average_per_student[i]/=NUM_COURSES; for(i=0;i<NUM_COURSES;++i) average_per_course[i]/=NUM_STUDENTS; }
void display_results(float grade_table[][NUM_COURSES], float average_per_student[], float average_per_course[]) { int i,j; for(i=0;i<NUM_STUDENTS;++i){ for(j=0;j<NUM_COURSES;++j) printf(“%5.2f ”,grade_table[i][j]); printf(“%5.2f\n”,average_per_student[i]; } for(j=0;j<NUM_COURSES;++j) printf(“%5.2f ”,average_per_course[j]); printf(“\n”); }
Τι ειναι το main()
Πιο γενικο προβλημα/λυση Τα δυο πρωτα δεδομενα οριζουν τον αριθμο φοιτητων και αριθμο μαθηματων (που δεν πρεπει να ξεπερνα το 80 και το 5 αντιστοιχα). Τι αλλαγες συνεπαγεται το πιο πανω;
void read_data(float grade_table[][NUM_COURSES], int *students,int *courses) { int i,j; scanf(“%d %d”,students,courses); if (*students>NUM_STUDENTS || *courses>NUM_COURSES){ printf(“error: students or courses > than allowed maximum”); exit(0); } for(i=0;i<*students;++i) for(j=0;j<*courses;++j) scanf(“%f”,&grade_table[i][j]); }
void compute_averages(float grade_table[][NUM_COURSES], float average_per_student[], float average_per_course[], int students, int courses) {int i,j; for(i=0;i<students;++i) average_per_student[i]=0; for(i=0;i<courses;++i) average_per_course[i]=0; for(i=0;i<students;++i) for(j=0;j<courses;++j){ average_per_student[i]+=grade_table[i][j]; average_per_course[j]+= grade_table[i][j]; } for(i=0;i<students;++i) average_per_student[i]/=courses; for(i=0;i<courses;++i) average_per_course[i]/=student; }
void display_results(float grade_table[][NUM_COURSES], float average_per_student[], float average_per_course[], int students, int courses) { int i,j; for(i=0;i<students;++i){ for(j=0;j<courses;++j) printf(“%5.2f ”,grade_table[i][j]); printf(“%5.2f\n”,average_per_student[i]; } for(j=0;j<courses;++j) printf(“%5.2f ”,average_per_course[j]); printf(“\n”); }
Input/Output Redirection (2.7) foo < in foo > out foo out Δεδομενα απο συγκεκριμενο αρχειο/α (2.7)