lllecture9-arrays-ND.pdf - ΗΥ-150...

Info icon This preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: ΗΥ-150 Προγραμματισμός Πίνακες (Arrays) Προγραμματισμός Εισαγωγικά Έστω ότι θέλουμε να αποθηκεύσουμε 100 ονόματα φοιτητών και τους βαθμούς τους. Πως θα το κάναμε αυτό με μεταβλητές; Πως θα μπορούσαμε να πούμε με αυτό το τρόπο «ταξινόμησε τους βαθμούς και τύπωσε τους»; Πως θα μπορούσαμε να πούμε «τύπωσε μόνο εκείνους που πέρασαν το μάθημα»; ΛΥΣΗ: Πίνακες – – – – Συλλογή μεταβλητών ίδιου τύπου Σταθερό μέγεθος Ν στοιχεία: 0 … Ν-1 Στη C η αρίθμηση ξεκινάει από το 0 Προγραμματισμός 2 Πίνακες Ένα σύνολο διατεταγμένων (συνήθως σχετιζόμενων) πραγματικών αριθμών – – π.χ. που καταγράφουν τη θερμοκρασία το μεσημέρι σε μία πόλη κατά τη διάρκεια του έτους αποθηκεύονται σε ένα μονοδιάστατο πίνακα (array) πραγματικών αριθμών με 365 στοιχεία παρά σε ισάριθμες ανεξάρτητες μεταβλητές. Η χρήση πίνακα διευκολύνει πολύ την αναζήτηση, ταξινόμηση και, γενικά, διαχείριση σχετιζόμενων ποσοτήτων. Η δήλωση ενός μονοδιάστατου πίνακα γίνεται ως εξής: τύπος όνομα[πλήθος_στοιχείων]; Το πλήθος_στοιχείων πρέπει να είναι μία ακέραιη σταθερά ή μία ακέραιη σταθερή ποσότητα, γνωστή κατά τη μεταγλώττιση του κώδικα. Προγραμματισμός 3 Παράδειγμα Οι παρακάτω δηλώσεις ορίζουν τον πραγματικό πίνακα temperature με 365 στοιχεία και ένα πίνακα των (τετραψήφιων) εσωτερικών τηλεφώνων μιας εταιρίας (που χωρούν σε int ): double temperature[365]; int const N = 155; int telephone[N]; Η δήλωση του telephone έγινε με “παράμετρο” το πλήθος των στοιχείων ώστε μία αλλαγή του να μην απαιτεί εκτεταμένες τροποποιήσεις στον κώδικα. Προγραμματισμός 4 Πίνακες Πίνακας – – – Για να πάρουμε ένα στοιχείο του πίνακα δίνουμε: – – – Σύνολο από συνεχόμενες θέσεις μνήμης Ίδιο όνομα και ίδιος τύπος Ορισμός : int c[12]; Όνομα πίνακα Θέση c[1] = 6; Μορφή: – – arrayname[ position number ] Πρώτο στοιχείο στη θέση 0 Για έναν πίνακα n στοιχείων με όνομα c: c[ 0 ], c[ 1 ], ..., c[ n – 1 ] Όλα τα στοιχεία του πίνακα έχουν όνομα c c[0] -45 c[1] 6 c[2] 0 c[3] 72 c[4] 1543 c[5] -89 c[6] 0 c[7] 62 c[8] -3 c[9] 1 c[10] 6453 c[11] 78 Θέση μέσα στον πίνακα c Προγραμματισμός 5 int c[12]; c[12] = 0; Γιατί μετράμε από το 0; Προγραμματισμός 6 Παράδειγμα Πρόσβαση στα στοιχεία ενός πίνακα, π.χ. του temperature, γίνεται βάζοντας σε αγκύλες μετά το όνομα του πίνακα ένα ακέραιο μεταξύ 0 και D-1 όπου D η διάσταση. Το πρώτο, δηλαδή, στοιχείο του πίνακα είναι στη θέση 0. Π.χ. temperature[0] = 14.0; temperature[1] = 14.5; temperature[2] = 15.5; temperature[3] = 13.0; temperature[4] = 15.0; Προγραμματισμός 7 for (i=0;i<N;i++) { int foo; cin >> foo; temperature[i] = foo; cout << temperature[i]; } Προγραμματισμός 8 Πίνακες Δήλωση πολλών πινάκων ίδιου τύπου – Όπως και μεταβλητές int b[ 100 ], x[ 27 ]; Τα στοιχεία του πίνακα χρησιμοποιούνται σαν συνηθισμένες μεταβλητές c[ 0 ] = 3; cout << c[ 0 ]; Μπορούμε να κάνουμε πράξεις μέσα στο δείκτη. if (x[0] == 3) c[ 5 - 2 ] == c[ 3 ] == c[ i ] Εμφωλιασμένοι δείκτες: c[c[c[1]]] ΠΡΟΣΟΧΗ: – – δείκτης πίνακα (index) c[i], index is i (int i) Προγραμματισμός 9 Στοιχεία του Πίνακα σε Εκφράσεις έκφραση1 όνομα_πίνακα[έκφραση2] – – – – πρώτα υπολογίζεται η τιμή της έκφρασης2 η τιμή της έκφρασης2 πρέπει να είναι ακέραια (int) η τιμή της έκφρασης1 είναι το στοιχείο του πίνακα που αντιστοιχεί στην συγκεκριμένη θέση που δίνεται από την έκφραση2 ο τύπος της έκφρασης1 είναι ο τύπος των στοιχείων του πίνακα double array[100]; int i, x=5; for (i = 0; i < 100; ++i) cin >> array[i]; i = (int)(array[10*x]); Προγραμματισμός 10 Πρόγραμμα - armemory.c #include <iostream.h> #define SIZE 10 int main() { int array[SIZE] = {5, 3,9, 123,0, 293, 2394, 2,-1, -232}; int n; for (n=0; n < SIZE ; n++) { cout << "Element array[" << n << "] = "; cout << array[n] << “, memory address "; cout << &array[n]; } return 0; } Προγραμματισμός 11 Δήλωση πινάκων Όταν δηλώνουμε πίνακες ως μεταβλητές καθορίζουμε: – – – Όνομα Τύπο Αριθμό στοιχείων arrayType arrayName[ numberOfElements ]; int c[ 10 ]; float myArray[ 3284 ]; Όταν δηλώνουμε πίνακες ως ορίσματα στον ορισμό συναρτήσεων καθορίζουμε: – – – Όνομα Τύπο int myfunction(int c){ ... } Όταν δηλώνουμε πίνακες ως ορίσματα στη δήλωση συναρτήσεων καθορίζουμε: – – Τύπο int myfunction(int ); Προγραμματισμός 12 Παραδείγματα χρήσης Αρχικοποίηση – int n[ 5 ] = { 1, 2, 3, 4, 5 }; Αν δεν υπάρχουν αρκετά στοιχεία για αρχικοποίηση, τότε τα υπολοιπόμενα γίνονται 0 int n[ 5 ] = { 0 }; /* All elements 0 */ for (i = 0; i < 5; ++i) n[i] = 0; – Αν βάλουμε πιο πολλά στοιχεία από όσα έχει ο πίνακας τότε θα πάρουμε λάθος Αν αρχικοποιούμε τον πίνακα μπορούμε να μη δώσουμε μέγεθος και ο πίνακας θα είναι όσος και τα στοιχεία που δίνουμε – int n[ ] = { 1, 2, 3, 4, 5 }; 5 στοιχεία, οπότε πίνακας 5 στοιχείων Προγραμματισμός 13 Αρχικοποίηση Μπορούμε να δώσουμε αρχικές τιμές στα στοιχεία ενός πίνακα εάν κατά τον ορισμό του παραθέσουμε λίστα τιμών με ίδιο (ή μετατρέψιμο) τύπο με τα στοιχεία. Κατά τη δήλωση με αρχική τιμή μπορούμε να παραλείψουμε τη διάσταση του πίνακα οπότε υπολογίζεται από τον compiler με βάση τ πλήθος των παρατιθέμενων τιμών. Αν υπάρχει και η διάσταση δεν επιτρέπεται να δίνονται περισσότερες αρχικές τιμές, ενώ, αν παρατίθενται λιγότερες, οι υπόλοιπες θεωρούνται 0 (μετατρεπόμενο στον αντίστοιχο τύπο): int primes[5] = {1,2,3,5,7}; int digits = {0,1,2,3,4,5,6,7,8,9}; // size is 10 char alphabet[5] = {'a', 'b', 'c', 'd', 'e', 'f'}; // Error int a[5] = {12, 5, 4}; // a == {12,5,4,0,0} Προγραμματισμός 14 Όρια Προσέξτε ότι αν δώσετε δείκτη (index) εκτός των ορίων του πίνακα, δηλαδή κάτω από το 0 ή πάνω από D-1 δε θα διαγνωστεί ως λάθος από τον compiler. Στη C++ δεν υπάρχει έλεγχος ορίων! Τι γίνεται αν βγούμε έξω από τον πίνακα; Προγραμματισμός 15 Προγράμματα (outofbounds.c) #include <stdio.h> int main() { int c,b, n[10], a; a = 5; b = 6; cout <<"a=" << a << “ b=“<<b<<endl; // Here we get out of bounds. What's going to happen depends on the system. for (c=-3; c < 10; c++) n[c] = 10; n[10] = 0; cout <<"a=" << a << “ b=“<<b<<endl; return 0; } Προγραμματισμός 16 Τι Κρύβει το Όνομα Ενός Πίνακα int a[100]; a[0] το 1ο στοιχείο του πίνακα &a[0] η διεύθυνση του 1ου στοιχείου του πίνακα &a[0] ισοδύναμο με το a (το όνομα του πίνακα) – – – Μπορούμε να χρησιμοποιούμε το a όπως ένα δείκτη – Αντί να γράφουμε &a[0] απλά γράφουμε a Άρα το a είναι διεύθυνση (δείκτης) στο πρώτο στοιχείο Ο τύπος του a είναι σταθερός δείκτης σε ακέραιο αργότερα θα δούμε ότι μπορούμε να χρησιμοποιούμε και δείκτες ως πίνακες! Το όνομα του πίνακα αντιστοιχεί σε μια σταθερή διεύθυνση Προγραμματισμός 17 Πίνακες σαν ορίσματα συναρτήσεων Ορίσματα: Δίνουμε το όνομα του πίνακα μόνο: int myArray[ 24 ]; float getMean(int myArray,int length) { int i; float sum = 0; for (i = 0; i < length; i++) sum += myArray[i]; return sum/length; } getMean( myArray, 24 ); – – – Συνήθως περνάμε μαζί και το μέγεθος του πίνακα Οι πίνακες πέρνιουνται call-by-reference Το όνομα του πίνακα είναι και δείκτης στο 1ο στοιχείο Η συνάρτηση έχει πρόσβαση στο σημείο αποθήκευσης του πίνακα Περνάμε στοιχεία του πίνακα – – call-by-value Περνάμε όνομα[θέση]: myArray[ 3 ] Προγραμματισμός 18 Πως μπορεί κανείς να αποφύγει να περάσει τον αριθμό στοιχείων του πίνακα; Από τη μνήμη που δεσμεύουν: το μέγεθος όλου του πίνακα / μέγεθος στοιχείου κατάλληλη χρήση sizeof() για την εύρεση των τιμών τους Προγραμματισμός 19 Size-of sizeof μπορεί να χρησιμοποιηθεί με – – – Ονόματα μεταβλητών Ονόματα τύπων Σταθερές sizeof – – – Επιστρέφει το μέγεθος σε bytes Για πίνακες: μέγεθος του 1 στοιχείου * πλήθος Αν sizeof( int ) είναι 4 bytes, τότε int myArray[ 10 ]; cout << sizeof( myArray ); Θα τυπώσει 40 Προγραμματισμός 20 Υπολογισμός Διεύθυνσης Στοιχείων Πού βρίσκεται στη μνήμη το στοιχείο a[index]; – – – – – double a[100]; Έστω ο πίνακας αρχίσει στην διεύθυνση a Κάθε στοιχείο του πιάνει χώρο sizeof(double) Θέλουμε να προσπελάσουμε το στοιχείο με δείκτη index H διεύθυνση (σε Bytes) στη μνήμη είναι η … a + sizeof(double) * index Προγραμματισμός 21 Πρόγραμμα : histogram.cpp #include <iostream.h> // The size of the array storing the grades #define HIST_SIZE 11 #define STUDENTS 30 // The size of the array storing the histogram int main() { int hist[HIST_SIZE] = {0}; int ba8moi[STUDENTS],i,j; for (i = 0; i < STUDENTS; ++i) cin >> ba8moi[i]; //Computes the histogram n of array a. //Array a has sizeA elements void computeHist(int n,int a,int sizeA) { int i; computeHist(hist,ba8moi,STUDENTS); for (i=0; i < HIST_SIZE; i++) { cout << i << “-” << hist[i] << ' '; for (i = 0; i < sizeA; ++i) n[a[i]]++; for (j = 0; j < hist[i]; j++) cout << '*'; } cout << endl; } return 0; } Προγραμματισμός 22 Πρόγραμμα #include <stdio.h> /* Print the values of the array AFTER the function call Notice: the values of the array elements have changed. The value of q has not changed.*/ void f(int , int size, int b); int main() { int c[10] = {0}; int n; int q = 30; for (n=0; n < 10; n++) cout << n << " " << c[n]; cout << "\nq = " << q << "\n\n"; /* Print the values of the array before the function call */ for (n=0; n < 10; n++) cout << n << " " << c[n]; } cout << "\nq = " << q << "\n\n"; void f(int a, int size, int b) { for (int i=0; i<size; i++) a[i] = 5; return 0; f(c, 10, q); b = 100; } Προγραμματισμός 23 ΗΥ-150 Προγραμματισμός Ταξινόμηση και Αναζήτηση Προγραμματισμός To πρόβλημα της Αναζήτησης Δοθέντος δεδομένων, λ.χ. σε Πίνακα (P) Ψάχνω να βρω κάποιο συγκεκριμένο στοιχείο (key) Αν ο πίνακας δεν είναι ταξινομημένος – Γραμμική Αναζήτηση (Linear search) Απλούστερη δυνατή Σύγκρινε σειριακά κάθε στοιχείο του πίνακα με την τιμή-κλειδί Χρήσιμο για μικρούς και ΜΗ ταξινομημένους πίνακες int linearSearch(int P,int apo,int eos,int key) { int i; } for (i = apo; i <= eos; ++i) { if (P[i] == key) return i; } return -1; Προγραμματισμός 25 To πρόβλημα της Αναζήτησης Αν ο πίνακας είναι ταξινομημένος – – λ.χ. τηλεφωνικός κατάλογος Μπορώ να κάνω πολύ πιο γρήγορα την αναζήτηση Δυαδική Αναζήτηση (Binary Search) – Συγκρίνει το P[middle] στοιχείο με το ζητούμενο key Αν είναι ίσα βρέθηκε Αν key < P[middle], ψάχνει στο 1ο μισό του πίνακα Αν key > P[middle], ψάχνει στο 2ο μισό του πίνακα Επανάληψη Πολύ γρήγορη – χειρότερη περίπτωση log2(N), Ν # στοιχείων πίνακα Πίνακας 100 στοιχείων χρειάζεται το πολύ 7 βήματα Πίνακας 100.000 στοιχείων χρειάζεται το πολύ 20 βήματα Πίνακας 100.000.000 στοιχείων χρειάζεται το πολύ 27 βήματα – Προγραμματισμός 26 Binary Search – Υλοποίηση με επανάληψη int binaryLoopSearch(int p, int searchkey, int low, int high) { int middle; while ( low <= high ) { middle = (low + high ) / 2; if (searchkey == p[middle]) return middle; else if (searchkey < p[middle] ) high = middle – 1; else low = middle + 1; } return -1; } Προγραμματισμός 27 Binary Search – Υλοποίηση με αναδρομή int binarySearch(int p, int searchkey, int low, int high) { int middle; middle = (low + high ) / 2; if (high < low) return -1; if (searchkey == p[middle]) return middle; else if (searchkey < p[middle]) return binarySearch(p, searchkey, low, middle-1); else return binarySearch(p, searchkey, middle+1,high); return -1; } Προγραμματισμός 28 To πρόβλημα της Ταξινόμησης Δοθέντος δεδομένων, λ.χ. σε Πίνακα (P) Να γίνει αναδιάταξη των στοιχείων του ώστε να βρεθούν σε αύξουσα (ή φθίνουσα) σειρά, δηλαδή ταξινομημένα 12 31 4 32 134 13 42 1 2 4 12 13 31 32 1 43 2 42 43 134 Λύση : Υπάρχουν διάφοροι αλγόριθμοι που το πετυχαίνουν και διαφοροποιούνται στο υπολογιστικό – – Straight Selection Sort - Bubble Sort : Ο(Ν2) Quick Sort : O(N log N) Προγραμματισμός 29 Ταξινόμηση με επιλογή values [0] [1] [2] 36 24 10 [3] [4] 6 12 Προγραμματισμός Χωρίζει νοητά τον πίνακα σε 2 μέρη: -Ταξινομημένο -Μη ταξινομημένο Σε κάθε επανάληψη βρίσκει το μεγαλύτερο στοιχείο και το ανταλλάσει με το πρώτο του αταξινόμητου υποπίνακα. Ταξινόμηση με επιλογή values [0] [1] [2] 36 24 10 [3] [4] 6 12 Προγραμματισμός U N S O R T E D Ταξινόμηση με επιλογή values [0] [1] [2] U N S O R T E D 12 24 10 [3] [4] 6 36 Προγραμματισμός SORTED Ταξινόμηση με επιλογή values [0] [1] [2] U N S O R T E D 12 6 24 10 [3] [4] 36 6 12 36 Προγραμματισμός SORTED Ταξινόμηση με επιλογή values [0] [1] [2] U N S O R T E D 12 6 10 6 24 10 [3] [4] 36 24 12 36 Προγραμματισμός SORTED Ταξινόμηση με επιλογή values [0] [1] [2] U N S O R T E D 12 6 10 [3] [4] 24 36 Προγραμματισμός SORTED Ταξινόμηση με επιλογή values [0] [1] [2] 10 6 12 [3] [4] 24 36 Προγραμματισμός UNSORTED S O R T E D Ταξινόμηση με επιλογή values [0] [1] [2] 10 6 12 [3] [4] 24 36 Προγραμματισμός UNSORTED S O R T E D Ταξινόμηση με επιλογή values [0] [1] [2] 6 10 12 [3] [4] 24 36 Προγραμματισμός S O R T E D Ταξινόμηση με επιλογή: Απαρίθμηση συγκρίσεων (υπολογιστικό κόστος) values [0] [1] [2] 6 4 compares for values[4] 10 3 compares for values[3] 12 [3] [4] 24 36 Προγραμματισμός 2 compares for values[2] 1 compare for values[1] = 4 + 3 + 2 + 1 Min Index minIndex = 0; minValue = arr[minIndex]; for (j = 1; j < n; j++) if (arr[j] < minValue) { minIndex = j; minValue = arr[j]; } Προγραμματισμός 40 Swap int a = 6; int b = 5; int tmp = a; a = b; b = tmp; Προγραμματισμός 41 Selection sort void selectionSort(int arr, int n) { int i, j, minIndex, tmp; for (i = 0; i < n - 1; i++) { minIndex = i; for (j = i + 1; j < n; j++) if (arr[j] < arr[minIndex]) minIndex = j; if (minIndex != i) { tmp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = tmp; } } } Προγραμματισμός QSort: Ψευδοκώδικας QSort(Πίνακας Π, δείκτης Α, δείκτης Τ) Ταξινομεί τον υποπίνακα Π[Α] έως Π[Τ] Αν Α Τ, επέστρεψε Διαφορετικά, – – – Διάλεξε ένα στοιχείο του πίνακα (pivot), έστω το μεσαίο Λ = Π[(Α+Τ)/2] Βρες την θέση Θ του Λ που θα έχει στην τελική ταξινόμηση Μετέφερε τα στοιχεία του Π[Α] έως και Π[Τ] έτσι ώστε: Π[Χ] Λ, αν Χ < Θ Π[Χ] > Λ, αν Χ > Θ QSort(Π, Α, Θ-1) QSort(Π, Θ+1, Τ) Προγραμματισμός 43 Qsort void qsort(int v, int left, int right) { int i, last; if(left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if (v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last-1); qsort(v, last+1, right); } void swap(int v, int i, int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } Προγραμματισμός 44 ΗΥ-150 Προγραμματισμός Πολυδιάστατοι Πίνακες Προγραμματισμός Πίνακες πολλών διαστάσεων Πίνακες πολλών διαστάσεων – – Πίνακες με γραμμές και στήλες (m Χ n πίνακας) Όπως και στα μαθηματικά: πρώτα γραμμή και μετά στήλη Column 0 Column 1 Column 2 Column 3 Row 0 Row 1 Row 2 a[ 0 ][ 0 ] a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 0 ] a[ 1 ][ 1 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ] a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 2 ] a[ 2 ][ 3 ] Column subscript Array name Row subscript Προγραμματισμός 46 Ένας διδιάστατος πίνακας ορίζεται ως εξής: τύπος όνομα[πλήθος_στοιχείων_1][πλήθος_στοιχείων_2]; Πίνακες περισσότερων διαστάσεων ορίζονται ανάλογα. Ένας ακέραιος 6 x 8 διδιάστατος πίνακας είναι ο int a[6][8]; Το στοιχείο π.χ. (3,2) του πίνακα αυτού είναι προσπελάσιμο ως a[3][2] . Απόδοση αρχικών τιμών γίνεται ανά γραμμή, ως εξής: int b[2][3] = { {0, 1, 2}, {3, 4, 5} }; Προγραμματισμός 47 Δισδιάστατοι Πίνακες Περιεχόμενα Μνήμης Δήλωση: int c[3][3]; Χρήση: c[k][j] = m; Αποθήκευση στη μνήμη c[0][0] -45 c[0][1] 6 c[0][2] 0 c[1][0] 72 c[1][1] 1543 c[1][2] -89 c[2][0] c[2][1] 0 62 c[2][2] -3 1 6453 78 Θέση μέσα στον πίνακα c Προγραμματισμός 48 Πίνακες πολλών διαστάσεων Αρχικοποίηση – – – int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; 1 2 3 4 {} διαχωρίζουν γραμμές του πίνακα Αν δεν είναι αρκετά τα στοιχεία, τα υπόλοιπα γίνονται 0 int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; Προγραμματισμός 49 1 0 3 4 Παράδειγμα 2Δ πίνακα #include <stdio.h> int main() { int magic[3][3] = { {8, 1, 6}, {3, 5, 7}, {4, 9, 2} }; int i, j, sum; int sumrows[3]; int sumcolumns[3]; int sumdiagonal1; int sumdiagonal2; // Now check that it is a magic square: // all rows and columns need to add to 15 sumdiagonal1 = 0; sumdiagonal2 = 0; for (i = 0 ; i < 3; i++) { sumrows[i] = 0; sumcolumns[i] = 0; for (j = 0 ; j < 3; j++) { sumrows[i] += magic[i][j]; sumcolumns[i]+= magic[j][i]; } sumdiagonal1 += magic[i][i]; sumdiagonal2 += magic[i][2-i]; // Print the magic square for (i=0; i < 3; i++) { for (j = 0; j < 3; j++) { cout << magic[i][j]; } cout << endl; } } for (i=0; i < 3 ; i++) { cout<<"Sum Row ”<<i<<“ is ” <<sumrows[i]<<endl; cout<<"Sum Column ”<<i<<“ is ” sumcolumns[i]<<endl; } cout<<“Sum diagonal 1 is ”<<sumdiagonal1 <<endl; cout<<“Sum diagonal 2 is ”<<sumdiagonal2<<endl; return 0; } Προγραμματισμός 50 Πολυδιάστατους Πίνακες ως Ορίσματα Πάντα πρέπει να δηλώνεται το μέγεθος κάθε διάστασης, εκτός από την πρώτη διάσταση (αριθμός γραμμών) int f(int a[10]) { … } int main(void) { int b[40][10]; f(b); } Γιατί μας υποχρεώνει η γλώσσα σε αυτόν τον περιορισμό; Σκεφτείτε. Προγραμματισμός 51 Υπολογισμός Mean, Median and Mode Mean – average – – Median – number in middle of sorted list – – 1, 1, 2, 2, 4 Mean = (1+1+2+2+4) / 5 = 2.0 1, 2, 3, 4, 5 3 is the median Mode – number that occurs most often – – 1, 1, 1, 2, 3, 3, 4, 5 1 is the mode Προγραμματισμός 52 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 , 29 30 31 32 /* Double-subscripted array example */ #include <stdio.h> #define STUDENTS 3 #define EXAMS 4 int minimum( const int [ EXAMS ], int, int ); int maximum( const int [ EXAMS ], int, int ); double average( const int , int ); void printArray( const int [ EXAMS ], int, int ); int main() { int student; const int studentGrades[ STUDENTS ][ EXAMS ] = { { 77, 68, 86, 73 }, { 96, 87, 89, 78 }, { 70, 90, 86, 81 } }; cout << "The array is:“ << printArray( studentGrades, cout<<"\n\nLowest grade: “ cout<<“Highest grade: “ << ); Each row is a particular student, each column is the grades on the exam. endl; STUDENTS, EXAMS ); << minimum( studentGrades, STUDENTS, EXAMS ) << endl; maximum( studentGrades, STUDENTS, EXAMS ) << “\n", Notice! Each studentGrades[i] is a one-dimensional array with the grades of student i. for ( student = 0; student <= STUDENTS - 1; student++ ) cout << "The average grade for student “ << student << “ is “ << average( studentGrades[ student ], EXAMS ) << endl; Προγραμματισμός return 0; } 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 /* Find the minimum grade */ int minimum( const int grades[ EXAMS ], int pupils, int tests ) { int i, j, lowGrade = 100; for ( i = 0; i <= pupils - 1; i++ ) for ( j = 0; j <= tests - 1; j++ ) if ( grades[ i ][ j ] < lowGrade ) lowGrade = grades[ i ][ j ]; return lowGrade; } /* Find the maximum grade */ int maximum( const int grades[ EXAMS ], int pupils, int tests ) { int i, j, highGrade = 0; for ( i = 0; i <= pupils - 1; i++ ) for ( j = 0; j <= tests - 1; j++ ) if ( grades[ i ][ j ] > highGrade ) highGrade = grades[ i ][ j ]; return highGrade; } /* Determine the average grade for a particular exam */ Προγραμματισμός double average( const int setOfGrades, int tests ) { 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 int i, total = 0; for ( i = 0; i <= tests - 1; i++ ) total += setOfGrades[ i ]; return ( double ) total / tests; } /* Print the array */ void printArray( const int grades[ EXAMS ], int pupils, int tests ) { int i, j; cout<<" [0] [1] [2] [3]"; for ( i = 0; i <= pupils - 1; i++ ) { cout << "\nstudentGrades[“ << i << “] “; for ( j = 0; j <= tests - 1; j++ ) cout << grades[ i ][ j ]; } } Προγραμματισμός Program Output The array is: [0] studentGrades[0] 77 studentGrades[1] 96 studentGrades[2] 70 [1] 68 87 90 [2] 86 89 86 [3] 73 78...
View Full Document

{[ snackBarMessage ]}

What students are saying

  • Left Quote Icon

    As a current student on this bumpy collegiate pathway, I stumbled upon Course Hero, where I can find study resources for nearly all my courses, get online help from tutors 24/7, and even share my old projects, papers, and lecture notes with other students.

    Student Picture

    Kiran Temple University Fox School of Business ‘17, Course Hero Intern

  • Left Quote Icon

    I cannot even describe how much Course Hero helped me this summer. It’s truly become something I can always rely on and help me. In the end, I was not only able to survive summer classes, but I was able to thrive thanks to Course Hero.

    Student Picture

    Dana University of Pennsylvania ‘17, Course Hero Intern

  • Left Quote Icon

    The ability to access any university’s resources through Course Hero proved invaluable in my case. I was behind on Tulane coursework and actually used UCLA’s materials to help me move forward and get everything together on time.

    Student Picture

    Jill Tulane University ‘16, Course Hero Intern