ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Σχετικά έγγραφα
ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αρχές Προγραμματισμού

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομημένος Προγραμματισμός

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αρχές Προγραμματισμού

Εισαγωγή στον Προγραμματισμό με C++

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομημένος Προγραμματισμός

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός Η/Υ. Ενότητα 7: Συναρτήσεις

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C

Εισαγωγή στους Υπολογιστές

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ (ΤΛ2007 )

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Προγραμματισμός Συστημάτων

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

Προγραμματισμός ΙI (E)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

Εισαγωγή στον δομημένο προγραμματισμό

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

3 η ΕΝΟΤΗΤΑ Συναρτήσεις στο MATLAB

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Εισαγωγή στους Υπολογιστές

Δομημένος Προγραμματισμός

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

Μεθόδων Επίλυσης Προβλημάτων

Διαδικαστικός Προγραμματισμός

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Εισαγωγή στον Προγραμματισμό με C++

Δομημένος Προγραμματισμός

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δομή του προγράμματος. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Διαδικαστικός Προγραμματισμός

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

Εργαστήριο 2: Πίνακες

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Εισαγωγή στον δομημένο προγραμματισμό

Δομημένος Προγραμματισμός

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 3: Είσοδος και Έξοδος Δεδομένων

Ηλεκτρονικοί Υπολογιστές

Διαδικαστικός Προγραμματισμός

Δομημένος Προγραμματισμός

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δείκτες Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Η/Υ (ΤΛ2007 )

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Διάλεξη 5: Δείκτες και Συναρτήσεις

Προέλευση της Pazcal ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Αρχές Προγραμματισμού

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εισαγωγή στον Προγραμματισμό

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 4: Έλεγχος Ροής. Κ.

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C

Προχωρημένες έννοιες προγραμματισμού σε C

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 9: Συναρτήσεις Εμβέλεια

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Eισαγωγή στον Προγραμματισμό

Γλώσσα Προγραμματισμού C

Προγραμματισμός Η/Υ (ΤΛ2007 )

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Εισαγωγή στον δομημένο προγραμματισμό

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις II Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

