Προγραμματιςμόσ Μεκόδων Επίλυςθσ Προβλθμάτων 16. Πίνακεσ και Συναρτήςεισ Ιωάννθσ Κατάκθσ
Σιμερα o Κλιςθ με τιμι o Κλιςθ με αναφορά o Πίνακεσ και ςυναρτιςεισ o Παραδείγματα
Ειςαγωγι o Στισ προθγοφμενεσ διαλζξεισ μάκαμε πϊσ να δθλϊνουμε, αρχικοποιοφμε να επεξεργαηόμαςτε και να αξιοποιοφμε πίνακεσ o Σιμερα κα μελετιςουμε πωσ μποροφμε να χρθςιμοποιιςουμε ζνα πίνακα ωσ όριςμα ςυνάρτθςθσ o Μασ επιτρζπει να επωφελθκοφμε όλων των πλεονεκτθμάτων των ςυναρτιςεων και των πινάκων
Κλιςθ με τιμι Όταν χρθςιμοποιοφμε μια μεταβλθτι (int, char, float), ςε μια ςυνάρτθςθ τότε δθμιουργείται ζνα αντίγραφο τθσ μεταβλθτισ, το οποίο δεν ζχει καμία ςχζςθ με τθν αρχικι μεταβλθτι. Αυτόσ ο τρόποσ οριςμοφ παραμζτρων ονομάηεται: Κλιςθ με τιμι (call by value) int add(int x) return x+4; int main() int a = 5; printf( %d\n,add(a)); Εκτφπωςθ printf( %d\n,a); 9 system( pause ); 5 return 0; a 5 5 x 9
Κλιςθ με τιμι o Η ςυνάρτθςθ ζχει μία τοπικι μεταβλθτι για να αποκθκεφςει το δικό τθσ αντίγραφο τθσ τιμισ που τθσ δίνουμε o Όταν κάνουμε αλλαγζσ ςτο αντίγραφο, θ αρχικι τιμι παραμζνει θ ίδια o Αν κζλουμε να επιςτρζψουμε τιμζσ πρζπει να χρθςιμοποιιςουμε τθ return
Κλιςθ με Αναφορά o Τι γίνεται αν κζλουμε να περάςουμε ζνα πίνακα ςε μια ςυνάρτθςθ? o Αν ο πίνακασ περνοφςε ςτθν ςυνάρτθςθ με τον ίδιο τρόπο που περνά θ μεταβλθτι (δθλαδι με αντιγραφι), τότε κάκε κάλεςμα κα ςιμαινε τθν αντιγραφι ενόσ μεγάλου αρικμοφ ςτοιχείων => Αυτό κα είχε ιδιαίτερο υπολογιςτικό κόςτοσ o Αντί να δθμιουργείτε ζνα νζο αντίγραφο όταν περνάμε ζνα πίνακα ςε μια ςυνάρτθςθ, γίνεται απλά κάποια αναφορά ςτον πίνακα. Αυτό το κάλεςμα ονομάηεται : Κλιςθ με Αναφορά (call by reference) o Δθλαδι δε γίνεται αντιγραφι των ςτοιχείων ςτθ ςυνάρτθςθ o Αυτό ςθμαίνει ότι μποροφμε να αλλάηουμε τουσ πίνακεσ μζςα από τισ ςυναρτιςεισ
Πίνακεσ και Συναρτιςεισ Χρθςιμοποιοφμε τθν ακόλουκθ ςφνταξθ όταν περνοφμε πίνακεσ ςε ςυναρτιςεισ o Στο πρότυπο και τον οριςμό τθσ ςυνάρτθςθσ : void FillArray ( int array[ ], int size); o Ή (μόνο ςτο Πρότυπο) void FillArray ( int [ ], int); o Στθ κλιςθ τθσ ςυνάρτθςθσ: FillArray (pin, megethos); Κλιςθ με αναφορά τθσ ςυνάρτθςθσ FillArray ςτον πίνακα pin. Για τθν ακρίβεια, θ αναφορά είναι ςτο πρϊτο ςτοιχείο του πίνακα
Παράδειγμα #include <stdio.h> #define SIZE 4 // Πρότυπο void FillArray (int[ ], int) ; main ( ) int array [SIZE]=-1,-1,-1,-1; // Κλιςθ Συνάρτθςθσ FillArray ( array, SIZE ); int i; for(i=0; i<size; i++) printf( %d,array*i+); // Οριςμόσ Συνάρτθςθσ void FillArray(int array[ ], int L) int i; for ( i = 0; i < L; i++) array [i] = i; ηο SIZE μπορούζε να τρηζιμοποιηθεί καηεσθείαν εδώ (μιας και είναι καθολική μεηαβληηή) Aν εκησπώζοσμε ηο πίνακα θα δούμε όηι array[0] = 0 array[1] = 1 array[2] = 2 array[3] = 3 8
Παράδειγμα #include <stdio.h> void dummy(int k, int p[]) k=7; p[5]=7; main() int i,a[10]=; i=10; A[5]=10; dummy(i,a); printf("%d\n",i); printf("%d\n",a[5]); system("pause"); 10 7
Παράδειγμα 1 Γράψτε μια ςυνάρτθςθ θ οποία αρχικοποιεί όλεσ τισ κζςεισ ενόσ πίνακα ακεραίων ARRAY με μζγεκοσ SIZE ςτθν τιμι 0 10
Παράδειγμα 1 #include <stdio.h> void initarray (int array [ ], int size) int i; for ( i = 0; i < size; i++ ) array [ i ] = 0 ; main ( ) int array[]= 1,2,3,4,5,6; initarray (array, 6); 11
Παράδειγμα 2 Γράψτε μια ςυνάρτθςθ θ οποία λαμβάνει ωσ τιμι ειςόδου ζνα πίνακα ακεραίων, και το μζγεκοσ του πίνακα, και επιςτρζφει ςαν τιμι εξόδου τον μζςο όρο των ςτοιχείων του 12
Παράδειγμα 2 #include <stdio.h> float avg(int [ ], int ); main ( ) int array[]= 1,2,3,4,5,6; printf("average: %f", avg(array, 6)); float avg(int array[ ], int L) int i; int sum=0, count=0; for (i = 0; i < L; i++) sum += array[i]; count++; return (float)sum/count; 13
Παράδειγμα 3 Γράψτε μια ςυνάρτθςθ θ οποία επιςτρζφει το άκροιςμα των αρικμϊν μεταξφ των κζςεων *2..4+ ενόσ πίνακα κετικϊν ακεραίων. Αν ο πίνακασ περιζχει λιγότερα από 5 ςτοιχεία τότε εκτυπϊνεται μινυμα λάκουσ και επιςτρζφει -1 Σημείωςη Η πρϊτθ κζςθ του πίνακα είναι 0. Π.χ. int array[]= 1,2,3,4,5,6; επιςτρζφει 12 Π.χ. int array[]= 1,2,3; επιςτρζφει -1 14
Παράδειγμα 3 int selective_sum(int array[ ], int L) int i; int sum=0; if (L<5) printf( Error ); return -1; for (i = 2; i <5; i++) sum += array[i]; return sum; 15
Παράδειγμα 4 Γράψετε μια ςυνάρτθςθ θ οποία επιςτρζφει το άκροιςμα των περιττών θζςεων ενόσ πίνακα ακεραίων. Σημείωςη Η πρϊτθ κζςθ του πίνακα είναι 0. Επομζνωσ κζλουμε το άκροιςμα των ςτοιχείων ςτισ κζςεισ 1, 3, 5, 16
Παράδειγμα 4 Τρόπος Α Τρόπος Β int oddsum(int array[ ], int L) int i; int sum=0; for (i = 0; i < L; i++) if (i%2 == 1) sum += array[i]; return sum; int oddsum(int array[ ], int L) int i; int sum=0; for (i = 1; i < L; i+=2) sum += array[i]; return sum; Π.τ. int array[]= 1,2,3,4,5,6; επιζηρέθει 12 17
Παράδειγμα 5 Γράψτε μια ςυνάρτθςθ θ οποία παίρνει τισ εξισ παραμζτρουσ o Κάποιο πίνακα ακεραίων ARRAY o Το μζγεκοσ του πίνακα SIZE Και ςτθ ςυνζχεια ηθτά από τον χριςτθ να δϊςει SIZE κετικοφσ ακεραίουσ, οι οποίοι αποκθκεφονται ςτον πίνακα ARRAY. 18
Παράδειγμα 5 void getvalues (int array [ ], int SIZE) int i; for ( i = 0 ; i < SIZE ; i++) printf ("Enter next value : ") ; scanf ("%d", &array[i] ) ; while ( array [ i ] < 1) printf ("Values must be positive..."); printf ("Enter next value : ") ; scanf ("%d", &array[ i ]) ; 19
Παράδειγμα 6 Σκελετόσ Προγράμματοσ #include <stdio.h> #define SIZE 39 #define GRADES 6 // Πρότυπα Συναρτήςεων void PrintInstructions (void) ; void InitArray (int gradecount [ ], int size) ; void FillArray (int score [ ], int size) ; double ProcessGrades (int score [ ], int size, int gradecount [ ] ) ; double FindAverage (double sum, int num) ; void PrintResults (double average, int gradecount [ ] ) ; 20
Παράδειγμα 6 Σκελετόσ Προγράμματοσ int main ( ) int i, score [SIZE], gradecount [GRADES] ; double average; PrintInstructions ( ) ; // Εκτφπωςη Οδηγιών InitArray (gradecount, GRADES) ; // Αρχικοποίηςη πίνακα gradecount ςε 0 FillArray (score, SIZE) ; // Ειςαγωγή ςτοιχείων από χρήςτη // εφρεςη μζςου όρου, ενημζρωςη gradecount βάςη πίνακα score average = ProcessGrades (score, SIZE, gradecount ) ; // Εκτφπωςη αποτελεςμάτων gradecount PrintResults (average, gradecount) ; return 0; 21
Τζλοσ διάλεξθσ