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

Σχετικά έγγραφα
Πξνγξακκαηηζκόο Ι (ΗΥ120)

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

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

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

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

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

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

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

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Η βασική συνάρτηση προγράμματος main()

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Ηβασικήσυνάρτηση προγράμματος main()

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

Υπολογισμός - Εντολές Επανάληψης

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

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

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

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

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

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

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

Ανάπτυξη και Σχεδίαση Λογισμικού

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

Διάλεξη 11η: Δείκτες, μέρος 1

12. Συναρτήσεις (Μέρος ΙI)

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

Ανάπτυξη και Σχεδίαση Λογισμικού

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Ανάπτυξη και Σχεδίαση Λογισμικού

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Παραδείγματα με συναρτήσεις στη C

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

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

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

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

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

Κεφάλαιο 10 ο Υποπρογράµµατα

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

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

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

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

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

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

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

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

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

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

7. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΣΥΝΑΡΤΗΣΕΙΣ

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 8 η : Συναρτήσεις Χειµερινό Εξάµηνο 2011

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

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

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 4η Διάλεξη Πίνακες Συναρτήσεις

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Πίνακες. Χρησιμοποιούνται για αποθήκευση συνόλου δεδομένων του ίδιου τύπου. Γραμμική Διάταξη Δήλωση Τύπος Δεδομένων ΌνομαΠίνακα[ length ]

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

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

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

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 12: Συναρτήσεις & Δείκτες

Αλλαγή του «εξωτερικού» περιβάλλοντος Αν σαν παράμετρος μιας συνάρτησης δοθεί μια μεταβλητή, σαν πραγματική παράμετρος θα περαστεί η τιμή της. Το πέρασμα παραμέτρων είναι καθ αποτίμηση. Οι πραγματικές παράμετροι (τιμές) αποθηκεύονται σε τοπική μνήμη προσωρινές μεταβλητές με τα ονόματα των αντίστοιχων τυπικών παραμέτρων. Αν ο κώδικας της συνάρτησης αλλάξει την τιμή μιας τυπικής παραμέτρου, στην πραγματικότητα αλλάζει την τιμή της αντίστοιχης τοπικής μεταβλητής, όχι της μεταβλητής που «περάστηκε» σαν παράμετρος. 2

#include <stdio.h> void inc0(int a) { a=a+1; οποιαδήποτε αλλαγή στην b δεν επηρεάζει το «εξωτερικό» περιβάλλον της κλήσης 3 int a; a=5; inc0(a); printf("a=%d\n", a); σαν πραγματική παράμετρος (για την τυπική παράμετρο a) περνιέται η τιμή 5 inc0(a); printf("a=%d\n", a); return(0);

Δείκτες ως παράμετροι συναρτήσεων Αν σαν παράμετρος μιας συνάρτησης δοθεί μια διεύθυνση, τότε η συνάρτηση μπορεί (προφανώς) να αλλάξει τα περιεχόμενα σε αυτή την θέση μνήμης. Η αντίστοιχη τυπική παράμετρος πρέπει να δηλωθεί ως δείκτης-σε-τ, και ο κώδικας της συνάρτησης πρέπει να χρησιμοποιεί αυτή την τιμή αντίστοιχα, όπως ακριβώς απαιτείται σε μια μεταβλητή δείκτη. Αντίστοιχα, όταν καλείται η συνάρτηση, σαν παράμετρος πρέπει να δίνεται μια διεύθυνση που αντιστοιχεί σε ένα αντικείμενο (μεταβλητή) τύπου Τ. Προσοχή: ένα κλασικό λάθος είναι το πέρασμα της τιμής αντί της διεύθυνσης της μεταβλητής. 4

#include <stdio.h> void inc0(int a) { a = a + 1; 5 void inc1(int *b_ptr) { *b_ptr = *b_ptr + 1; δείκτης! int a1, a2; printf("enter int value: "); scanf("%d", &a1); a2=a1; διεύθυνση! inc0(a1); inc1(&a2); printf("a1=%d, a2=%d\n", a1, a2); inc0(a1); inc1(&a2); printf("a1=%d, a2=%d\n", a1, a2); return(0);

#include <stdio.h> void swap(int *a_ptr, int *b_ptr) { int tmp; tmp=*a_ptr; *a_ptr=*b_ptr; *b_ptr=tmp; 6 int i,j; printf("enter 2 int values: "); scanf("%d %d", &i, &j); printf("i=%d, j=%d\n", i, j); swap(&i,&j); printf("i=%d, j=%d\n", i, j); return(0);