{ int a = 5; { int b = 7; a = b + 3;

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό

Transcript:

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 12 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών & Τεχνολογίας Υπολογιστών

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τυπου άδειας χρησης, η άδεια χρησης αναφερεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου των διδασκόντων καθηγητών. Το έργο «Ανοικτά Ακαδήμαϊκά Μαθήματα στο Πανεπιστήμιο Πατρών» έχει χρηματοδοτηθεί μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκη Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικους πόρους. 3

Ανάπτυξη Το παρόν εκπαιδευτικό υλικό αναπτύχθηκε στο τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών του Πανεπιστημίου Πατρών 4

Παράδειγμα #include <stdio.h> #include <stdlib.h> // // C99 comment style // Demonstration of C99 VLAs as parameters in functions // void readarray(int rows, int cols, int x[rows][cols]); void printarray(int rows, int cols, int x[rows][cols]); int main(int argc, char *argv[]) { int a[5][5]; readarray(5, 5, a); printarray(3, 5, a); return 0; void readarray(int rows, int cols, int x[rows][cols]) { int i, j; for (i = 0; i< rows; i++) for (j = 0; j < cols; j++) x[i][j] = -i*cols - j ; Δεν υποστηρίζονται Από όλους τους Compilers!!! Το mvsc δεν είναι C99 compiler Εδώ γράφουμε C90 Εκτός αν ζητείται αναλυτικά void printarray(int rows, int cols, int x[rows][cols]) { int i, j; for (i = 0; i< rows; i++) { for (j = 0; j < cols; j++) printf("%4d", x[i][j]) ; printf("\n"); 5

Μηχανισμοί κλήσης συναρτήσεων 6

Τι θα τυπωθεί; #include <stdio.h> int myfun(int, int); int main ( ) { int a = 3, b = 3; myfun(a, b); prin return 0; int myfun(int a, int b) { a++; b++; printf("myfun: a:%d b:%d\n", a, b); return 0; 7

Κλήση συνάρτησης κατ αναφορά (call by reference) πρότυπο: void swap(int *a, int *b); κλήση: swap( &value1, &value2 ); 1. Η συνάρτηση επενεργεί απευθείας στις θέσεις μνήμης των μεταβλητών που χρησιμοποιούνται ως πραγματικά ορίσματα. 2. Δεν δημιουργούνται τοπικά αντίγραφα των δεδομένων. 3. Ισχύει για τις διευθύνσεις; 4. Στη C, ουσιαστικά, υλοποιείται ως κατ αξία πέρασμα διευθύνσεων. 8

Oρισμός συνάρτησης swap( ) void swap(int *a, int *b) { int temp ; temp = *b ; *b = *a ; *a = temp ; 9

Παράδειγμα χρήσης κλήσης κατ αναφορά #include <stdio.h> void swap (int *, int *); int main ( ) { int value1 = 5; int value2 = 3; printf("value1: %d value2: %d\n", value1, value2); void swap(int *a, int *b) { int temp; temp = *a ; *a = *b ; *b = temp ; swap (&value1, &value2) ; printf("value1: %d value2: %d\n", value1, value2); return 0; 10

Μερικές διαφορές Μηχανισμός κλήσης κατ αξία (call by value) δημιουργούνται τοπικά αντίγραφα των τιμών των ορισμάτων Αν τα ορίσματα έχουν μήκος πολλών bytes, επιβαρύνεται η εκτέλεση. Η συνάρτηση δεν μπορεί να αλλάξει τις τιμές ορισμάτων στο σημείο κλήσης. Μηχανισμός κλήσης με αναφορά (call by reference) δεν δημιουργούνται τοπικά αντίγραφα τιμών, μόνο των διευθύνσεων!!! η συνάρτηση ενημερώνεται για τη θέση μνήμης στην οποία είναι αποθηκευμένο ένα όρισμα. μπορεί να είναι ταχύτερο είναι δυνατόν να αλλάξουν οι τιμές ορισμάτων στο σημείο κλήσης. χρειάζεται προσοχή, μπορεί να γίνει εκ παραδρομής. Είναι ένας τρόπος να επιστρέψω περισσότερες από μία τιμές Για τη C, καταχρηστικά λέγεται έτσι : επί της ουσίας είναι κατ αξία πέρασμα δεικτών. 11

Παράδειγμα #include <stdio.h> Δείκτες σε ακέραιο #include <stdlib.h> void sumdiff(int, int, int *, int *); int main(int argc, char *argv[]) { int a = 3, b =4 ; int sum; int diff; Διευθύνσεις των μεταβλητών που θα αλλάξουν τιμές Στη sumdiff( ) ορίζονται νέες μεταβλητές a,b Οι a,b της main() είναι διαφορετικές μεταβλητές sumdiff(a,b, &sum, &diff); printf("%d %d\n", sum, diff); system("pause"); return 0; Η s αρχικοποιείται στην τιμή &sum void sumdiff(int a, int b, int *s, int *d) { *s = a + b; *d = a - b; a++; b++; printf("%d %d\n",a,b); Αλλάζουν τιμές τα περιεχόμενα των θέσεων με διευθύνσεις s, d. 12

Εμβέλεια ονομάτων int i, k ; main () { int i, m; int f1 () {int i, j; int f2 () {int n; 13

#include <stdio.h> #include <stdlib.h> int f1(int); καθολική Τι θα γίνει αν αφαιρεθεί το /* */ από τη δήλωση; int i = 5; int main(int argc, char *argv[]) { /*int i = 2;*/ int k = 1; τοπική i++; f1(i); f1(k); system("pause"); return 0; καθολική i int f1(int m) { printf("%d\n", m+i); return 0; Τοπική m 14

Διάρκεια ζωής μεταβλητής #include <stdio.h> #include <stdlib.h> void function (void); void function1 (void); int main () { function1(); function ( ) ; function1 ( ) ; function ( ) ; return 0; void function1() { int j = 0; j++; printf("function1, j: %d at %X\n", j, &j); Η τοπική μεταβλητή i δεν αρχικοποιείται! Τι βγαίνει εδώ; i, j, είναι τοπικές μεταβλητές Διάρκεια ζωής: όσο εκτελείται η συνάρτηση Η θέση μνήμης επαναχρησιμοποιείται void function ( ) { int i ; i++ ; printf("function, i: %d at %X\n", i, &i); printf("%d\n", i); 15

Διάρκεια ζωης μεταβλητής (2) void function1 (void); void function2 (void); void function(void); main ( ) { function(); function1( ) ; function2( ) ; function1( ) ; function2( ) ; function1( ) ; function2( ) ; void function() { int k = 0; void function1( ) { int i; i++ ; printf("f1:%d\n", i); void function2( ) { int j; j++ ; printf("f2:%d\n", j); Αν η κλήση της function1( ) γίνεται εναλλάξ με την function2( ), η συμπεριφορά αλλάζει... Εμφανίζονται εξαρτήσεις (είναι δυνατόν να...) 16

Λύση;;; void function1 (void); void function2 (void); main ( ) { function1( ) ; function2( ) ; function1( ) ; function2( ) ; function1( ) ; function2( ) ; void function1 () { int i = 0; i++ ; printf("f1:%d\n", i); void function2 () { int j = 0; j++ ; printf("f2:%d\n", j); Αρχικοποιώντας τις μεταβλητές κάθε φορά που καλείται η συνάρτηση, οι τοπικές μεταβλητές μηδενίζονται κάθε φορά που καλείται η συνάρτηση. 17

Η λέξη κλειδί static σε δηλώσεις τοπικών μεταβλητών void function1 (void); void function2 (void); main ( ) { function1( ) ; function2( ) ; function1( ) ; function2( ) ; function1( ) ; function2( ) ; void function1 ( ) { static int i = 0; i++ ; printf("f1:%d\n", i); void function2 ( ) { static int j = 0; j++ ; printf("f2:%d\n", j); static: ο χώρος μνήμης της μεταβλητής δεν αποδεσμεύεται όταν ολοκληρωθεί μια εκτέλεση της συνάρτησης. 18

Άλλη χρήση της static: Ορισμός εμβέλειας αρχείου αρχείο πηγαίου κώδικα: code2.c static int sum = 0; int func(int k) { int i; for (i=0;i<5; i++) sum += k ; /* sum = sum + k */ return 2 * k; void report() { printf("%d\n", sum); αρχείο πηγαίου κώδικα: code1.c int func (int); void report(void); main () { int i ; for ( i=0; i< 5; i++) printf("%d\n", func(i)); report(); 19

Παράδειγμα #include <stdio.h> int f (int ); int g (int ); double h (double ); int w (int, int); int main(int argc, char *argv[]) { f(1); g(1); h(1.0); w(1, 2); f(2); g(1); int f(int a) { int b = 1 ; printf("function f: address of parameter %X\n", &a); printf("\t\t address of local variable %X\n", &b); if (a>1) g(a); return b + a; return 0; 20

Παράδειγμα int g (int a) { int b = 1 ; int *c = &a; printf("function g: address of parameter %X\n", &a); printf("\t\t address of local variable b %X\n", &b); printf("\t\t address of local variable c %X\n", &c); return b + a ; int w (int a, int c) { int b = 1 ; printf("function w: address of parameter %X\n", &a); printf("\t\t address of local variable %X\n", &b); return b + a + c; double h (double a) { double b = 2.0 ; printf("function h: address of parameter %X\n", &a); printf("\t\t address of local variable %X\n", &b); return b + a; 21

Σημείωμα αναφοράς Copyright Πανεπιστήμιο Πατρών, Παλιουράς Βασίλειος, Δερματάς Ευάγγελος «Αρχές Προγραμματισμού». Έκδοση: 1.0. Πάτρα 2015 Διαθέσιμο από τη δικτυακιακή διέυθυνση https://eclass.upatras.gr/modules/ 22