Πίνακες ως παράμετροι συναρτήσεων 7 Η τυπική παράμετρος δηλώνεται ως πίνακας. Δεν είναι υποχρεωτικό να προσδιοριστεί το μέγεθος της μεγαλύτερης διάστασης του πίνακα. Κατά την κλήση, σαν πραγματική παράμετρος περνιέται (στην στοίβα) η διεύθυνση (του πρώτου στοιχείου) του πίνακα, όχι τα περιεχόμενα του. Ο κώδικας της συνάρτησης μπορεί να αλλάξει τις τιμές των στοιχείων του πίνακα, και αυτές οι αλλαγές θα «παραμείνουν» αφού επιστρέψει η συνάρτηση. Παρατήρηση: μια τυπική παράμετρος τύπου δείκτη-σε-τ μπορεί να ερμηνευτεί ως η αρχή ενός πίνακα από Τ.

/* αλλαγή σε κεφαλαία */ #include <stdio.h> #define N 16 void smalltocapitals(char s[]) { int i; 8 for (i=0; s[i]!= '\0'; i++) { if ( (s[i] >= 'a') && (s[i] <= 'z') ) { s[i] = 'A' + s[i] - 'a'; char str[n]; scanf("%15s",str); printf("%s\n",str); smalltocapitals(str); printf("%s\n",str); return(0);

/* αλλαγή σε κεφαλαία */ #include <stdio.h> #define N 16 void smalltocapitals(char *s) { int i; 9 for (i=0; s[i]!= '\0'; i++) { if ( (s[i] >= 'a') && (s[i] <= 'z') ) { s[i] = 'A' + s[i] - 'a'; char str[n]; scanf("%15s",str); printf("%s\n",str); smalltocapitals(str); printf("%s\n",str); return(0);

πάνω μισό Ας δουλέψουμε μόνο στο /* αλλαγή σε κεφαλαία */ #include <stdio.h> #define N 16 void smalltocapitals(char s[]) { int i; for (i=0; s[i]!= '\0'; i++) { if ( (s[i] >= 'a') && (s[i] <= 'z') ) { s[i] = 'A' + s[i] - 'a'; char str[n]; scanf("%7s",&str[8]); printf("%s\n",str); smalltocapitals(&str[8]); printf("%s\n",&str[8]); 10 return(0);

/* ανάγνωση και ταξινόμηση ακεραίων */ #include <stdio.h> #define N 10 void swap(int *a_ptr, int *b_ptr) { 11 void sort(int t[], int len) { int i, j; for (i=0; i<len; i++) for (j=i; j<len; j++) if (t[i]>t[j]) swap(&t[i],&t[j]); int buf[n], i; for (i=0; i<n; i++) scanf("%d", &buf[i]); sort(buf,n); for (i=0; i<n; i++) printf("%d ", buf[i]); printf("\n");

/* ανάγνωση και ταξινόμηση ακεραίων */ #include <stdio.h> #define N 10 void swap(int *a_ptr, int *b_ptr) { 12 void sort(int *t, int len) { int i, j; for (i=0; i<len; i++) for (j=i; j<len; j++) if (t[i]>t[j]) swap(&t[i],&t[j]); int buf[n], i; for (i=0; i<n; i++) scanf("%d", &buf[i]); sort(buf,n); for (i=0; i<n; i++) printf("%d ", buf[i]); printf("\n");

Δεν είναι σωστή λύση. Απλά ταξινομείται το κάτω μισό και το πάνω μισό του πίνακα /* ανάγνωση και ταξινόμηση ακεραίων */ #include <stdio.h> #define N 10 void swap(int *a_ptr, int *b_ptr) { void sort(int t[], int len) { int i, j; for (i=0; i<len; i++) for (j=i; j<len; j++) if (t[i]>t[j]) swap(&t[i],&t[j]); int buf[n],i; for (i=0; i<n; i++) scanf("%d", &buf[i]); sort(buf,n/2); sort(&buf[n/2],n/2); for (i=0; i<n; i++) printf("%d ", buf[i]); printf("\n"); return(0); 13

Σχόλιο Η αλλαγή της τιμής μιας εξωτερικής μεταβλητής μέσα από συνάρτηση, μέσω δείκτη, μπορεί να θεωρηθεί ως μια μορφή παρενέργειας. Η διαφορά σε σχέση με την αλλαγή καθολικών μεταβλητών είναι ότι για να γίνει αυτό πρέπει να υπάρχει τυπική παράμετρος που να έχει δηλωθεί σαν δείκτης, και όταν γίνεται η κλήση να δίνεται σαν παράμετρος η διεύθυνση της μεταβλητής. Αυτό είναι ορατό κατά την ανάγνωση του κώδικα, συνεπώς δεν αποτελεί «πραγματική» παρενέργεια. Το πρόθεμα const σε μια τυπική παράμετρο δείκτη, δηλώνει ότι η συνάρτηση δεν αλλάζει τα περιεχόμενα που βρίσκονται σε αυτή τη διεύθυνση. 14

Δείκτες ως αποτέλεσμα συναρτήσεων 15 Μια συνάρτηση μπορεί να δηλωθεί έτσι ώστε να επιστρέφει σαν αποτέλεσμα ένα δείκτη-σε-τ. Χρειάζεται προσοχή ώστε η τιμή που επιστρέφεται να αντιστοιχεί σε μεταβλητή (μνήμη) που είναι μόνιμη. Η επιστροφή της διεύθυνσης μιας (συμβατικής) προσωρινής τοπικής μεταβλητής μιας συνάρτησης είναι προγραμματιστικό λάθος, καθώς αυτή μπορεί να μην υφίσταται μετά την κλήση της συνάρτησης (καταστρέφεται το πλαίσιο εκτέλεσης). Αυτό δεν εντοπίζεται από το μεταφραστή αλλά οδηγεί (αν είμαστε τυχεροί, και όχι πάντα) σε τερματισμό της εκτέλεσης του προγράμματος.

#include <stdio.h> int *add(int a, int b) { int c; c=a+b; return(&c); /* αυτό είναι λάθος! */ 16 int f(int a, int b) { int c = 0; int a,b,*c; printf("enter 2 int values: "); scanf("%d %d", &a, &b); c=add(a,b); f(a,b); printf("the result is %d\n", *c); return(0);

Χρήση συναρτήσεων Χρησιμοποιούμε συναρτήσεις: Όταν το πρόγραμμα αποτελείται από μια ομάδα εντολών που επαναλαμβάνεται πολλές φορές, και η οποία μπορεί να παραμετροποιηθεί έτσι ώστε να γράψουμε τον κώδικα μια μοναδική φορά. Όταν επιθυμούμε, για λόγους καλύτερης δόμησης, να σπάσουμε ένα μεγάλο τμήμα κώδικα σε περισσότερα, νοηματικά ανεξάρτητα, κομμάτια. Όταν επιθυμούμε να έχουμε ανεξάρτητα τμήματα κώδικα σε διαφορετικά αρχεία ή/και με δυνατότητα ξεχωριστής μετάφρασης (π.χ. βιβλιοθήκες). 17

Χρήση μεταβλητών Κάθε μεταβλητή εξυπηρετεί ένα συγκεκριμένο σκοπό και ονομάζεται αντίστοιχα (χωρίς υπερβολές). Μεταβλητές με «ειδικό» ρόλο σχολιάζονται ώστε να διευκολύνουν την ανάγνωση του κώδικα. Ιδανικά, η λειτουργία κάθε συνάρτησης πρέπει να είναι κατανοητή «από μόνη της», χωρίς να γνωρίζουμε το τι (ακριβώς) κάνει ο υπόλοιπος κώδικας του προγράμματος. Οι καθολικές μεταβλητές πρέπει να χρησιμοποιούνται με σύνεση, μόνο όταν απλουστεύουν τον κώδικα. 18

Συναρτήσεις με άγνωστο αριθμό παραμέτρων Μπορεί να υλοποιηθούν συναρτήσεις με άγνωστο (μεταβλητό) αριθμό παραμέτρων, ορίζοντας ως τελευταία (αλλά όχι πρώτη) παράμετρο το. Αυτό είναι βολικό σε περιπτώσεις που ο αριθμός των παραμέτρων δεν μπορεί να προσδιοριστεί εκ των προτέρων ή είναι επιθυμητό η συνάρτηση να μπορεί να καλείται με μεταβλητό αριθμό παραμέτρων. Ο συνολικός αριθμός των παραμέτρων πρέπει να μπορεί να υπολογίζεται με βάση τις τιμές των (γνωστών) παραμέτρων της συνάρτησης. 19 Κλασικό παράδειγμα: printf και scanf.

Βασικές λειτουργίες βιβλιοθήκης Για την πρόσβαση στις παραμέτρους που δόθηκαν κατά την κλήση, χρησιμοποιούνται οι μάκρο-εντολές (από τη βιβλιοθήκη stdarg): - va_list: ο τύπος της λίστας των παραμέτρων - void va_start(va_list ap, last): αρχικοποιεί την μεταβλητή ap ώστε να δείχνει στην πρώτη άγνωστη παράμετρο μετά την τελευταία γνωστή παράμετρο της συνάρτησης last - type va_arg(va_list ap, type): επιστρέφει την τιμή της παραμέτρου στην οποία δείχνει η ap ερμηνεύοντας την σύμφωνα με τον τύπο type και μεταθέτει το ap στην επόμενη θέση - void va_end(va_list ap): καλείται πριν τον τερματισμό της συνάρτησης 20

#include<stdio.h> #include<stdarg.h> void sum(int nof_args,...) { int i,s; va_list ap; 21 va_start(ap,nof_args); for(i=0,s=0; i<nof_args; i++) { s=s+va_arg(ap,int); va_end(ap); printf("sum of 1..7 is %d\n",sum(7,1,2,3,4,5,6,7)); printf("sum of 1..5 is %d\n",sum(5,5,7,9,11,13)); return(0);